|
3134
|
AV Media Booking System by @rachell_aristo | Stard AV Media Booking System by @rachell_aristo | Stardance...
|
rachell_aristo
|
0
|
78.75
|
0
|
[]
|
[{"post_id": 81415, "ts": "202 [{"post_id": 81415, "ts": "2026-10-21T06:29:38Z", "hours": 6.6819, "text": "Added an equipment check out system that allows the media technician to check out a loan by typing in the barcodes of specific assets. Checks if scanned asset exists in catalog Checks if the same assets are scanned > once Checks if a scanned asset is not requested in this loan And then saves the scanned barcodes to db. to do: add error handling for this + add barcode scanner with cam function"}, {"post_id": 80887, "ts": "2026-10-19T05:22:58Z", "hours": 1.2214, "text": "Added/changed all email templates into HTML to allow more formatting options in the future"}, {"post_id": 76966, "ts": "2026-10-05T07:15:47Z", "hours": 1.9156, "text": "Added variables to approve emails (with Jinja) so it’s dynamic Also added a few util functions for converting int ids to the string value (for equipment ids, studio space ids, timeslot ids etc) I wonder if there is a built in method for doing this with sql alchemy?"}, {"post_id": 71065, "ts": "2026-09-20T08:06:15Z", "hours": 0.9994, "text": "Added fully booked (depending on avalibility from selected date) + not avali for year group messages"}, {"post_id": 71020, "ts": "2026-09-20T06:51:57Z", "hours": 8.2517, "text": "I added an equipment item column to the equipment bookings table so that admin can also filter search by equipment :) Also added error handling for Flask Mail functions + updating loan status to db, which sends an appropriate message to admin about whether data was updated, email was sent etc."}, {"post_id": 70474, "ts": "2026-09-19T08:08:45Z", "hours": 5.9058, "text": "Added functionality for studio booking table - modals, action buttons etc. Also added filters to all tables. This sounds simple cuz previously all worked on equipment table, but was actually a mess to refactor because now there’s equipment bookings and studio bookings not just one type 🫠"}, {"post_id": 68636, "ts": "2026-09-15T13:22:08Z", "hours": 7.0539, "text": "omg SO MANY UPDATES!! >:) Updated the equipment booking system to dynamically update quantity counts depending on the date range selected by user (JS fetch) My app now sends AUTO EMAILS WHATTT with Flask Mail. Legit so cool :)) When admin changes a booking, eg by approving/cancelling, it will trigger an email to the user Added a filter system to bookings table! Can filter by searching a value in any column"}, {"post_id": 67984, "ts": "2026-09-14T09:54:57Z", "hours": 6.0844, "text": "Added accept/reject/cancel button functions to admin page + table of bookings with color coded status. Clicking on rows brings up a modal with more info + action buttons"}, {"post_id": 67211, "ts": "2026-09-13T08:17:54Z", "hours": 4.5839, "text": "Added verification for equipment booking: equipment must be allowed for the user’s year group, user must not have overdue loans and each loan has a limit for # of items loaned per equipmen type Basic table record display for all bookings on admin_home.html Updated CSS color scheme to fit school colors + unrounded elements (cuz I think the round UI design is over hyped) + made records more space efficent AI use: used Gemini to help update CSS"}, {"post_id": 66564, "ts": "2026-09-12T12:22:51Z", "hours": 2.1478, "text": "Fixed a really serious problem I didn’t spot previously where the equipment loan record getting saved to db wasn’t saving the quantity properly when u book >1 of each equipment type…simply forgot to iterate through the quantity list I had made 🫠 Also added to student_home page so that equipment bookings also get shown :)"}, {"post_id": 66329, "ts": "2026-09-12T03:08:07Z", "hours": 5.2681, "text": "Finally have a working equipment booking page and system! Figuering out how to select the data of equipment type and quantity and send to py was low key a nightmare…"}, {"post_id": 63527, "ts": "2026-09-07T13:12:08Z", "hours": 1.1408, "text": "Basic tab system for sorting the equipment cards based on category :)"}, {"post_id": 63488, "ts": "2026-09-07T11:28:33Z", "hours": 4.1219, "text": "Created a CSV parser with pandas (first time using!) which I can incorperate into the admin interface later on. Sorted out a lot of logicial tough questions such as how do you iterate through a 2D array to create records?"}, {"post_id": 62852, "ts": "2026-09-06T11:53:40Z", "hours": 2.3272, "text": "Changed html + js so that the studio booking page allows for div cards w/ photos for each studio space instead of a boring form like structure (css not fixed yet!)"}, {"post_id": 62606, "ts": "2026-09-06T02:26:32Z", "hours": 5.0053, "text": "Added comments to all my code + implemented Flask-Login. POV u came back to coding after like a month and realized you don’t understand what you wrote…comments for future me now. As for Flask-login, I implemented it cuz it makes sense to use it instead of manualy building login functions (in screenshot - goodbye manual login functions woop)"}, {"post_id": 35684, "ts": "2026-07-27T08:55:43Z", "hours": 11.0956, "text": "Finally have a functioning studio booking system with an HTML form that submits data to my mySQL db (form has frontend + backend validation too)!! Also created a student_home.html page, linked it to successful booking page. asked AI for tempoary functional css styling so that my page is easier to read (will change css to something less AI later on!) Stuff I’ve learned for the first time to use: Flatpickr date picker understanding how blueprints & routes work HTML templates and Jinja2 syntax Querying from database with sqlalchemy select"}, {"post_id": 14074, "ts": "2026-06-23T01:52:11Z", "hours": 2.5953, "text": "Added Google OAuth login!"}, {"post_id": 6664, "ts": "2026-06-11T05:21:49Z", "hours": 2.3544, "text": "Created database tables with SQLAlchemy for the first time"}]...
|
Title: AV Media Booking System by @rachell_aristo Title: AV Media Booking System by @rachell_aristo | Stardance
Devlogs:
Created database tables with SQLAlchemy for the first time
Added Google OAuth login!
Finally have a functioning studio booking system with an HTML form that submits data to my mySQL db (form has frontend + backend validation too)!! Also created a student_home.html page, linked it to successful booking page. asked AI for tempoary functional css styling so that my page is easier to read (will change css to something less AI later on!) Stuff I’ve learned for the first time to use: Flatpickr date picker understanding how blueprints & routes work HTML templates and Jinja2 syntax Querying from database with sqlalchemy select
Added comments to all my code + implemented Flask-Login. POV u came back to coding after like a month and realized you don’t understand what you wrote…comments for future me now. As for Flask-login, I implemented it cuz it makes sense to use it instead of manualy building login functions (in screenshot - goodbye manual login functions woop)
Changed html + js so that the studio booking page allows for div cards w/ photos for each studio space instead of a boring form like structure (css not fixed yet!)
Created a CSV parser with pandas (first time using!) which I can incorperate into the admin interface later on. Sorted out a lot of logicial tough questions such as how do you iterate through a 2D array to create records?
Basic tab system for sorting the equipment cards based on category :)
Finally have a working equipment booking page and system! Figuering out how to select the data of equipment type and quantity and send to py was low key a nightmare…
Fixed a really serious problem I didn’t spot previously where the equipment loan record getting saved to db wasn’t saving the quantity properly when u book >1 of each equipment type…simply forgot to iterate through the quantity list I had made 🫠 Also added to student_home page so that equipment bookings also get shown :)
Added verification for equipment booking: equipment must be allowed for the user’s year group, user must not have overdue loans and each loan has a limit for # of items loaned per equipmen type Basic table record display for all bookings on admin_home.html Updated CSS color scheme to fit school colors + unrounded elements (cuz I think the round UI design is over hyped) + made records more space efficent AI use: used Gemini to help update CSS
Added accept/reject/cancel button functions to admin page + table of bookings with color coded status. Clicking on rows brings up a modal with more info + action buttons
omg SO MANY UPDATES!! >:) Updated the equipment booking system to dynamically update quantity counts depending on the date range selected by user (JS fetch) My app now sends AUTO EMAILS WHATTT with Flask Mail. Legit so cool :)) When admin changes a booking, eg by approving/cancelling, it will trigger an email to the user Added a filter system to bookings table! Can filter by searching a value in any column
Added functionality for studio booking table - modals, action buttons etc. Also added filters to all tables. This sounds simple cuz previously all worked on equipment table, but was actually a mess to refactor because now there’s equipment bookings and studio bookings not just one type 🫠
I added an equipment item column to the equipment bookings table so that admin can also filter search by equipment :) Also added error handling for Flask Mail functions + updating loan status to db, which sends an appropriate message to admin about whether data was updated, email was sent etc.
Added fully booked (depending on avalibility from selected date) + not avali for year group messages
Added variables to approve emails (with Jinja) so it’s dynamic Also added a few util functions for converting int ids to the string value (for equipment ids, studio space ids, timeslot ids etc) I wonder if there is a built in method for doing this with sql alchemy?
Added/changed all email templates into HTML to allow more formatting options in the future
Added an equipment check out system that allows the media technician to check out a loan by typing in the barcodes of specific assets. Checks if scanned asset exists in catalog Checks if the same assets are scanned > once Checks if a scanned asset is not requested in this loan And then saves the scanned barcodes to db. to do: add error handling for this + add barcode scanner with cam function...
|
1792587171.3745627
|
1793191971.3745627
|
|
4712
|
VaultForge Crypto Wallet by @professional_toad | S VaultForge Crypto Wallet by @professional_toad | Stardance...
|
professional_toad
|
1
|
119.12
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T16:59:27Z", "hours": 26.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Fully functional, multi-chain (Bitcoin, EVM, and Solana support with more on the way) wallet. To test this project, please go to the GitHub repository linked to the project.", "repo": "https://github.com/kunningKing11/vaultforge", "demo": "https://github.com/kunningKing11/vaultforge/releases"}]...
|
[{"post_id": 81422, "ts": "202 [{"post_id": 81422, "ts": "2026-10-21T07:03:36Z", "hours": 0.7881, "text": "Devlog 31 - swapping support for Solana! (partially) there’s now swapping support for solana, at least for DEX aggregators like LI.FI or Relay. i still need to figure out native solana DEX swapping on platforms like Jupiter…"}, {"post_id": 81198, "ts": "2026-10-20T08:10:50Z", "hours": 3.2675, "text": "Devlog 30 - support for swapping (finally!) this took so long!!! i thought i would be done last friday but ig that was overly optimistic… there are still some small things i will fix/improve to make the experience a bit smoother in the coming days. Implementation so i added uniswap support for all supported evm chains; however only for same-chain transactions and only through one pool. this is suboptimal so i want to add cross-chain support and through multiple pools maybe in the future. to make it possible to do cross-chain swaps, i added Relay support (it’s an aggregator) were solvers compete to give a quote. the issue with this is that they charge quite a fee and so i really want to just use uniswap where possible. what’s next better uniswap integration (as mentioned above), plus support for solana potentially jupiter support (it’s a solana DEX) as it has really good rates and high liquidity."}, {"post_id": 80081, "ts": "2026-10-16T05:40:57Z", "hours": 1.2094, "text": "Devlog 29 - more coin icons! specifically for AAVE, Chainlink (LINK), and Uniswap (UNI)."}, {"post_id": 79643, "ts": "2026-10-14T20:01:16Z", "hours": 1.4264, "text": "Devlog 28 - coin icons! it finally looks sooo professional now… just look at those icons! they will also appear in the send and transfer (soon to be swap!) tabs over the coming days. uniswap dex integration is still the top priority though. 🫡 before there weren’t any (they were just grey) and every wallet has them so i made it better ig"}, {"post_id": 79385, "ts": "2026-10-13T19:20:45Z", "hours": 3.1186, "text": "Devlog 27 - CCTP support is here… in like 30 minutes hang tight, it’s coming soon 🚀 i attached some proof , you guys can check out the transaction here more info on this tomorrow after v0.5.0 comes out with the CCTP support. you haven’t seen nothing yet, uniswap support coming next; stay tuned! probably coming in the next week or so…"}, {"post_id": 79016, "ts": "2026-10-12T11:14:38Z", "hours": 2.2986, "text": "Devlog 26 unfortunately, it’s taking longer than i would like to add the swapping and CCTP functionality. i would say i’m about 80% there, but there are quite a few things that i have to think about and as such, i think i will get it working by tomorrow (tuesday). stay tuned! 👀"}, {"post_id": 77760, "ts": "2026-10-08T05:56:13Z", "hours": 2.3114, "text": "Devlog 25 - some progress on the swapping i haven’t had much time in the last few days but i managed to do a big refactor to make the code more modular and cleaner. this is needed so that i can do more complex transactions instead of just basic transfers. i haven’t pushed it to main or committed it yet but it’s basically done. in terms of when CCTP support will ship, I think it will be by the end of sunday."}, {"post_id": 76737, "ts": "2026-10-04T13:27:58Z", "hours": 2.095, "text": "Devlog 24 - adding support for swapping after absolutely grinding on the support for swapping for the past week, here are some updates: 12 commits coming to main soon, about half bug fixes 4/10 things completed that i think are required for adding swapping support (more info below) i’ve also decided on a rough implementation order of swapping-related functionality: CCTP v2 transfers (basically moving USDC stablecoins across chains) Uniswap DEX (the biggest Decentrallized EXchange) Jupiter DEX ( the biggest dex on Solana) NEAR Intents (a cross-chain DEX) LI.FI aggregator (basically tells the walet the best market rates) i know this is kind of an ambitious timeline but i think i can pull it all off before the end of stardance on the 31st of october 🤞. i think i will manage to get CCTP transfers working by friday or sunday, depending on how much time i have."}, {"post_id": 74986, "ts": "2026-09-28T19:35:45Z", "hours": 1.4533, "text": "Devlog 23 15 new commits pushed to main ! still cooking on the integrated swapping support… sorry this is a short devlog; i’m more focused on the coding rn and will post when i’ve done something more substantial."}, {"post_id": 74352, "ts": "2026-09-27T06:58:05Z", "hours": 2.1792, "text": "Devlog 22 since the deadline for stardance has been extended by one month, i decided to keep going and make VaultForge as good as possible over the coming weeks. here’s a quick overview of what i will focus on next: actual swapping, and integration with multiple DEXes (think Jupiter, NEAR Intents, Uniswap, etc.) a better activity view token and chain icons! makes it much easier to differentiate between assets general performance and UI improvements with these new features, especially the integrated swapping, my wallet is finally going to be on par (mostly) with established wallets such as metamask. i’ve already got like 10+ commits since the last release that i will merge to main branch soon…"}, {"post_id": 73472, "ts": "2026-09-25T06:06:46Z", "hours": 1.0978, "text": "Devlog 21 as promised, VaultForge v0.4.0 is out! this brings huge changes to wallet unlock speed, adds ripple support, adds BIP-84 addresses, and loads more. here is the link to the release page if you want to check it out. some interesting stats: there was an increase of >6,000 lines of code which is a more than 50% increase since v0.3.0 . 132 commits since last release. this is probably going to be my second-to-last devlog as i really want to hit the 100-hour mark."}, {"post_id": 72818, "ts": "2026-09-23T20:02:48Z", "hours": 7.05, "text": "Devlog 20 so i finally added ripple support… and migrated everything to React for a much better, cleaner UI. and as always, i am late again. i actually could have finished on friday but i had other things to do (like homework) and i also wanted to migrate to react as well since I decided this will be my last release before the end of stardance, so i really want to add everything i can. this is because after stardance i will take a break of a few months on this project and then come back with a different hack club ysws challenge. the react migration was so big that i decided to use AI this time: the finished App.tsx file containing the react code is over 3090 lines of code (proof is the 2nd attached image)! that’s the largest code file i have ever worked on. since this is a huge change to the ui, i decided to create some before and after comparisons below. anyways, i decided to share some design decisions relating to the migration to react. i knew react was a big framework so it would add a few MB to the app’s file size (about 1-2 MB as of my recent testing) but the app itself is tiny anyway - not even 30 MB - so i thought it was really worth it. it gives you design consistency, more so than tailwindcss, which i needed since the more fun part for me was working on the backend and not the frontend (the user-facing part of the application). plus, the guys who work at coinbase (shoutout to them) made a goated plugin/theme/whatever you call it for react which makes my app have the default coinbase theme that i can tweak (i made the font monospace) which is alone like 70% of the stuff needed for the migration. i promise i will release v0.4.0 tomorrow…"}, {"post_id": 68207, "ts": "2026-09-14T18:12:58Z", "hours": 0.5819, "text": "Devlog 19 still cooking on the ripple support… i think i will be done by friday."}, {"post_id": 66040, "ts": "2026-09-11T16:23:03Z", "hours": 0.4975, "text": "Devlog 18 i finished all the perf improvements! there was one that i left out though bc it probably wouldn’t have helped much in terms of performance and would have been a pain to implement. i am FINALLY going to move on to ripple support for the next few days…"}, {"post_id": 65508, "ts": "2026-09-10T18:18:14Z", "hours": 0.7617, "text": "Devlog 17 perf improvement #3 done! 🎊 now refreshes are fully concurrent, w/ a limit of 4 requests at a time to avoid rate limiting. i haven’t fully tetsed it yet but it feels noticeably faster (like 25-35% faster) until the updated prices & balances are shown. plus, I kind of finished the settings stuff so i’ll be working on ripple support ig…"}, {"post_id": 64935, "ts": "2026-09-09T17:38:35Z", "hours": 2.8842, "text": "Devlog 16 sorry guys, i’m kind of late on this one tbh: I said that I would have the settings improvements, ripple support and all that ready by like monday but clearly nothing has happened since like the weekend. i have decided to delay the timleine by about a week as after some careful consideration I found it was wayyy too aggressive and my fingers can’t keep up with the typing speed i would need for that :) i seriously have no idae whatsoever why I thought it was possible to add that many features in such a short space of time. I know it kind of is but I have school now which means i have much less time for this with homework and studying and stuff. however, today I decided to lock in and actually do this and so I can assure you that i am hard at work doing the settings stuff rn and ripple support is absolutely coming right after that this next release really is going to be a big one… p.s. i attached a screenshot of some of the new commits i worked on (more are coming soon)"}, {"post_id": 62021, "ts": "2026-09-05T07:16:08Z", "hours": 1.6236, "text": "Devlog #15 Since the last devlog, I’ve worked on some more boring stuff: Tauri cleanup and desktop-specific improvements. I moved the application setup and command registration from src-tauri/src/main.rs into a new src-tauri/src/lib.rs . This keeps the entry point organized and follows Tauri’s recommended structure, while main.rs now only launches the library. I also replaced the browser clipboard API with Tauri’s native clipboard manager plugin. Copy buttons now use the desktop clipboard integration. Finally, VaultForge now enforces a single-instance window. If the app is launched while another instance is already open, the new launch focuses the existing main window instead of opening a second copy, which is far more desirable of a behaviour imo as it lets a user find a window without inadvertently opening even more. Plus some more random stuff: I now sign off all my commits As of today (4th of September), I also sign all my commits with a PGP key to verify all commits are made on my laptop and not by someone who hacked my GitHub account or smth - this is definitely overkill but why not Next, I’m continuing the settings improvements before moving on to Ripple support. P.S. I also randomly moved to Neovim as it looks much better than VS Code."}, {"post_id": 61004, "ts": "2026-09-03T18:18:49Z", "hours": 1.7533, "text": "Devlog #14 Not very much since last time; just some refactors and small improvements throughout. You can kind of tell by all the fix/chore/docs changes… btw improved settings is in the works - I think I’ll do some more progress over the next two days, then some actual chain support for Ripple. I’ve decided that I will release v0.4.0 before adding basic Zcash support as it’s been basically a month since last release and I don’t want to keep you guys waiting for those of you who want to download the binaries directly w/o building. Quick summary Now –> ~5 September: settings improvements 5 September –> 7 September: Ripple support 7/8 September: release of VaultForge v0.4.0"}, {"post_id": 59639, "ts": "2026-09-01T15:39:50Z", "hours": 3.5681, "text": "Devlog #13 I finally added different currencies ! Before, all prices were displayed in USD and now they can display in any of the below currencies: USD ($) EUR (€) GBP (£) JPY (¥) Shoutout to the fantastic API I used for this! Previously, I fetched CoinGecko pricing data which came in USD but I needed to convert this data into whatever currency the user chose so I had to find an API. However, there really weren’t any good forex APIs that were free with no rate limits when I searched for one so I turned to ChatGPT to find one and find one it did. This API gives daily central bank rates and even has data going back to 1948 on 201 currencies which is more than enough for this project. I also added the second performance improvement : caching the HTTP request client object to avoid having to recreate it on every API request. As of rn the project roadmap for the near future is this: Finish perf improvements Add basic Ripple (XRP) transaction support Maybe add transparent <=> transparent pool transaction support for Zcash (ZEC) Release VaultForge v0.5.0"}, {"post_id": 58117, "ts": "2026-08-30T13:52:54Z", "hours": 5.2722, "text": "Devlog #12 Quite a bit more to report this time! Since last devlog, I’ve mostly been working on improving actual wallet functionality, fixing some smaller UI issues, and looking into performance. Recent changes Below is a quick summary of what I’ve been working on since the last devlog: Full TRC-20 token support is here! 🎊 Tron is no longer limited to just native TRX transfers, and the token validation/network logic has been updated to support TRC-20 tokens as well. Significantly improved Bitcoin support by adding proper BIP84 account discovery . VaultForge now scans both receive and change addresses, tracks which UTXOs belong to which derived addresses, signs each input with the correct derived key, and refreshes discovery before sending. Anecdote: I use Brave Wallet which did the receive and change addresses thing so my funds didn’t show up in previous versions of VaultForge. However, as of this update, I now am. Wallet unlocking now feels much faster ! Cached balances/prices are shown immediately while fresh data refreshes in the background. Improved asset cards so they show which network an asset belongs to . Assets worth less than $1 are now hidden from the portfolio/assets view unless VaultForge does not have price data for them. Fixed a few UI issues, including dashboard scrolling, refresh errors, escaping asset data (aka preventing XSS) , and copying the currently selected wallet address. Converted the remaining .js config files to TypeScript because apparently I cannot resist refactoring things even when it makes no difference whatsoever. For the first time in this series of devlogs, I’m linking the changes to relevant commits on GitHub wherever possible so you can have a look. Performance improvements I also found a few ways to reduce VaultForge’s roughly 10s full refresh time: Cached unlock (mentioned above): perceived unlock time is now closer to ~1–3s, although balances/prices can still take around the same amount of time to fully refresh in the background. Reuse HTTP clients: should save roughly ~0.2-1.5s by reusing connections. Concurrent provider calls: likely the biggest improvement, potentially bringing a ~10s refresh down to ~3–5s. Refresh prices separately: could make fresh balances appear another ~0.5–2s sooner. Derive Argon2 once: should save roughly a few hundred ms to ~1s on cold unlocks. The above estimated perf improvements are obviously quite variable and depend on a multitude of factors (+ I got ChatGPT to analyze my current code to make an estimate because how else would I do it), but there is definitely still a lot of low-hanging fruit here. Upcoming features Actual settings are still the elephant in the room 😭, so I definitely need to get around to those but since I think this may need a big PR a bit like the previous style improvements, I think I will do this after v0.4.0 (so therefore for v0.5.0 ). Ripple (XRP) support (at least for native token transfers), planned for v0.4.0 . Zcash (ZEC) support: I’ve got a feeling this one will take quite some time so at most I will implement transparent <=> transparent transactions before next release but will have to see. The remaining performance improvements mentioned above."}, {"post_id": 55009, "ts": "2026-08-26T13:12:12Z", "hours": 8.6272, "text": "Devlog #11 What a MASSIVE PR and it’s finally merged ! Hooray! That was the biggest PR I’ve ever created by a big margin. Now I can finally start work on actual features like more support for different blockchains, address types, random extra features that certain chains have… the list goes on. I already have a personal list of 25 different blockchains that I want to add support for, most of which aren’t in the project roadmap simply for the reason that it would make the file overly long and hard to read. * sigh * that will take a long time Not to underestimate what I added with the PR, though - I didn’t spend like 15 hours and do 48 commits for nothing: inside the PR I added Onboarding! 🎊 Lots of (at least in the future) common settings will be selected here to set up your wallet. You can already import an existing wallet or generate a new one (both accept 12, 15, 18, 21, and 24-word recovery phrases) and set an auto-lock timeout and select networks you want or don’t want. Finally, there is also the option to select a theme if you want. New and more prominent splash screen when loading the application. The application itself is super fast so it takes barely any time but to make it look cooler I’ve set a minimum time to display it for to 650 ms. Icons throughout the application to make it look better. Let you copy addresses in the sidebar with one click and list all enabled addresses, not just Ethereum. Squashed some more small UI bugs, especially relating to scrolling in different parts of the application. Although slightly unrelated to the theme of the PR, MUCH better refresh logic and handling. It now respects network selection choices (like the ones you want or don’t want that you selected during onboarding) and tells you exactly which network’s RPC request encountered errors. Perhaps ironically, this was literally the reason I fixed an issue with the Solana RPC. Before this update, it never actually refreshed the balance correctly so it wasn’t working. However, after this change, I was able to identify that the issue was not on my end (yay!) but was actually PublicNode ’s (the RPC I’m using for the majority of chains in this project for consistency, apart from Monad and now Solana) as I assumed it could fetch the user’s token accounts but it couldn’t so I had to switch to using the official Solana RPC which fixed the issue. For anyone who got lost somewhere in the previous paragraph, an RPC is a service that allows you to query data about the state of the blockchain (where crypto transactions are stored) so you can use it to see how much crypto you are holding. Token accounts are basically a weird quirk of Solana where your main account is used to hold Solana which links to associated token accounts (ATAs) , which each hold one token other than Solana. This is by far not a complete list but rather a list of the highlights of this PR; if you want to look at all the changes, please feel free to visit the page linked at the top of this devlog. That said, after this big change, I did say last devlog that I would be getting ready to release version v0.4.0 of this application which is exactly what I will do after adding Tron token support! Quick reminder, after v0.4.0 I am planning to add Ripple (XRP) support, preliminary (meaning like non-shielded probably) support for Zcash and revamp the settings page like I did to the onboarding in this PR. Further out, I will probably focus some more on the in-application swaps to aggregate data from major DEXs (decentralized exchanges) to get the best rates, matching other major wallets w/ more chain support, which would make my wallet actually competitive. 🤞"}, {"post_id": 50515, "ts": "2026-08-19T18:16:53Z", "hours": 6.2019, "text": "Devlog #10 I’m close to finishing the theme improvements (I would say I’m about 90% there) and am doing some general bug fixes and QoL improvements. As such, there isn’t much to log rn except for a few small new features & improvements: Show/hide password button on recovery phrase and password Loads of bug fixes, e.g., inconsistent password strength progress bar on onboarding, preventing the user from typing the Enter key when entering a seed phrase to import, text overflow, etc. Some dependency version bumps If you want to see my progress on this PR (there are already like 30 commits in it - it’s a pretty big PR!), you can do so here . What’s coming next Some final finishing touches on the PR and then I will merge it to main so that it will be in the next release Support for Tron token transfers Support for Ripple The release of VaultForge v0.4.0 either before or after adding support for Ripple transactions A revamp of the settings tab (currently it doesn’t do anything) Support for Zcash"}, {"post_id": 45175, "ts": "2026-08-11T14:25:55Z", "hours": 6.7719, "text": "Devlog #9 Not much to report but I’m still working on improving the theme and the wider interface. You can see my progress here . Recent changes Below is a quick summary of what I’ve been working on since last devlog: Improved fonts ( Tektur for headings, Manrope for body text, and Ubuntu Mono for monospace text) Updated some text across different views for consistency Improved the look and feel of onboarding Added wallet setup flow to onboarding so you can now quickly import or generate a wallet with different seed length options (12, 15, 18, 21, and 24-word seed phrases are all supported now) Theme selection (in onboarding) between four different themes - I know these look a bit AI-generated rn (they are; it would have been frustrating to write out three new themes) but I will make them look a bit better in the future Auto-lock! 🎊 Now, you can easily set an auto-lock option in the onboarding or have none at all Upcoming features I think the elephant in the elephant in the room rn is actual settings which I will be working on over the next few days as currently there are no settings in the literal settings page!"}, {"post_id": 40732, "ts": "2026-08-04T13:27:44Z", "hours": 10.4086, "text": "Devlog #8 That took a lot of time! Over the past two weeks, I have done quite a bit of bug fixing and stopping undesired behaviour, including fixing weird sideways scrolling behaviour on the dashboard portfolio and creating custom scrollbars for less janky behaviour fixing the left sidebar’s contents overflowing vertically when the window height was decreased too much (it now lets you scroll if there is not enough space to fully display its contents) stopping zooming with Ctrl + ... or with trackpad gestures completely fix portfolio allocation percentage bars stuck at zero in the dashboard Along with this, I have done quite some improvement on the CI (especially the release.yaml workflow and pre-commit checks) and some refactoring, including using Lefthook npm install , bun install , Oxlint, Oxfmt validation, TypeScript typechecking, cargo check , and package.json package-lock.json bun.lock src-tauri/Cargo.lock are automatically staged on every commit. The npm install , bun install , and automatic lockfile staging is to ensure consistency between npm and Bun so that both can be used in development and testing. The other checks are for checking (or at least trying to; there could always be edge cases that aren’t covered) that no invalid code gets committed. There is also a maximum commit message subject length (72 characters) and the same for each line of the commit message body to ensure that commit messages stay readable. cargo test , and rust-analyzer analysis on every push to GitHub, since every commit runs the other checks anyway and uncommitted code can’t be pushed refactoring the previously monolithic TypeScript file that contained multiple pages so that each page now gets its own file inside of src/views/ significantly improving release.yaml (the app release workflow for GitHub) so that it now adds a commit count since the last release adds a line count statistic and the change in lines since the previous release allows for release comments and highlights written by me adds a link that links to a GitHub page of all the commits made between the release and the previous one (it already/before this change had all the new commits listed in the release notes with a link to each one) unifying networks.json (the file that contains all the relevant chain information for the TypeScript frontend) with all the scattered equivalent information in the Rust backend; now, the backend references the networks.json file instead Also, you are now able to test out all of these changes as I have just released v0.3.0 of VaultForge! Unfortunately, I haven’t yet worked on any of the theme changes but these are top priority for the next release… As a recap, here are the things that I will be working on for the next release, in order of priority: Updated theme Full Tron support (not just native token sends) Ripple (XRP) support Miscellaneous bug fixes and new features"}, {"post_id": 29564, "ts": "2026-07-16T16:15:34Z", "hours": 7.8725, "text": "Devlog #7 Unfortunately, since I am on holiday, I was not able to complete everything that I wanted to do by the end of last week. However, I was definitely able to make some progress: Progress Tron (TRX) support is here! 🎊 (albeit only native Tron sends are currently supported) some refactoring happened What’s next As I promised last week (but did not manage to complete), I was going to completely redesign the UI to make it more user-friendly and usable and have less of an AI-generated feel. This is because when I initially started this project, I used AI to create a demo app (without any of the signing logic), just to get a sort of structure to build on and add functionality to. However, I have changed pretty much every part of it so far apart from the theme which is why I am going to work on it now/this week. Icons for different currencies and across the application for easily recognisable features Support for Ripple (XRP)"}, {"post_id": 25341, "ts": "2026-07-09T16:00:38Z", "hours": 8.0019, "text": "Devlog #6 Progress Not much to announce rn but so far (since last week/log), I have refactored the code a bit bumped some dependencies made a cool new banner for the project (you can see it on this project’s banner) started work on improving the theme/look of the app fixed some minor issues and bugs, such as EVM nonce processing used the latest nonce from a confirmed block, ignoring the fact that the user may have been fast enough to send two transactions with the same nonce, which would guarantee that at least one transaction will fail BTC preview balance displayed to the user before approving a transaction did not take into account the unspent UTXOs in the calculation Not too exciting but this lays the groundwork for what is to come. 👇🏼 What’s next I will try to add this before the end of this week: a full redesign of the theme full Tron (TRX) support"}, {"post_id": 18461, "ts": "2026-06-29T16:57:39Z", "hours": 1.5761, "text": "Devlog #5 Solana support is here!"}, {"post_id": 17931, "ts": "2026-06-28T21:30:30Z", "hours": 9.9086, "text": "Devlog #4 Support for Solana coming soon, stay tuned! 👀 Since last devlog, I refactored the code a bit and split up all the TypeScript frontend and Rust backend logic into self-contained files, each for a clear purpose. Now, it’s much easier to read and understand the codebase."}, {"post_id": 13869, "ts": "2026-06-22T18:44:00Z", "hours": 1.0944, "text": "Devlog #3 The GitHub repository is public!"}, {"post_id": 13552, "ts": "2026-06-22T05:53:33Z", "hours": 9.5006, "text": "Devlog #2 I added loads of stuff! As promised: CoinGecko pricing data integrated Integrated RPC Progress on the actual transactions (implemented for EVM only so far and I am still working on it) Hardened security: Added a CSP (content security policy) to stop XSS (cross-site scripting) Hardened address validation, including EVM EIP-55 checksum validation Added a “remove wallet data” button Added zeroization for mnemonic/key/salt on lock and clear Coming soon/roadmap: Full support for BTC, EVM, SOL, and TRX chain transfers Actual cross-chain swaps via NEAR Intents Public GitHub repository (the repo hasn’t been made public yet as it’s still not fully working) Full support for more chains, including (but not limited to): Ripple (XRP) Hyperliquid (HYPE) - support for trading perps (perpetuals) Injective (INJ) Algorand (ALGO) Zcash (ZEC) - support transparent AND shielded addresses Monero (XMR) - alternative to Zcash Support for the Open Wallet Standard Native DeFi support: Native Aerodrome Finance LPing (liquidity providing) Native Aave lending (hopefully) Filecoin storage integration so you can easily store, download, and access files stored on Filecoin (hopefully) Integration with Tor for anonymity"}, {"post_id": 6061, "ts": "2026-06-10T05:49:45Z", "hours": 4.1822, "text": "Devlog #1 Just finished the basic UI; more coming soon… Current features already include: Argon2 password hashing to secure wallet Import a wallet seed phrase RPC connection to see how much crypto you’re holding QR code to get people to send stuff to you with a fault tolerance selector, e.g., smaller QR code for 7% data recovery, 25%, 30%, etc. Coming soon: GitHub repository for the project Coming soon: CoinGecko pricing data so you can see how much your crypto is worth Coming soon: actual transactions Coming soon: compatibility with Open Wallet Standard"}]...
|
Title: VaultForge Crypto Wallet by @professional_t Title: VaultForge Crypto Wallet by @professional_toad | Stardance
Devlogs:
Devlog #1 Just finished the basic UI; more coming soon… Current features already include: Argon2 password hashing to secure wallet Import a wallet seed phrase RPC connection to see how much crypto you’re holding QR code to get people to send stuff to you with a fault tolerance selector, e.g., smaller QR code for 7% data recovery, 25%, 30%, etc. Coming soon: GitHub repository for the project Coming soon: CoinGecko pricing data so you can see how much your crypto is worth Coming soon: actual transactions Coming soon: compatibility with Open Wallet Standard
Devlog #2 I added loads of stuff! As promised: CoinGecko pricing data integrated Integrated RPC Progress on the actual transactions (implemented for EVM only so far and I am still working on it) Hardened security: Added a CSP (content security policy) to stop XSS (cross-site scripting) Hardened address validation, including EVM EIP-55 checksum validation Added a “remove wallet data” button Added zeroization for mnemonic/key/salt on lock and clear Coming soon/roadmap: Full support for BTC, EVM, SOL, and TRX chain transfers Actual cross-chain swaps via NEAR Intents Public GitHub repository (the repo hasn’t been made public yet as it’s still not fully working) Full support for more chains, including (but not limited to): Ripple (XRP) Hyperliquid (HYPE) - support for trading perps (perpetuals) Injective (INJ) Algorand (ALGO) Zcash (ZEC) - support transparent AND shielded addresses Monero (XMR) - alternative to Zcash Support for the Open Wallet Standard Native DeFi support: Native Aerodrome Finance LPing (liquidity providing) Native Aave lending (hopefully) Filecoin storage integration so you can easily store, download, and access files stored on Filecoin (hopefully) Integration with Tor for anonymity
Devlog #3 The GitHub repository is public!
Devlog #4 Support for Solana coming soon, stay tuned! 👀 Since last devlog, I refactored the code a bit and split up all the TypeScript frontend and Rust backend logic into self-contained files, each for a clear purpose. Now, it’s much easier to read and understand the codebase.
Devlog #5 Solana support is here!
Devlog #6 Progress Not much to announce rn but so far (since last week/log), I have refactored the code a bit bumped some dependencies made a cool new banner for the project (you can see it on this project’s banner) started work on improving the theme/look of the app fixed some minor issues and bugs, such as EVM nonce processing used the latest nonce from a confirmed block, ignoring the fact that the user may have been fast enough to send two transactions with the same nonce, which would guarantee that at least one transaction will fail BTC preview balance displayed to the user before approving a transaction did not take into account the unspent UTXOs in the calculation Not too exciting but this lays the groundwork for what is to come. 👇🏼 What’s next I will try to add this before the end of this week: a full redesign of the theme full Tron (TRX) support
Devlog #7 Unfortunately, since I am on holiday, I was not able to complete everything that I wanted to do by the end of last week. However, I was definitely able to make some progress: Progress Tron (TRX) support is here! 🎊 (albeit only native Tron sends are currently supported) some refactoring happened What’s next As I promised last week (but did not manage to complete), I was going to completely redesign the UI to make it more user-friendly and usable and have less of an AI-generated feel. This is because when I initially started this project, I used AI to create a demo app (without any of the signing logic), just to get a sort of structure to build on and add functionality to. However, I have changed pretty much every part of it so far apart from the theme which is why I am going to work on it now/this week. Icons for different currencies and across the application for easily recognisable features Support for Ripple (XRP)
Devlog #8 That took a lot of time! Over the past two weeks, I have done quite a bit of bug fixing and stopping undesired behaviour, including fixing weird sideways scrolling behaviour on the dashboard portfolio and creating custom scrollbars for less janky behaviour fixing the left sidebar’s contents overflowing vertically when the window height was decreased too much (it now lets you scroll if there is not enough space to fully display its contents) stopping zooming with Ctrl + ... or with trackpad gestures completely fix portfolio allocation percentage bars stuck at zero in the dashboard Along with this, I have done quite some improvement on the CI (especially the release.yaml workflow and pre-commit checks) and some refactoring, including using Lefthook npm install , bun install , Oxlint, Oxfmt validation, TypeScript typechecking, cargo check , and package.json package-lock.json bun.lock src-tauri/Cargo.lock are automatically staged on every commit. The npm install , bun install , and automatic lockfile staging is to ensure consistency between npm and Bun so that both can be used in development and testing. The other checks are for checking (or at least trying to; there could always be edge cases that aren’t covered) that no invalid code gets committed. There is also a maximum commit message subject length (72 characters) and the same for each line of the commit message body to ensure that commit messages stay readable. cargo test , and rust-analyzer analysis on every push to GitHub, since every commit runs the other checks anyway and uncommitted code can’t be pushed refactoring the previously monolithic TypeScript file that contained multiple pages so that each page now gets its own file inside of src/views/ significantly improving release.yaml (the app release workflow for GitHub) so that it now adds a commit count since the last release adds a line count statistic and the change in lines since the previous release allows for release comments and highlights written by me adds a link that links to a GitHub page of all the commits made between the release and the previous one (it already/before this change had all the new commits listed in the release notes with a link to each one) unifying networks.json (the file that contains all the relevant chain information for the TypeScript frontend) with all the scattered equivalent information in the Rust backend; now, the backend references the networks.json file instead Also, you are now able to test out all of these changes as I have just released v0.3.0 of VaultForge! Unfortunately, I haven’t yet worked on any of the theme changes but these are top priority for the next release… As a recap, here are the things that I will be working on for the next release, in order of priority: Updated theme Full Tron support (not just native token sends) Ripple (XRP) support Miscellaneous bug fixes and new features
Devlog #9 Not much to report but I’m still working on improving the theme and the wider interface. You can see my progress here . Recent changes Below is a quick summary of what I’ve been working on since last devlog: Improved fonts ( Tektur for headings, Manrope for body text, and Ubuntu Mono for monospace text) Updated some text across different views for consistency Improved the look and feel of onboarding Added wallet setup flow to onboarding so you can now quickly import or generate a wallet with different seed length options (12, 15, 18, 21, and 24-word seed phrases are all supported now) Theme selection (in onboarding) between four different themes - I know these look a bit AI-generated rn (they are; it would have been frustrating to write out three new themes) but I will make them look a bit better in the future Auto-lock! 🎊 Now, you can easily set an auto-lock option in the onboarding or have none at all Upcoming features I think the elephant in the elephant in the room rn is actual settings which I will be working on over the next few days as currently there are no settings in the literal settings page!
Devlog #10 I’m close to finishing the theme improvements (I would say I’m about 90% there) and am doing some general bug fixes and QoL improvements. As such, there isn’t much to log rn except for a few small new features & improvements: Show/hide password button on recovery phrase and password Loads of bug fixes, e.g., inconsistent password strength progress bar on onboarding, preventing the user from typing the Enter key when entering a seed phrase to import, text overflow, etc. Some dependency version bumps If you want to see my progress on this PR (there are already like 30 commits in it - it’s a pretty big PR!), you can do so here . What’s coming next Some final finishing touches on the PR and then I will merge it to main so that it will be in the next release Support for Tron token transfers Support for Ripple The release of VaultForge v0.4.0 either before or after adding support for Ripple transactions A revamp of the settings tab (currently it doesn’t do anything) Support for Zcash
Devlog #11 What a MASSIVE PR and it’s finally merged ! Hooray! That was the biggest PR I’ve ever created by a big margin. Now I can finally start work on actual features like more support for different blockchains, address types, random extra features that certain chains have… the list goes on. I already have a personal list of 25 different blockchains that I want to add support for, most of which aren’t in the project roadmap simply for the reason that it would make the file overly long and hard to read. * sigh * that will take a long time Not to underestimate what I added with the PR, though - I didn’t spend like 15 hours and do 48 commits for nothing: inside the PR I added Onboarding! 🎊 Lots of (at least in the future) common settings will be selected here to set up your wallet. You can already import an existing wallet or generate a new one (both accept 12, 15, 18, 21, and 24-word recovery phrases) and set an auto-lock timeout and select networks you want or don’t want. Finally, there is also the option to select a theme if you want. New and more prominent splash screen when loading the application. The application itself is super fast so it takes barely any time but to make it look cooler I’ve set a minimum time to display it for to 650 ms. Icons throughout the application to make it look better. Let you copy addresses in the sidebar with one click and list all enabled addresses, not just Ethereum. Squashed some more small UI bugs, especially relating to scrolling in different parts of the application. Although slightly unrelated to the theme of the PR, MUCH better refresh logic and handling. It now respects network selection choices (like the ones you want or don’t want that you selected during onboarding) and tells you exactly which network’s RPC request encountered errors. Perhaps ironically, this was literally the reason I fixed an issue with the Solana RPC. Before this update, it never actually refreshed the balance correctly so it wasn’t working. However, after this change, I was able to identify that the issue was not on my end (yay!) but was actually PublicNode ’s (the RPC I’m using for the majority of chains in this project for consistency, apart from Monad and now Solana) as I assumed it could fetch the user’s token accounts but it couldn’t so I had to switch to using the official Solana RPC which fixed the issue. For anyone who got lost somewhere in the previous paragraph, an RPC is a service that allows you to query data about the state of the blockchain (where crypto transactions are stored) so you can use it to see how much crypto you are holding. Token accounts are basically a weird quirk of Solana where your main account is used to hold Solana which links to associated token accounts (ATAs) , which each hold one token other than Solana. This is by far not a complete list but rather a list of the highlights of this PR; if you want to look at all the changes, please feel free to visit the page linked at the top of this devlog. That said, after this big change, I did say last devlog that I would be getting ready to release version v0.4.0 of this application which is exactly what I will do after adding Tron token support! Quick reminder, after v0.4.0 I am planning to add Ripple (XRP) support, preliminary (meaning like non-shielded probably) support for Zcash and revamp the settings page like I did to the onboarding in this PR. Further out, I will probably focus some more on the in-application swaps to aggregate data from major DEXs (decentralized exchanges) to get the best rates, matching other major wallets w/ more chain support, which would make my wallet actually competitive. 🤞
Devlog #12 Quite a bit more to report this time! Since last devlog, I’ve mostly been working on improving actual wallet functionality, fixing some smaller UI issues, and looking into performance. Recent changes Below is a quick summary of what I’ve been working on since the last devlog: Full TRC-20 token support is here! 🎊 Tron is no longer limited to just native TRX transfers, and the token validation/network logic has been updated to support TRC-20 tokens as well. Significantly improved Bitcoin support by adding proper BIP84 account discovery . VaultForge now scans both receive and change addresses, tracks which UTXOs belong to which derived addresses, signs each input with the correct derived key, and refreshes discovery before sending. Anecdote: I use Brave Wallet which did the receive and change addresses thing so my funds didn’t show up in previous versions of VaultForge. However, as of this update, I now am. Wallet unlocking now feels much faster ! Cached balances/prices are shown immediately while fresh data refreshes in the background. Improved asset cards so they show which network an asset belongs to . Assets worth less than $1 are now hidden from the portfolio/assets view unless VaultForge does not have price data for them. Fixed a few UI issues, including dashboard scrolling, refresh errors, escaping asset data (aka preventing XSS) , and copying the currently selected wallet address. Converted the remaining .js config files to TypeScript because apparently I cannot resist refactoring things even when it makes no difference whatsoever. For the first time in this series of devlogs, I’m linking the changes to relevant commits on GitHub wherever possible so you can have a look. Performance improvements I also found a few ways to reduce VaultForge’s roughly 10s full refresh time: Cached unlock (mentioned above): perceived unlock time is now closer to ~1–3s, although balances/prices can still take around the same amount of time to fully refresh in the background. Reuse HTTP clients: should save roughly ~0.2-1.5s by reusing connections. Concurrent provider calls: likely the biggest improvement, potentially bringing a ~10s refresh down to ~3–5s. Refresh prices separately: could make fresh balances appear another ~0.5–2s sooner. Derive Argon2 once: should save roughly a few hundred ms to ~1s on cold unlocks. The above estimated perf improvements are obviously quite variable and depend on a multitude of factors (+ I got ChatGPT to analyze my current code to make an estimate because how else would I do it), but there is definitely still a lot of low-hanging fruit here. Upcoming features Actual settings are still the elephant in the room 😭, so I definitely need to get around to those but since I think this may need a big PR a bit like the previous style improvements, I think I will do this after v0.4.0 (so therefore for v0.5.0 ). Ripple (XRP) support (at least for native token transfers), planned for v0.4.0 . Zcash (ZEC) support: I’ve got a feeling this one will take quite some time so at most I will implement transparent <=> transparent transactions before next release but will have to see. The remaining performance improvements mentioned above.
Devlog #13 I finally added different currencies ! Before, all prices were displayed in USD and now they can display in any of the below currencies: USD ($) EUR (€) GBP (£) JPY (¥) Shoutout to the fantastic API I used for this! Previously, I fetched CoinGecko pricing data which came in USD but I needed to convert this data into whatever currency the user chose so I had to find an API. However, there really weren’t any good forex APIs that were free with no rate limits when I searched for one so I turned to ChatGPT to find one and find one it did. This API gives daily central bank rates and even has data going back to 1948 on 201 currencies which is more than enough for this project. I also added the second performance improvement : caching the HTTP request client object to avoid having to recreate it on every API request. As of rn the project roadmap for the near future is this: Finish perf improvements Add basic Ripple (XRP) transaction support Maybe add transparent <=> transparent pool transaction support for Zcash (ZEC) Release VaultForge v0.5.0
Devlog #14 Not very much since last time; just some refactors and small improvements throughout. You can kind of tell by all the fix/chore/docs changes… btw improved settings is in the works - I think I’ll do some more progress over the next two days, then some actual chain support for Ripple. I’ve decided that I will release v0.4.0 before adding basic Zcash support as it’s been basically a month since last release and I don’t want to keep you guys waiting for those of you who want to download the binaries directly w/o building. Quick summary Now –> ~5 September: settings improvements 5 September –> 7 September: Ripple support 7/8 September: release of VaultForge v0.4.0
Devlog #15 Since the last devlog, I’ve worked on some more boring stuff: Tauri cleanup and desktop-specific improvements. I moved the application setup and command registration from src-tauri/src/main.rs into a new src-tauri/src/lib.rs . This keeps the entry point organized and follows Tauri’s recommended structure, while main.rs now only launches the library. I also replaced the browser clipboard API with Tauri’s native clipboard manager plugin. Copy buttons now use the desktop clipboard integration. Finally, VaultForge now enforces a single-instance window. If the app is launched while another instance is already open, the new launch focuses the existing main window instead of opening a second copy, which is far more desirable of a behaviour imo as it lets a user find a window without inadvertently opening even more. Plus some more random stuff: I now sign off all my commits As of today (4th of September), I also sign all my commits with a PGP key to verify all commits are made on my laptop and not by someone who hacked my GitHub account or smth - this is definitely overkill but why not Next, I’m continuing the settings improvements before moving on to Ripple support. P.S. I also randomly moved to Neovim as it looks much better than VS Code.
Devlog 16 sorry guys, i’m kind of late on this one tbh: I said that I would have the settings improvements, ripple support and all that ready by like monday but clearly nothing has happened since like the weekend. i have decided to delay the timleine by about a week as after some careful consideration I found it was wayyy too aggressive and my fingers can’t keep up with the typing speed i would need for that :) i seriously have no idae whatsoever why I thought it was possible to add that many features in such a short space of time. I know it kind of is but I have school now which means i have much less time for this with homework and studying and stuff. however, today I decided to lock in and actually do this and so I can assure you that i am hard at work doing the settings stuff rn and ripple support is absolutely coming right after that this next release really is going to be a big one… p.s. i attached a screenshot of some of the new commits i worked on (more are coming soon)
Devlog 17 perf improvement #3 done! 🎊 now refreshes are fully concurrent, w/ a limit of 4 requests at a time to avoid rate limiting. i haven’t fully tetsed it yet but it feels noticeably faster (like 25-35% faster) until the updated prices & balances are shown. plus, I kind of finished the settings stuff so i’ll be working on ripple support ig…
Devlog 18 i finished all the perf improvements! there was one that i left out though bc it probably wouldn’t have helped much in terms of performance and would have been a pain to implement. i am FINALLY going to move on to ripple support for the next few days…
Devlog 19 still cooking on the ripple support… i think i will be done by friday.
Devlog 20 so i finally added ripple support… and migrated everything to React for a much better, cleaner UI. and as always, i am late again. i actually could have finished on friday but i had other things to do (like homework) and i also wanted to migrate to react as well since I decided this will be my last release before the end of stardance, so i really want to add everything i can. this is because after stardance i will take a break of a few months on this project and then come back with a different hack club ysws challenge. the react migration was so big that i decided to use AI this time: the finished App.tsx file containing the react code is over 3090 lines of code (proof is the 2nd attached image)! that’s the largest code file i have ever worked on. since this is a huge change to the ui, i decided to create some before and after comparisons below. anyways, i decided to share some design decisions relating to the migration to react. i knew react was a big framework so it would add a few MB to the app’s file size (about 1-2 MB as of my recent testing) but the app itself is tiny anyway - not even 30 MB - so i thought it was really worth it. it gives you design consistency, more so than tailwindcss, which i needed since the more fun part for me was working on the backend and not the frontend (the user-facing part of the application). plus, the guys who work at coinbase (shoutout to them) made a goated plugin/theme/whatever you call it for react which makes my app have the default coinbase theme that i can tweak (i made the font monospace) which is alone like 70% of the stuff needed for the migration. i promise i will release v0.4.0 tomorrow…
Devlog 21 as promised, VaultForge v0.4.0 is out! this brings huge changes to wallet unlock speed, adds ripple support, adds BIP-84 addresses, and loads more. here is the link to the release page if you want to check it out. some interesting stats: there was an increase of >6,000 lines of code which is a more than 50% increase since v0.3.0 . 132 commits since last release. this is probably going to be my second-to-last devlog as i really want to hit the 100-hour mark.
Devlog 22 since the deadline for stardance has been extended by one month, i decided to keep going and make VaultForge as good as possible over the coming weeks. here’s a quick overview of what i will focus on next: actual swapping, and integration with multiple DEXes (think Jupiter, NEAR Intents, Uniswap, etc.) a better activity view token and chain icons! makes it much easier to differentiate between assets general performance and UI improvements with these new features, especially the integrated swapping, my wallet is finally going to be on par (mostly) with established wallets such as metamask. i’ve already got like 10+ commits since the last release that i will merge to main branch soon…
Devlog 23 15 new commits pushed to main ! still cooking on the integrated swapping support… sorry this is a short devlog; i’m more focused on the coding rn and will post when i’ve done something more substantial.
Devlog 24 - adding support for swapping after absolutely grinding on the support for swapping for the past week, here are some updates: 12 commits coming to main soon, about half bug fixes 4/10 things completed that i think are required for adding swapping support (more info below) i’ve also decided on a rough implementation order of swapping-related functionality: CCTP v2 transfers (basically moving USDC stablecoins across chains) Uniswap DEX (the biggest Decentrallized EXchange) Jupiter DEX ( the biggest dex on Solana) NEAR Intents (a cross-chain DEX) LI.FI aggregator (basically tells the walet the best market rates) i know this is kind of an ambitious timeline but i think i can pull it all off before the end of stardance on the 31st of october 🤞. i think i will manage to get CCTP transfers working by friday or sunday, depending on how much time i have.
Devlog 25 - some progress on the swapping i haven’t had much time in the last few days but i managed to do a big refactor to make the code more modular and cleaner. this is needed so that i can do more complex transactions instead of just basic transfers. i haven’t pushed it to main or committed it yet but it’s basically done. in terms of when CCTP support will ship, I think it will be by the end of sunday.
Devlog 26 unfortunately, it’s taking longer than i would like to add the swapping and CCTP functionality. i would say i’m about 80% there, but there are quite a few things that i have to think about and as such, i think i will get it working by tomorrow (tuesday). stay tuned! 👀
Devlog 27 - CCTP support is here… in like 30 minutes hang tight, it’s coming soon 🚀 i attached some proof , you guys can check out the transaction here more info on this tomorrow after v0.5.0 comes out with the CCTP support. you haven’t seen nothing yet, uniswap support coming next; stay tuned! probably coming in the next week or so…
Devlog 28 - coin icons! it finally looks sooo professional now… just look at those icons! they will also appear in the send and transfer (soon to be swap!) tabs over the coming days. uniswap dex integration is still the top priority though. 🫡 before there weren’t any (they were just grey) and every wallet has them so i made it better ig
Devlog 29 - more coin icons! specifically for AAVE, Chainlink (LINK), and Uniswap (UNI).
Devlog 30 - support for swapping (finally!) this took so long!!! i thought i would be done last friday but ig that was overly optimistic… there are still some small things i will fix/improve to make the experience a bit smoother in the coming days. Implementation so i added uniswap support for all supported evm chains; however only for same-chain transactions and only through one pool. this is suboptimal so i want to add cross-chain support and through multiple pools maybe in the future. to make it possible to do cross-chain swaps, i added Relay support (it’s an aggregator) were solvers compete to give a quote. the issue with this is that they charge quite a fee and so i really want to just use uniswap where possible. what’s next better uniswap integration (as mentioned above), plus support for solana potentially jupiter support (it’s a solana DEX) as it has really good rates and high liquidity.
Devlog 31 - swapping support for Solana! (partially) there’s now swapping support for solana, at least for DEX aggregators like LI.FI or Relay. i still need to figure out native solana DEX swapping on platforms like Jupiter…
Ships:
Fully functional, multi-chain (Bitcoin, EVM, and Solana support with more on the way) wallet. To test this project, please go to the GitHub repository linked to the project....
|
1792846338.507225
|
1792932738.507225
|
|
69806
|
Synth by @Himikle09 | Stardance
|
Himikle09
|
0
|
10.99
|
0
|
[]
|
[{"post_id": 81425, "ts": "202 [{"post_id": 81425, "ts": "2026-10-21T07:10:58Z", "hours": 4.1392, "text": "Completed pcb for the synth!"}, {"post_id": 81253, "ts": "2026-10-20T14:05:10Z", "hours": 4.0839, "text": "Further PCB/schematic designing. Footprints uploaded and now I just need to rearrange for the final PCB layout."}, {"post_id": 79842, "ts": "2026-10-15T16:26:15Z", "hours": 1.4472, "text": "making it physically. testing and looking for improvements."}, {"post_id": 79762, "ts": "2026-10-15T09:23:40Z", "hours": 1.3172, "text": "Planning Circuitry layout"}]...
|
Title: Synth by @Himikle09 | Stardance
Devlogs:
P Title: Synth by @Himikle09 | Stardance
Devlogs:
Planning Circuitry layout
making it physically. testing and looking for improvements.
Further PCB/schematic designing. Footprints uploaded and now I just need to rearrange for the final PCB layout.
Completed pcb for the synth!...
|
1792860474.9082906
|
1793465274.9082906
|
|
54044
|
Snap2Study by @akyadav | Stardance
|
akyadav
|
1
|
21.63
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T05:50:47Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Snap2Study, an AI-powered study tool that lets students gets answers to question by just clicking a picture of it rather than searching it on the internet. The most challenging parts in the projects were to build the AI analysis pipeline and security and authentication system for users. I’m proud that i built a fully working production-deployed product and helped students to remove the stressful part of searching answers to questions on the internet. To test Snap2Study: 1.Open snap2study.vercel.app 2.Create and verify account by using email and entering the OTP. 3.After log in, upload a picture of the question. 4.And view the AI-generated analysis of the question. 5.Open profile/history to see previously analyzed questions and its complete result and other points. And that’s all, you are done", "repo": "https://github.com/adityayadav0002/snap2study", "demo": "https://snap2study.vercel.app/"}]...
|
[{"post_id": 81426, "ts": "202 [{"post_id": 81426, "ts": "2026-10-21T07:12:55Z", "hours": 4.3436, "text": "Fixed Some minor bugs in the code."}, {"post_id": 59725, "ts": "2026-09-01T17:29:54Z", "hours": 5.2894, "text": "Devlog - 6 Rewrote the Entire Codebase of Snap2Study due to some reasons."}, {"post_id": 58671, "ts": "2026-08-31T05:37:57Z", "hours": 2.2697, "text": "Devlog - 5 Implemented full authentication/security system. Added email OTP signup/login. Added secure sessions, logout & auth state. Added question history storage & search. Added previous-result viewing."}, {"post_id": 58138, "ts": "2026-08-30T14:26:30Z", "hours": 3.9194, "text": "Devlog - 4 Launched to Production Mobile & desktop testing completed Fixed major issues Next Step: Database & authentication setup, Email OTP authentication, profiles, sessions, and question history only."}, {"post_id": 57260, "ts": "2026-08-29T11:27:15Z", "hours": 2.3711, "text": "Devlog - 3 Now i have finished major part, fixing major and multiple bugs. Completed results page, added perfect frontend display of answers, and fixed major turbopack build error."}, {"post_id": 56495, "ts": "2026-08-28T09:03:48Z", "hours": 2.7569, "text": "Snap2Study - Devlog #2 In the last update i have added UI. But now i have added AI analysis pipeline into it and basically an mvp is ready of it. However had to handle many errors while doing this but managed it to do. Next step is to add more features to it and fix major things.*"}, {"post_id": 55694, "ts": "2026-08-27T17:39:06Z", "hours": 1.1403, "text": "Devlog #1 I have started building Snap2Study, a simple platform that turns questions into a smoother study experience. Currently i have built UI, preview. This is just beginning. Soon I will add more features to it."}]...
|
Title: Snap2Study by @akyadav | Stardance
Devlogs Title: Snap2Study by @akyadav | Stardance
Devlogs:
Devlog #1 I have started building Snap2Study, a simple platform that turns questions into a smoother study experience. Currently i have built UI, preview. This is just beginning. Soon I will add more features to it.
Snap2Study - Devlog #2 In the last update i have added UI. But now i have added AI analysis pipeline into it and basically an mvp is ready of it. However had to handle many errors while doing this but managed it to do. Next step is to add more features to it and fix major things.*
Devlog - 3 Now i have finished major part, fixing major and multiple bugs. Completed results page, added perfect frontend display of answers, and fixed major turbopack build error.
Devlog - 4 Launched to Production Mobile & desktop testing completed Fixed major issues Next Step: Database & authentication setup, Email OTP authentication, profiles, sessions, and question history only.
Devlog - 5 Implemented full authentication/security system. Added email OTP signup/login. Added secure sessions, logout & auth state. Added question history storage & search. Added previous-result viewing.
Devlog - 6 Rewrote the Entire Codebase of Snap2Study due to some reasons.
Fixed Some minor bugs in the code.
Ships:
I built Snap2Study, an AI-powered study tool that lets students gets answers to question by just clicking a picture of it rather than searching it on the internet. The most challenging parts in the projects were to build the AI analysis pipeline and security and authentication system for users. I’m proud that i built a fully working production-deployed product and helped students to remove the stressful part of searching answers to questions on the internet. To test Snap2Study: 1.Open snap2study.vercel.app 2.Create and verify account by using email and entering the OTP. 3.After log in, upload a picture of the question. 4.And view the AI-generated analysis of the question. 5.Open profile/history to see previously analyzed questions and its complete result and other points. And that’s all, you are done...
|
1792846421.457738
|
1792932821.457738
|
|
33317
|
Geometry Manipulation Engine by @Lolo_berk | Stard Geometry Manipulation Engine by @Lolo_berk | Stardance...
|
Lolo_berk
|
0
|
12.53
|
0
|
[]
|
[{"post_id": 81428, "ts": "202 [{"post_id": 81428, "ts": "2026-10-21T07:42:31Z", "hours": 4.5975, "text": "Okay so within the past 4-ish days, I have added many new features! I coded the rendering and click behavior for the circle, triangle, and rectangle tools. Also, I’m using SVG to render my shapes. —————————————————————————––––––––––––––––––————One of the things I enjoyed most about coding the tools is actually the mathematical components I implemented. I had JavaScript calculate distance between points, slope along lines, side lengths and area for triangles and rectangles (later polygons), and I had it calculate radii + area for circles. I had a little fun with this since I got to use familiar equations we actually use in class such as area formulas like Heron’s formula for SSS triangles, slope formula, and used PI for circle area and circumference. ——————————————————————————————————————–—–Along with this though, there was definitely A LOT of debugging. After I coded each tool, I tested it and had to work around the click behavior failing to recognize the unique ID’s, and the SVG not rendering correctly. At one point my file was overwrote somehow and the only reason I was able to recover all my code from my triangle and rectangle tools was because of my web browser’s console tab. —————————————————————————————————————–––Anyway, I’m so excited to keep adding more visual tools to this and make the design come to life at the end! Oh and I also included a video below of me testing out the new tools."}, {"post_id": 79742, "ts": "2026-10-15T08:27:54Z", "hours": 1.5, "text": "Okay I updated the point tool in the engine and added my first line tool feature. Now selected points appear orange and larger, while previously made points remain blue and smaller. Along with this, I added the first version of the line tool feature where a segment can be made between 2 existing points that recognizes the unique endpoint IDs. More features and add-ons for the tools later this week!"}, {"post_id": 79471, "ts": "2026-10-14T05:23:59Z", "hours": 1.2653, "text": "Little mini update for today, this is a mockup design I made using Canva to model what I hope the final look for the geometry engine will look like! I did do some coding on it today however, it was more updating and debugging. I haven’t added any new focuses like transformations and interactive features for any of the shapes quite yet. I will get to that tomorrow. Let me know what you think of the mockup design tho!"}, {"post_id": 79243, "ts": "2026-10-13T05:48:15Z", "hours": 3.1419, "text": "Hi! There have been many changes since my last devlog of this project. I had a lot of trouble with the correct Pygame installation version syncing with my Python code, and I wanted to tweak parts of my code anyway, so I decided to restart and switch back to previous languages I had already worked with. That being CSS, HTML, and JavaScript. ————————————————————————————————————— This time instead of trying to render the entire engine at once (and in a single coding file), I made a list of things to focus on creating first that I’ll gradually edit and go back to update; also to ensure that the engine is actually interactive and working as I go. My focuses currently are: [Points, Lines, Circles, Rectangles, Triangles, Polygons, Transformations, Intersections, Distances + Angles (later), Coordinate plane, and Camera movement / zoom which will be later.]———————————————————————————————————–– Today I was able to successfully code the coordinate plane + window, top-bar and toolbar, selection types and a selection status below the toolbar, and interactive features with points. The status tool shows the point you made and its coordinates as well! It took a while for me to get the x and y axes to show up in the proper orientation, as well as the selection status tool to work, but I was able to debug both! I then spent some time in Canva designing a mock-up of what I want the final website to look like. It’s not much yet, but I’d say it’s definitely a big improvement from my last coding project!"}, {"post_id": 25768, "ts": "2026-07-10T06:59:34Z", "hours": 2.0239, "text": "Hi, for my second coding project I’ve decided to create a Geometry Manipulation Engine where you can create shapes and polygons and view them in 3D; and see the math behind each. —————————————————————————————————————————–So far, I’ve created the 2D sketch plane, which doesn’t look like much yet, but I’ll keep posting updates. Recently I added the camera, renderer, and loop the scene on top of the code for the basic shapes. ——————————————————————————————————————————I’m not sure yet if this will closely resemble an engine like GeoGebra, or a CAD design software, but my goal is to code a little geometry building space with simple mathematics behind it (angles, arc lengths, side lengths). I’m very excited to see what this project will look like finished! :))"}]...
|
Title: Geometry Manipulation Engine by @Lolo_berk Title: Geometry Manipulation Engine by @Lolo_berk | Stardance
Devlogs:
Hi, for my second coding project I’ve decided to create a Geometry Manipulation Engine where you can create shapes and polygons and view them in 3D; and see the math behind each. —————————————————————————————————————————–So far, I’ve created the 2D sketch plane, which doesn’t look like much yet, but I’ll keep posting updates. Recently I added the camera, renderer, and loop the scene on top of the code for the basic shapes. ——————————————————————————————————————————I’m not sure yet if this will closely resemble an engine like GeoGebra, or a CAD design software, but my goal is to code a little geometry building space with simple mathematics behind it (angles, arc lengths, side lengths). I’m very excited to see what this project will look like finished! :))
Hi! There have been many changes since my last devlog of this project. I had a lot of trouble with the correct Pygame installation version syncing with my Python code, and I wanted to tweak parts of my code anyway, so I decided to restart and switch back to previous languages I had already worked with. That being CSS, HTML, and JavaScript. ————————————————————————————————————— This time instead of trying to render the entire engine at once (and in a single coding file), I made a list of things to focus on creating first that I’ll gradually edit and go back to update; also to ensure that the engine is actually interactive and working as I go. My focuses currently are: [Points, Lines, Circles, Rectangles, Triangles, Polygons, Transformations, Intersections, Distances + Angles (later), Coordinate plane, and Camera movement / zoom which will be later.]———————————————————————————————————–– Today I was able to successfully code the coordinate plane + window, top-bar and toolbar, selection types and a selection status below the toolbar, and interactive features with points. The status tool shows the point you made and its coordinates as well! It took a while for me to get the x and y axes to show up in the proper orientation, as well as the selection status tool to work, but I was able to debug both! I then spent some time in Canva designing a mock-up of what I want the final website to look like. It’s not much yet, but I’d say it’s definitely a big improvement from my last coding project!
Little mini update for today, this is a mockup design I made using Canva to model what I hope the final look for the geometry engine will look like! I did do some coding on it today however, it was more updating and debugging. I haven’t added any new focuses like transformations and interactive features for any of the shapes quite yet. I will get to that tomorrow. Let me know what you think of the mockup design tho!
Okay I updated the point tool in the engine and added my first line tool feature. Now selected points appear orange and larger, while previously made points remain blue and smaller. Along with this, I added the first version of the line tool feature where a segment can be made between 2 existing points that recognizes the unique endpoint IDs. More features and add-ons for the tools later this week!
Okay so within the past 4-ish days, I have added many new features! I coded the rendering and click behavior for the circle, triangle, and rectangle tools. Also, I’m using SVG to render my shapes. —————————————————————————––––––––––––––––––————One of the things I enjoyed most about coding the tools is actually the mathematical components I implemented. I had JavaScript calculate distance between points, slope along lines, side lengths and area for triangles and rectangles (later polygons), and I had it calculate radii + area for circles. I had a little fun with this since I got to use familiar equations we actually use in class such as area formulas like Heron’s formula for SSS triangles, slope formula, and used PI for circle area and circumference. ——————————————————————————————————————–—–Along with this though, there was definitely A LOT of debugging. After I coded each tool, I tested it and had to work around the click behavior failing to recognize the unique ID’s, and the SVG not rendering correctly. At one point my file was overwrote somehow and the only reason I was able to recover all my code from my triangle and rectangle tools was because of my web browser’s console tab. —————————————————————————————————————–––Anyway, I’m so excited to keep adding more visual tools to this and make the design come to life at the end! Oh and I also included a video below of me testing out the new tools....
|
1792777798.8445408
|
1793382598.8445408
|
|
70755
|
BetterW4 by @JohannesNeighbourhood | Stardance
|
JohannesNeighbourhood
|
0
|
13.29
|
0
|
[]
|
[{"post_id": 81433, "ts": "202 [{"post_id": 81433, "ts": "2026-10-21T08:33:12Z", "hours": 13.2872, "text": "Made the app, uploaded it to the app store and distributed it to the 84 students who use IOS!"}]...
|
Title: BetterW4 by @JohannesNeighbourhood | Starda Title: BetterW4 by @JohannesNeighbourhood | Stardance
Devlogs:
Made the app, uploaded it to the app store and distributed it to the 84 students who use IOS!...
|
1792572454.686937
|
1793177254.686937
|
|
70759
|
Betterlectio by @JohannesNeighbourhood | Stardance
|
JohannesNeighbourhood
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T08:45:30Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I worked on a small part of a big project, that was based on a previous project of mine and @jonbng . A big part was understanding the codebase and the systems already setup.", "repo": "https://github.com/jonbng/betterlectio-android/", "demo": "https://betterlectio.dk/"}]...
|
[{"post_id": 81434, "ts": "202 [{"post_id": 81434, "ts": "2026-10-21T08:40:21Z", "hours": 2.5947, "text": "Worked on the admin dashboard, added several features including growth and a SoMe Insight!"}]...
|
Title: Betterlectio by @JohannesNeighbourhood | St Title: Betterlectio by @JohannesNeighbourhood | Stardance
Devlogs:
Worked on the admin dashboard, added several features including growth and a SoMe Insight!
Ships:
I worked on a small part of a big project, that was based on a previous project of mine and @jonbng . A big part was understanding the codebase and the systems already setup....
|
1792860471.4781897
|
1792946871.4781897
|
|
61389
|
FrictionHub by @Dev_L_K | Stardance
|
Dev_L_K
|
6
|
34.0
|
302
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T09:31:41Z", "hours": 6.0, "multiplier": 9.66, "payout": 62, "blessing": "neutral", "text": "FrictionHub FrictionHub is a small collection of Quality of Life improving miniweb tools made with html css and js only. Added PWA setup to the website Go to https://frictionhub.devlkakkoth.me In the browser settings click Addto homescreen Then click Install . the PWA will be installed to your home screen Features CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code World Clock Check and analyse the world time and time differnce between zones. Typing speed checker Measure your word per minute using this sub app. Typing is a big support to devlopers. Daily Planner Helpful to those who dont memorize important things. mark as completed when each plan is done Please read my recent Devlog my this ship was completely gone! Due to many reasons I have explained them in my devlogs please read that. While working with the world clock sub app I even lost all my 45 min code and I had to rewrite it. I am being honest that I hasn’t tried to fraud hackatime. I am completely proud of me that since my last ship i am here after long days before cause I was very busy in improving my js and logics. You can see the difference I have made in my js since last ship Thank you. Thsi one is the same copy of my README.md And I have made some changes here.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 2, "ts": "2026-10-10T16:54:12Z", "hours": 6.0, "multiplier": 10.96, "payout": 63, "blessing": "neutral", "text": "FrictionHub This is a multifunctional web app. Which has many differt purpose tools that can improve the QOL It has a newly added PWA setup. Go to FrictionHub Go to browser options and click on Add to Homescreen In the pop up click Install to install the PWA to your home screen. Works on both Laptops and mobile phones Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code. If u find this helpful please give better ratings. Thankyou for rating my project.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 3, "ts": "2026-10-08T10:16:22Z", "hours": 4.0, "multiplier": 15.51, "payout": 56, "blessing": "neutral", "text": "FrictionHub This is a small web app made by me to reduce our digital friction. It contains many tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 4, "ts": "2026-09-27T01:39:34Z", "hours": 1.0, "multiplier": 4.25, "payout": 4, "blessing": "neutral", "text": "FrictionHub A multifunctional web app with many utitility tools. Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 5, "ts": "2026-09-26T01:32:25Z", "hours": 8.0, "multiplier": 12.36, "payout": 97, "blessing": "neutral", "text": "FrictionHub A multimedia web app with many QOL improving tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning.(Uses external js) text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. None of ur data never leaves your browser", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}, {"ship_num": 6, "ts": "2026-09-13T11:04:47Z", "hours": 9.0, "multiplier": 4.31, "payout": 20, "blessing": "neutral", "text": "Friction Hub A collection of light weight web tools that can improve the QOL. It has 5 sub apps. None of your data entered here never leaves your device Storage - local storage Pdf generaton gode was a little hard to understand. Others were quite simple. It will help u improve your digital life. No direct use of ai just used ai to rectify errors and understanding ideologies.", "repo": "https://github.com/dev-l-k/FrictionHub", "demo": "https://frictionhub.devlkakkoth.me"}]...
|
[{"post_id": 81439, "ts": "202 [{"post_id": 81439, "ts": "2026-10-21T09:19:34Z", "hours": 2.3631, "text": "Hey all I have completed the work for the next ship. I wants some stardust now so I am gonna ship it now. New feature Daily planner You can add tasks and plan your day. And when each task is completed mark it as complete. i didnt used the exact same css. This time I decided to include more and write my self. if u notice the changes in the js of my first ship and the new one Yay! I have made a large improvement in my js i am very proud of it. Until my last ship i targeted to improve js. So I didn’t get time to code efficiently I am very proud of my improvement in js. Plss rate my project"}, {"post_id": 81180, "ts": "2026-10-20T06:19:27Z", "hours": 1.9072, "text": "Devlog after a long time I am back with my Devlog Now I have created a new sub app to frictionHub It’s is Typing Speed Checker If u just check the js it was quite too hard to figure out the logics. So I had to redo the same code by fixing errors(logical). Butit is one of the best html apps I have made. Html and css was very simple but the js was just harder than I have ever experienced. If u guys wants to try it out Plss check here https://FrictionHub.devlkakkoth.me/typing"}, {"post_id": 80426, "ts": "2026-10-17T16:31:40Z", "hours": 2.1608, "text": "Guys I am back with coding again I am back all I have added a new sub app world clock First of all I am being honest to all the Stardance reviewers. Reviewers might seem my project code time as inflated because. My sister just deleted all my code and clicked save. I lost all and i had to rewrite the codes again. So please don’t ban me as spamming hackatime. I am coding in my mobile phone I don’t have a laptop. So I can’t do undo plss this is a request. I am coding through termux along with code-server World clock It is a small mini app withalmost 15+ timezones to track current time. If u are offline u can use pwa."}, {"post_id": 78371, "ts": "2026-10-10T16:17:40Z", "hours": 1.3331, "text": "Devlog Added new app CSS Gradient Generator Uses simple js logics Select Degree ,2 colors and type and it will generate the gradient Instantly copy the code Live at Click me"}, {"post_id": 78334, "ts": "2026-10-10T14:01:19Z", "hours": 1.8939, "text": "Devlog FrictionHub I now worked mainly on my new sub app dictionary. It uses public dictionary APIs to get data Writing the code was much harder. I neededto use ai to format them correctly and to find my errors. It is currently live on Click Me"}, {"post_id": 78266, "ts": "2026-10-10T06:47:13Z", "hours": 1.8833, "text": "Devlog FrictionHub Now I have added a new app called pomodaro timer it helps to focus complete take breaks and achieve your goals. Huge update Added PWA support to the website Click add to home screen from your browser to add as PWA I am sorry because I used dir GitHub to add pwa code and its code was written with help of AI. The icon was generated by me using inshot. Ai not used Check here Click me"}, {"post_id": 78123, "ts": "2026-10-09T17:04:30Z", "hours": 0.5994, "text": "Devlog Updated home screen Now it has 4 sections Text tools Dev tools everyday utilities discover Check it out Click here"}, {"post_id": 77792, "ts": "2026-10-08T09:18:02Z", "hours": 1.2572, "text": "Devlog RecipeHub Powered by TheMealDb includes many recipes from all over the world. A simple project Live at Click here"}, {"post_id": 76720, "ts": "2026-10-04T12:31:07Z", "hours": 0.9842, "text": "Devlog FrictionHub Added new sub app Book Finder Search and find details of millions of books Works using openlibrary api. Live at https://frictionhub.devlkakkoth.me/Book"}, {"post_id": 76660, "ts": "2026-10-04T09:16:15Z", "hours": 1.3586, "text": "Devlog FrictionHub After a long time I started working New app - Base64 converter Features encode an decode images and texts to base 64 helpful for coder"}, {"post_id": 74242, "ts": "2026-09-27T01:35:23Z", "hours": 1.0253, "text": "Devlog FrictionHub Added Code formatter app. Format and clean codes html css and js and python supported Live at https://frictionhub.devlkakkoth.me/code"}, {"post_id": 73801, "ts": "2026-09-26T01:26:42Z", "hours": 0.9319, "text": "Devlog Added color converter convert colors to hex RGB and hsl Updated readme.md Live at https://frictionhub.devlkakkoth.me/color"}, {"post_id": 73790, "ts": "2026-09-26T00:20:05Z", "hours": 0.7061, "text": "Devlog FrictionHub Find and replace Find and replace texts in a large paragraph Live at https://frictionhub.devlkakkoth.me/replace"}, {"post_id": 73673, "ts": "2026-09-25T17:23:56Z", "hours": 0.8936, "text": "Devlog FrictionHub Added currency exchanger sub app uses frankfurter api to get realtime currency exchange rates. Live at https://frictionhub.devlkakkoth.me/currency"}, {"post_id": 73629, "ts": "2026-09-25T15:17:15Z", "hours": 1.2483, "text": "Devlog FrictionHub Weather dashboard Check weather and forecasts of any place using the open meteo api Added clock too Live at https://frictionhub.devlkakkoth.me/weather"}, {"post_id": 73384, "ts": "2026-09-25T01:30:46Z", "hours": 0.8211, "text": "Devlog FrictionHub JSON Formatter Format and minify json codes Added copy feature Live at https://frictionhub.devlkakkoth.me/jsonformatter"}, {"post_id": 73357, "ts": "2026-09-24T23:59:56Z", "hours": 0.5275, "text": "Devlog FrictionHub URL cleaner Remove tracking parameters and other unwanted datas from urls. Added load demo Live at https://frictionhub.devlkakkoth.me/urlcleaner"}, {"post_id": 73238, "ts": "2026-09-24T17:13:04Z", "hours": 0.6617, "text": "DevLog FrictionHub New app added Qr code generator uses simple qr code js library to generate QR code and download it as png. check live at https://frictionhub.devlkakkoth.me/qrcode"}, {"post_id": 72928, "ts": "2026-09-24T01:49:53Z", "hours": 1.4289, "text": "Devlog FrictionHub After a long time I started coding again on friction Hub Now I have added text difference finder sub app You can easily find text difference quick and fast jst pure js logics. Check here https://frictionhub.devlkakkoth.me/textdiff"}, {"post_id": 67741, "ts": "2026-09-13T23:45:05Z", "hours": 0.5972, "text": "Devlog FrictionHub Made some changes in the css and rewrite the complete readme correctly."}, {"post_id": 67276, "ts": "2026-09-13T10:51:10Z", "hours": 0.4733, "text": "Devlog FrictionHub Completed project Ready to ship Now live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67262, "ts": "2026-09-13T10:15:23Z", "hours": 1.3436, "text": "Devlog 6 FrictionHub Shopping list add items to your cart and download PDFs Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67184, "ts": "2026-09-13T07:45:30Z", "hours": 1.0269, "text": "Devlog 5 FrictionHub Case Converter convert the cases of any type of texts Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67129, "ts": "2026-09-13T06:02:15Z", "hours": 1.4153, "text": "Devlog 4 FrictionHub Text cleaner convert messy texts into clean ones helps to avoid unwanted spaces duplicate lines etc Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 67007, "ts": "2026-09-13T01:31:41Z", "hours": 1.4203, "text": "Devlog 3 FrictionHub Password Generator(sub app) You can generate 100% secure and unique passwords and copy them and save with no effort. Your password or any thing don’t leaves your device Used HTML CSS JS Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 66728, "ts": "2026-09-12T16:54:14Z", "hours": 1.6175, "text": "Devlog2 FrictionHub CopyBoard(sub app) A place where u can save texts and fast access and copy it Completed it’s html structure css styles and js logics it doesn’t use any external database your data never leaves the browser Live at https://frictionhub.devlkakkoth.me"}, {"post_id": 66652, "ts": "2026-09-12T14:41:20Z", "hours": 1.7111, "text": "Devlog 1 FrictionHub Home Page added home page to the project debugged it’s errors. Try at https://frictionhub.devlkakkoth.me"}]...
|
Title: FrictionHub by @Dev_L_K | Stardance
Devlog Title: FrictionHub by @Dev_L_K | Stardance
Devlogs:
Devlog 1 FrictionHub Home Page added home page to the project debugged it’s errors. Try at https://frictionhub.devlkakkoth.me
Devlog2 FrictionHub CopyBoard(sub app) A place where u can save texts and fast access and copy it Completed it’s html structure css styles and js logics it doesn’t use any external database your data never leaves the browser Live at https://frictionhub.devlkakkoth.me
Devlog 3 FrictionHub Password Generator(sub app) You can generate 100% secure and unique passwords and copy them and save with no effort. Your password or any thing don’t leaves your device Used HTML CSS JS Live at https://frictionhub.devlkakkoth.me
Devlog 4 FrictionHub Text cleaner convert messy texts into clean ones helps to avoid unwanted spaces duplicate lines etc Live at https://frictionhub.devlkakkoth.me
Devlog 5 FrictionHub Case Converter convert the cases of any type of texts Live at https://frictionhub.devlkakkoth.me
Devlog 6 FrictionHub Shopping list add items to your cart and download PDFs Live at https://frictionhub.devlkakkoth.me
Devlog FrictionHub Completed project Ready to ship Now live at https://frictionhub.devlkakkoth.me
Devlog FrictionHub Made some changes in the css and rewrite the complete readme correctly.
Devlog FrictionHub After a long time I started coding again on friction Hub Now I have added text difference finder sub app You can easily find text difference quick and fast jst pure js logics. Check here https://frictionhub.devlkakkoth.me/textdiff
DevLog FrictionHub New app added Qr code generator uses simple qr code js library to generate QR code and download it as png. check live at https://frictionhub.devlkakkoth.me/qrcode
Devlog FrictionHub URL cleaner Remove tracking parameters and other unwanted datas from urls. Added load demo Live at https://frictionhub.devlkakkoth.me/urlcleaner
Devlog FrictionHub JSON Formatter Format and minify json codes Added copy feature Live at https://frictionhub.devlkakkoth.me/jsonformatter
Devlog FrictionHub Weather dashboard Check weather and forecasts of any place using the open meteo api Added clock too Live at https://frictionhub.devlkakkoth.me/weather
Devlog FrictionHub Added currency exchanger sub app uses frankfurter api to get realtime currency exchange rates. Live at https://frictionhub.devlkakkoth.me/currency
Devlog FrictionHub Find and replace Find and replace texts in a large paragraph Live at https://frictionhub.devlkakkoth.me/replace
Devlog Added color converter convert colors to hex RGB and hsl Updated readme.md Live at https://frictionhub.devlkakkoth.me/color
Devlog FrictionHub Added Code formatter app. Format and clean codes html css and js and python supported Live at https://frictionhub.devlkakkoth.me/code
Devlog FrictionHub After a long time I started working New app - Base64 converter Features encode an decode images and texts to base 64 helpful for coder
Devlog FrictionHub Added new sub app Book Finder Search and find details of millions of books Works using openlibrary api. Live at https://frictionhub.devlkakkoth.me/Book
Devlog RecipeHub Powered by TheMealDb includes many recipes from all over the world. A simple project Live at Click here
Devlog Updated home screen Now it has 4 sections Text tools Dev tools everyday utilities discover Check it out Click here
Devlog FrictionHub Now I have added a new app called pomodaro timer it helps to focus complete take breaks and achieve your goals. Huge update Added PWA support to the website Click add to home screen from your browser to add as PWA I am sorry because I used dir GitHub to add pwa code and its code was written with help of AI. The icon was generated by me using inshot. Ai not used Check here Click me
Devlog FrictionHub I now worked mainly on my new sub app dictionary. It uses public dictionary APIs to get data Writing the code was much harder. I neededto use ai to format them correctly and to find my errors. It is currently live on Click Me
Devlog Added new app CSS Gradient Generator Uses simple js logics Select Degree ,2 colors and type and it will generate the gradient Instantly copy the code Live at Click me
Guys I am back with coding again I am back all I have added a new sub app world clock First of all I am being honest to all the Stardance reviewers. Reviewers might seem my project code time as inflated because. My sister just deleted all my code and clicked save. I lost all and i had to rewrite the codes again. So please don’t ban me as spamming hackatime. I am coding in my mobile phone I don’t have a laptop. So I can’t do undo plss this is a request. I am coding through termux along with code-server World clock It is a small mini app withalmost 15+ timezones to track current time. If u are offline u can use pwa.
Devlog after a long time I am back with my Devlog Now I have created a new sub app to frictionHub It’s is Typing Speed Checker If u just check the js it was quite too hard to figure out the logics. So I had to redo the same code by fixing errors(logical). Butit is one of the best html apps I have made. Html and css was very simple but the js was just harder than I have ever experienced. If u guys wants to try it out Plss check here https://FrictionHub.devlkakkoth.me/typing
Hey all I have completed the work for the next ship. I wants some stardust now so I am gonna ship it now. New feature Daily planner You can add tasks and plan your day. And when each task is completed mark it as complete. i didnt used the exact same css. This time I decided to include more and write my self. if u notice the changes in the js of my first ship and the new one Yay! I have made a large improvement in my js i am very proud of it. Until my last ship i targeted to improve js. So I didn’t get time to code efficiently I am very proud of my improvement in js. Plss rate my project
Ships:
Friction Hub A collection of light weight web tools that can improve the QOL. It has 5 sub apps. None of your data entered here never leaves your device Storage - local storage Pdf generaton gode was a little hard to understand. Others were quite simple. It will help u improve your digital life. No direct use of ai just used ai to rectify errors and understanding ideologies.
FrictionHub A multimedia web app with many QOL improving tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning.(Uses external js) text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. None of ur data never leaves your browser
FrictionHub A multifunctional web app with many utitility tools. Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat.
FrictionHub This is a small web app made by me to reduce our digital friction. It contains many tools Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items
FrictionHub This is a multifunctional web app. Which has many differt purpose tools that can improve the QOL It has a newly added PWA setup. Go to FrictionHub Go to browser options and click on Add to Homescreen In the pop up click Install to install the PWA to your home screen. Works on both Laptops and mobile phones Tools CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code. If u find this helpful please give better ratings. Thankyou for rating my project.
FrictionHub FrictionHub is a small collection of Quality of Life improving miniweb tools made with html css and js only. Added PWA setup to the website Go to https://frictionhub.devlkakkoth.me In the browser settings click Addto homescreen Then click Install . the PWA will be installed to your home screen Features CopyBoard Here you can save frequently used texts emails etc inside your browser storage Password Generator You can save 100% secure and random passwords. and save it in your browser storage. so if you forgot it you can retrive it again. Text Cleaner You can clean a large messy text by removing empty lines. unwanted spaces and more. Case Conveter Convert a large text into different cases like uppercase lowercase sentnce case etc… Shopping List Create and manage shopping lists and save them as PDF files. Color converter For html coders converting color codes are difficult. Find and replace Finding and replacing some texts from long paragraphs areuch boring stuff. Currency converter Buying items with international cards are very hard to find exhchange rates and converting qr code generator instead of sending urls using url we can enter sites using scanning. text difference finder finding small small differences in texts paragraphs are very boring url cleaner remove tracking ids and unwanted things from url. Weather dashboard find the weather of a city by searching simply. Code formatter Formats html css js and python codes clean and neat. Base 64 converter Convert images and texts into base64 and decode them too. BooksFinder Uses openlibrary api to find details of many books. RecipeFinder Uses themealdb api to find images and recipe to find food items Dictionary Uses Dictionary api to get meaning and other information about words ir phrases Pomodaro Timer Focus,take break and acheive your gols through pomodaro timer. CSS Gradient Generator Make CSS Gradients by selecting colors only and instantly copy the code World Clock Check and analyse the world time and time differnce between zones. Typing speed checker Measure your word per minute using this sub app. Typing is a big support to devlopers. Daily Planner Helpful to those who dont memorize important things. mark as completed when each plan is done Please read my recent Devlog my this ship was completely gone! Due to many reasons I have explained them in my devlogs please read that. While working with the world clock sub app I even lost all my 45 min code and I had to rewrite it. I am being honest that I hasn’t tried to fraud hackatime. I am completely proud of me that since my last ship i am here after long days before cause I was very busy in improving my js and logics. You can see the difference I have made in my js since last ship Thank you. Thsi one is the same copy of my README.md And I have made some changes here....
|
1792813837.1603749
|
1792900237.1603749
|
|
68313
|
MacOS but on web by @pmandal7355 | Stardance
|
pmandal7355
|
1
|
8.03
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-09T19:30:01Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made the copy /inspirational macos like web os and created majority of function and really like to share this, as my first web os using electron , i recommend download electron, zustand and", "repo": "https://github.com/itsprantik/MacOS/", "demo": "https://macosproject.vercel.app/"}]...
|
[{"post_id": 81450, "ts": "202 [{"post_id": 81450, "ts": "2026-10-21T10:28:15Z", "hours": 1.0317, "text": "made the readme again as stated by reviewers the readme is seemed to be ai"}, {"post_id": 78025, "ts": "2026-10-09T07:27:20Z", "hours": 0.8658, "text": "made the calendar app and made bugs fix and new css for safari and made about mac section"}, {"post_id": 77875, "ts": "2026-10-08T17:02:43Z", "hours": 2.4664, "text": "made the browser and news app and darkmode , calculator, clock app and switched to electron for browser dependencies as google Programmable Search Engine opens in new window which ruins the os , there is still some bugs on the safari app and layout bugs which will be fixed"}, {"post_id": 77791, "ts": "2026-10-08T09:17:40Z", "hours": 1.0428, "text": "made the widgets draggable and user friendly adeed a terminal with git controls and settings page with working brightness control , sound and finder . the project will be completed within 1 to 2 days"}, {"post_id": 77767, "ts": "2026-10-08T06:18:34Z", "hours": 0.8544, "text": "made the desktop and the task bar with icons , now only the music player is made and the control centre the widgets are non movable and non removable, need to be fixed"}, {"post_id": 77609, "ts": "2026-10-07T16:41:15Z", "hours": 1.0089, "text": "made the full bottloading screen and the login page , it doesnt nedd password to keep it available for everyone"}, {"post_id": 77530, "ts": "2026-10-07T10:53:55Z", "hours": 0.3783, "text": "current made some parts of boot loading screen, will de adding a few desktop appearanace"}]...
|
Title: MacOS but on web by @pmandal7355 | Stardanc Title: MacOS but on web by @pmandal7355 | Stardance
Devlogs:
current made some parts of boot loading screen, will de adding a few desktop appearanace
made the full bottloading screen and the login page , it doesnt nedd password to keep it available for everyone
made the desktop and the task bar with icons , now only the music player is made and the control centre the widgets are non movable and non removable, need to be fixed
made the widgets draggable and user friendly adeed a terminal with git controls and settings page with working brightness control , sound and finder . the project will be completed within 1 to 2 days
made the browser and news app and darkmode , calculator, clock app and switched to electron for browser dependencies as google Programmable Search Engine opens in new window which ruins the os , there is still some bugs on the safari app and layout bugs which will be fixed
made the calendar app and made bugs fix and new css for safari and made about mac section
made the readme again as stated by reviewers the readme is seemed to be ai
Ships:
i made the copy /inspirational macos like web os and created majority of function and really like to share this, as my first web os using electron , i recommend download electron, zustand and...
|
1792817686.0022256
|
1792904086.0022256
|
|
17432
|
Sleepy OS by @sriyank | Stardance
|
sriyank
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:28:49Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a os that is personalized to me i chose a hobby that i like to do sleeping and based the theme of that, as you can see i have also used js for the logic behind the dragging of the windows and pictures thank you.", "repo": "https://github.com/SasukeUchiha12309876/Sleepy-OS", "demo": "https://sleepy-os.vercel.app/"}]...
|
[{"post_id": 8146, "ts": "2026 [{"post_id": 8146, "ts": "2026-06-13T16:15:35Z", "hours": 0.5328, "text": "i believe that i am done i dont think i will go all out for this project though i will slowly gget into the flow but for now i will submit what i habve the update i made today is a dragable window and closable windo of a picture"}, {"post_id": 7869, "ts": "2026-06-13T03:52:03Z", "hours": 0.9389, "text": "Now i made some good progress with a app and a taskbar"}, {"post_id": 7689, "ts": "2026-06-12T20:51:11Z", "hours": 0.4464, "text": "Right now i just finished on the background for the os now i am going to start on the taskbar"}]...
|
Title: Sleepy OS by @sriyank | Stardance
Devlogs: Title: Sleepy OS by @sriyank | Stardance
Devlogs:
Right now i just finished on the background for the os now i am going to start on the taskbar
Now i made some good progress with a app and a taskbar
i believe that i am done i dont think i will go all out for this project though i will slowly gget into the flow but for now i will submit what i habve the update i made today is a dragable window and closable windo of a picture
Ships:
I created a os that is personalized to me i chose a hobby that i like to do sleeping and based the theme of that, as you can see i have also used js for the logic behind the dragging of the windows and pictures thank you....
|
1792839206.972613
|
1792925606.972613
|
|
20724
|
CRM by @F3rro_32 | Stardance
|
F3rro_32
|
1
|
124.74
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-14T16:34:42Z", "hours": 115.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "CRM An open-source CRM for Italian small businesses: contacts, companies, leads, quotes, orders, invoices with VAT, tickets, email campaigns, NPS surveys, reports and a customer portal. It started as a way to manage clients for a friend’s startup and became a working and valuable project. TRY IT (no install) https://crm.alessio.hackclub.app email: [email protected] password: HackClub-Demo-2026! The demo has full access and realistic fake data, so feel free to click everything, create, edit and delete. The data resets occasionally. Outgoing email is switched off on the demo. HEADS UP: the interface is in Italian. Use the translate widget in the corner of the app (or your browser’s translator) to read it in English. Real i18n is on my roadmap, sorry! WHAT TO LOOK AT A quote with line items, discounts and VAT by rate, and the “Print PDF” button. PDFs come from HTML templates you can edit, with a live preview on your last real document. A customer accepting a quote from a signed link, without an account. Full-text search across every module (PostgreSQL). Italian e-invoicing: it builds the FatturaPA XML and validates it against the official government XSD before saving. Invoices lock once sent to the SDI. The MCP server: an AI assistant can use the CRM through an API key, with seven generic tools that work on all 34 modules and respect permissions. 2FA (TOTP) with recovery codes, secrets encrypted at rest, installable PWA. HOW IT WORKS There is no “contacts” or “companies” table. One generic Record entity stores its fields in a jsonb column, and an ObjectType + FieldDef describe each module (39 field types). Adding a module is a configuration record, not a migration or a new controller. Permissions are checked per module and action at runtime. You can have more info in the README, so please check it. I hope you appreciate this project :)", "repo": "https://github.com/AlessioFerrari8/crm", "demo": "https://crm.alessio.hackclub.app"}]...
|
[{"post_id": 81469, "ts": "202 [{"post_id": 81469, "ts": "2026-10-21T11:47:01Z", "hours": 9.7417, "text": "Hey guys, what’s up? I’m finally in the last phase of getting my driving license, so that’s taking up some of my time too. The CRM is now online at crm.alessio.hackclub.app . The VPS has very little RAM, so I build the Docker images locally and transfer them to the server using docker save over SSH. It’s not the fanciest deployment process, but it works with the resources I have, so I’ll stick to it for now. One of the main things I worked on was the customer portal . The backend from last week finally has a frontend: customers can log in, see their tickets and documents, open requests, reply to messages, download PDFs and accept quotes. I also made sure that internal notes stay internal. Notes now have a Visible to customer checkbox, which is disabled by default. The portal only shows notes explicitly marked as visible, so there’s less risk of accidentally exposing something that should stay private. Another feature I added is Google Calendar import . It’s read-only for now, so the CRM can import events without modifying anything in your Google account. Events are created through the same service as normal CRM records, meaning workflows and the audit log still work as expected. Sync runs every 15 minutes, and if something goes wrong with an account, it won’t stop the others from syncing. I also started replacing the Google Translate workaround with proper internationalization (i18n). The translation system is in place, including support for parameters and locale-aware dates and numbers. The dictionary is type-checked, too, so missing English translations can be caught at compile time. There’s still a lot of work here: around 1,200 strings need to be translated by hand. It’s not the most exciting task, but I’d rather have proper translations than rely on Google Translate forever. Obviously that’s my opionion. I also started working on public registration, but it’s not ready yet. There’s one important limitation: the CRM currently has a single shared workspace, so everyone who registers would see the same data. Registration will stay disabled unless explicitly enabled until I decide how to handle that properly. That’s because the idea is to have 1 single DB for each workspace, since the CRM should be self-hosted. There’s still work to do, but the CRM is getting closer to the version I wanted to ship. See you in the next devlog!"}, {"post_id": 79560, "ts": "2026-10-14T16:31:36Z", "hours": 2.4331, "text": "Hey guys, how’s going? This will be a short devlog, and it’s the one before the shipping. I decided to ship the CRM, even if it’s not completely finished. That’s because I still have to do lots of things, but now I have a working product, so, since the changes I have to make are complementary. Unfortunately, I have a big issue: the whole interface is in Italian. The app is made for Italian small businesses (FatturaPA, VAT, SDI…), but if you come from Stardance you can’t read a single menu. Real i18n is still on my list and it is a big job, so for now I added the Google Translate widget in the corner of the app. If your browser is in English it starts translating by itself, otherwise you pick English from the selector. It’s not pretty, but it makes the demo usable today instead of “someday”. I had to widen the CSP in nginx for it, and I loaded the script as an external file so I didn’t need a second hash. I also fixed the README and cleaned the repo. Now everything should work fine, or at least let’s hope so. I hope you enjoy the product."}, {"post_id": 78818, "ts": "2026-10-11T17:58:49Z", "hours": 8.3728, "text": "Hey guys, how’s everythings going? I’m doing pretty well. As always I have lots of things to do, but I still have plenty of time for coding. School is demanding, and preparing for my driving license is also tough, but I’m managing everything little by little. Last time I ended up with an app that wouldn’t even start. Luckily, I fixed all those errors, and all 258 tests are now green and passing on the PostgreSQL db. After that, I added new features. First of all I worked on NPS surveys and quote acceptance. Customers can now receive surveys and answer them through a public link. They can also accept quotes directly from a link, without needing an account. I also made sure these features work with the existing workflows, so automations can still do their job properly. Another interesting addition is the MCP server. AI agents can now interact with the CRM through an API key. Instead of creating a separate set of tools for every module, I went with seven generic tools that can work across all 34 modules. This should make it easier for AI models to understand which actions they can perform, while keeping the CRM’s existing permissions and security rules in place. I also improved search quite a bit. Before, it mostly looked at record titles. Now it uses PostgreSQL full-text search to find relevant information inside the actual record data and rank the results. The audit history is also much easier to read, with related record IDs replaced by their actual titles. I worked on a couple of smaller but important things, too. The trash can now properly handle related files and records when permanently deleting something, while protecting fiscal documents that must be kept for ten years. Finally, I started working on the customer portal. It now has its own backend authentication and permission system, separate from the employee login. Customers will only be able to access records they’re actually allowed to see. The backend is ready, but I still need to connect the frontend pages and routes. There’s still quite a bit to do, but I’m getting closer to the first complete version of the CRM. See you in the next devlog!"}, {"post_id": 77578, "ts": "2026-10-07T15:01:58Z", "hours": 9.0769, "text": "Hey guys, how’s going? I have plenty of things to do, but coding is still one of my favorite activities, so I always try to save some time for it.This time I worked again on FatturaPA, which is the Italian electronic invoice.What I did, is that now, first of all, the CRM can now generate the FatturaPa XML directly from an invoice and validate it against the official XSD, before saving it. I also added the whole invoice lifecycle, from draft, to setn, delivered, accepted or rejected. The CRM can read the recepits from the SDI and show ufseful information when something goes wrong.Another important change is that invoices now become locked once they’re sent to the SDI. If something needs to be changed, the correct way is to create a credit note instead. This is much efficient in my opinion.I also started working on the SDI integration itself. For now there’s only a manual transport, but the system is built so that adding an actual provider later shouldn’t require changing the rest of the CRM. I did it this way, so I can decide which provider use, and not have to change everything.Besides invoicing, I added time tracking. You can start a timer from the top bar and see your hours directly on records. Timers also automatically close after a maximum amount of time, so nobody ends up with a 80-hour ticket because they forgot to stop it.Finally, I worked on email campaigns. You can create a campaign from a saved filter, send emails through a queue and manage unsubscribes. I also added some protections against things like open redirects and accidental unsubscribes.And now, the honest part: before writing this devlog, I ran the tests and guess what, the app didn’t even start.I used claude for debugging, cause I wans’t finding the error. Silly me, it was just a typo."}, {"post_id": 75572, "ts": "2026-09-30T13:58:27Z", "hours": 10.0467, "text": "Hey guys, how’s everything going? I’m alright. I’m so glad hackclub postponed the end of stardance, I have still another month to 1. finish this project 2. do other projects I had on my mind for such a long time. Before doing this devlog, I had to use claude to debug my work, because I had some errors I didn’t understand (I was using a class created for a test in the normal “code”), so bad :( and also other small issues. Lately I worked on one of the most significat features for me, which is 2FA . As my network teacher says \"zero trust, because the world is a place full of bastards\" . 2FA is one of the techniques I use to follow this approach. Basically, now you can press “Enable” in your preferences, scan the QR code with any authenticator app (f.e google), or just type the secret by hand, because half the people can’t frame a QR code at the first time, lol. You also have to confirm with a code. At login, if 2FA is on, there’s a second step for the six digits. You also get ten recovery codes that you can copy or download, shown only once. Turning it off asks for your password, so a stolen open session can’t remove this precaution. You’re probably wondering: are the secrets encrypted? Yes, they are. I mostly use AES-GCM, because it’s pretty simple, but also secure, so it’s the better compromise. The TOTP secret and the mailbox passwords are stored encrypted with AES-GCM. The key lives in an env variable, not in the db, so a database dump alone isn’t enough to generate codes or read someone’s email. I also turned the crm in a PWA . You can install it on your phone or desktop, it has its own icon and window, and when I deploy a new verion, it tells you to reload, instead of silently serving you the old one from cache (it also checks every 6 hours, maybe I’m gonna change it to 10, idk, for the tab you leave open for days) Like in every other devlog, I made some tests and updated the docs. The report engine now has tests against a real Postgres started in docker, and the repo finally has a real README (it’s not finished, just with some basic information, claude, thanks for the suggestion of making it). Oh, I nearly forgot. I also worked on emails. Now I’m currently working on the Italian electronic invoice, which is called FatturaPA. The crm builds the XML from an invoice, and the first test I wrote checks it against the official government XSD: if it doesn’t pass, it isn’t saved. I think I’m gonna study a bit of english / american law, to allow people out of Italy to use this app as well. I hope you like my product, see you soon"}, {"post_id": 71912, "ts": "2026-09-21T19:15:14Z", "hours": 9.0044, "text": "Hey guys, how have you been doing lately? I’m alright. I’m still getting my driver license, so I don’t have much time to code. Last devlog was all about the PDF engine on the backend, and I closed it saying that the UI was next. Here it is: Print button : I added a print button Print PDF on quotes, orders, delivery notes and invoices. The file is downloaded with the document number as its name, so you get for example 2025-47.pdf and not just document.pdf Template editor : I also added to settings a new tab called “Print”. On the left there’s the list of templates, on the right the HTML, the page size and the margin. The preview renders the last real document of that module instead of a fake one, so what you can see is exactly what your customer receives. The default templates can’t be edited you duplicate them: the seeder rewrites them at every boot, so any change would silently disapper on the next restart. I preferred to say it in the interface rather than let someoune lose an afternoon of work. Company data : The company settings now hold also the legal name, VAT number, tax code, address and contact line. That’s what the PDF header prints, and without them the header comes out empty. VAT that adds up to the cent The header discount is spread across the VAT rates and every share gets rounded, so the sum of the shares could end up one or two cents away from the total. On a quote nobody would ever notice. On an electronic invoice it’s rejection 00423. Now the rounding leftover goes on the last rate, so taxable + VAT = total, always. Tests on a real db : The report engine builds SQL at runtime, and mocking a database proves nothing, so its tests now start a throwaway Postgres in Docker and run against it: filters, grouping, ordering and counting. Two bugs closed : Merging two records didn’t look at the bin, so a deleted record could be merged into a live one. And editing a saved report answered 405, because the frontend was sending PUT to an endpoint that only has POST. Right now I’m working on the 2FA (for those who don’t know, the 2 factor auth). I’m writing the TOTP myself instead of pulling in a library: it’s an HMAC-SHA1 of the 30 second counter, and the six digits come out of the dynamic truncation described in the RFC. The secret is encrypted in the database with AES-GCM, because someone who can read the db must not be able to generate the codes, otherwise a second factor is just a second password. There are ten recovery codes, stored hashed and usable once each, and the last accepted counter is saved, so the same code can’t be replayed during its 30 seconds. The tests are the official RFC 6238 vectors: a TOTP written at home always “works” until you compare it with a real auth app, and at that point it’s too late to find out. Two things I know are missing: the second factor has no interface yet, there’s no page to scan the QR code from, and the mailbox that turns incoming emails into tickets is only half written. See you soon, the end of this project is near."}, {"post_id": 67216, "ts": "2026-09-13T08:29:02Z", "hours": 8.6217, "text": "Hey guys, how’s it going? I hope you’re all doing well. School started here in Italy, so I have less time compared to August. I also have to get my driver’s license, so I’m studying for that too. Unfortunately, coding isn’t the first thing I do every day anymore. I’m still working on the PDF generator. Last time I mentioned that relation fields were showing raw IDs and that document totals weren’t formatted properly. I fixed both of those, but I’ll get back to them later. About the PDF The template is HTML, and it lives in the DB. I didn’t hardcode the layout in Java. I created a PdfTemplate entity that stores the HTML, page size and margins. There is one default template for each document type: quote, order, delivery note and invoice. Thymeleaf fills the template with the document data, and OpenHTMLToPDF + PDFBox generate the PDF. Since the HTML is provided by the user, I also had to think about security. A template could try to load something like file:///etc/passwd or access an internal URL. Because of this, external protocols are disabled and only data: URIs are allowed. Page sizes are also checked against a whitelist. I also had to deal with the fact that HTML isn’t always valid XML. OpenHTMLToPDF expects XML, so I use jsoup to normalize the HTML first. Otherwise, perfectly normal HTML can cause a SAXParseException . And finally, fonts have to be embedded in the PDF. Without including DejaVu Sans in the jar, the PDF doesn’t render correctly. VAT summary I also worked on the VAT summary. Lines are grouped by VAT rate, shipping is added to the highest rate, and the document discount is distributed across the rates instead of being applied at the end. VAT is then calculated on the discounted amounts, so everything adds up correctly: taxable + VAT = total This actually fixed a bug where VAT was calculated before applying the document discount. It wasn’t very obvious until I started testing it with real numbers. Three endpoints The PDF system now has three endpoints: print a document preview a template print a batch For the preview, instead of creating a fake document, I use the last real document of that module. This way there is only one PDF generation system to maintain. The batch endpoint combines multiple documents into one PDF, while checking permissions for every document. A few other fixes The two ugly things from last time are also gone. Relation titles are now resolved by a shared backend service, so instead of UUIDs you see things like the company name. The same service is used by the lists, detail pages and PDFs. Amounts in the PDF are also formatted using the user’s preferences. I also added tags to the record lists. Tags are resolved in bulk instead of doing a permission check for every single row, which makes a big difference on larger lists. The backend part is basically done for this cycle. The print button and template editor are already written, but they’re not wired up yet. Right now I’m still using the API to test the generator. So, UI is next. See you in the next devlog!"}, {"post_id": 63513, "ts": "2026-09-07T12:44:46Z", "hours": 6.7903, "text": "Hey guys, how’s going? Soon school is going to start for me, but luckily it’s my last year in high school, so I’m really happy about this. Lately I had much time to code, so I continued working on this project. Last devlog was all backend; I said the engine was there and the screens weren’t. This time it’s quite the opposite. I didn’t really touch the backend, I spent the last 5-6 hours writing the frontend. Here’s the details of what I did: Document lines the grid is finally in the record detail. You can add lines, set quantity, price, discount and VAT, additionaly with the subtotal / VAT / total block, that updates while you type. When you save, the whole set of lines is sent at once. Tags I added the tag picker on the record detail, so you can attach and remove tags from a record as you wish. I also made the page that shows every record with a given tag, from all the modules together. Duplicates The duplicate finder now has its own screen: you choose a module, you get the pairs it thinks are duplicates, and the you see the two records side by side and pick field by field which value to keep before merging them. Reports There’s a page to build a report with a wizard (rows, columns, metrics, filters) and a preview that shows you the result before saving it. Dashboard widgets This is the main thing of this cycle. I wrote all six widget types, which are: - KPI tile - split KPI tile - chart - table - pivot - record list A widget is just a saved report query plus the type of rendering you want, so it runs on the report engine. Dashboards with tabs You can create a dashboard, add tabs to it and put widgets inside, so you can keep for example sales and support separated from each other. Sidebar and topbar The sidebar now has the routes for all the new pages, and the topbar has a quick-create button to make a record from anywhere without opening its module first. Two things are still not nice and I’m aware: in some places the relation fields show the raw id instead of the name of the record, and the totals of the document lines are not formatted with the user preferences yet, so you read 9054.00 instead of 9.054,00 EUR. Both are small and both are on the list to be improved. Now I’m working on the PDF generator See you, I hope you enjoy this project"}, {"post_id": 59674, "ts": "2026-09-01T16:28:33Z", "hours": 8.095, "text": "Hey guys, how it’s going? These days I’ve got quite a lot of work to do, since we’re in the middle of harvest season here in Italy, so I don’t have much time to work on the project. Unfortunately, today it rains, so I’m home, and I can spend some time on the PC. Lately I’ve been working a lot on the backend. The first two things I did are documents and document numbering : I created the model for document rows ( DocumentLine ), with its engine to calculate totals, including subtotals, discounts and VAT. I also added unit tests for the calculator. I also implemented automatic document numbering, so documents like quotes, invoices and tickets are automatically assigned a number when they’re created. Then I worked on quote revisions, with a new QuoteRevisionService to keep track of different versions of the same quote. Another thing I started working on is document conversion. The idea is to be able to convert a quote into an invoice, but this part is still a work in progress. I also spent quite a bit of time on reports and dashboards: added the Report model and the ReportEngine / ’ReportService` added default reports through a ReportSeeder created the Dashboard model, with tabs and widgets added the related controllers, services and repositories On the frontend side I’ve scaffolded the pieces for dashboards and widgets — the widgets/ and dashboard-tabs/ components exist and the dashboard and report services are written — but the components themselves are still empty shells. The data layer is ready, the screens aren’t written yet. That’s what I’ll pick up next. Another big thing I worked on is tags and data quality. I added the tag model and APIs, together with the services and repositories. I also started working on a duplicate finder and record merging system, so duplicate contacts/companies can be detected and merged instead of leaving messy data around. For PostgreSQL, I also enabled pg_trgm to improve fuzzy searches for duplicate detection. Finally, I added user preferences for number and date formats, including a live preview so users can immediately see how their chosen formats will look in the app. I’ve also added icons for the new modules. As you can probably tell, this was a very backend-heavy cycle. Almost everything I built this time: document lines, numbering, quote revisions, reports, dashboards, tags and duplicate detection lives in the models and the services, and the UI for most of it isn’t there yet. So this time there isn’t much to show in screenshots: the engine is in place, the screens come next. I’d rather get the model right first and build the interface on top of something solid than the other way around. Hopefully I’ll be able to find some more time to work on it after harvest, so see you in a while."}, {"post_id": 45652, "ts": "2026-08-12T09:05:39Z", "hours": 4.9961, "text": "Hey guys, back on this project. Last time I said the next round was going to be document lines, my quote was “the only part of this CRM that doesn’t fit the dynamic JSON engine”. That’s what this round was, plus the report engine on top of it. Document Lines : One single table for all four documents: quote, sales order, delivery note, invoice. The line is exactly the samein all of them, the only thing that changes is the document holding it, and a document here is just a Record like any other, so there’s no type constraint on the line at all. A line can be a product line, a free text line (no amounts, just something to say in the middle of the document) or a subtotal. Two things get copied at save time: the description and the vat percentage. The math is its own class, DocumentLineCalculator, and it’s the one piece of this project I wanted testable completely on its own, because it’s the only place where a wrong rounding produces a wrong tax document. The order is fixed: gross = quantity × unit price discount = a percentage of the gross, or a flat amount net = gross - discount, rounded to 2 decimals here vat = net × rate, rounded line total = net + vat Rounding happens after the discount and after the vat, never on the unit price: round the unit price and the error gets multiplied by the quantity. Rounding mode is HALF_UP, which is the commercial rounding used here, not HALF_EVEN. And a flat discount bigger than the line itself gets clamped instead of producing a negative amount, since that’s a typo 100% of the time. Lines are always saved all together. The endpoint is a PUT that replaces the whole set. It deletes and rewrites instead of diffing row by row, because a document has a few dozen lines at most and the diff would cost more code than it’s worth. The reason for this rule is the totals: they depend on every line, so a partial save would leave the header and the lines disagreeing, even if only for a moment. The totals (subtotal, vatTotal, total) get written back into the document’s own JSON, plus the header level discount and shipping cost. They live there so they can be list columns you filter and sort on, which is the whole point of having them. Now I’m working on the dashboard graphs, widget and this kind of things.I hope you like the project. I’m sorry if I don’t have any screenshot of the working website, it’s because I focused only on the backend, the frontend of this part still needs to be written."}, {"post_id": 42597, "ts": "2026-08-07T12:41:14Z", "hours": 6.4236, "text": "Hey guys, still on this project. This round was all about the stuff that sits on top of the modules, instead of new modules. Per-user formatting preferences . There’s a new “My preferences” page in the user menu. Every user picks how they want to see numbers and dates: thousands separator, decimal separator, currency (any ISO code, the symbol gets resolved automatically), how many decimals, whether the symbol goes before or after the number, and whether to cut trailing zeros. Same thing for the date format. There’s a live preview box that updates while you touch the selects, so you see 1.234,50 € turn into $ 1,234.5 as you change this. The setting applies everywhere, lists, record details and so on. Tags . These are cross-module, which is the whole point; a tag can sit on a lead and on a ticket. There are two kinds: shared ones, visible to the whole workspace, and private ones, which only you see. Each one has a color. You can attach and detach them from any record, and there’s a “all records with this tag” view that goes across modules, filtered by your permissions, so if you can see tickets but not opportunities, you only get the tickets.I did not build this as a field type, even though I already have a TAGS one. That one belongs to a single ObjectType with its own fixed options, so it gives you neither the shared catalog nor the cross-module search. Duplicate merge . You pick a module and it gives you back the candidate pairs, ranked by how similar their titles are (there’s a threshold you can move, default 0.6). Then you get the two records side by side and choose, field by field, which value survives. When you confirm: the winner keeps everything you picked, every relation that pointed at the loser now points at the winner, ids of the loser mentioned inside other records get rewritten too, including the ones stored in lists, notes and tags move over (and if the winner already had that tag, the duplicate link is dropped), the loser goes to the trash, not deleted. A wrong merge has to be recoverable, and I already have a bin, so I used it. Document numbering . Documents now number themselves. It’s configurable per module: prefix, whether to include the year, padding, separator. Right now it’s on for three of them: - quotes → 2025-47 - invoices → FT2025-0001 - tickets → TT643 The counter is per module and per year, and it’s locked while it’s being read, so two people creating a quote at the same time can’t get the same number. If you type a number by hand, yours wins, that matters when you’re entering an old document with its original number. On top of that, quotes have revisions. Revising 2025-13 gives you 2025-13_2 , a brand new document that links back to its parent, while the parent moves to the “revised” stage. And you can revise a revision, so 2025-13_2_2 works too, the counter is progressive per parent, not global, which took a bit more care than I expected. Next up is the big one: document lines. Quote → order → delivery note → invoice, with quantities, discounts and VAT per line. It’s the only part of this CRM that doesn’t fit the dynamic JSON engine everything else is built on, so it gets its own real tables. See ya in the next devlog, I hope you like the project. P.S. you’ll see the tag in the next devlog, I still have to implement the frontend"}, {"post_id": 40187, "ts": "2026-08-03T16:19:02Z", "hours": 5.575, "text": "Hey guys, I’m still working on this project, cause there are lots of things to do.Lately I focused on improving and adding things to the ObjectTypes. As you can see in the two images of the sidebar, I added like 10 fields. Among them, the most important are goals , basically contains the possibility of creating a goal, setting an owner, which is responsible for this goal (clearly depends on the situation), the actual goal and the period. Along with that you can set a metric, so if the goal is revenue , opportunities , leads , custom project_task , basically it contains the instruction for each member, on a certain project service_contract , the support, it contains the subject, the company which is referred to, start and end date, the actual status, so active , expiring , expired , terminated , hours spent and so on. Along with these and the other I didn’t cite here, I added 3 object for the sales, where this two are the most important: The first one is the supplier , it contains all the specs, so name, vat, email, phone, website, address, and eventual notes. The second one, the most important, is sales_order , which contains the subject, the number of the order, a relation with the company, and a relation with the contact, a relation with the quote (I don’t know if it’s right, in italian it’s called preventivo), the possibility of setting a status, so created , confirmed , shipped , closed , cancelled , the order date, a relation with the payment Method object, and all the financial part, so the subtotal, with maybe the discount, vat, the total and the infos for the shipping, billing and shipping address. I hope to finish this project asap, since it’s taking me so looong.See ya in the next devlogs"}, {"post_id": 38868, "ts": "2026-08-01T13:05:15Z", "hours": 5.2586, "text": "Hey guys, I have stopped this project for a bit, but here I am again. I’m currently improving the CRM, mostly the security, which, for me, is one of the most important parts, and adding functionalities. Lately I focused on the mails. I added my smtp server, and in the backend, I managed all mails. Here is an example, with the invitation email. It’s in italian, but don’t worry, basically it invites you to the CRM, and then you can create your own account, with password. As you can see in the third screenshot, I can manage the invitation link, whether I want to invite an admin, or a simple employee."}, {"post_id": 26409, "ts": "2026-07-11T05:54:20Z", "hours": 10.4239, "text": "Hey guys, this week was also about making the CRM feel more complete. Alongside several new features, I also spent a good amount of time improving security and fixing one particularly deceptive bug. First of all, I added a new global Calendar page that shows every record with a date in one monthly view. Events, tasks, reminders and subscription renewals are all displayed together, each with its own color. Before this, the calendar only existed inside each record type, so there wasn’t a way to see everything happening at once. I also integrated Cal.com. The booking page can now be embedded directly inside the CRM, and when someone books a meeting, a webhook automatically creates an Event record. If the meeting is rescheduled, the existing record is updated instead of creating a duplicate, and if it’s cancelled, the event is removed. To keep the integration secure, the webhook signature is verified using the raw request body instead of reserializing the JSON. I spent some time looking at features from Pipedrive, HubSpot and Attio, then implemented a few that I really liked. The Kanban board now shows the total value of each column, making it easy to see how much every stage of the pipeline is worth. I also added rotting, which highlights cards that haven’t been updated for more than two weeks so forgotten leads are easier to spot. Another big addition is public forms. Every record type can now expose a public form that can be shared with a link or embedded into any website. When someone submits it, a new record is created automatically and any related workflows are triggered. The feature also includes a honeypot for bots and per-IP rate limiting. Finally, I added a Trash Bin, allowing users to restore accidentally deleted records with a single click. I also added the ability to assign an owner directly from the record page. Passwords now follow the same rules everywhere in the application: at least 8 characters one uppercase letter one lowercase letter one number one special character. The backend enforces the policy, while the frontend shows a live checklist as the user types. I also added a Change Password page. When a password is changed, every other active session is logged out while the current one stays active. At one point login stopped working and always returned “Invalid credentials”. It turned out the password wasn’t the problem at all, the backend was stuck in a crash loop. A new database column was added as “not null” without a default value, so Hibernate couldn’t apply the change to an existing table. The application never finished starting, and the frontend showed a generic login error. I fixed the database manually, added a default value to the migration, and made a note for the future: every new “not null” column should always have a default value. After adding all these features, I went through another security pass. The rate limiter now also protects password changes and the Cal.com webhook. I also added a scheduled cleanup job that removes old expired sessions from the database. Finally, I configured proper security headers, including a CSP. Public forms can still be embedded on external websites, while the rest of the CRM remains protected from being embedded elsewhere. Stay tuned, cause I still have lots to do :)"}, {"post_id": 14329, "ts": "2026-06-23T12:44:44Z", "hours": 5.6103, "text": "I continued working on this wonderful project. The first thing I implemented was the sidebar, designed as a reusable component. You can expand and collapse it to switch between icons only and icons with text. I also added a top bar, which contains the company name (top left), a search bar that will allow users to scan the entire database and quickly find what they’re looking for. I also added translations (2 languages for now), light and dark mode, notifications, and a profile section with the user’s name. Additionally, I implemented a simple dashboard with fake data to start shaping the overall user experience. Stay tuned."}, {"post_id": 13650, "ts": "2026-06-22T12:28:12Z", "hours": 8.3619, "text": "Still working on my project. It’s been really tough so far, I’m still on the backend, which is very hard. I feel lucky to have AI helping me; it would be really difficult without it. Honestly, it’s hard even with AI, so I lean on it a lot. I don’t think using AI is a negative: as long as you understand the code it writes and can modify, fix, and improve it, you’re fine. On the backend I’m currently working on the engine underneath, mainly the database relations. For example, the record table stores its fields generically (as JSON), so users can define whatever fields they want. The catch is that validating the data is on me, since the fields are dynamic, the database can’t enforce their shape, so it all has to be checked in code, mostly in the frontend. I’ve also started on the frontend: first by dockerizing it, then by adding the login form that exercises my backend."}, {"post_id": 11904, "ts": "2026-06-19T12:16:33Z", "hours": 5.9808, "text": "Started working on a very big project, called CRM. I hope you know what a CRM is, but for who doesn’t, a crm is basically an app, or maybe a dashboard, used by companies to keep track of their clients, employees and all this kind of things. It helps growing a company, with integrated tickets and so on. This app will be built in the following tech stack: Angular for the frontend, with daisyUI and tailwindCSS as graphical libraries Java Spring for the backend, able to manage correctly users, types and endpoints. I chose this over nestJS with prisma, because I want to have more control on the db. db, I have still to choose what I want and should use, because now I’m focusing on other things, like JWT auth, creation of users and entities and so on. My idea is to use this as a base, and then for maybe companies who needs it, I could like improve this, add requested features, and optimize everything. My current situation: I started the angular project, but I still have to install all libraries and update determined packages I created backend, and I’m currently focusing on auth (as you can see from the pic), with jwt sessions, users, entities, permissions and this kind of things. db, still in progress The application will be dockerized for best practice."}]...
|
Title: CRM by @F3rro_32 | Stardance
Devlogs:
Star Title: CRM by @F3rro_32 | Stardance
Devlogs:
Started working on a very big project, called CRM. I hope you know what a CRM is, but for who doesn’t, a crm is basically an app, or maybe a dashboard, used by companies to keep track of their clients, employees and all this kind of things. It helps growing a company, with integrated tickets and so on. This app will be built in the following tech stack: Angular for the frontend, with daisyUI and tailwindCSS as graphical libraries Java Spring for the backend, able to manage correctly users, types and endpoints. I chose this over nestJS with prisma, because I want to have more control on the db. db, I have still to choose what I want and should use, because now I’m focusing on other things, like JWT auth, creation of users and entities and so on. My idea is to use this as a base, and then for maybe companies who needs it, I could like improve this, add requested features, and optimize everything. My current situation: I started the angular project, but I still have to install all libraries and update determined packages I created backend, and I’m currently focusing on auth (as you can see from the pic), with jwt sessions, users, entities, permissions and this kind of things. db, still in progress The application will be dockerized for best practice.
Still working on my project. It’s been really tough so far, I’m still on the backend, which is very hard. I feel lucky to have AI helping me; it would be really difficult without it. Honestly, it’s hard even with AI, so I lean on it a lot. I don’t think using AI is a negative: as long as you understand the code it writes and can modify, fix, and improve it, you’re fine. On the backend I’m currently working on the engine underneath, mainly the database relations. For example, the record table stores its fields generically (as JSON), so users can define whatever fields they want. The catch is that validating the data is on me, since the fields are dynamic, the database can’t enforce their shape, so it all has to be checked in code, mostly in the frontend. I’ve also started on the frontend: first by dockerizing it, then by adding the login form that exercises my backend.
I continued working on this wonderful project. The first thing I implemented was the sidebar, designed as a reusable component. You can expand and collapse it to switch between icons only and icons with text. I also added a top bar, which contains the company name (top left), a search bar that will allow users to scan the entire database and quickly find what they’re looking for. I also added translations (2 languages for now), light and dark mode, notifications, and a profile section with the user’s name. Additionally, I implemented a simple dashboard with fake data to start shaping the overall user experience. Stay tuned.
Hey guys, this week was also about making the CRM feel more complete. Alongside several new features, I also spent a good amount of time improving security and fixing one particularly deceptive bug. First of all, I added a new global Calendar page that shows every record with a date in one monthly view. Events, tasks, reminders and subscription renewals are all displayed together, each with its own color. Before this, the calendar only existed inside each record type, so there wasn’t a way to see everything happening at once. I also integrated Cal.com. The booking page can now be embedded directly inside the CRM, and when someone books a meeting, a webhook automatically creates an Event record. If the meeting is rescheduled, the existing record is updated instead of creating a duplicate, and if it’s cancelled, the event is removed. To keep the integration secure, the webhook signature is verified using the raw request body instead of reserializing the JSON. I spent some time looking at features from Pipedrive, HubSpot and Attio, then implemented a few that I really liked. The Kanban board now shows the total value of each column, making it easy to see how much every stage of the pipeline is worth. I also added rotting, which highlights cards that haven’t been updated for more than two weeks so forgotten leads are easier to spot. Another big addition is public forms. Every record type can now expose a public form that can be shared with a link or embedded into any website. When someone submits it, a new record is created automatically and any related workflows are triggered. The feature also includes a honeypot for bots and per-IP rate limiting. Finally, I added a Trash Bin, allowing users to restore accidentally deleted records with a single click. I also added the ability to assign an owner directly from the record page. Passwords now follow the same rules everywhere in the application: at least 8 characters one uppercase letter one lowercase letter one number one special character. The backend enforces the policy, while the frontend shows a live checklist as the user types. I also added a Change Password page. When a password is changed, every other active session is logged out while the current one stays active. At one point login stopped working and always returned “Invalid credentials”. It turned out the password wasn’t the problem at all, the backend was stuck in a crash loop. A new database column was added as “not null” without a default value, so Hibernate couldn’t apply the change to an existing table. The application never finished starting, and the frontend showed a generic login error. I fixed the database manually, added a default value to the migration, and made a note for the future: every new “not null” column should always have a default value. After adding all these features, I went through another security pass. The rate limiter now also protects password changes and the Cal.com webhook. I also added a scheduled cleanup job that removes old expired sessions from the database. Finally, I configured proper security headers, including a CSP. Public forms can still be embedded on external websites, while the rest of the CRM remains protected from being embedded elsewhere. Stay tuned, cause I still have lots to do :)
Hey guys, I have stopped this project for a bit, but here I am again. I’m currently improving the CRM, mostly the security, which, for me, is one of the most important parts, and adding functionalities. Lately I focused on the mails. I added my smtp server, and in the backend, I managed all mails. Here is an example, with the invitation email. It’s in italian, but don’t worry, basically it invites you to the CRM, and then you can create your own account, with password. As you can see in the third screenshot, I can manage the invitation link, whether I want to invite an admin, or a simple employee.
Hey guys, I’m still working on this project, cause there are lots of things to do.Lately I focused on improving and adding things to the ObjectTypes. As you can see in the two images of the sidebar, I added like 10 fields. Among them, the most important are goals , basically contains the possibility of creating a goal, setting an owner, which is responsible for this goal (clearly depends on the situation), the actual goal and the period. Along with that you can set a metric, so if the goal is revenue , opportunities , leads , custom project_task , basically it contains the instruction for each member, on a certain project service_contract , the support, it contains the subject, the company which is referred to, start and end date, the actual status, so active , expiring , expired , terminated , hours spent and so on. Along with these and the other I didn’t cite here, I added 3 object for the sales, where this two are the most important: The first one is the supplier , it contains all the specs, so name, vat, email, phone, website, address, and eventual notes. The second one, the most important, is sales_order , which contains the subject, the number of the order, a relation with the company, and a relation with the contact, a relation with the quote (I don’t know if it’s right, in italian it’s called preventivo), the possibility of setting a status, so created , confirmed , shipped , closed , cancelled , the order date, a relation with the payment Method object, and all the financial part, so the subtotal, with maybe the discount, vat, the total and the infos for the shipping, billing and shipping address. I hope to finish this project asap, since it’s taking me so looong.See ya in the next devlogs
Hey guys, still on this project. This round was all about the stuff that sits on top of the modules, instead of new modules. Per-user formatting preferences . There’s a new “My preferences” page in the user menu. Every user picks how they want to see numbers and dates: thousands separator, decimal separator, currency (any ISO code, the symbol gets resolved automatically), how many decimals, whether the symbol goes before or after the number, and whether to cut trailing zeros. Same thing for the date format. There’s a live preview box that updates while you touch the selects, so you see 1.234,50 € turn into $ 1,234.5 as you change this. The setting applies everywhere, lists, record details and so on. Tags . These are cross-module, which is the whole point; a tag can sit on a lead and on a ticket. There are two kinds: shared ones, visible to the whole workspace, and private ones, which only you see. Each one has a color. You can attach and detach them from any record, and there’s a “all records with this tag” view that goes across modules, filtered by your permissions, so if you can see tickets but not opportunities, you only get the tickets.I did not build this as a field type, even though I already have a TAGS one. That one belongs to a single ObjectType with its own fixed options, so it gives you neither the shared catalog nor the cross-module search. Duplicate merge . You pick a module and it gives you back the candidate pairs, ranked by how similar their titles are (there’s a threshold you can move, default 0.6). Then you get the two records side by side and choose, field by field, which value survives. When you confirm: the winner keeps everything you picked, every relation that pointed at the loser now points at the winner, ids of the loser mentioned inside other records get rewritten too, including the ones stored in lists, notes and tags move over (and if the winner already had that tag, the duplicate link is dropped), the loser goes to the trash, not deleted. A wrong merge has to be recoverable, and I already have a bin, so I used it. Document numbering . Documents now number themselves. It’s configurable per module: prefix, whether to include the year, padding, separator. Right now it’s on for three of them: - quotes → 2025-47 - invoices → FT2025-0001 - tickets → TT643 The counter is per module and per year, and it’s locked while it’s being read, so two people creating a quote at the same time can’t get the same number. If you type a number by hand, yours wins, that matters when you’re entering an old document with its original number. On top of that, quotes have revisions. Revising 2025-13 gives you 2025-13_2 , a brand new document that links back to its parent, while the parent moves to the “revised” stage. And you can revise a revision, so 2025-13_2_2 works too, the counter is progressive per parent, not global, which took a bit more care than I expected. Next up is the big one: document lines. Quote → order → delivery note → invoice, with quantities, discounts and VAT per line. It’s the only part of this CRM that doesn’t fit the dynamic JSON engine everything else is built on, so it gets its own real tables. See ya in the next devlog, I hope you like the project. P.S. you’ll see the tag in the next devlog, I still have to implement the frontend
Hey guys, back on this project. Last time I said the next round was going to be document lines, my quote was “the only part of this CRM that doesn’t fit the dynamic JSON engine”. That’s what this round was, plus the report engine on top of it. Document Lines : One single table for all four documents: quote, sales order, delivery note, invoice. The line is exactly the samein all of them, the only thing that changes is the document holding it, and a document here is just a Record like any other, so there’s no type constraint on the line at all. A line can be a product line, a free text line (no amounts, just something to say in the middle of the document) or a subtotal. Two things get copied at save time: the description and the vat percentage. The math is its own class, DocumentLineCalculator, and it’s the one piece of this project I wanted testable completely on its own, because it’s the only place where a wrong rounding produces a wrong tax document. The order is fixed: gross = quantity × unit price discount = a percentage of the gross, or a flat amount net = gross - discount, rounded to 2 decimals here vat = net × rate, rounded line total = net + vat Rounding happens after the discount and after the vat, never on the unit price: round the unit price and the error gets multiplied by the quantity. Rounding mode is HALF_UP, which is the commercial rounding used here, not HALF_EVEN. And a flat discount bigger than the line itself gets clamped instead of producing a negative amount, since that’s a typo 100% of the time. Lines are always saved all together. The endpoint is a PUT that replaces the whole set. It deletes and rewrites instead of diffing row by row, because a document has a few dozen lines at most and the diff would cost more code than it’s worth. The reason for this rule is the totals: they depend on every line, so a partial save would leave the header and the lines disagreeing, even if only for a moment. The totals (subtotal, vatTotal, total) get written back into the document’s own JSON, plus the header level discount and shipping cost. They live there so they can be list columns you filter and sort on, which is the whole point of having them. Now I’m working on the dashboard graphs, widget and this kind of things.I hope you like the project. I’m sorry if I don’t have any screenshot of the working website, it’s because I focused only on the backend, the frontend of this part still needs to be written.
Hey guys, how it’s going? These days I’ve got quite a lot of work to do, since we’re in the middle of harvest season here in Italy, so I don’t have much time to work on the project. Unfortunately, today it rains, so I’m home, and I can spend some time on the PC. Lately I’ve been working a lot on the backend. The first two things I did are documents and document numbering : I created the model for document rows ( DocumentLine ), with its engine to calculate totals, including subtotals, discounts and VAT. I also added unit tests for the calculator. I also implemented automatic document numbering, so documents like quotes, invoices and tickets are automatically assigned a number when they’re created. Then I worked on quote revisions, with a new QuoteRevisionService to keep track of different versions of the same quote. Another thing I started working on is document conversion. The idea is to be able to convert a quote into an invoice, but this part is still a work in progress. I also spent quite a bit of time on reports and dashboards: added the Report model and the ReportEngine / ’ReportService` added default reports through a ReportSeeder created the Dashboard model, with tabs and widgets added the related controllers, services and repositories On the frontend side I’ve scaffolded the pieces for dashboards and widgets — the widgets/ and dashboard-tabs/ components exist and the dashboard and report services are written — but the components themselves are still empty shells. The data layer is ready, the screens aren’t written yet. That’s what I’ll pick up next. Another big thing I worked on is tags and data quality. I added the tag model and APIs, together with the services and repositories. I also started working on a duplicate finder and record merging system, so duplicate contacts/companies can be detected and merged instead of leaving messy data around. For PostgreSQL, I also enabled pg_trgm to improve fuzzy searches for duplicate detection. Finally, I added user preferences for number and date formats, including a live preview so users can immediately see how their chosen formats will look in the app. I’ve also added icons for the new modules. As you can probably tell, this was a very backend-heavy cycle. Almost everything I built this time: document lines, numbering, quote revisions, reports, dashboards, tags and duplicate detection lives in the models and the services, and the UI for most of it isn’t there yet. So this time there isn’t much to show in screenshots: the engine is in place, the screens come next. I’d rather get the model right first and build the interface on top of something solid than the other way around. Hopefully I’ll be able to find some more time to work on it after harvest, so see you in a while.
Hey guys, how’s going? Soon school is going to start for me, but luckily it’s my last year in high school, so I’m really happy about this. Lately I had much time to code, so I continued working on this project. Last devlog was all backend; I said the engine was there and the screens weren’t. This time it’s quite the opposite. I didn’t really touch the backend, I spent the last 5-6 hours writing the frontend. Here’s the details of what I did: Document lines the grid is finally in the record detail. You can add lines, set quantity, price, discount and VAT, additionaly with the subtotal / VAT / total block, that updates while you type. When you save, the whole set of lines is sent at once. Tags I added the tag picker on the record detail, so you can attach and remove tags from a record as you wish. I also made the page that shows every record with a given tag, from all the modules together. Duplicates The duplicate finder now has its own screen: you choose a module, you get the pairs it thinks are duplicates, and the you see the two records side by side and pick field by field which value to keep before merging them. Reports There’s a page to build a report with a wizard (rows, columns, metrics, filters) and a preview that shows you the result before saving it. Dashboard widgets This is the main thing of this cycle. I wrote all six widget types, which are: - KPI tile - split KPI tile - chart - table - pivot - record list A widget is just a saved report query plus the type of rendering you want, so it runs on the report engine. Dashboards with tabs You can create a dashboard, add tabs to it and put widgets inside, so you can keep for example sales and support separated from each other. Sidebar and topbar The sidebar now has the routes for all the new pages, and the topbar has a quick-create button to make a record from anywhere without opening its module first. Two things are still not nice and I’m aware: in some places the relation fields show the raw id instead of the name of the record, and the totals of the document lines are not formatted with the user preferences yet, so you read 9054.00 instead of 9.054,00 EUR. Both are small and both are on the list to be improved. Now I’m working on the PDF generator See you, I hope you enjoy this project
Hey guys, how’s it going? I hope you’re all doing well. School started here in Italy, so I have less time compared to August. I also have to get my driver’s license, so I’m studying for that too. Unfortunately, coding isn’t the first thing I do every day anymore. I’m still working on the PDF generator. Last time I mentioned that relation fields were showing raw IDs and that document totals weren’t formatted properly. I fixed both of those, but I’ll get back to them later. About the PDF The template is HTML, and it lives in the DB. I didn’t hardcode the layout in Java. I created a PdfTemplate entity that stores the HTML, page size and margins. There is one default template for each document type: quote, order, delivery note and invoice. Thymeleaf fills the template with the document data, and OpenHTMLToPDF + PDFBox generate the PDF. Since the HTML is provided by the user, I also had to think about security. A template could try to load something like file:///etc/passwd or access an internal URL. Because of this, external protocols are disabled and only data: URIs are allowed. Page sizes are also checked against a whitelist. I also had to deal with the fact that HTML isn’t always valid XML. OpenHTMLToPDF expects XML, so I use jsoup to normalize the HTML first. Otherwise, perfectly normal HTML can cause a SAXParseException . And finally, fonts have to be embedded in the PDF. Without including DejaVu Sans in the jar, the PDF doesn’t render correctly. VAT summary I also worked on the VAT summary. Lines are grouped by VAT rate, shipping is added to the highest rate, and the document discount is distributed across the rates instead of being applied at the end. VAT is then calculated on the discounted amounts, so everything adds up correctly: taxable + VAT = total This actually fixed a bug where VAT was calculated before applying the document discount. It wasn’t very obvious until I started testing it with real numbers. Three endpoints The PDF system now has three endpoints: print a document preview a template print a batch For the preview, instead of creating a fake document, I use the last real document of that module. This way there is only one PDF generation system to maintain. The batch endpoint combines multiple documents into one PDF, while checking permissions for every document. A few other fixes The two ugly things from last time are also gone. Relation titles are now resolved by a shared backend service, so instead of UUIDs you see things like the company name. The same service is used by the lists, detail pages and PDFs. Amounts in the PDF are also formatted using the user’s preferences. I also added tags to the record lists. Tags are resolved in bulk instead of doing a permission check for every single row, which makes a big difference on larger lists. The backend part is basically done for this cycle. The print button and template editor are already written, but they’re not wired up yet. Right now I’m still using the API to test the generator. So, UI is next. See you in the next devlog!
Hey guys, how have you been doing lately? I’m alright. I’m still getting my driver license, so I don’t have much time to code. Last devlog was all about the PDF engine on the backend, and I closed it saying that the UI was next. Here it is: Print button : I added a print button Print PDF on quotes, orders, delivery notes and invoices. The file is downloaded with the document number as its name, so you get for example 2025-47.pdf and not just document.pdf Template editor : I also added to settings a new tab called “Print”. On the left there’s the list of templates, on the right the HTML, the page size and the margin. The preview renders the last real document of that module instead of a fake one, so what you can see is exactly what your customer receives. The default templates can’t be edited you duplicate them: the seeder rewrites them at every boot, so any change would silently disapper on the next restart. I preferred to say it in the interface rather than let someoune lose an afternoon of work. Company data : The company settings now hold also the legal name, VAT number, tax code, address and contact line. That’s what the PDF header prints, and without them the header comes out empty. VAT that adds up to the cent The header discount is spread across the VAT rates and every share gets rounded, so the sum of the shares could end up one or two cents away from the total. On a quote nobody would ever notice. On an electronic invoice it’s rejection 00423. Now the rounding leftover goes on the last rate, so taxable + VAT = total, always. Tests on a real db : The report engine builds SQL at runtime, and mocking a database proves nothing, so its tests now start a throwaway Postgres in Docker and run against it: filters, grouping, ordering and counting. Two bugs closed : Merging two records didn’t look at the bin, so a deleted record could be merged into a live one. And editing a saved report answered 405, because the frontend was sending PUT to an endpoint that only has POST. Right now I’m working on the 2FA (for those who don’t know, the 2 factor auth). I’m writing the TOTP myself instead of pulling in a library: it’s an HMAC-SHA1 of the 30 second counter, and the six digits come out of the dynamic truncation described in the RFC. The secret is encrypted in the database with AES-GCM, because someone who can read the db must not be able to generate the codes, otherwise a second factor is just a second password. There are ten recovery codes, stored hashed and usable once each, and the last accepted counter is saved, so the same code can’t be replayed during its 30 seconds. The tests are the official RFC 6238 vectors: a TOTP written at home always “works” until you compare it with a real auth app, and at that point it’s too late to find out. Two things I know are missing: the second factor has no interface yet, there’s no page to scan the QR code from, and the mailbox that turns incoming emails into tickets is only half written. See you soon, the end of this project is near.
Hey guys, how’s everything going? I’m alright. I’m so glad hackclub postponed the end of stardance, I have still another month to 1. finish this project 2. do other projects I had on my mind for such a long time. Before doing this devlog, I had to use claude to debug my work, because I had some errors I didn’t understand (I was using a class created for a test in the normal “code”), so bad :( and also other small issues. Lately I worked on one of the most significat features for me, which is 2FA . As my network teacher says "zero trust, because the world is a place full of bastards" . 2FA is one of the techniques I use to follow this approach. Basically, now you can press “Enable” in your preferences, scan the QR code with any authenticator app (f.e google), or just type the secret by hand, because half the people can’t frame a QR code at the first time, lol. You also have to confirm with a code. At login, if 2FA is on, there’s a second step for the six digits. You also get ten recovery codes that you can copy or download, shown only once. Turning it off asks for your password, so a stolen open session can’t remove this precaution. You’re probably wondering: are the secrets encrypted? Yes, they are. I mostly use AES-GCM, because it’s pretty simple, but also secure, so it’s the better compromise. The TOTP secret and the mailbox passwords are stored encrypted with AES-GCM. The key lives in an env variable, not in the db, so a database dump alone isn’t enough to generate codes or read someone’s email. I also turned the crm in a PWA . You can install it on your phone or desktop, it has its own icon and window, and when I deploy a new verion, it tells you to reload, instead of silently serving you the old one from cache (it also checks every 6 hours, maybe I’m gonna change it to 10, idk, for the tab you leave open for days) Like in every other devlog, I made some tests and updated the docs. The report engine now has tests against a real Postgres started in docker, and the repo finally has a real README (it’s not finished, just with some basic information, claude, thanks for the suggestion of making it). Oh, I nearly forgot. I also worked on emails. Now I’m currently working on the Italian electronic invoice, which is called FatturaPA. The crm builds the XML from an invoice, and the first test I wrote checks it against the official government XSD: if it doesn’t pass, it isn’t saved. I think I’m gonna study a bit of english / american law, to allow people out of Italy to use this app as well. I hope you like my product, see you soon
Hey guys, how’s going? I have plenty of things to do, but coding is still one of my favorite activities, so I always try to save some time for it.This time I worked again on FatturaPA, which is the Italian electronic invoice.What I did, is that now, first of all, the CRM can now generate the FatturaPa XML directly from an invoice and validate it against the official XSD, before saving it. I also added the whole invoice lifecycle, from draft, to setn, delivered, accepted or rejected. The CRM can read the recepits from the SDI and show ufseful information when something goes wrong.Another important change is that invoices now become locked once they’re sent to the SDI. If something needs to be changed, the correct way is to create a credit note instead. This is much efficient in my opinion.I also started working on the SDI integration itself. For now there’s only a manual transport, but the system is built so that adding an actual provider later shouldn’t require changing the rest of the CRM. I did it this way, so I can decide which provider use, and not have to change everything.Besides invoicing, I added time tracking. You can start a timer from the top bar and see your hours directly on records. Timers also automatically close after a maximum amount of time, so nobody ends up with a 80-hour ticket because they forgot to stop it.Finally, I worked on email campaigns. You can create a campaign from a saved filter, send emails through a queue and manage unsubscribes. I also added some protections against things like open redirects and accidental unsubscribes.And now, the honest part: before writing this devlog, I ran the tests and guess what, the app didn’t even start.I used claude for debugging, cause I wans’t finding the error. Silly me, it was just a typo.
Hey guys, how’s everythings going? I’m doing pretty well. As always I have lots of things to do, but I still have plenty of time for coding. School is demanding, and preparing for my driving license is also tough, but I’m managing everything little by little. Last time I ended up with an app that wouldn’t even start. Luckily, I fixed all those errors, and all 258 tests are now green and passing on the PostgreSQL db. After that, I added new features. First of all I worked on NPS surveys and quote acceptance. Customers can now receive surveys and answer them through a public link. They can also accept quotes directly from a link, without needing an account. I also made sure these features work with the existing workflows, so automations can still do their job properly. Another interesting addition is the MCP server. AI agents can now interact with the CRM through an API key. Instead of creating a separate set of tools for every module, I went with seven generic tools that can work across all 34 modules. This should make it easier for AI models to understand which actions they can perform, while keeping the CRM’s existing permissions and security rules in place. I also improved search quite a bit. Before, it mostly looked at record titles. Now it uses PostgreSQL full-text search to find relevant information inside the actual record data and rank the results. The audit history is also much easier to read, with related record IDs replaced by their actual titles. I worked on a couple of smaller but important things, too. The trash can now properly handle related files and records when permanently deleting something, while protecting fiscal documents that must be kept for ten years. Finally, I started working on the customer portal. It now has its own backend authentication and permission system, separate from the employee login. Customers will only be able to access records they’re actually allowed to see. The backend is ready, but I still need to connect the frontend pages and routes. There’s still quite a bit to do, but I’m getting closer to the first complete version of the CRM. See you in the next devlog!
Hey guys, how’s going? This will be a short devlog, and it’s the one before the shipping. I decided to ship the CRM, even if it’s not completely finished. That’s because I still have to do lots of things, but now I have a working product, so, since the changes I have to make are complementary. Unfortunately, I have a big issue: the whole interface is in Italian. The app is made for Italian small businesses (FatturaPA, VAT, SDI…), but if you come from Stardance you can’t read a single menu. Real i18n is still on my list and it is a big job, so for now I added the Google Translate widget in the corner of the app. If your browser is in English it starts translating by itself, otherwise you pick English from the selector. It’s not pretty, but it makes the demo usable today instead of “someday”. I had to widen the CSP in nginx for it, and I loaded the script as an external file so I didn’t need a second hash. I also fixed the README and cleaned the repo. Now everything should work fine, or at least let’s hope so. I hope you enjoy the product.
Hey guys, what’s up? I’m finally in the last phase of getting my driving license, so that’s taking up some of my time too. The CRM is now online at crm.alessio.hackclub.app . The VPS has very little RAM, so I build the Docker images locally and transfer them to the server using docker save over SSH. It’s not the fanciest deployment process, but it works with the resources I have, so I’ll stick to it for now. One of the main things I worked on was the customer portal . The backend from last week finally has a frontend: customers can log in, see their tickets and documents, open requests, reply to messages, download PDFs and accept quotes. I also made sure that internal notes stay internal. Notes now have a Visible to customer checkbox, which is disabled by default. The portal only shows notes explicitly marked as visible, so there’s less risk of accidentally exposing something that should stay private. Another feature I added is Google Calendar import . It’s read-only for now, so the CRM can import events without modifying anything in your Google account. Events are created through the same service as normal CRM records, meaning workflows and the audit log still work as expected. Sync runs every 15 minutes, and if something goes wrong with an account, it won’t stop the others from syncing. I also started replacing the Google Translate workaround with proper internationalization (i18n). The translation system is in place, including support for parameters and locale-aware dates and numbers. The dictionary is type-checked, too, so missing English translations can be caught at compile time. There’s still a lot of work here: around 1,200 strings need to be translated by hand. It’s not the most exciting task, but I’d rather have proper translations than rely on Google Translate forever. Obviously that’s my opionion. I also started working on public registration, but it’s not ready yet. There’s one important limitation: the CRM currently has a single shared workspace, so everyone who registers would see the same data. Registration will stay disabled unless explicitly enabled until I decide how to handle that properly. That’s because the idea is to have 1 single DB for each workspace, since the CRM should be self-hosted. There’s still work to do, but the CRM is getting closer to the version I wanted to ship. See you in the next devlog!
Ships:
CRM An open-source CRM for Italian small businesses: contacts, companies, leads, quotes, orders, invoices with VAT, tickets, email campaigns, NPS surveys, reports and a customer portal. It started as a way to manage clients for a friend’s startup and became a working and valuable project. TRY IT (no install) https://crm.alessio.hackclub.app email: [email protected] password: HackClub-Demo-2026! The demo has full access and realistic fake data, so feel free to click everything, create, edit and delete. The data resets occasionally. Outgoing email is switched off on the demo. HEADS UP: the interface is in Italian. Use the translate widget in the corner of the app (or your browser’s translator) to read it in English. Real i18n is on my roadmap, sorry! WHAT TO LOOK AT A quote with line items, discounts and VAT by rate, and the “Print PDF” button. PDFs come from HTML templates you can edit, with a live preview on your last real document. A customer accepting a quote from a signed link, without an account. Full-text search across every module (PostgreSQL). Italian e-invoicing: it builds the FatturaPA XML and validates it against the official government XSD before saving. Invoices lock once sent to the SDI. The MCP server: an AI assistant can use the CRM through an API key, with seven generic tools that work on all 34 modules and respect permissions. 2FA (TOTP) with recovery codes, secrets encrypted at rest, installable PWA. HOW IT WORKS There is no “contacts” or “companies” table. One generic Record entity stores its fields in a jsonb column, and an ObjectType + FieldDef describe each module (39 field types). Adding a module is a configuration record, not a migration or a new controller. Permissions are checked per module and action at runtime. You can have more info in the README, so please check it. I hope you appreciate this project :)...
|
1792731096.075204
|
1792817496.075204
|
|
13934
|
My first slack bot! by @Saifan | Stardance
|
Saifan
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T13:59:15Z", "hours": 1.0, "multiplier": 1.01, "payout": 1, "blessing": "neutral", "text": "i created a slack bot named “KOT” having kings theme/behaviour for more info check my github repo plzz", "repo": "https://github.com/Saifan86/SlackBot-Kot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BAHTBN3U1?_gl=1*5vnct3*_gcl_au*MTYzNjg1MDQxLjE3ODE0NDI3MTI."}]...
|
[{"post_id": 8147, "ts": "2026 [{"post_id": 8147, "ts": "2026-06-13T16:15:52Z", "hours": 1.1336, "text": "slackBot"}]...
|
Title: My first slack bot! by @Saifan | Stardance
Title: My first slack bot! by @Saifan | Stardance
Devlogs:
slackBot
Ships:
i created a slack bot named “KOT” having kings theme/behaviour for more info check my github repo plzz...
|
1792824968.1379652
|
1792911368.1379652
|
|
34137
|
GMTK game jam 2026 by @ducki | Stardance
|
ducki
|
0
|
46.91
|
0
|
[]
|
[{"post_id": 81474, "ts": "202 [{"post_id": 81474, "ts": "2026-10-21T12:25:57Z", "hours": 3.6486, "text": "A public leaderboard I have not ever tried to add a public leaderboard to a game , but it was more pleasant than I expected. I took some of my old code to quickly make a js node application, using sequelize to handle the backend. Then set up everything to a Render web service and postgress database. Then connected godot to the web service and it works! When loosing in the endless mode you will be prompted if you wish to submit your score to the database, and if you are top 10, you will show up on the main menu. A small intro. The jam version had a very long intro, I remade it to have a way shorter one, so when trying the game over and over, it is not a hastle to wait through the tutorial."}, {"post_id": 81411, "ts": "2026-10-21T05:33:54Z", "hours": 4.0214, "text": "Bobs shop is officially open Buy upgrade cards after rounds to be able to beat even harder rounds. The goal is going to be to make it to the furthest level possible. And then flex on others with a level leaderboard. Main features I managed to make A very nice upgrade card system, which lets me make new cards insanely easily. (I love dictionaries) I can make each upgrade store its own function, then make custom new functions at will. Card buying and then displaying on 2D. As well as popping up when their special function is met Reroll buttons The game is starting to come togheter . Today I have woken up sick. because of it I probably won’t be able to finish in my own set time limit, but that is normal in game development, to plan less time than it would actually take. Video is a bit laggy"}, {"post_id": 81224, "ts": "2026-10-20T11:06:26Z", "hours": 2.4675, "text": "Welcome to Bobs shop I have made the shop cards, only have the buying left to add and make a bunch of custom card functions. Obviously made the cards stretch and pop around. gameplay loop The gameplay loop is almost done already. I added the button to start next round, which now means the player can go on forever, as long as they get enough score each round There is a fun “feature” of text and cards becoming huge, that I will showcase in the next devlog"}, {"post_id": 81195, "ts": "2026-10-20T07:58:02Z", "hours": 3.5203, "text": "Enviornment changes I realised the previous deep fog was a bit too much. So I gave bob a new skybox, so he does not have to live in darkness. Also a bunch more visual improvements. More buttons squatch and stretch. Optimized some code, where for some reason I was running the same code in 3 different spots, combined all that into just 1 function. Next I will start working on the shop, originally started a 2d shop, but realised I want to keep the 3d cards, so instead I am a 3d shop."}, {"post_id": 81020, "ts": "2026-10-19T16:24:43Z", "hours": 4.1611, "text": "I love polish The most important part of an incremental game is polish. So in the video, you can a load of the basics. Particles, Rotation, scaling. Numbers. I will have to improve this system further, but currently I already like how it feels. Cash calculating Currently I only have amount and multiplier. It is a bit inspired by balatro, I want to differenetiate a bit by trying to make it be more the players choice of possible combos. Instead of having some multiplier based on poker hands, each card shall do something. and each upgrade, either buffs a specific card, or lets the player themselves make combinations, for example, if your card sum is 10, get 3x the cash. more additions Added card selecting/unselecting added hand playing"}, {"post_id": 80928, "ts": "2026-10-19T08:28:55Z", "hours": 3.8089, "text": "Got a load of feedback about the game Bob is back! After getting a lot of feedback, I have realised what could be improved in the game, so I have decided to improve the game a bit, and try implement some stuff that I did not get to in the short GMTK game jam time frame but what is the fun if there is no challenge? So I have decided to attempt to finish all the game improvements in 50 hours of real world time (2 days) Current changes From the feedback, the 3d world buttons sometimes were hard to spot, so I moved them to be 2d. Also I have started to clean up some of the spaghetti code that was made when speedrunning this game in such a short time frame Made the cards order themselves based on values Idea that I want to implement I want to make the game be more like and incremental, and have a lot of customization. The idea is every card does something else, and between levels you get to buy upgrades, that change what each specific card does."}, {"post_id": 35656, "ts": "2026-07-27T07:28:11Z", "hours": 7.2297, "text": "Bob is succesfully a part of the gmtk game jam After having to rush the game, too big files and multiple game breaking bugs we managed to fix everything in time! The problems: Couple hours before submission I wanted to add a arrow to guide the player that they do not get lost. Now I tried for an entire hour to do some complex vector math, after giving up my teammate just found that there is the godot look_at() function o_o. Fun waste of an important hour. Game breaking bugs -> Scenes crashing, money doesnt reset when you restart the game (You would be stuck at 0 all the time), items dont get used up Now luckly they were all quite easy to fix, but then also, since this was a game jam we decided to use some premade assets. We ended up having a lot that we did not use in the directory, and then we found out itch allows only 200mb files for web games , we were almost double that. Well swing swing half the files deleted The game contents A small story scene in the beginning and end of game Playing cards against Bob ( Do anything you must to win) mainmenu, settings, ending screen tutorial, which hopefully explains the gameplay good enough overall We have stuff to work on, spaghetti code is something that can always improve, our modeling skills. Try not to rush everything in the end, but I am proud of our progress in this game jam, even more with the fact this was our first 3d game jam. I think this game needs a little bit more polish before being worthy of a stardance ship, so its gameplay shall be perfected after the suggestions from the jam voters. try out the jam version at https://duc-k.itch.io/cashless-drive If you also made a gmtk game jam game, drop a link to it in the comments for me to try out"}, {"post_id": 34911, "ts": "2026-07-26T00:33:33Z", "hours": 8.5508, "text": "Bob now plays cards with you on a moving car! In the past few hours in my gmtk game jam game I have succesfully polished the main blackjack game. meanwhile my teammate has been working on shops, between scenes. This doesnt mean there was no struggle I have banged my head a couple of times on my desk trying to figure out how to order every signal and event in the correct order. Bob was being a bit quiet So i let him be able to talk, well kind of ragebait the player This dialogue system is definetly one of the more favorite ones I have made, mainly because of how fast I was able to make it. Instead of making the next text function replace the entire current text that is displayed, I instead use a string Array to keep all the requested dialogues, where if there are no dialogues when adding to the array, I create a while loop untill I run out of dialogue strings, letting me handle multiple messags from different components all at the same time without even a chance of anything going wrong. I had given the game to a friend to playtest Understood that it is very hard to know what you are supposed to do (they got stuck not knowing what to do), that is why my main priority is going to be a polished tutorial, so people do not get stuck in the first 3 minutes. There are only around 22 hours left in the jam Will it be possible for this games team of 2 to finish in time, yes, but very rough, so this game will have to be polished a bit after submission to the jam. Comment your gmtk game jam games so I can check them out"}, {"post_id": 34343, "ts": "2026-07-24T23:15:08Z", "hours": 9.5028, "text": "Say hi to BOB This year I am participating in a gamejam in the GMTK game jam. Now the theme is kind of not my favorite (trauma from making timed games) You might be asking who is Bob, well he is the green alien in the picture, idk I think it makes sense. Game idea: So this year to keep it simple, taking inspiration from balatro and gamble with your friends, you get stuck in the desert and you are missing 5$ for a bus ticket but Bob here decides here is going to give you a lift, but you must pay him for every km you drive, you dont have money but you can get it by playing blackjack against him. Who said it was gonna be fair? Appart from the regular blackjack implementation, I have added cheating and items both to increase your chances of surviving. (Yes surviving, dont run out of cash) Sometimes Bob gets a bit distracted, during those moments you have the chance to cheat…. Or if you are fancy, use your items to do a load of powerful effects. Progress Progress is a bit slow, since gmtk game jam ends in like 2 days, but I think this is possible, godot signals have become my best friend to keep everything ordered correctly in all the scripts. This is definetly my best code for a game jam yet. If any of you is working on the GMTK game jam, comment your projects!"}]...
|
Title: GMTK game jam 2026 by @ducki | Stardance
D Title: GMTK game jam 2026 by @ducki | Stardance
Devlogs:
Say hi to BOB This year I am participating in a gamejam in the GMTK game jam. Now the theme is kind of not my favorite (trauma from making timed games) You might be asking who is Bob, well he is the green alien in the picture, idk I think it makes sense. Game idea: So this year to keep it simple, taking inspiration from balatro and gamble with your friends, you get stuck in the desert and you are missing 5$ for a bus ticket but Bob here decides here is going to give you a lift, but you must pay him for every km you drive, you dont have money but you can get it by playing blackjack against him. Who said it was gonna be fair? Appart from the regular blackjack implementation, I have added cheating and items both to increase your chances of surviving. (Yes surviving, dont run out of cash) Sometimes Bob gets a bit distracted, during those moments you have the chance to cheat…. Or if you are fancy, use your items to do a load of powerful effects. Progress Progress is a bit slow, since gmtk game jam ends in like 2 days, but I think this is possible, godot signals have become my best friend to keep everything ordered correctly in all the scripts. This is definetly my best code for a game jam yet. If any of you is working on the GMTK game jam, comment your projects!
Bob now plays cards with you on a moving car! In the past few hours in my gmtk game jam game I have succesfully polished the main blackjack game. meanwhile my teammate has been working on shops, between scenes. This doesnt mean there was no struggle I have banged my head a couple of times on my desk trying to figure out how to order every signal and event in the correct order. Bob was being a bit quiet So i let him be able to talk, well kind of ragebait the player This dialogue system is definetly one of the more favorite ones I have made, mainly because of how fast I was able to make it. Instead of making the next text function replace the entire current text that is displayed, I instead use a string Array to keep all the requested dialogues, where if there are no dialogues when adding to the array, I create a while loop untill I run out of dialogue strings, letting me handle multiple messags from different components all at the same time without even a chance of anything going wrong. I had given the game to a friend to playtest Understood that it is very hard to know what you are supposed to do (they got stuck not knowing what to do), that is why my main priority is going to be a polished tutorial, so people do not get stuck in the first 3 minutes. There are only around 22 hours left in the jam Will it be possible for this games team of 2 to finish in time, yes, but very rough, so this game will have to be polished a bit after submission to the jam. Comment your gmtk game jam games so I can check them out
Bob is succesfully a part of the gmtk game jam After having to rush the game, too big files and multiple game breaking bugs we managed to fix everything in time! The problems: Couple hours before submission I wanted to add a arrow to guide the player that they do not get lost. Now I tried for an entire hour to do some complex vector math, after giving up my teammate just found that there is the godot look_at() function o_o. Fun waste of an important hour. Game breaking bugs -> Scenes crashing, money doesnt reset when you restart the game (You would be stuck at 0 all the time), items dont get used up Now luckly they were all quite easy to fix, but then also, since this was a game jam we decided to use some premade assets. We ended up having a lot that we did not use in the directory, and then we found out itch allows only 200mb files for web games , we were almost double that. Well swing swing half the files deleted The game contents A small story scene in the beginning and end of game Playing cards against Bob ( Do anything you must to win) mainmenu, settings, ending screen tutorial, which hopefully explains the gameplay good enough overall We have stuff to work on, spaghetti code is something that can always improve, our modeling skills. Try not to rush everything in the end, but I am proud of our progress in this game jam, even more with the fact this was our first 3d game jam. I think this game needs a little bit more polish before being worthy of a stardance ship, so its gameplay shall be perfected after the suggestions from the jam voters. try out the jam version at https://duc-k.itch.io/cashless-drive If you also made a gmtk game jam game, drop a link to it in the comments for me to try out
Got a load of feedback about the game Bob is back! After getting a lot of feedback, I have realised what could be improved in the game, so I have decided to improve the game a bit, and try implement some stuff that I did not get to in the short GMTK game jam time frame but what is the fun if there is no challenge? So I have decided to attempt to finish all the game improvements in 50 hours of real world time (2 days) Current changes From the feedback, the 3d world buttons sometimes were hard to spot, so I moved them to be 2d. Also I have started to clean up some of the spaghetti code that was made when speedrunning this game in such a short time frame Made the cards order themselves based on values Idea that I want to implement I want to make the game be more like and incremental, and have a lot of customization. The idea is every card does something else, and between levels you get to buy upgrades, that change what each specific card does.
I love polish The most important part of an incremental game is polish. So in the video, you can a load of the basics. Particles, Rotation, scaling. Numbers. I will have to improve this system further, but currently I already like how it feels. Cash calculating Currently I only have amount and multiplier. It is a bit inspired by balatro, I want to differenetiate a bit by trying to make it be more the players choice of possible combos. Instead of having some multiplier based on poker hands, each card shall do something. and each upgrade, either buffs a specific card, or lets the player themselves make combinations, for example, if your card sum is 10, get 3x the cash. more additions Added card selecting/unselecting added hand playing
Enviornment changes I realised the previous deep fog was a bit too much. So I gave bob a new skybox, so he does not have to live in darkness. Also a bunch more visual improvements. More buttons squatch and stretch. Optimized some code, where for some reason I was running the same code in 3 different spots, combined all that into just 1 function. Next I will start working on the shop, originally started a 2d shop, but realised I want to keep the 3d cards, so instead I am a 3d shop.
Welcome to Bobs shop I have made the shop cards, only have the buying left to add and make a bunch of custom card functions. Obviously made the cards stretch and pop around. gameplay loop The gameplay loop is almost done already. I added the button to start next round, which now means the player can go on forever, as long as they get enough score each round There is a fun “feature” of text and cards becoming huge, that I will showcase in the next devlog
Bobs shop is officially open Buy upgrade cards after rounds to be able to beat even harder rounds. The goal is going to be to make it to the furthest level possible. And then flex on others with a level leaderboard. Main features I managed to make A very nice upgrade card system, which lets me make new cards insanely easily. (I love dictionaries) I can make each upgrade store its own function, then make custom new functions at will. Card buying and then displaying on 2D. As well as popping up when their special function is met Reroll buttons The game is starting to come togheter . Today I have woken up sick. because of it I probably won’t be able to finish in my own set time limit, but that is normal in game development, to plan less time than it would actually take. Video is a bit laggy
A public leaderboard I have not ever tried to add a public leaderboard to a game , but it was more pleasant than I expected. I took some of my old code to quickly make a js node application, using sequelize to handle the backend. Then set up everything to a Render web service and postgress database. Then connected godot to the web service and it works! When loosing in the endless mode you will be prompted if you wish to submit your score to the database, and if you are top 10, you will show up on the main menu. A small intro. The jam version had a very long intro, I remade it to have a way shorter one, so when trying the game over and over, it is not a hastle to wait through the tutorial....
|
1792641251.2250888
|
1793246051.2250888
|
|
280
|
Ks' Corner by @Ks | Stardance
|
Ks
|
2
|
37.14
|
325
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T22:34:46Z", "hours": 15.0, "multiplier": 12.18, "payout": 177, "blessing": "neutral", "text": "This website is still a work in progress, but am shipping right now for Playground [I don’t know how to add it to the mission though] (Note: Find Lavender though Games -> Lavender’s Home -> Lavender) I hated doing the phone version, couldn’t get patting for the phone in any single way, but it works well on PC, (hover the mouse and move it a bit) In this update you also have the main Math page, still working on the smaller pages, might have to bring up Manim or something soon for them, and added a calculator!", "repo": "https://github.com/Ks-Marbs/ks-corner", "demo": "https://ks-marbs.github.io/ks-corner/"}, {"ship_num": 2, "ts": "2026-06-29T19:55:54Z", "hours": 20.0, "multiplier": 7.33, "payout": 148, "blessing": "neutral", "text": "My first website attempt Honestly too lazy to learn HTML so made it in Godot ’o-o Any and all feedback is appreciated", "repo": "https://github.com/Ks-Marbs/ks-corner", "demo": "https://ks-marbs.github.io/ks-corner/"}]...
|
[{"post_id": 81479, "ts": "202 [{"post_id": 81479, "ts": "2026-10-21T12:45:22Z", "hours": 2.1442, "text": "Added small pages for all three of my [old] series Tweaked Lavender a bit too"}, {"post_id": 79180, "ts": "2026-10-12T22:28:17Z", "hours": 2.5675, "text": "Finished adding Lavender, And her game page! Will ship for now so it qualifyies for Playground but ill still finish the other pages 🪻"}, {"post_id": 77385, "ts": "2026-10-06T19:00:40Z", "hours": 2.8272, "text": "Added the Lavender’s home page, and just added… Lavender?"}, {"post_id": 76020, "ts": "2026-10-02T02:34:12Z", "hours": 2.265, "text": "Made pages for room sokoban and Unn Rhyhtm game, as well as bugfixed the calculator on phone, as it was coming too small for the screen"}, {"post_id": 73376, "ts": "2026-09-25T01:17:36Z", "hours": 2.6642, "text": "Oh hey, we actually did a calculator… [sort of, its just a fancy keyboard and parcing in godot but i’m too lazy to make a full calculator] No idea what to do next except writing… ‘– It’s so boooooorinng"}, {"post_id": 70148, "ts": "2026-09-18T15:41:53Z", "hours": 2.2397, "text": "Added the Math page! Planning on adding a calculator “page” later, and maybe adding more articles written by myself when i have time ;-;"}, {"post_id": 65673, "ts": "2026-09-10T23:44:19Z", "hours": 2.0031, "text": "Updated godot from 4.5 to 4.7 It broke the image sizing so i fixed it ( ’–)"}, {"post_id": 18596, "ts": "2026-06-29T19:41:44Z", "hours": 4.6339, "text": "Finished the website (mostly) I think its nice enough to ship :] Should update with photos and irl prizes when i’m more comfortable sharing my irl name but except that, it works Added a very nice BG and pictures and audios"}, {"post_id": 13493, "ts": "2026-06-22T02:49:40Z", "hours": 4.1911, "text": "Week 15 to 21 worked mostly on getting the site phone ready. also began developing some features/Easter eggs. I’m develoging through phone and it does not have the enter key to type \\n"}, {"post_id": 9607, "ts": "2026-06-16T00:23:39Z", "hours": 5.5392, "text": "Week: 8->14/6 I’m not home so I hope this goes in time for the weekly stickers T-T This week I worked mostly on phone adaptation, also looked how to make each of the pages actual pages, and made the start screen text! Also discovered that images can go directly on text so will use that to my advantage :]"}, {"post_id": 4360, "ts": "2026-06-07T17:32:43Z", "hours": 0.7628, "text": "Images are now working! plans for the future is making the site diferent for phone i.e. vertical"}, {"post_id": 3881, "ts": "2026-06-06T23:37:48Z", "hours": 0.6258, "text": "Am I wrong for doing exactly 30 minutes everyday just so I can get all da stickers? But yeah, somehow typing all this and making it work for more than 1 mini page took 35 minutes"}, {"post_id": 3220, "ts": "2026-06-06T01:33:03Z", "hours": 3.0619, "text": "So in these last few days: Updated the site to make it scalable Made it so text exists Figuring out how to add images that move with the text (Hackatime changed the name of the project so I didn’t devlog since I didn’t see it did, please don’t remove my stickers)"}, {"post_id": 1014, "ts": "2026-06-02T20:06:21Z", "hours": 0.8453, "text": "Began building the website in Godot, and am creating the github repo (before i forget) Figured out how to make the mouse do the thingy where it turns into a “you can click here” thingy (unable to screenshot that but most of y’all know it) Began searching for how to turn scenes into pages in Godot -> HTML"}, {"post_id": 496, "ts": "2026-06-01T23:38:07Z", "hours": 0.5667, "text": "Heyyyy🟡 idk why but i can only type the title? Anyway, began doing a sketch at canva for reference"}]...
|
Title: Ks' Corner by @Ks | Stardance
Devlogs: Title: Ks' Corner by @Ks | Stardance
Devlogs:
Heyyyy🟡 idk why but i can only type the title? Anyway, began doing a sketch at canva for reference
Began building the website in Godot, and am creating the github repo (before i forget) Figured out how to make the mouse do the thingy where it turns into a “you can click here” thingy (unable to screenshot that but most of y’all know it) Began searching for how to turn scenes into pages in Godot -> HTML
So in these last few days: Updated the site to make it scalable Made it so text exists Figuring out how to add images that move with the text (Hackatime changed the name of the project so I didn’t devlog since I didn’t see it did, please don’t remove my stickers)
Am I wrong for doing exactly 30 minutes everyday just so I can get all da stickers? But yeah, somehow typing all this and making it work for more than 1 mini page took 35 minutes
Images are now working! plans for the future is making the site diferent for phone i.e. vertical
Week: 8->14/6 I’m not home so I hope this goes in time for the weekly stickers T-T This week I worked mostly on phone adaptation, also looked how to make each of the pages actual pages, and made the start screen text! Also discovered that images can go directly on text so will use that to my advantage :]
Week 15 to 21 worked mostly on getting the site phone ready. also began developing some features/Easter eggs. I’m develoging through phone and it does not have the enter key to type \n
Finished the website (mostly) I think its nice enough to ship :] Should update with photos and irl prizes when i’m more comfortable sharing my irl name but except that, it works Added a very nice BG and pictures and audios
Updated godot from 4.5 to 4.7 It broke the image sizing so i fixed it ( ’–)
Added the Math page! Planning on adding a calculator “page” later, and maybe adding more articles written by myself when i have time ;-;
Oh hey, we actually did a calculator… [sort of, its just a fancy keyboard and parcing in godot but i’m too lazy to make a full calculator] No idea what to do next except writing… ‘– It’s so boooooorinng
Made pages for room sokoban and Unn Rhyhtm game, as well as bugfixed the calculator on phone, as it was coming too small for the screen
Added the Lavender’s home page, and just added… Lavender?
Finished adding Lavender, And her game page! Will ship for now so it qualifyies for Playground but ill still finish the other pages 🪻
Added small pages for all three of my [old] series Tweaked Lavender a bit too
Ships:
My first website attempt Honestly too lazy to learn HTML so made it in Godot ’o-o Any and all feedback is appreciated
This website is still a work in progress, but am shipping right now for Playground [I don’t know how to add it to the mission though] (Note: Find Lavender though Games -> Lavender’s Home -> Lavender) I hated doing the phone version, couldn’t get patting for the phone in any single way, but it works well on PC, (hover the mouse and move it a bit) In this update you also have the main Math page, still working on the smaller pages, might have to bring up Manim or something soon for them, and added a calculator!...
|
1792835772.2337348
|
1792922172.2337348
|
|
65403
|
AVIAN FILES! by @vashi_21 | Stardance
|
vashi_21
|
1
|
3.41
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T06:59:05Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my personal website about aviary . the main challenge was css part but as the guide given on the website it made easy for me .", "repo": "https://github.com/wizard21-sudo/first-html", "demo": "https://wizard21-sudo.github.io/first-html/"}]...
|
[{"post_id": 81480, "ts": "202 [{"post_id": 81480, "ts": "2026-10-21T12:46:35Z", "hours": 0.6408, "text": "Today, I finally fixed my image gallery by organizing all my bird photos into a local folder. I renamed the image files and updated the HTML paths so every single picture loads cleanly on the page. After that I committed the progress and pushed to GitHub. It feels great to see all the six birds showing up properly now."}, {"post_id": 76118, "ts": "2026-10-02T11:04:31Z", "hours": 1.7681, "text": "Had fun time doing it <3 ."}, {"post_id": 75127, "ts": "2026-09-29T06:49:05Z", "hours": 1.4139, "text": "Built the website layout for THE BACKYARD AVIARY using HTML5 and CSS3 ! Added birdwatching tips , styled the navigation menu , and set up an image gallery with colorful songbirds .Deployed the site live using GitHub Pages . It was an amazing experience to create this."}]...
|
Title: AVIAN FILES! by @vashi_21 | Stardance
Devl Title: AVIAN FILES! by @vashi_21 | Stardance
Devlogs:
Built the website layout for THE BACKYARD AVIARY using HTML5 and CSS3 ! Added birdwatching tips , styled the navigation menu , and set up an image gallery with colorful songbirds .Deployed the site live using GitHub Pages . It was an amazing experience to create this.
Had fun time doing it <3 .
Today, I finally fixed my image gallery by organizing all my bird photos into a local folder. I renamed the image files and updated the HTML paths so every single picture loads cleanly on the page. After that I committed the progress and pushed to GitHub. It feels great to see all the six birds showing up properly now.
Ships:
I made my personal website about aviary . the main challenge was css part but as the guide given on the website it made easy for me ....
|
1792817243.2522254
|
1792903643.2522254
|
|
18864
|
Super Wifi Duck Pad by @gavhu10 | Stardance
|
gavhu10
|
0
|
36.14
|
0
|
[]
|
[{"post_id": 81490, "ts": "202 [{"post_id": 81490, "ts": "2026-10-21T14:05:33Z", "hours": 2.2736, "text": "I fixed another bug, learned a new thing about C, and wrote some docs. When there was a space on a line by itself the device performed as expected. But when something that was not a function or something on a line by itself, it typed the first two letters, then inserted a newline. After hitting my head against walls, I found out that I had been using the strcomp function (in C) wrong. It returns 0 when a string matches and I expected to return 1 instead. That caused all the lines to be handled like they were just a space. I also found out that I had not accounted for a newline character and had assumed it would be removed sometime in the parsing process. I managed to figure it out, though, and it works fine now. I also wrote some docs. I wrote them in markdown and made a converter that turns them into html and stores them in the device when the project is compiled. That way someone can read the docs online or from the access point."}, {"post_id": 78508, "ts": "2026-10-11T01:04:52Z", "hours": 0.5553, "text": "I added a bunch of QOL improvements. I made it so that Ctrl+S would save the file in the editor. I made it so that a profile is automatically selected when the web ui loads. I also added mDNS so that you do not have to remember an ip address but can just go to wifi-duck.local!"}, {"post_id": 78202, "ts": "2026-10-09T23:25:11Z", "hours": 1.6008, "text": "I fixed a tricky bug. If the script parser encountered a line with just a space, it would not delete the line like it would if the line was empty. Instead it would split the line on that space and return a NULL pointer. The reason this was hard to find was because it was deep in the internals of the parser and was written in C and I could not use print statements as the Serial Arduino is C++ only. When I could use print statements, I did, and with careless abandon! Then I spent a bunch of time making my commit message line up nicely."}, {"post_id": 78053, "ts": "2026-10-09T12:01:24Z", "hours": 2.1314, "text": "I made it so that the selected profile and selected script are highlighted. It took longer than it should have because I have not learned frontend and do not use AI. Another problem is the time it takes to upload changes to the device. However, I still managed to make it look okay."}, {"post_id": 77550, "ts": "2026-10-07T12:34:13Z", "hours": 2.7089, "text": "I added media keys! So far I have pause/play, next, previous, and volume. It turns out those types of keys are not regular keyboard keys. They actually are part of something called Consumer Control. The library that works with Consumer Control is very similar to the built-in esp-idf keyboard library but as I looked at the code, I noticed something wrong with it. I found out that the USBHIDKeyboard library was vendored and then modified. To make sure that Consumer Control did not mess with the keyboard I refactored the code so it just used the built in library. Here is a demo of the volume keys:"}, {"post_id": 76258, "ts": "2026-10-02T22:55:37Z", "hours": 4.1675, "text": "I rebuilt the case! It took ~20 iterations of export, slice, and print, not including failed prints. It now covers the whole top of the board but includes some vents so that you can press the reset and boot buttons. It took a lot of work and I changed the design multiple times. I ended up with hexagon holes in the case which in themselves were tricky. I used an OpenScad library I found on thingiverse and modified it, only to redesign the pattern so that those edits were not needed. Typical! The main picture is what I finished with. I also have pictures of the other designs."}, {"post_id": 74564, "ts": "2026-09-27T17:18:02Z", "hours": 0.6494, "text": "I made alternate keycaps with OpenScad for my keypad but in the end I chose to stick with what I had before. I wanted the buttons to have smaller profiles and be the same colour. At first I tried to make a complicated clip like the injection molded ones that came with the set, but that failed as 3d printed material is not suited for that purpose. Instead I made keycaps that held on with friction. That worked, but they were hard to take off again and they ended up being uglier than the injection molded ones."}, {"post_id": 73296, "ts": "2026-09-24T19:40:20Z", "hours": 2.3914, "text": "I made a case for my Keypad using OpenScad. It took eight iterations of export, slice, and print, but I like how it turned out. It makes it look a lot more finished. I tracked the time with Lapse because I could not track it with hackatime."}, {"post_id": 72003, "ts": "2026-09-21T23:46:56Z", "hours": 0.7506, "text": "I added a command (function?) called STRINGLN. This is just like the STRING function, which types out a string, but after typing out the string, it presses enter. This is not a big change, but to make it, I had to read all the code involved with parsing the script and pressing the buttons. STRINGLN is also a very handy function (command?) as it reduces verbosity and many existing duckyscripts use it. I created a pr to the upstream project which you can see here . Below is an example script from the Hak5 repo that uses STRINGLN."}, {"post_id": 60915, "ts": "2026-09-03T16:00:00Z", "hours": 2.2614, "text": "I integrated the NeoPixel LED with the firmware. My only problem was that the NeoPixel library was vendored in. I fixed that by adding a PlatformIO library in the config. Now you can show the status of your script through the LED! It also shows you if it managed to connect to WiFi. I tried to make the ip address of the device static while in station mode, but it turns out things like that vary between routers, so I just added a readout of the ip address to the settings. I made a demo video for the LED. The three flashes at the beginning confirm that it connected to a wifi network. I had to put tape over the LED to diffuse it."}, {"post_id": 52720, "ts": "2026-08-23T01:19:52Z", "hours": 3.7614, "text": "I made it so that you did not need to connect to the access point to configure the device. This is handy because otherwise you would have to disconnect from the internet to configure the device. I also fixed a stubborn bug with the profiles. The problem was that the get_profile command returned the current profile with a newline. This in turn broke the javascript that let you edit the scripts. Instead of editing 6 (for button six) it was editing \\n\\r6. This broke the quotes and made a big mess."}, {"post_id": 47412, "ts": "2026-08-15T10:29:24Z", "hours": 7.4258, "text": "This is a really long devlog because profiles are a big feature. They make it so that you do not have to overwrite your macros every time you switch contexts. They were tricky to make for a variety of reasons. I had to add multiple cli commands so that the web ui could do things, refactor lots of things so that they could be reused, and change how I compiled the project. I also had to write frontend code! shudder I learnt a lot of things about the project while debugging. For example, a cli command called from the websocket must return something or the ui will hang. Fun times! Here is the diff of what I did: link"}, {"post_id": 36769, "ts": "2026-07-29T01:14:15Z", "hours": 0.3378, "text": "I made so that the ordering made more sense. It used to start with zero which is fine but confusing for some people. I also made so that the pins are read in the right order, as the order used to be 1 4 7 2 5 8 3 6 9 to make it easier to route, but that also is confusing, so now it reflects the ui. The next step is shortcut profiles like the og duckyPad."}, {"post_id": 36149, "ts": "2026-07-28T01:40:43Z", "hours": 1.3208, "text": "I made it so that the script selector is like the buttons so that it is easier to use. It took a while because I am not very good at frontend things, but I like how it turned out. It was made especially tricky as on-device debugging involves compiling and uploading the new firmware, connecting to the access point network, and then reloading. I did get a debug setup going with python -m http.server but then the websockets did not work for obvious reasons."}, {"post_id": 23202, "ts": "2026-07-06T00:54:40Z", "hours": 3.41, "text": "This devlog is rather long, but a lot of things needed to happen before I wanted to make another devlog. I had a very difficult bug involving macros (written in DuckyScript) running at the same time. It wasn’t always a problem, but the buttons made it really easy to crash the system by overlapping scripts. When I added some code to keep track of that, it would crash when launching a script from the web-ui, but not when launching them from the terminal or buttons. After much (much much much) debugging and banging my head against walls, I figured that the problem was with a websocket status pulse. By delaying the pulse, I could avoid a crash. You can see the one line javascript patch below. I’m not sure why it was crashing the device, but it seems to be fixed now. I made a PR to upstream here Anyway, enjoy the demo!"}, {"post_id": 18051, "ts": "2026-06-29T00:58:38Z", "hours": 0.3911, "text": "I made a macropad with KiCad. It uses an esp32 s3, so it will have a web based config editor. This project is the firmware for it as I did not know that stardance could do hardware projects. Since I just worked on some button code and got set up, I will just have some pics of the macropad."}]...
|
Title: Super Wifi Duck Pad by @gavhu10 | Stardance Title: Super Wifi Duck Pad by @gavhu10 | Stardance
Devlogs:
I made a macropad with KiCad. It uses an esp32 s3, so it will have a web based config editor. This project is the firmware for it as I did not know that stardance could do hardware projects. Since I just worked on some button code and got set up, I will just have some pics of the macropad.
This devlog is rather long, but a lot of things needed to happen before I wanted to make another devlog. I had a very difficult bug involving macros (written in DuckyScript) running at the same time. It wasn’t always a problem, but the buttons made it really easy to crash the system by overlapping scripts. When I added some code to keep track of that, it would crash when launching a script from the web-ui, but not when launching them from the terminal or buttons. After much (much much much) debugging and banging my head against walls, I figured that the problem was with a websocket status pulse. By delaying the pulse, I could avoid a crash. You can see the one line javascript patch below. I’m not sure why it was crashing the device, but it seems to be fixed now. I made a PR to upstream here Anyway, enjoy the demo!
I made it so that the script selector is like the buttons so that it is easier to use. It took a while because I am not very good at frontend things, but I like how it turned out. It was made especially tricky as on-device debugging involves compiling and uploading the new firmware, connecting to the access point network, and then reloading. I did get a debug setup going with python -m http.server but then the websockets did not work for obvious reasons.
I made so that the ordering made more sense. It used to start with zero which is fine but confusing for some people. I also made so that the pins are read in the right order, as the order used to be 1 4 7 2 5 8 3 6 9 to make it easier to route, but that also is confusing, so now it reflects the ui. The next step is shortcut profiles like the og duckyPad.
This is a really long devlog because profiles are a big feature. They make it so that you do not have to overwrite your macros every time you switch contexts. They were tricky to make for a variety of reasons. I had to add multiple cli commands so that the web ui could do things, refactor lots of things so that they could be reused, and change how I compiled the project. I also had to write frontend code! shudder I learnt a lot of things about the project while debugging. For example, a cli command called from the websocket must return something or the ui will hang. Fun times! Here is the diff of what I did: link
I made it so that you did not need to connect to the access point to configure the device. This is handy because otherwise you would have to disconnect from the internet to configure the device. I also fixed a stubborn bug with the profiles. The problem was that the get_profile command returned the current profile with a newline. This in turn broke the javascript that let you edit the scripts. Instead of editing 6 (for button six) it was editing \n\r6. This broke the quotes and made a big mess.
I integrated the NeoPixel LED with the firmware. My only problem was that the NeoPixel library was vendored in. I fixed that by adding a PlatformIO library in the config. Now you can show the status of your script through the LED! It also shows you if it managed to connect to WiFi. I tried to make the ip address of the device static while in station mode, but it turns out things like that vary between routers, so I just added a readout of the ip address to the settings. I made a demo video for the LED. The three flashes at the beginning confirm that it connected to a wifi network. I had to put tape over the LED to diffuse it.
I added a command (function?) called STRINGLN. This is just like the STRING function, which types out a string, but after typing out the string, it presses enter. This is not a big change, but to make it, I had to read all the code involved with parsing the script and pressing the buttons. STRINGLN is also a very handy function (command?) as it reduces verbosity and many existing duckyscripts use it. I created a pr to the upstream project which you can see here . Below is an example script from the Hak5 repo that uses STRINGLN.
I made a case for my Keypad using OpenScad. It took eight iterations of export, slice, and print, but I like how it turned out. It makes it look a lot more finished. I tracked the time with Lapse because I could not track it with hackatime.
I made alternate keycaps with OpenScad for my keypad but in the end I chose to stick with what I had before. I wanted the buttons to have smaller profiles and be the same colour. At first I tried to make a complicated clip like the injection molded ones that came with the set, but that failed as 3d printed material is not suited for that purpose. Instead I made keycaps that held on with friction. That worked, but they were hard to take off again and they ended up being uglier than the injection molded ones.
I rebuilt the case! It took ~20 iterations of export, slice, and print, not including failed prints. It now covers the whole top of the board but includes some vents so that you can press the reset and boot buttons. It took a lot of work and I changed the design multiple times. I ended up with hexagon holes in the case which in themselves were tricky. I used an OpenScad library I found on thingiverse and modified it, only to redesign the pattern so that those edits were not needed. Typical! The main picture is what I finished with. I also have pictures of the other designs.
I added media keys! So far I have pause/play, next, previous, and volume. It turns out those types of keys are not regular keyboard keys. They actually are part of something called Consumer Control. The library that works with Consumer Control is very similar to the built-in esp-idf keyboard library but as I looked at the code, I noticed something wrong with it. I found out that the USBHIDKeyboard library was vendored and then modified. To make sure that Consumer Control did not mess with the keyboard I refactored the code so it just used the built in library. Here is a demo of the volume keys:
I made it so that the selected profile and selected script are highlighted. It took longer than it should have because I have not learned frontend and do not use AI. Another problem is the time it takes to upload changes to the device. However, I still managed to make it look okay.
I fixed a tricky bug. If the script parser encountered a line with just a space, it would not delete the line like it would if the line was empty. Instead it would split the line on that space and return a NULL pointer. The reason this was hard to find was because it was deep in the internals of the parser and was written in C and I could not use print statements as the Serial Arduino is C++ only. When I could use print statements, I did, and with careless abandon! Then I spent a bunch of time making my commit message line up nicely.
I added a bunch of QOL improvements. I made it so that Ctrl+S would save the file in the editor. I made it so that a profile is automatically selected when the web ui loads. I also added mDNS so that you do not have to remember an ip address but can just go to wifi-duck.local!
I fixed another bug, learned a new thing about C, and wrote some docs. When there was a space on a line by itself the device performed as expected. But when something that was not a function or something on a line by itself, it typed the first two letters, then inserted a newline. After hitting my head against walls, I found out that I had been using the strcomp function (in C) wrong. It returns 0 when a string matches and I expected to return 1 instead. That caused all the lines to be handled like they were just a space. I also found out that I had not accounted for a newline character and had assumed it would be removed sometime in the parsing process. I managed to figure it out, though, and it works fine now. I also wrote some docs. I wrote them in markdown and made a converter that turns them into html and stores them in the device when the project is compiled. That way someone can read the docs online or from the access point....
|
1792670117.7122445
|
1793274917.7122445
|
|
2155
|
obliberry by @torkel | Stardance
|
torkel
|
1
|
433.12
|
5134
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T09:34:08Z", "hours": 270.0, "multiplier": 19.51, "payout": 5134, "blessing": "neutral", "text": "obliberry feels usable enough that i think its a good time for a first ship :) obliberry is a fallout-inspired isometric game engine for hex-grid games, written in C++20 with OpenGL, featuring a visual editor, an ECS core, its own scripting language, and single-file packaging/exports. this has all been rather challenging, but an incredibly fun learning project, especially regarding using modern C++, OpenGL, and making my own programming language it is still obviously not fully complete of course, but I think it’s in a rather good state :D", "repo": "https://github.com/torkelicious/obliberry", "demo": "https://github.com/torkelicious/obliberry/releases"}]...
|
[{"post_id": 81496, "ts": "202 [{"post_id": 81496, "ts": "2026-10-21T14:23:50Z", "hours": 7.1158, "text": "script properties & UUID types scripts can now declare properties that show up in the inspector and get saved per entity. also ripped std::string UUIDs out of most of the engine in favor of an actual Core::UUID type, plus some scripting additions and a few tests. changes script properties Prop(\"SpeedOrSomething\", 2.5) , PropEntity(\"TargetEntity\") and PropUI(\"MyRect\") for regular values, entities and UI elements properties show up under each script slot in the inspector, with appropriate controls and per-slot values values are only readable during top-level script execution, so store them in variables for use in hooks. Prop in a hook just returns the fallback saved as scriptProperties in scene JSON, omitted when empty property edits support undo, including live number/string editing. unused saved properties can be pruned with undo too.. ScriptSlot is move-only now Core::UUID replaced string UUIDs across the registry, UI, editor commands, project config, save directories and scripting with a 16-byte Core::UUID registry UUID lookups now use an index instead of looping through entities malformed UUIDs in files fall back to generated or nil UUIDs UI UUIDs are saved and restored, including nested elements. duplicate UI UUIDs are handled without crashing the loader savegame directories etc take a UUID directly scripting & UI script objects now have identity values and wrappers are readonly , along with various scripting result objects. came with an ObSL bump UI wrappers get SetParent(parent) and a uuid field. null reparents an element to the root UISystem::Reparent preserves ownership and prevents parenting an element under its own descendant new created scripts use fn on_update(dt) (I wrote on_update() last time …oops…) smaller stuff UndoManager::Execute returns whether the command applied script list shows filenames with Remove beside them tests and docs more tests and docs updated ofc… so u can reference entities in scripts without using Find() now!!!"}, {"post_id": 80249, "ts": "2026-10-16T21:56:07Z", "hours": 3.8333, "text": "uuid-bound script wrappers…, logger sinks…., and a pile of small editor stuff…. mostly scripting + logging plumbing this time, plus a couple of editor things I’d been wanting… changes script wrappers are uuid-bound now entity wrappers used to capture the raw runtime id, which is a problem if ids get recycled or the registry gets rebuilt. now every wrapper holds the entity’s uuid and resolves the live id on each call, so it keeps pointing at the right entity (or does nothing if it’s gone). new FindEntityByUUID(uuid) global and GetUUID() / .uuid on entity objects SetParent matches an entity object by uuid, a plain number is still a runtime id same treatment for UI wrappers: they resolve by uuid instead of name, so renaming or duplicate names don’t break them added FindUIByUUID , GetUUID() and Destroy() on UI elements, and SetImage / GetImage on images (acquires the texture through the scene asset scope like fonts do) still by name: FindUI , DestroyUI and the button state queries ( WasClicked / IsHovered / IsHeld ). UI scripting is still weird… work in progress i guess… logger sinks the old way was swapping the logger’s std::ostream for a stringstream that the UI panel also read from, which was a data race waiting to happen (logger thread writes, main thread reads). replaced it with actual sinks: ILogSink with ConsoleSink (stdout/stderr like before) and UILogSink (mutex -ed pending buffer the panel drains each frame) the editor and runtime both register a ConsoleSink , and the editor adds the UI sink on top, so the Logs panel is always there now instead of only when there’s no tty console panels color lines by severity now interpreter output goes through a small UiStream ostream into the ObSL panel, with stdout and stderr split (needed the bumped obsl, Interpreter takes both streams now…) ObSL panel clears when you enter play mode editor F focuses the camera on the selected entity, press it again to go back to the origin. its smooth…., ..panning cancels the focus keyboard pan only gets called when there’s actually input now.. editing a material in the inspector no longer mutates shared runtime-only materials. if it isn’t a catalog asset it gets cloned into assets.json first, and edits to catalog materials get “upserted” back to the catalog. “Clone Material” writes to the catalog too new scripts from the project browser come with an on_update stub instead of just a comment scripting runtime script top-level code now runs with the command buffer in “immediate” mode ( BeginImmediate / EndImmediate ), so registry writes at the top of a script apply right away instead of waiting for a flush that hasn’t been set up yet during init Hex_GetNeighbors wasn’t GC protecting its array while filling it, fixed…. grid tile textures a tile type with no texture used to fall back to hex_tex both when collecting dependencies and when loading scenes, which would pull in a texture that might not exist. now no texture means no texture… as it should… misc bumped obsl (new using alias feature, and err output stream settings) docs for all the uuid stuff, the F key, and the new UI/image methods… of course… oh also … new demo scene testin thingamabob im messing with…"}, {"post_id": 79544, "ts": "2026-10-14T15:18:47Z", "hours": 7.9614, "text": "map edit kinda overhauled changes map edit stuff the brush size is now 1 to 8 instead of 1 to 5. size 1 is one hex, size 2 is 7, size 3 is 19, etc. Ctrl +scroll also changes the size added Rect and Circle shapes alongside the brush. they work with Paint, Erase and Select. Rect uses opposite corners, Circle goes from a center out to the hex you release on. both apply on release paint previews are green, erase previews are red, and selection previews are yellow. selected tiles get a blue overlay added tool hotkeys: B for Paint, E for Erase and Q for Select Esc cancels a drag. Rect and Circle do nothing if cancelled, while a brush stroke gets reverted instead of leaving half the changes behind loading a map now prompts before discarding a dirty map, and successfully creating or loading a map clears the old undo history selecting and editing multiple tiles Select now supports click and drag, Shift +drag to add to the selection and Ctrl +drag to remove from it the toolbar shows the selection count and has Clear and Delete buttons. Delete removes all selected tiles in one undo step the Tile Editor can edit the type and walkability of the whole selection at once. when selected tiles differ, the controls show mixed values etc. material editing only appears when every selected tile shares a type. Override Current Type changes the material for every tile using that type, while Save as New Type assigns a matching type to the selection without changing every other tile using the old type brush strokes, Rect/Circle fills, deletes and bulk type or walkability changes are each grouped into one undo step. changing a type’s material itself is still not undoable…. the console…. logging now has a sink system, so the same formatted log messages can go to different outputs the editor now has separate Logs and ObSL panels. engine/application logs go to Logs now, and script stdout goes to ObSL the panels have Clear and Copy buttons and keep the latest 2000 lines. the UI sink buffers incoming logs under a mutex before the editor consumes them closing the editor closing the window now goes through a callback, so unsaved scene or project changes trigger the save/discard prompt instead of immediately closing removed the old global Esc -to-quit shortcut. ObSL’s CloseWindow() no longer closes the editor while in Editor mode. it logs that it was called instead. in the runtime, it still closes the window windows and smaller fixes enabled /MP for MSVC builds, and the editor/runtime targets use the Windows GUI subsystem so they don’t launch with a console window attached atomic file writes now write the byte buffer explicitly and retry Windows file replacement when it fails with access-denied or sharing-violation errors, for up to about 2 seconds a bit of cleanup around collision pair sorting, const-correctness and naming docs updated the editor guide and screenshot to cover the new tools, shapes, selection controls, shortcuts and undo behavior. blah blah …map editing is finally a lot less barebones…"}, {"post_id": 78861, "ts": "2026-10-11T19:54:19Z", "hours": 3.0197, "text": "uhhh changes dont nuke scene on failed load scene deserialization moved out of Scene::OnEnter into SceneManager::LoadScene , and now runs before the old scene gets torn down. if the new one fails, you stay in the old scene ( LoadSceneByPath returns a bool now) loading is stricter. missing map files, bad/out-of-range/cyclic parent values and broken UI sections fail the load instead of logging an error and limping on persistent entity migration happens before the swap too, so a failed asset acquire can’t leave you half in the new scene the editor’s LoadScene used to clear the current project before trying to load. now undo history and selection only get cleared once the load actually worked saving: map write failures now propagate instead of reporting success, and files get closed before the error check destroying entities DestroyEntity was recursive, now it’s iterative with a visited set. deep hierarchies, cycles and duplicate child entries no longer kaboom the stack or double delete, and children go first (wow that sounds dark) Reparent and SetParentDirect go through CanSetParent , which rejects cycles and stale parents, even if the existing hierarchy is already cyclic script DestroyEntity / entity.Destroy() now use RequestDestroy to tag the entity and its whole subtree instead of deleting immediately, so on_destroy runs before deletion. scene exit drains the destroy queue too, including entities tagged by exit hooks the script wrapper cache evicts an entity when it’s destroyed a dumb one…: the hot-reload cleanup list had on_exit in it twice and no on_destroy , so on_destroy GC roots never got released … the script system was holding raw ScriptComponent* across initialization, which dangles if a script spawns enough entities to grow the pool. it looks components up by entity ID now script runtime reinitialization after a scene change uses the VFS path and reruns setup, so using imports keep working from the mounted project ui undo UI elements have UUIDs now, and undo commands resolve them by UUID instead of holding raw pointers. removing an element captures the whole subtree plus its sibling position, so undo restores the hierarchy and order. renaming also updates the name index live. smaller fixes collision broadphase is a “spatial hash grid” now instead of checking every pair lightmap rebakes when ambient changes, and handles maps with no tiles atomic file writes use unique temp names so concurrent writers don’t trip over each other project changes wait for background asset loads to finish timeout timers are mutex-protected, and callbacks can schedule more timers without deadlocking SmallTask over-aligned captures fall back to the heap VFS::Resolve(\"..\") had UB from a std::mismatch that wasn’t bounded on the second range… PlayMusic stops, swaps and starts under the lock now instead of racing!!! tests wrote a pile of tests alongside all this: atomic writes, wrapper cache, hierarchy safety, map serialization, save concurrency, scene loading failures, script lifecycle, script modules, SmallTask and timeouts. expanded to the editor command, save game and VFS tests. so EVEN LESS explosions !!! Woo!"}, {"post_id": 78453, "ts": "2026-10-10T20:34:34Z", "hours": 4.7336, "text": "undo stuff + render lifetime fixes undo / redo the undo system relied way too much on runtime entity IDs and direct pointers into components. that works until an entity gets deleted, an ECS slot gets recycled, or a dense component pool moves stuff around… entity commands now store the entity UUID and resolve the current runtime entity when they execute / undo instead. this now applies to transforms, renaming, adding / removing components, script changes, component field edits and map painting. so older commands can still find the right entity even if it was deleted and later restored with a completely different runtime ID. deleting things is actually undoable now finally added proper undo for deleting entities. !!!!!! deleting an entity snapshots the whole subtree first, including components, UUIDs, names, hierarchy + sibling order, scripts, custom data and asset references. undo rebuilds the tree, reloads required assets, restores the UUIDs and puts everything back where it was. this also means edits from before the deletion still work afterwards, since those commands just resolve the restored entity by UUID. paste uses the same snapshot system now too, so undo / redo keeps the same pasted entity identities instead of creating unrelated ones every time. there are checks for conflicting UUIDs, missing parents, invalid hierarchies, missing assets etc. failed restores shouldn’t leave half-created entities behind. failed commands also no longer get added to undo history or wipe an existing redo chain. custom ObSL data custom script data needed special handling too. arrays / objects can share references or even be cyclic, so just copying ObSL::Value s wasn’t enough. there’s now a snapshot format that captures the object graph and rebuilds it through the interpreter + GC when an entity is restored. CustomDataComponent also roots stored ObSL values properly so GC-managed objects stay alive. runtime functions aren’t snapshotable though, so deletion just fails instead of restoring garbage. render thread lifetime stuff also did a pretty big pass over renderer resource lifetime, mostly because scene switching could unload resources while an already submitted frame was still using them. (this started because someone mightve pointed out a lil crash for me…) render commands now pin the meshes, materials, shaders and textures they need until that frame is done. same idea for UI textures and the editor viewport framebuffer. OpenGL objects also don’t call glDelete* from whichever thread destroys the C++ object anymore. textures, shaders, buffers, VAOs and framebuffers queue deletion for the render thread, while it actually owns the GL context. less bugs yay frame state + shutdown renderer state that can change while the render thread is behind is captured per frame now too, including clear color, post-processing and UI resolution / projection state. shutdown is also more deliberate now: worker threads stop first, background font loads finish, scripts stop, scenes/resources are cleared, renderer/UI resources shut down, then the remaining GL delete queue is processed while a context still exists. font loading uses tracked jthread s now too instead of detached threads. small things exporting now reports success / failure back to the editor and shows a little result popup instead of silently relying on the console. also added tests around delete / restore, UUID reuse, hierarchy restoration, script components, map edits, pasting, command failures and repeated undo / redo without leaking entities or asset references. so. .. . less explosions hopefully sorry if wording is weird.. character limit.."}, {"post_id": 78136, "ts": "2026-10-09T18:21:07Z", "hours": 3.2578, "text": "export dependencies + prefab asset loading redid how exporting figures out what needs to go into the package previously editor export was basically much closer to just packing the project directory. now it builds a dependency manifest first figuring out what to export export starts from the project + scenes and follows the things they reference: catalog assets used by entities, maps, UI and post processing map files attached ObSL scripts script using imports scenes loaded from scripts prefabs instantiated from scripts music / sound files material textures + shaders animation sheets shader #include s referenced scenes and prefabs get scanned too, dependencies keep chaining from there. it then generates a new filtered assets.json specifically for the package instead of sticking the entire project catalog in there. the actual project’s catalog is untouched. script analysis added a ScriptAssetAnalyzer which walks the ObSL AST without actually running anything. literal stuff can be narrowed down properly, including things like: PlayMusic(\"assets/audio/music.ogg\", 1.0) or even constant string concatenation… asset setters like SetTexture / SetFont get tracked too. if a texture or font ID is dynamic, export keeps that entire asset category. if a runtime file path for stuff like LoadScene , Instantiate , PlayMusic or PlaySound2D can’t be figured out, it falls back to keeping the eligible project files + full asset catalog. unknown / indirect calls are done the same too so simple projects get smaller exports, while weird dynamic scripting should still work… .pakignore still applies, and required files being missing or ignored is now an export error prefab assets also fixed prefabs properly interacting with the lazy asset system. instantiating a prefab now scans its components, acquires whatever catalog assets it needs, resolves their dependencies, and retains them in the scene before creating the entity. so a prefab can use an asset that wasn’t already referenced by the scene and it should just work. scene asset scopes got changed a bit for this too. instead of accumulating a new scope every time something acquires assets, they’re merged into one scene scope and duplicate asset references are ignored. also made prefab revert a little safer so the old entity isn’t destroyed unless the replacement prefab actually instantiated successfully. packaging / ci things editor packaging is stricter in general now. script dependency validation can fail the export, missing dependencies stop it, and PackageCurrentProject reports failure so the rest of the export doesn’t continue pretending everything is fine. shader includes are followed during dependency collection too, while the engine shader helpers still get bundled for runtime includes. also cleaned up CI a decent bit… also some more tests too for the packaging and script analysis lowk sorry for just posting an image of the logs idk how else to show it since it’s mostly backend / file stuff 😭"}, {"post_id": 77620, "ts": "2026-10-07T17:38:02Z", "hours": 3.62, "text": "more tests (more bugs) kept going with the unit tests the test suite now covers most of the important stuff, including: ECS / entity IDs / UUIDs serialization + hierarchies collision geometry, events and movement maps animation saves ObSL + some EngineLib bindings assets / asset lifetime VFS + packaged projects configuration editor undo commands also added a couple integration tests for audio and rendering (OpenGL tests are optional) finding things unsurprisingly this found some actual problems too. stale entity handles can no longer remove / access components from an entity that reused the same slot, and editor undo commands are a bit safer around entities or components disappearing. also fixed some hierarchy rotation decomposition weirdness, cleaned up VFS / package mounting state so old package data can’t leak into the next mount, and added a few other small null / cleanup checks around scenes and rendering resources."}, {"post_id": 76449, "ts": "2026-10-03T15:32:32Z", "hours": 3.1158, "text": "unit tests (& some fixes) uhhhh started adding actual unit tests… i was kinda putting it off but i gotta have it… set up GoogleTest + CTest and started covering some stuff ECS registry / generational IDs entity UUIDs entity serialization hierarchy / parenting collision events + movement blocking save games maps bugs bugs bugs… and unsurprisingly, writing tests immediately started exposing some smaller issues. fixed stale entity handles being able to mess with components belonging to a recycled entity slot, and cleaned up some hierarchy transform / rotation handling that wasn’t preserving transforms correctly in certain parenting cases. also tightened up a couple math helpers while testing them. im still gonna write even more tests.. its very needed at this point and will prolly help me find some more bugs i missed before…"}, {"post_id": 75890, "ts": "2026-10-01T14:46:00Z", "hours": 5.4794, "text": "uuids, collision layers, save settings, and other stuff bit of a mixed bag this time. mostly cleaning up some systems that were already there and filling in stuff I’d need… entity UUIDs entities have proper UUIDs now, separate from their normal runtime entity IDs. the regular generational ID still does all the normal ECS stuff, while the UUID is a stable identity that gets serialized with the entity. this mostly fixes how persistent entities work between scenes. previously I was deduplicating persistent entities by name , which was obviously not ideal since names aren’t actually identities. persistent entities + their children now keep their UUIDs when moving between scenes, and if the destination already has an entity with the same UUID it gets replaced by the carried-over one. two things can have the exact same name now without persistence randomly deciding they’re the same thing. normal prefab instances / newly created entities still get new UUIDs. collision layers colliders now have proper layers + masks. there are 32 collision layers, and every collider has: a layer a 32-bit mask of layers it accepts both colliders have to accept each other’s layer for the pair to interact. the same filtering is used for normal overlap events and movement blocking, so there isn’t a separate set of collision rules depending on which system happens to be asking. added editor controls for this too, including the layer selector, all 32 mask toggles, and select all / deselect all buttons because clicking 32 checkboxes individually sounds incredibly fun. scripts can also read / change the layer and mask now. collision-aware script movement also added Transform.TryMoveTo(x, y, z) to ObSL. unlike SetPosition , this checks whether the entity can actually occupy the destination before moving it. the normal hex movement system uses the same helper now too, so script-controlled collision-aware movement and normal movement go through the same path. direct SetPosition is still basically teleporting, which is intentional. also fixed on_collision_stay actually looking up the collision stay callback instead of the trigger stay callback. whoops. more save settings did some more work around the save system from the last update. saving can now be enabled / disabled per project, and projects can choose where save files go: Data Home , the normal OS application-data location Portable , relative to the executable both still use the project UUID underneath so different projects don’t start sharing save files because somebody named both of them game . these are editable from Project Settings now. also added a confirmation dialog when regenerating the project UUID since doing that changes which save directory the project looks at. the old saves aren’t deleted, the project just gets a new identity and stops finding them automatically. graphics config stuff changed packaged builds so graphics.json can live beside the executable and override the version inside the package. (i.e if someone decides to unignore the graphics config and package it) couple random fixes particle emitters now keep their actual live particle count, so GetAliveCount() in ObSL finally returns the real value instead of the completely useless placeholder it had before. fixed a prefab revert issue where the code was reading the prefab path from the component after destroying the entity. very intelligent. also made theme font loading a bit less fragile. missing / broken font files get logged and skipped instead of potentially taking the whole theme load down with them, plus some parsing cleanup. and updated another mountain of docs to match all the collision, persistence, save, prefab, post-processing and export changes."}, {"post_id": 73199, "ts": "2026-09-24T16:15:43Z", "hours": 7.0497, "text": "save system i wanted this to be pretty generic instead of the engine having some hardcoded idea of what a “player save” or whatever is, so the actual save data is ba sically just key/value storage that scripts can use for whatever they want!!! save data there’s now a SaveGameManager which keeps one active save in memory. save values can currently be: booleans numbers strings the file format is versioned and also stores a display name + created / updated timestamps. the actual save data itself doesn’t really care what the values mean. it is any key value pair that persists. there’s also locking around the active save since scripts can be running across multiple workers….. project UUIDs projects also have their own UUID now. it’s generated when the project is created or when a project that does not already have one is opened right now it’s mainly used to give each project its own save-data directory without name collisions but im sure its good to have outside that!!! save files the basic save file operations too create a new save write the current active save load a save delete a save list existing saves start a fresh unsaved “game” save filenames are generated from timestamps. the human-readable name stays inside the file, display names don’t need to also be valid / unique filenames. save_list() also gives creation + update timestamps, and saves are sorted by most recently updated. writes are atomic too, so it writes through a temporary file before replacing the real save instead of directly nuking the existing one and hoping for the best per-project save directories save data is stored outside the project itself in the normal OS application data home each project gets its own directory based on its UUID <data home>/obliberry/<project uuid>/saves/ projects with the same name don’t fight over the same saves.. (i have several projects just called “UntitledProject” lol) this is LocalAppData on Windows, Application Support on macOS, and XDG_DATA_HOME / ~/.local/share on Linux. both the editor and runtime configure the save manager when the project is loaded, and it gets reset again when the editor closes the project ! ObSL ObSL savedata enginelib intergration: basic data stuff: save_set(key, value) save_get(key) save_has(key) save_remove(key) save_clear() save_new() save file management: save_create(name) save_write() save_load(filename) save_delete(filename) save_list() save_list() returns an array with the filename, display name, creation time and last update time some cleanup also pulled the atomic file writing stuff into a shared OS file utility, so assets.json can use the same code instead of having its own implementation. bunch of formatting stuff too i still have to document this and do some more testingf but yeahhh"}, {"post_id": 71462, "ts": "2026-09-20T21:23:42Z", "hours": 6.445, "text": "asset system refactor + some editor stuff been wanting to redo how assets work for a while now. until now scenes carried the asset definitions with them, and loading scenes would keep throwing resources into the global resource manager. worked fine enough , but it also meant resources could kinda just accumulate forever.. i seperated them now!! assets.json projects now have a project-wide assets.json catalog. textures, shaders, meshes, materials, fonts, animation sets, etc. live there instead of getting serialized into every single scene. scenes / prefabs / UI / animations etc. just store resource IDs and the definitions live in one place besides making scene files considerably less bloated, this means saving a scene no longer serializes whatever random collection of resources happens to currently exist in the resource manager lazy asset loading having one project-wide catalog does not mean loading the entire project into memory. scene loading now scans for the resources that scene actually references and loads those from the catalog this includes stuff referenced by: entities maps / tile types UI post processing spritesheets / animators dependencies get resolved too so if something needs a material, its shader + texture get pulled in first. animation sets pull in their spritesheet texture, etc. etc. now the the resource manager should only contain what is actually being used asset lifetime stuff added SceneAssetScope for keeping track of what assets a scene has acquired. assets are retained while something needs them and can actually be unloaded once the last scope using them disappears so changing scenes repeatedly should no longer turn the resource manager into yummy more objects :O forever…. persistent entities reacquire the resources they need when moving between scenes too. there’s also handling for catalog entries being replaced / deleted while their old resource is still loaded. those can be marked stale and discarded safely once the old scene lets go of them instead of leaving weird zombie resources around. engine assets still stay around like normal. editor asset workflow the editor now goes through the asset catalog too. creating / importing / replacing / deleting things like: textures shaders meshes materials fonts animation sets updates assets.json instead of depending on scene serialization to preserve them…. supported editor selections / script setters can also acquire catalog assets on demand and attach them to the current scene’s asset scope old projects old projects obviously still have all their assets embedded inside their scene files, so I added an ob_asset_migrator tool. it can scan the old scenes and merge all of those definitions into a project-level assets.json . there’s: dry-run validation conflict detection optional removal of the old scene assets sections backups before it starts rewriting stuff uses backups because i dont trust myself enough .. might vaporize projects who knows… docs docs docs also updated a stupid amount of documentation for the new asset model … since of course.. there’s now a full assets.json format page covering the different asset types, dependencies, lazy loading, asset scopes, editor behavior and migration. updated the scene / prefab / animation / post-processing docs too since all of those previously described assets as being stored directly in scenes. also cleaned up the main README + docs index a bit and updated the feature list because quite a lot of it was outdated at this point…. theme presets also did some work on editor themes. split the built-in theme definitions out and added some interesting presets: Obliberry Dark ImGui Classic Dark Obliberry Light ew imagine using light themes… High Contrast Dark Haxxorman Green editable and all… tldr: resourcemanager is now longer an infintly growing landfill…"}, {"post_id": 70788, "ts": "2026-09-19T19:20:34Z", "hours": 1.5706, "text": "I will not elaborate"}, {"post_id": 70712, "ts": "2026-09-19T17:13:26Z", "hours": 3.3022, "text": "animation editor continued working on the animation system and made the editor UI…. animation editor there’s now a Sprite Animation Editor you can: choose the spritesheet texture edit rows / columns / spacing create, rename and delete clips toggle looping per clip edit individual frame indices + durations move frames up / down duplicate / remove frames expand / collapse the frame list also added range generation so adding a normal animation doesn’t make you manually enter every frame one by one….. theres also an Apply FPS to All Frames button ! preview added a live preview for the selected clip. you can play, pause and restart it woaw it shows the current clip frame and spritesheet index while it runs…. project browser integration animation assets are properly integrated into the project browser now too there’s an Animations section where you can create, import, edit and delete animation assets creating a new one lets you choose its path then opens it in the animation editor. the animation asset workflow is mostly usable from inside the editor :D erm even more enginelib changes for the new systen that i still have to document… ( Play() Restart() etc) some cleanup working on… some mostly const-correctness, explicit casts, ranges, include cleanup and some other small stuff etc etc.. god bless resharper c++ also cleaned up some EngineLib entity wrapper code around registry locking so it can create wrappers safely when the registry mutex is already held spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly"}, {"post_id": 70230, "ts": "2026-09-18T19:10:52Z", "hours": 6.3242, "text": "btw pls star on girhub animation clips / refactoring spritesheets …kinda refactoring the whole spritesheet animation thing already the first version worked, but having FPS / looping / frame ranges etc directly on the SpriteSheetComponent was gonna get pretty limiting cuz what if I wanted multiple animations for one sprite. it might sound stupid but for me it’s always worked to get a prototype working, then refactor/reimplement it. thats even what i did for this entire project early on, before it deleoped into a full on engine :D so now the spritesheet is mostly just the sheet + currently displayed frame, and animation playback is seperate animation clips working on proper animation sets + clips. an animation asset can have one spritesheet and multiple named clips, with each clip containing its own list of frames :D each frame also has its own duration now instead of the whole animation just sharing one FPS value, so stuff like holding a frame longer or doing irregular timing is possible without clips can loop independently too animator component added a separate SpriteAnimatorComponent which handles the actual playback state: animation asset initial clip autoplay current clip current frame inside that clip elapsed time playing state the normal SpriteSheetComponent is way simpler now… it just says what sheet + frame should currently be rendered (the animator updates that for it) animation assets animation sets are assets now under assets/animations/ they serialize separately and contain the spritesheet setup plus all the clips / frames / durations they are loaded through the normal asset system and registered in the ResourceManager scene serialization now keeps the animator config like the selected animation asset, initial clip, and autoplay editor stuff the sprite sheet inspector got reworked for the current thing but whole UI stuff isnt finished once an animator is attached it owns the sheet/frame instead of both systems trying to edit the same thing. I still need a proper UI for actually making / editing animation assets and clips though. i shall work on this next!!! (right now the backend is pretty much all ive done but its taken a lil longer than i thought… who wouldve thought adding cips cleanly would take this whole aah refactor) scripting EngineLib updates too SpriteAnimator in scripts can now do: Play(\"walk\") Restart(\"walk\") Pause() Resume() Stop() IsPlaying() GetClip() it is now based on named clips so i guess not anything flashy to show but… its stuff :)"}, {"post_id": 69178, "ts": "2026-09-16T15:19:06Z", "hours": 4.2144, "text": "spritesheets / animation finally … spritesheet support spritesheets added a new SpriteSheetComponent with: texture rows / columns optional row + column spacing start frame animation length FPS looping playing / paused state current frame basically the renderer can now render only a specific UV region of a texture animation also added a small sprite animation system that advances frames based on FPS and handles looping / stopping at the end etc etc animations also update while in the editor… might be annoying for some, might be less annoying for others.. but thats how i like it editor stuff you can pick the texture, set rows / columns and spacing, choose the start frame + animation length, change FPS, toggle looping / playback, scrub the current frame, restart the animation, etc. etc EngineLib scripts can inspect stuff like the current frame, frame count, FPS, rows / columns and texture, and can also change the texture/grid/animation, set frames, play, pause, restart and stop animations. Collider also has a proper EngineLib component wrapper instead of collision only being accessible through the callback hooks. right now that’s just getting / setting whether it’s a trigger, but it’s there. also added both Collider and SpriteSheet to the normal GetComponent , AddComponent , RemoveComponent , HasComponent , etc. obviously. some cleanup did a bit of registry / EngineLib locking cleanup while I was in there too, mostly around entity wrappers being created while the registry lock is already held. also fixed one very stupid collision callback typo where on_collision_stay was looking up the wrong hook… oops….. im also starting on documenting this stuff…. yep.. pain… spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly"}, {"post_id": 67894, "ts": "2026-09-14T06:13:59Z", "hours": 2.1764, "text": "collision callbacks scripts can do collision things now….!!! script collision callbacks ObSL scripts can now define collision hooks: on_collision_enter(other) on_collision_stay(other) on_collision_exit(other) on_trigger_enter(other) on_trigger_stay(other) on_trigger_exit(other) the other argument is a normal EngineLib entity wrapper, scripts can do stuff like check its name, components, etc. collision events get collected by the CollisionWorld , then dispatched to the relevant script instances afterwards. they’re also run through the existing script command buffer ofc 2D collider shapes are back too… added explicit 2D shapes alongside the 3D ones: Rectangle Circle so the full set is now: Box Sphere Cylinder Rectangle Circle rectangle / circle are flat shapes. which is nicer for sprites and other 2d things movement actually respects colliders hex movement now checks whether an entity can actually occupy its next tile before moving there. added a CanOccupy() collision query which builds the entity’s collider at the target position, it blocks the move if something solid is in the way. triggers don’t block movement. collision robustness stuff also did a bunch of smaller fixes around the collision added a shared collision tolerance instead of random 1e-6 s in different places AABB overlap now uses that tolerance too improved collider validation depending on the actual shape fixed gizmo world-to-local conversion to use the proper inverse transform more finite-value / clipping checks in the collider gizmo GJK Indeterminate results preserve the previous collision state instead of automatically counting as a collision p.s, heres a lil photo of my attempt at making syntax highlighting for obsl using textmate grammar… :D"}, {"post_id": 66845, "ts": "2026-09-12T19:22:05Z", "hours": 3.0608, "text": "collision system round 2 i guess ended up pretty much reworking most of the collision system….. the first version was still basically 2D, with separate box vs box / circle vs circle / box vs circle functions. that worked as a starting point, but it was gonna get annoying … so… it is 3D now. colliders ColliderComponent now supports: boxes spheres cylinders 3D offsets / dimensions triggers entity-space or billboard orientation billboard colliders follow the same camera-facing basis as billboard rendering, which means billboard sprites can still have colliders that actually line up with how they appear on screen. GJK got rid of all the individual boxVBox , boxVCircle , etc. collision functions and replaced them with support-mapped collision detection using GJK. each collider shape just provides a support point now, the intersection test doesn’t care what combination of shapes it’s checking. i dont fully understand the math completely yet.. but it kinda makes sense :D still no collision response / physics yet. this is just detection + events, i think ill prolly get it into EngineLib.. soon… events the CollisionWorld still tracks collisions between frames and generates: Enter Stay Exit trigger state is kept with the collision too. this is for EngineLib integration. scripts should be able to react to collisions / triggers like unity I have not gotten around to this yet though… collider gizmos also had to redo the collider gizmos now that colliders aren’t just flat 2D shapes anymore… its a lil janky but it works.. billboard cleanup while doing the billboard collider stuff I also cleaned up billboard rendering a bit billboards used to have their world transform temporarily modified by SpriteBillboardSystem before rendering. now the billboard matrix is generated when the entity is submitted to the renderer instead, so the actual ECS transform can stay as the real entity transform there’s now one shared billboard matrix helper used by both rendering and collision, which is considerably less cursed. um scripting integration next i guess.. if something dosent explode ! :D"}, {"post_id": 66200, "ts": "2026-09-11T21:27:55Z", "hours": 3.4236, "text": "collision stuff been working on a collider system. still pretty early and not hooked into EngineLib yet, but most of the basic backend + editor stuff is there planning to expose it to scripts in a similar way to how Unity handles collision callbacks / triggers, but that’s for later……. collision added a new ColliderComponent with: box and circle colliders offsets size / radius trigger support collision system currently handles: box vs box circle vs circle box vs circle collision normals + penetration depth ‘trigger’ collisions also added a CollisionWorld that keeps track of collisions between frames and generates Enter , Stay , and Exit events. mostly groundwork for when I hook this into EngineLib… collider editing colliders are editable from the editor theres a collider inspector widget for changing the shape, offset, size/radius, and whether it’s a trigger, plus a viewport gizmo for directly moving and resizing them collider edits also go through the undo system, because every new editor feature needs to become an undo/redo problem eventually……… :D other editor fixes entity copy/paste now copies the whole child hierarchy instead of only the selected entity pasted hierarchies keep their parent relationships added copy/paste to the entity and UI context menus fixed stale entity / UI selections after the thing being selected gets deleted fixed single-key shortcuts like V , T , R , etc. firing while Ctrl/Alt/Shift was held keyboard camera movement no longer fights with Ctrl/Alt shortcuts a few smaller include / cleanup things mostly collision work though. next step is probably getting the collision events into EngineLib and experimentiung w. it its still a bit jank of course but it works i guess :DDDDD"}, {"post_id": 65603, "ts": "2026-09-10T20:50:19Z", "hours": 4.8511, "text": "copy paste (kinda) also too much time fighting windows builds tried to get entity copy/paste working and it’s… janky. also ended up wasting a stupid amount of time just getting windows builds to actually build again because i lowk forgot again about how it wont let me pass paths as strings implictly as it does on every other damn os… changes copy/paste (wip, kinda broken) started on ctrl+c/ctrl+v for entities & ui in the editor it kinda works but is really janky and does not feel good to use, also tried implementing it in the context menu but its not workiong at all -.- other the windows fixes…. some resharper reccomendation inspection type shi but lowk its been a while since i logged soo yep"}, {"post_id": 64268, "ts": "2026-09-08T15:23:01Z", "hours": 3.8883, "text": "sllight hub overhaul redid the project hub screen and added recent projects tracking, since up to now opening anything meant going through a file dialog every single time… changes recent projects get tracked in a PROJECTHIST file (next to the editor executable) …dead simple format, one filepath per line, each pointing at a project’s .json . capped at 5 entries, oldest just get removed off the list. hub screen is basically remade two docked panels now instead of one. left panel is the same buttons as before (new project, open project, etc), right panel is the new recent-projects list, up to 5 entries since that’s all the history file holds. also removed some unused dead code i found… QoL type stuff i guess :D"}, {"post_id": 63577, "ts": "2026-09-07T14:25:37Z", "hours": 3.9417, "text": "too many post proc fx? followup to the post processing / shader experiments… changes shader includes shaders can #include \"rand.glsl\" etc and it resolves properly. it checks the project VFS first, then falls back to the engine’s own shader helper directory if it isn’t found there. engine shader helpers also get packaged into exported games under engine/shaders/ , so includes keep working at runtime. added a few helper include files: rand.glsl / auto_rand.glsl - seeded hash-based random, with auto_rand reseeding per frame from u_Time color.glsl - HSV conversion, lift/gamma/gain, contrast, saturation, and three-way color wheels commons.glsl - engine-provided uniform declarations so you don’t have to redeclare u_Resolution , etc. in every shader for engine-provided uniforms the helpers use #ifndef / #define guards, so auto_rand.glsl can include rand.glsl without causing double declarations if the effect shader or another include declare the same uniforms or includes. more built-in effects added a few more built-in post processing effects: ColorGrading - exposure, contrast + pivot, saturation, lift/gamma/gain, and shadow/midtone/highlight color wheels using color.glsl FilmGrain - chunky per-cell grain with u_GrainSize controlling the cell size Vingette - yes i know its mispelled. uniforms with Wheel in the name now get the wheel-style color picker instead of the regular color picker, since a normal RGB slider cleaned up effect registration used to have two separate lists, one for raw shader registration and one for the default effect chain. this meant adding an effect involved touching two different structs in two different places. merged those into one PPRegistration list with an inDefaultChain flag shader debug name added an actual m_DebugName field and made error messages / the material inspector fall back to it when there isn’t a real file path. docs wrote up some post-processing editor docs ….. i hate writing docs.. also .shader is now a valid extension for importing custom effect shaders, alongside .frag / .glsl trimmed down the miniaudio CMake config by disabling its examples, tests, and tools, along with Vorbis/Opus/FLAC support since i’m not using any of that…."}, {"post_id": 62331, "ts": "2026-09-05T17:14:14Z", "hours": 3.0172, "text": "shader preprocessing been working on a small shader preprocessor thing while also finishing up the final bits of post-processing right now the preprocessor is pretty simple, mostly just adding support for: #include #pragma once I haven’t actually needed it yet, I just kinda had the urge to make it… so now I have a shader preprocessor …? its pretty extendable and all though so usefull to have ig :)"}, {"post_id": 61599, "ts": "2026-09-04T16:12:18Z", "hours": 6.9642, "text": "more post processing!!!! this took way longer than i thought it would but uh whateveer. i think i still gotta fix some small things but its working pretty alright :D editor ui added a proper ui for post processing :) threw in an import button and stuff so you can load in fragment shaders as post proc fx you can edit the uniforms directly in the ui now stuff glsl uniform parser: wrote a very simple basic glsl uniforms parser. this is what makes the ui editing possible, but it also helps a ton with serialization so i don’t have to hardcode everything serialization: implemented saving and loading for post processing effects and also made post processing effects bound per-scene instead of being a global engine thing yay post processing funny effects shaders aaaaaaaah"}, {"post_id": 58126, "ts": "2026-08-30T14:12:01Z", "hours": 6.2431, "text": "experimenting with post processing working on a lil post-processing pipeline still very wip but im mostly just playing around with various shaders and stuff changes the pipeline PostProcessor is a simple “ping-pong” chain: scene renders to an off-screen FrameBuffer , then each enabled effect runs full-screen-triangle shaders bouncing between two ping-pong buffers, in whatever order they were added I’m working on a system via variants to get uniforms to be easily serializable and such, it seems to be working but I havent actually wired it into anything just yet. editor and runtime a lil bigger change than expected. i implemented a unified fbo for both editor/runtime rather than the weird jank i was doing before editor: scene renders into m_SceneFrameBuffer , post effects run, then it gets sent into the ImGui viewport image like before runtime: same scene framebuffer, same post effects, then PresentToScreen goes to the default framebuffer instead just some general cleanup for that ig crt shader i wrote a lil silly CRT looking shader to test it out as shown below, it’s cool but kind of useless, but very fun to play with!!!"}, {"post_id": 55765, "ts": "2026-08-27T19:09:56Z", "hours": 4.9358, "text": "custom meshes im trynna make it so you can draw your own custom 2d meshes in the editor its still a lil buggy but it’s mostly working, serializes and all that :) very fun…"}, {"post_id": 55022, "ts": "2026-08-26T13:27:21Z", "hours": 2.1303, "text": "ui editing gizmos!!!1 you can finally drag UI elements around in the editor (instead of typing position/scale values into the inspector) changes ui gizmo added a proper UI gizmo with resize handles and dragging support and that corners resize both axes, edges resize one axis dragging the body moves the element resizing from the top/left keeps the opposite edge anchored added a small drag deadzone so clicking doesn’t accidentally create an undo step UI transforms now go through TransformUIElementCommand , so they’re undo/redo -able also renamed the existing entity gizmo code and naming gets confusing otherwise… coordinate stuff the gizmo needed mouse coordinates relative to the viewport rather than the whole window, so added some better viewport coordinate handling for that… maybe a lil late ui editing mode buttons won’t randomly enter their hover/pressed states just because your mouse is sitting over them now in the editor beccause its a lil annoying when editing small optimization also fixed UIText and UIButton recalculating their text layout every frame when nothing changes feels nice :)"}, {"post_id": 54551, "ts": "2026-08-25T16:02:00Z", "hours": 2.53, "text": "hardening + performance stuff so this is kinda the continuation of the last log(s) where i was going through some old code kinda boooring but its important performance mainly been trying to get rid of unnecessary allocations and full scans stuff optimized ECS entity/component lookups and removal reworked hierarchy propagation to avoid unnecessary registry scans reduced allocations in scripting and UI command buffers cached script wrappers so they can be reused instead of constantly recreated improved UI lookups with a proper name index made particle/lightmap updates only rebuild when actually needed cached project browser directory scans capped the editor console and added clipping for large logs also did a bunch of smaller optimizations around scripting task scheduling and resource loading things thread safety went through a lot of the cross-thread stuff as well made ResourceManager access properly synchronized experimenting with the audio locking guarded FreeType access made window size and pending scene state thread-safe fixed some render thread / GL context handling basically trying to make all the multithreading stuff a little less “it seems to work” type stuff though alot of this probably wasnt actually causing any issues YET , it would be very hard to debug in the future if I didn’t try to fix it now so yeahh correctness fixed several out-of-bounds issues in VFS/package parsing made VFS path resolution properly stay inside the VFS root (oops…) fixed hierarchy reparenting allowing cycles fixed a few dangling references in hierarchy code fixed some component pool and packaged asset lifetime issues undo history now clears when loading a scene cleaned up a few map editor edge cases fixed text centering fixed the triangle mesh made engine context non copyable also updated the demo template while I was at it (since a recent movementcomponent update it wasnt behaving properly due to the addition of a new field) there are other small things i probably didn’t mention here too but it’s mostly all a collection of a bunch of small things im still testing this though and looking into a few other small things….."}, {"post_id": 53560, "ts": "2026-08-24T04:55:16Z", "hours": 7.8433, "text": "code cleanup & optimization currently going through a bunch of older code and fixing / optimizing things. prolly way too much to actually write about, and most of it is just boring small changes, bug fixes, and a lil cleanup big pr i guess soon idk"}, {"post_id": 51782, "ts": "2026-08-21T16:57:55Z", "hours": 3.4422, "text": "mostly windows fixes changes SetLightmap took a raw Lightmap* and just held onto it for the frame swapped it for a small value type the renderer copies out immediately instead… this sometimes caused crashes but seemingly only on windows?.. just my luck.. LightingSystem had the same issue, was writing back into ECS memory through a raw pointer from a GL init task. now creates the framebuffer/vao up front and just calls Invalidate() on them SubmitPersistent was also holding a raw pointer into caller-owned memory, now copies into the staging buffer like everything else does RenderBatch used to just silently not draw anything if a batch went over MAX_INSTANCES . now it chunks into multiple draw calls instead of dropping the whole thing InvalidateGLCache wasn’t resetting the dynamic instance buffers, only the VAO cache, so they could point at dead GL objects after a context loss actual windows fixes opening files tries to open via already existing file associationg, otherwise falls back to the “open with” dialog if there’s no default handler also the paths get normalized to backslashes now asset import for scripts and so just does a file copy now instead of going through the old import path"}, {"post_id": 51240, "ts": "2026-08-20T19:35:22Z", "hours": 4.2758, "text": "persistent entities… again kinda scrapped most of the first attempt at persistent entities and decided to redo it instead of setting persistence in the editor, I went with something closer to Unity’s DontDestroyOnLoad , where scripts explicitly mark entities as persistent. makes more sense and is a lot less weird around scene changes. (i.e this.SetPersistent(true); ) changes scripting added: entity.SetPersistent(true) entity.IsPersistent() persistence persistent entities are tagged before the scene unloads, serialized normally, then re-injected and reparented when the new scene loads. the persistence tag itself isn’t serialized, so it won’t accidentally end up saved into the scene dedup added some basic deduplication so persistent entities don’t get duplicated if the new scene already contains an entity with the same name. its name based for now… not very great, but good enough"}, {"post_id": 50497, "ts": "2026-08-19T17:37:31Z", "hours": 6.7433, "text": "persistent Entities been working on persistent entities via a tag.. the same idea as Unity’s DontDestroyOnLoad, except you mark entities as persistent in the editor instead of doing it through scripts (scripts can do it too though). everything keeps breaking or half-working help."}, {"post_id": 49249, "ts": "2026-08-17T22:47:10Z", "hours": 2.5156, "text": "more docs… and some bug fixes some small bugs that have been annoying me for a while finally got fixed… and I wrote more docs than I probably needed to…? or maybe too litte.. who knows changes entity selection actually clears now fixed an issue where clicking empty space in the viewport wouldn’t reliably clear the current selection. the pick-result handling was structured wrong, so the “nothing was selected” case basically never got handled properly. also explicitly clear the entity ID framebuffer attachment every frame so it doesn’t leave stale IDs around from previous frames. i knew this was broken, and figured the fix would be pretty simple for a while.. but i just kinda forgot to fix it.. oops…. fixed parent transforms during scene loading fixed a bug with parented entities getting their transforms messed up when loading a scene. the issue was that scene loading was using the same Reparent() logic as interactive editor reparenting. that function intentionally recalculates the local transform to preserve world position, which is what you don’t want when loading a transform that’s already been serialized correctly… was eepy when writing that i guess added Registry::SetParentDirect() for scene loading, which just sets up the parent/child relationship without touching the transforms. interactive reparenting still uses the old behaviour, so dragging entities around in the hierarchy still preserves their world position misc cleaned out some old commented-out code docs, docs, docs also wrote proper editor documentation section covering things like: editor concepts usage scenes prefabs components and some even have screenshots.. yes i know.. fancy the help button in the editor links to some of these pages now. i guess “figure it out yourself” wasn’t really an acceptable documentation strategy anymore…. i mean i had some docs.. but they weren’t that good for editor-usage and more technical stuff.. so yep.. also made the README headers slightly more obvious because people were still asking where the download link was …."}, {"post_id": 48754, "ts": "2026-08-17T08:58:43Z", "hours": 2.7114, "text": "scrips can change things on the map yippie changes scripting scripts can now modify maps through EngineLib added: Map_SetHexWalkable Map_SetTileType yes, i made sure changes to walkability properly update the map’s pathfinding data instead of leaving it with stale information… sanitizers added sanitizer builds…. got ASan + UBSan working through CMake, along with presets for testing… it has helped already :) timers SetTimeout : if a script created a timer and then the scene changed before it fired, the callback could still run against the old scene state. timers now use generations, so changing/reloading a scene invalidates any timers belonging to the previous scene. editor fixed another map editor bug where discarding unsaved changes didn’t actually discard them… it would clear the dirty state but leave the edited map in memory… i knew about this bug and fix for a while, but i kept on forgetting about it… but its finally done -.- also added an Edit button to script entries in the project browser so scripts can be opened directly (launches default app it detects for the file via ur os)"}, {"post_id": 47739, "ts": "2026-08-15T21:10:44Z", "hours": 1.0883, "text": "mostly ui stuff (and fighting windows wide chars) yay pretty ui editor ui theming ui blah blah idk what to call it kinda cleaned up some stuff into proper members so the ui state doesn’t get all weird and persistent when you close the theme window discarding changes: actually works now. closing the window used to revert colors but keep your staged font changes, which was dumb (didnt really cause issues since changes werent applied anyways unless you saved beforehand but still.) font role indicators: added a little visual thingamabob where the font list now shows a star next to whatever font is actively set as the body font (also font name is now rendered in its proper font) path tooltips: added a hover tooltip on the font list items that shows the full file path of the font also some placeholder stuff in the code for searching the customization menu i might be implementing soon windows compat std::filesystem::path everything: went through and switched out the raw std::string usage for font paths inside FontConfig , replacing them with std::filesystem::path . this was purely because my windows ci build was failing. i was passing raw char strings around and doing weird string conversions, which completely blows up on windows because it expects wide chars for paths and i didnt consider that when i was being lazy and doing silly conversions and stuff because i just wanted to pass ez pz to a c library. freetype & serialization cleanup: updated all the internal freetype helper functions ( GetFontName , etc.) and the json theme serializer to play nice with the new paths instead of passing raw char pointers kinda mostly just making it a lil more prettier"}, {"post_id": 47431, "ts": "2026-08-15T11:16:32Z", "hours": 9.0703, "text": "fighting with fonts font-management rabbit hole in the theme editor… still wip changes font management in the theme editor the theme editor now has a proper Fonts section import .ttf / .otf fonts directly from the editor assign fonts to roles like Body, Bold, Monospace, Icons, etc. merge fonts together so icon fonts can be stacked on top of regular fonts rename, delete, and change the size of fonts fontsets are now saved as part of the theme, so imported fonts persist across restarts the role system isn’t fully wired up yet currently Body is used as the default editor font and Monospace is used for the console. im still working on the whole font management system here and its very unfinished and kinda untested.. very WIP!!! hot-reloading the annoying part was getting font changes to work while the renderer is running on another thread. rebuilding the ImGui font atlas in the middle of a frame was… not ideal, and eventually resulted in an assertion. now font changes mark the atlas as dirty, and the editor waits for the render thread to finish before rebuilding the atlas at a safe point. not the prettiest solution, but it seems to be working.. kind of dpi & freetype also experimented with DPI handling for fonts and wrapped FreeType into a single shared instance instead of creating separate instances everywhere. still figuring out exactly how I want the DPI/font sizing stuff to behave, but it’s getting there. bug fixes while doing all of this I also ended up fixing a few unrelated things: fixed an old GUI rendering bug where text could stop rendering or become garbled because of a pointer race thanks to @staneko for helping test/report that one since I couldn’t reproduce it properly on my system fixed a weird compilation issue related to namespace escaping bumped the vendored ImGui version for some dynamic font-related fixes a few other small UI changes and cleanup still working on this, and the font management side definitely isn’t finished yet… most of this time was just spent trying to get it to half-work so.. yep.."}, {"post_id": 46512, "ts": "2026-08-13T19:50:30Z", "hours": 3.6469, "text": "…the default imgui theme first off, huge thanks for all the incredibly kind reviews on my last ship !!! most of this work was also inspired by someone pointing out that i was still using the default imgui theme. fairs… so i spent some time making the editor actually customizable and messing around with having some kinda-nice defaults :) editor ui & theming live theme editor: built a proper window to tweak colors, spacing, padding, rounding, etc. in real-time. semantic palettes: added a semantic color system so you can build out a theme from a small set of base colors, rather than manually adjusting every single internal imgui color enum (though you can still override individual colors if you need to). serialization: themes dump straight out to a theme.json sitting right next to the editor executable. undo/redo: the theme adjustments go through the undo/redo system! help menu: put in a placeholder help menu. turns out literally nobody likes reading docs, so i guess i gotta start explaining how to use the engine from inside the engine… not implemented yet though editor groundwork did a bit of backend cleanup as well. added an EditorContext for editor-specific state, separate from the runtime EngineContext (currently just used for theme stuff) started working on editor font support with a FontSet for things like Body, Bold, Monospace, and Icons, not implemented though the font stuff is mostly groundwork for now, but the theming system is actually working and makes the editor feel nice :D"}, {"post_id": 46257, "ts": "2026-08-13T11:34:55Z", "hours": 2.8147, "text": "scripts can schedule stuff for later Added SetTimeout to the scripting API changes SetTimeout SetTimeout(fn, ms) calls fn() after ms milliseconds. simple to call from obsl timers live in a plain std::vector<Timer> in a new Platform::Time namespace, polled once a frame from Scene::Update no threads, no async bs or whatever :) the callback itself is a SmallTask , which falls back to a heap allocation if the closure is too big to fit inline fine for this since timeouts aren’t really a hot path timeout callback fires from an arbitrary point in Update , so it gets its own ScriptCommandBuffer set up on the worker just for the duration of the call, then flushed right after also gc.add_root / remove_root the function around the callback so it doesn’t get collected while it’s sitting in the timer list waiting to fire Documented it in the api reference alongside the other Time functions also tiny UI tweak in the tile editor: it now warns “no tile types defined, no map will be visible!” instead of just “no tile types defined” was seeing people get confused about why a new map looked empty after trying to paint also small updates to docs in general and stuff but nothing super interesting"}, {"post_id": 40738, "ts": "2026-08-04T13:46:27Z", "hours": 0.7667, "text": "Lighting Fixes been fixing a few small things with the lighting system mainly fixed lights using the wrong entity transform I forgot to account for entity parenting when I implemented that… also added a per-scene toggle for enabling/disabling the lighting system"}, {"post_id": 40621, "ts": "2026-08-04T08:56:51Z", "hours": 3.7144, "text": "the repo is public been working on gettin things ready for that, mostly writing some docs and getting GitHub Actions set up so I can build and release cross-platform builds also did some small code cleanup / fixes while I was going through everything. changes github actions i setup a workflow to compile the project on linux, windows, and mac, and then publish a release (mac is untested but compiles). im real happy though that its actually compiling on all “major” platforms though docs finally wrote some actual documentation… there are a few files in the docs/ folder now and a proper README still a WIP obviously, but at least there’s something there… misc implemented create new map button i forgot about completely repo there is already a build published as a test of the github actions thingy, try it out if you want :D https://github.com/torkelicious/obliberry"}, {"post_id": 39155, "ts": "2026-08-01T21:44:42Z", "hours": 3.0289, "text": "Bugs bugs bugs… I’ve been working on a demo project to both test the engine properly (looking for bugs and all), and also have something to actually show off made in my engine… this is the project you’ve been seeing in the last couple logs btw :) of course… since I’ve been using the editor for actual “work”, I have found a bunch of bugs. the biggest one being the entity ID situation… or.. disaster? changes the entity ID mess in the past, out of laziness… entity ID 0 was being used as both a real, valid entity handle and the “no entity / invalid” value depending on where you looked. which worked fine… mostly because of pure luck. the annoying part was that after working on this for a while I wasn’t even sure anymore if I was using 0 , -1 , or something else for invalid entities.. yep.. so I finally cleaned it up there is now a proper INVALID_ENTITY_ID constant, and entity index 0 is reserved for invalid entities. real entities now start from 1 . went through and replaced a bunch of random == 0 / != 0 checks across ECS, serialization, prefab handling, editor panels, and scripting bindings. project templates added support for multiple project templates. new project creation now scans the Templates/ folder instead of everything being hardcoded to “Default”. currently has: DemoProject Empty the demo project is mostly there to show off the newer UI/scripting stuff (the same demo as mentioned before), while Empty is just a completely blank scene. hierarchy & transforms fixed entity and UI reparenting. previously moving something to a new parent could randomly change its position because it was just applying the new local transform now reparenting keeps the world transform, so dragging things around in the hierarchy behaves properly UI & text rendering fixed a bunch of UI text issues. text now centers vertically using actual glyph metrics instead of a random offset I was “pretty sure” was correct it was not, in fact, correct button text now scales to fit inside the button fonts can now load directly from VFS memory instead of requiring a real filesystem path the VFS font loading one was something I completely forgot about when testing outside packaged projects… oops. packaging implemented .pakignore instead of a hardcoded ignore list, the packer now supports gitignore-style patterns in a .pakignore file and properly skips ignored folders/files also fixed a few smaller packaging issues while testing exported projects. misc a bunch of smaller things: map save/load dialogs now default to the project maps folder fixed scene switching bindings in editor play mode fixed a lightmap redraw bug font importer now only accepts .ttf / .otf added a small README with build instructions since im planning on publishing the repo soon (and writing all the docs… scary..) nothing super flashy this time.. but important"}, {"post_id": 38183, "ts": "2026-07-31T13:32:00Z", "hours": 0.8028, "text": "Windows Build The Windows build seems to be working.. I don’t have proper OpenGL passthrough in my VM… However, the Windows executable compiles perfectly in the VM and is running fine under Wine. so I consider that a win for now…"}, {"post_id": 37625, "ts": "2026-07-30T14:23:01Z", "hours": 1.56, "text": "working in a windows vm trying to get it to compile on windows… it is obviously going great… -.-"}, {"post_id": 36411, "ts": "2026-07-28T14:49:53Z", "hours": 3.1286, "text": "Entity Hierarchy & Scripting Integration finally caved & added actual parent/child relationships to entities changes entity hierarchy entities can now have a parent & children via a new RelationshipComponent . Registry::Reparent() handles moving an entity under a new parent, with cycle & self-parenting protection so you cant do anything silly like parenting an entity to its own descendant. TransformComponent now has a worldTransform alongside the existing local one, a new HierarchySystem systems that care about actual position (i.e AISystem ) read worldTransform now instead of assuming local == world. destroying an entity recursively destroys its children too & unlinks it from its parent’s child list scene serialization now saves & restores the hierarchy editor the Registry panel is a proper collapsible tree now instead of a flat list drag & drop reparenting, plus a right click menu for “Create Child”, “Detach”, & “Set Parent”. scripting pulled all the entity/component script bindings out into their own EngineLibRegistry.cpp module, they were kind of scattered around before & this makes them way easier to find & extend. scripts can now walk the hierarchy too (get children, etc), same module. added SetFont / GetFont bindings so scripts can assign or query a button’s font, small thing but script generated buttons wont have visible text without it :) misc cleanup small modernization stuff while i was in these files anyway: dropped redundant ternary parens, swapped a bunch of auto x = ...; if (x) into if-with-initializer, dropped some unnecessary global qualifiers, const-correctness fixes on UISystem::Update & UIRenderer::Flush . (yes i know the gizmos are offset and buggy, i kind of forgot to update the gizmo code after changing transforms :p )"}, {"post_id": 35110, "ts": "2026-07-26T10:28:41Z", "hours": 8.4342, "text": "Scripted UI, Map Workflow, & a Bunch of Bug Fixes alot of bug hunting… changes scripting & ui scripts can now actually interact with the UI system. added bindings for things like: creating UI buttons, text, rects, and images finding UI elements destroying UI elements these return wrapped objects with basic getters/setters for position, visibility, and button state map workflow spent a fair bit of time cleaning up the map editor flow. maps no longer get a fake default path on creation switching to the Map Editor tab now auto-creates a map (empty) if there isn’t one yet mapFilePath now stays project dir relative instead of randomly becoming absolute tile materials are now shared properly instead of silently duplicating state rendering & lifetime bugs i’ve been doing alot of testing recently, so i found alot of bugs… this was probably the biggest pain point. renderer submissions now keep materials and meshes alive for the frame instead of trusting the caller replaced the old Shader::Default() singleton hack with a real fallback shader (internalshaders base) fixed the lightmap quad so it keeps its own VAO and clears correctly when there are no lights fixed a Texture move bug that was double-deleting GL handles sometimes editor polish also cleaned up a bunch of editor behavior while I was in there. Ctrl+S now behaves correctly depending on whether editing a scene or a map scene loading now rebinds editor panels properly save/load dialogs now append file extensions automatically added more inline warnings in the inspector and panels (i.e if an entity has no material it will tell you it wont render) and ive probably forgotten something else … in summary ive just been testing out some UI/UX changed and hunting down bugs untill I feel it is ready to maybe start prearing some sort of demo :)"}, {"post_id": 33128, "ts": "2026-07-22T19:10:20Z", "hours": 2.6717, "text": "more ui ive been kinda sick so i aint really had the motivation to do a lot but ive been working more on the UI system im kinda tired so i dont really feel like writing more for now -.-"}, {"post_id": 31900, "ts": "2026-07-20T17:42:45Z", "hours": 4.6017, "text": "game UI Progress been continuing work on the UI system. changes UI made some good progress UI system currently have: font importing working texture support for UI elements basic text rendering a simple editor view panel for UI it’s still very much WIP editor right now it’s pretty basic, but it’s enough to start experimenting with how creating and editing UI might actually work inside the editor there’s still a lot left to do before I’d call it usable, but im making progress.. getting text working is painfull, and still unfinished.. but im workin on it…"}, {"post_id": 30701, "ts": "2026-07-18T14:27:23Z", "hours": 3.7628, "text": "UI Experiments since working on the particle system, I feel like it’s in a pretty good place for the current scope. I don’t really know what else I want to add to it right now, so I decided to finally start on something that’s been sitting in the back of my mind for a long time… a proper UI system. changes particles mostly just spent some time testing and polishing the particle system to make sure everything behaves properly I’m pretty happy with where it’s at for now UI started prototyping a custom UI system it’s very early, but I’ve got the basic rendering pipeline up and running currently working on: a UIElement system a dedicated UI renderer text rendering font loading using FreeType right now it’s mostly just enough to prove everything works, but it’s the foundation for the runtime UI system ive wanted for a long time the goal is for games made in the editor to be able to have their own UI, with everything exposed through EngineLib so scripts can create and interact with UI elements as well honestly, for now.. I was expecting it to go alot worse.. FreeType isn’t as bad as it seems once you get it working with GL The screenshot below dosent show much, but you can see the rendering of Text and rects, it also supports textured rects (which is what the text is currently using to render from a texture atlas)"}, {"post_id": 30249, "ts": "2026-07-17T17:50:34Z", "hours": 2.8864, "text": "More Particle work… been spending some time on the particle system… changes particles expanded the particle system quite a bit. currently supports: randomized size ranges randomized rotation configurable emitter shapes (support quad, circle, and soft circle) alpha and additive blending configurable render order (still kinda broken but im working on it) per-particle color over lifetime particle presets that can be saved and loaded (as JSON) also added an editor preview mode, so particles can be previewed while editing instead of only showing up in play mode renderer had to do a bit of renderer work to support all of this particles now use their own dedicated shader added support for per-instance colors during instanced rendering added an overlay render pass for effects that should render on top of the scene cleanup also did a some more project cleanup, splitting up my Utils header into multiple files.. nothing special though misc particle emitters can now be saved as reusable presets (some which will be shipped as defaults ofc) as suggested by @sol4r_on_hackclub cleaned up a few asset importing edge cases fixed a couple of packaging issues too I’m pretty happy with how the particle system is coming along :D"}, {"post_id": 29706, "ts": "2026-07-16T19:55:20Z", "hours": 0.9678, "text": "mostly just spent some time going through some old code.. nothing really important, but i’ve also replaced the placeholder assets.. with my own placeholder assets that i drew in GIMP, considering i probably do not have the rights at all to distribute the previous assets.. :)"}, {"post_id": 29523, "ts": "2026-07-16T14:38:59Z", "hours": 2.2728, "text": "Particles! :) Ive started working on a particle system. i have got the core pieces in place and it seems to be working nicely so far…. changes particles implemented the foundations of the particle system currently has: ParticleEmitterComponent ParticleSystem ParticlePool emitters currently support: configurable particle limits and emission rates randomized lifetimes and velocities “gravity” size over lifetime color over lifetime world space simulation materials obviously so far it’s all behaving pretty well… EngineLib next up is getting particles exposed through the EngineLib API so scripts can spawn and control emitter components we will see how it goes…"}, {"post_id": 29203, "ts": "2026-07-15T22:53:22Z", "hours": 6.2536, "text": "Editor QoL, Graphics Configs & Prefabs new devlog… mostly been focusing on editor ui and qol changes this time around. kinda tired of hardcoded settings for the graphics settings, so i finally built a proper interface for it, plus some prefab management stuff in the editor changes graphics settings i built a dedicated graphics configurator window in the window, for the current project ( GraphicsConfigEditor ). it hooks directly into the UndoManager using the command pattern ( GraphicsConfigUpdateCommand ) serializes everything out to graphics.json . added QuerySupportedSampleCounts which asks the active GL context ( before it gets handed to the render thread ) what MSAA sample counts it supports. the editor now dynamically generates the dropdown and snaps to a valid sample count (i.e 1, 2, 4, 8, 16). prefab management the editor now supports prefab management that i implemented earlier .. instead of directly writing it in the scene json file you can spawn entities directly into the scene from prefab json files you can revert a prefab, which wipes any local overrides and resets the entity back to whatever is saved in the file you can break a prefab, severing the link to the json file and turning it into a normal, standalone entity in the registry ui & editor cleanup spent some time making the editor less annoying.. in general the editor layout stops resetting itself , it now checks if imgui.ini exists on startup, and if it does, it skips rebuilding the default dockspace ripped the hardcoded hub drawing code out of the EditorLayer and made it its own state for the editor state machine refactored the config windows ( ProjectConfigEditor , SceneConfigEditor , and the new GraphicsConfigEditor ) to inherit from a base ConfigEditor class so its cleaner and easier to maintain.. fixed the script widget since the ui was kinda messy"}, {"post_id": 28584, "ts": "2026-07-14T22:27:14Z", "hours": 2.6136, "text": "the OpenGL State Machine Strikes Back… I spent the entire day trapped in hell: debugging a corrupted OpenGL state… it may not show up as tracked hours.. since most of it was just staring at various forms of text.. but it was painful. problem so since i turned the lightmap to run on gpu .. well… Whenever I transitioned from the editor ( MapEditState ) into Play mode, the map would turn into like a bunch of weird diamonds, and the corruption would persist indefinitely until I remounted the current project. because it only happened on state transition, i spent hours chasing ghosts in my state management code and scene cleanup routines… (in the end though i did make some changes to the cleanup routines, but between states rather than scenes.. so i guess i was halfway there?) the culprit It was the lighting pass… took me forever to figure it out, but i had the genius and definitely NOT a very late and obvious idea i shouldve had hours ago , to see if the issue happened when i turned off the lighting system. so i put some early returns in my lighting system functions and.. it didnt corrupt.. inside LightingSystem::Update() , the renderer was modifying global OpenGL state changing depth functions, blending modes, and texture bindings, but not restoring them to their original defaults properly When the engine swapped states, the next frame inherited this dirty, half configured state, causing the whole thing to become a mess. the fix I went through the lighting system and made sure the state changes are wrapped and properly restored through the render thread.. LightingSystem.h : Full GL state save/restore around the light pass. now explicitly backing up and restoring the FBO, program, VAO, blend state, draw buffers, clear color, viewport, and active texture. MapEditState.cpp : OnExit() now properly nulls out m_MapComp and m_CurrentGrid . OnEnter() and will refetch them from the current registry so it isnt holding onto outdated references. EditorLayer.cpp : Added a call to renderer->Clean() after state transfers to clear out stale VAO and mesh caches.(bc its multithreaded things go kinda weird but.. it works now) glad thats over with :D Also heres a fun peek of what ObSL can do with EngineLib, yes, it can make your entire map look like hell..! i am totally not going insane"}, {"post_id": 27998, "ts": "2026-07-13T23:29:33Z", "hours": 5.0142, "text": "GPU Lighting & Graphics Settings been doing a bit of rendering work again… mostly trying to optimize things. the biggest change is that I completely rewrote the lighting system previously all the point light calculations were happening on the CPU, and after doing some profiling (and spending way too long staring at compiler generated assembly annotations) it became pretty obvious that this was one of the bigger performance bottlenecks (well THE biggest excluding driver overhead) lighting now runs entirely on the GPU through shaders instead changes lighting rewrote the lighting system. lighting is now shader-based and runs on the GPU removed the old CPU-side lighting calculations moved engine shaders (like the base shader and lighting shader) into built-in InternalShaders (hardcoded string literals, it might seem messy but i prefer it like that) the internal shader change mostly exists because they’re pretty fundamental to the renderer. if they were treated like normal project assets and someone accidentally deleted them… well… suddenly nothing renders (unless they had setup their own shaders, which is fully supported!) and lighting completely falls over, also i prefer it to loading them from the filesystem anyways overall I’m pretty happy with how the new lighting system turned out graphics settings also started working on configurable graphics settings instead of baking them into the project, the engine now loads graphics settings from a separate JSON file. this doesn’t get packed into the .obpak , so users can tweak their graphics settings after exporting a game currently supports: resolution fullscreen MSAA (toggle + sample count) target FPS VSync it’s weirdly fun actually being back in OpenGL code again instead of just working with engine abstractions sometimes it’s nice to get back into the weeds.. even if its.. painfull :D"}, {"post_id": 27425, "ts": "2026-07-12T23:53:21Z", "hours": 7.5097, "text": "Performance & Zero Copy Assets been spending some time under the hood… this one’s almost entirely backend. no new features, mostly went through the render thread, asset pipeline, & a handful of ECS loops to squeeze out more performance. it was incredibly rage inducing at times.. but seeing the profiler diff against baseline.. i am satisfied.. almost at peace.. but was considering becoming a farmer & never touching a computer again.. mostly because i thought i’d messed up more than i did.. but.. im happy now. changes threading & ecs i’ve reinvented the wheel enough already… but had to redo how tasks are dispatched. ThreadPool used to take a std::function , which heap allocates if you capture more than a couple pointers. scripts dispatch through this every frame, so it added up. swapped it for a custom Task type a 56-byte inline buffer, no heap allocs swapped the pending-task counter to a lock free atomic decrement instead of a mutex on every completion… rendering been cleaning up how the main thread interacts with the render thread. the main & render threads used to awkwardly poll eachothers framebuffers. now theres a m_ReadyFrames deque main pushes a frame index, render pops it. much cleaner :) ImGui draw data is now reused in-place instead of allocating & freeing a fresh clone every frame (ive put off fixing that hack for a while so its nice to finally come around to it). instanced draws no longer store a vector<mat4> per draw call, transforms get appended into one giant staging buffer per frame now. added SubmitPersistent for things that already own a long-lived buffer (like the map tile renderer) to skip the copy entirely. swapped a bunch of unordered_map s for flat vectors in the texture/VAO/uniform caches for a handful of items, linear scan beats hashing. batched rendering also caches the last bound texture & color uniform so b2b batches sharing a texture dont rebind needlessly. added a zero-size window safeguard for Wayland so it stops wrecking the renderer when the window briefly reports 0x0 during resize (also turned vsync back on, weird syscall spam otherwise) assets & packaging added VFS::ReadVirtualView to hand out string_view s directly into memory instead of owned strings for packaged builds, ContainerReader now mmap s the .obpak file directly, uncompressed stuff (textures, uncompiled maps) gets handed right to the parser without a copy. also now move only, with a destructor that unmaps memory instead of holding a copied vector of chars scripting the script hot-reloader was doing a stat() syscall on every script file every frame . oops. now polls every 300 frames & caches resolved paths.. thought i already debounced this.. guess not.. the on_update & on_destroy work buckets used to be freshly allocated vectors every frame… now static , so they just clear & reuse capacity editor & ui finally ripped out the old in game debug UI ( GameUI.cpp ), it had fallen out of sync with the ECS anyway (used it for debug visuals while implementing the first version of the ecs.. then forgot about it) the editors inspector does all of this better now, so replaced it with a minimal FPS counter audio & map audio engine now sets an explicit period size (2048 frames) via miniaudio to cut IPC roundtrips to the audio daemon.. (this one was annoying to figure out.. god bless strace & gdb) the map’s visible transforms buffer is now double buffered, rebuilds write to the back buffer while the render thread reads the front, no race conditions. also swapped typeMats from an unordered_map to a flat vector nothing user facing changed this time, but frame pacing feels noticeably smoother (somewhat suprised), & the packaged build starts noticeably faster i know it could probably be a lot better, but im still a bit of a noob at C++, so this is one hell of a learning project"}, {"post_id": 26719, "ts": "2026-07-11T17:53:32Z", "hours": 3.9353, "text": "Undo/Redo …again! been working on the editor again the undo/redo system now covers a lot more than just gizmo transforms. but there’s still a few things left (entity creation/deletion mainly). changes undo/redo expanded the command system to cover most editor actions. currently supports: entity transforms adding/removing components adding/removing scripts editing project settings editing scene properties also fixed the undo/redo shortcuts so they only trigger once per key press instead of repeatedly firing while the keys are held… which is probably how they should’ve worked from the start map editor continued working on map editing. painting and erasing now properly integrate with the command system. also, an entire brush stroke is treated as a single undo step instead of undoing one tile at a time. also cleaned up a couple of edge cases while doing this, like preserving existing tile data and avoiding unnecessary commands when nothing actually changed. misc did a bit of cleanup around the editor while wiring everything together. centralized a few bits of duplicated UI logic cleaned up window title updates continued refactoring the command system the undo system is still unfinished, but it covers most of the important stuff and feels nice.. also.. still gotta fix some ui window-size stuff soon too but .. thats for later"}, {"post_id": 26228, "ts": "2026-07-10T21:54:28Z", "hours": 3.1872, "text": "Undo/Redo! :) been working on some editor QoL stuff again… the biggest addition this time is a proper undo/redo system. it’s still very early and pretty barebones, but having the foundations in place is nice changes editor commands implemented the beginnings of a proper command system for the editor instead of modifying things directly, editor actions now go through commands, which means they can be undone and redone currently supports: entity transforms movement rotation scaling adding components removing components (with the exception of ScriptComponent for now.. that’ll get its own custom command due to the way it works) also keeps a command history, and the usual shortcuts are hooked up now: Ctrl + Z : Undo Ctrl + Y : Redo its still pretty basic, but it works and feels nice to use. input for this, I added proper key-combination support to the input manager. things like: Ctrl + S Ctrl + Z Ctrl + Y can now be handled properly instead of manually checking modifier keys everywhere logging did a bit more cleanup to the logging system as well. the logger now goes through a proper interface instead of everything depending directly on one concrete implementation, which should make it a bit easier to swap things around later if I ever want to. mostly backend work again… but undo/redo is fire"}, {"post_id": 26050, "ts": "2026-07-10T17:12:54Z", "hours": 2.2128, "text": "editor polish still nothing super flashy.., mostly a bunch of small things changes window titles the editor now updates its window title based on what youre working on. it’ll now include things like the current project and scene, or map project loading cleaned up project loading a bit. the editor now properly syncs the loaded project configuration into the engine context instead of relying on stale data also added menu in the map editor that lets you save and load map files (create new is just placeholder for now) UI added a small helper for rendering framebuffer textures in ImGui without needing to remember to flip the UVs every time. and made the tile Editor use it also forgot to mention in the last log that i cleaned up the “project browser” ui a bit logging fixed up some more logging :)"}, {"post_id": 25892, "ts": "2026-07-10T11:51:37Z", "hours": 3.0564, "text": "Logging Cleanup replaced all the random std::cout / std::cerr calls scattered throughout the project with an actual logging system logging implemented a proper logging system. replaced std::cout / std::cerr throughout the engine added support for different log levels optional logging to a log file centralized all engine logging into one place thread safe !!!! nothing particularly flashy or fancy, but its cleaner, easier to work with, and generally just nice i probably should’ve done this a long time ago :)"}, {"post_id": 25509, "ts": "2026-07-09T20:30:56Z", "hours": 4.8756, "text": "Map Editing, Brushes, and a 4(?) hour ImGui Bug The map editor is finally coming together It’s still a bit… rough but it does feel nice to be able to paint a map in the editor I did, however, spend an embarrassing amount of time trying to figure out why my click and drag “painting” wasn’t working… well.. ImGui was eating my inputs because it thought I was trying to drag the Scene View window around.. yeah.. changes map editor actually got the map editing tools working for real this time. the paint and erase tools actually place and remove tiles now instead of just being placeholder buttons added a brush radius slider, so you can paint in bigger hex rings added a preview outline that renders around your cursor so you can see before clicking toggling “is walkable” on a tile now properly syncs with the grid pathfinding editor ui spent some time making the tile palette and material editing.. work.. video explains better ngl im not good at describing ui stuff math laid some groundwork in the hex math system ( Lerp , CubeRound , and GetHexLine ) this is mostly for some future evil plans… still a WIP…"}, {"post_id": 25003, "ts": "2026-07-08T22:10:08Z", "hours": 0.7108, "text": "map editor preveiw ig kinda didnt have much time to do anything today but im working on the tile editor"}, {"post_id": 24426, "ts": "2026-07-07T23:37:55Z", "hours": 8.7589, "text": "editor rework & map editing groundwork been working on the editor again this update was mostly about cleaning up the editor architecture so I can actually keep adding features without everything turning into spaghetti. I also finally started laying the groundwork for proper map editing. changes editor reworked the editor state system. instead of instantly swapping between states, transitions are now deferred until a safe point during the update loop. this makes switching between Edit, Play, Map Edit, and the Hub a lot cleaner, and the editor now remembers which editing mode you were in before hitting Play. (i’ll admit… i was getting a bunch of weird, seemingly unexplainable crashes before eventually realizing my mistake was instantly switching states while things were still being updated/rendered…) also moved more UI responsibility into the individual states instead of having EditorLayer decide how everything should be drawn. map editor started putting together the map editor. currently i have: map hover and tile selection working placeholder Paint / Erase / Select tools the beginnings of a tile palette system a placeholder tile editor panel the actual editing logic isn’t implemented yet, but the foundations are there now :) asset picker ripped out the old “open a native file dialog for every asset field” flow. instead, the editor now lets you pick existing textures, meshes, materials and shaders directly from the ResourceManager , which is a lot nicer to work with and also avoids accidentally importing duplicate assets. (the old workflow would happily create a brand new object every time you imported something… which was fine for testing, but definitely wasn’t something i wanted to keep) rendering fixed a few editor rendering issues while i was at it. materials with invalid shaders now fall back to the default shader instead of silently disappearing fixed some edge cases with framebuffer entity picking currently unused, but functional shader hot reloading tests misc smoothed out editor camera movement and zoom added a few helper utilities for the map editor reorganized the editor UI code a bit doesn’t look massively different in screenshots, but makes future work alot easier/cleaner map painting is next ?.."}, {"post_id": 23641, "ts": "2026-07-06T18:38:19Z", "hours": 2.4394, "text": "Project Exporting been working on making projects exportable from the editor it’s now able to export a project to the selected folder, package all the assets into an .obpak , and then copy over the runtime so the exported project is runnable changes project exporting added export to the editor choose an output folder for the exported project packages the project into an .obpak copies the runtime into the export folder renames the runtime to match the project name (just 2 files for full project!, executable and .obpak) the whole process is pretty much one click now instead of manually packaging everything together. file dialogs refactored my entire filedialog implementation cuz it was kinda broken packaging did some more work on the packaging pipeline while implementing exporting and put it in the editor ui im pretty happy that its all working and i can actually export stuff, and run it feels cool :)"}, {"post_id": 23429, "ts": "2026-07-06T12:05:06Z", "hours": 4.1694, "text": "Project Packaging is Working been spending a lot of time working on project packaging, and it’s finally working now. the engine can now load projects directly from .obpak files, and I’ve got basic tooling to create them as well. the plan is to integrate the tooling i have now with the editor to “build” an obpak archive (i think its called an archive?) changes packaging implemented the full packaging/loading pipeline yippie :D currently the packer: pre-generates ASTs for ObSL scripts converts project, scene(s) and prefab(s) JSON into MessagePack bundles everything into a single .obpak container compresses the package with LZ4 assets like textures, audio and shaders just get copied into the package without any conversion runtime the engine can now load packaged projects directly instead of relying on loose project files. all of this goes through the VFS, so from the engine’s point of view it doesn’t really matter whether assets are coming from a folder or from an .obpak (i.e it can still load loose project files of course) tooling added command-line tools for packing and unpacking projects, i originally made it for testing but it’s actually pretty nice to work with so im probably keeping it. still probably things to polish, but it’s pretty satisfying seeing the engine load an entire packaged project properly pls ignore the lag in the video, i promise its not as terrible as it looks, its just that recording is pretty buggy for me"}, {"post_id": 23095, "ts": "2026-07-05T20:42:38Z", "hours": 3.8311, "text": "Project Packaging been working on a packaging format for projects. the goal is basically to package an entire project into a single container while preprocessing assets that make sense to preprocess. Also makes shipping a game made in the engine in the future alot easier / cleaner, and portable. changes packaging implemented the start of a proper project packaging system. currently it: parses ObSL scripts ahead of time and stores serialized ASTs instead of source code (basically very similar to some sort of a very very simple AOT compiler) converts project, scene and prefab JSON files into MessagePack stores media and other binary assets directly in the package optionally compresses package entries with LZ4 the idea is that the engine has less work to do at runtime since scripts don’t need parsing and JSON doesn’t need parsing either. and a single “package” file is alot cleaner in general for a finished game “build” package format also implemented the actual container format itself. different asset types are stored as different entry types (scripts, binary JSON, media, shaders, etc.), so the loader knows exactly how each asset should be handled. tools added standalone packaging tools as well for packing and unpacking projects, mostly for testing. still a work in progress, but the whole packaging pipeline is starting to come together."}, {"post_id": 22372, "ts": "2026-07-04T20:12:27Z", "hours": 5.1664, "text": "editor Gizmos! :DD this took a lot longer than I’d like to admit… but it’s finally working. changes gizmos got all gizmos working.. but had issues with rotation and scale at first figured out the issues with rotation/scaling ended up patching ImGuizmo at first to get things working, but after digging through the code I eventually figured out how to do it properly with the normal library translation, rotation, and scale gizmos all work now :)))))) honestly I learnt quite a bit just from messing around with the ImGuizmo internals.. but it was painful editor added a few more UI improvements as well. i.e billboard sprites now explicitly mention that rotation doesn’t do anything, instead of letting you wonder why nothing happens gizmos are one of those things I’ve been waiting on implementing.. but im finally happy to have them"}, {"post_id": 21565, "ts": "2026-07-03T16:19:30Z", "hours": 2.6169, "text": "actually working on the editor I’m finally getting around to actually implementing the editor ..it still looks pretty similar (well mostly the same) but most of the UI before was just placeholder. changes editor implemented a Project Settings window implemented a Scene Properties window made the component widgets actually do something now load textures assign scripts change material colors change meshes change shaders etc…. added an Add Component button added Remove buttons to components it works.. so thats good :D"}, {"post_id": 21208, "ts": "2026-07-03T00:51:55Z", "hours": 0.6447, "text": "ObSL Scripting Library Moved the scripting language into its own repository :) It’s now included in the engine as a library using git submodules and public headers instead of living directly in the engine source code Makes the project structure a lot cleaner .. for both projects ( ObSL can now be found at https://github.com/torkelicious/ObSL )"}, {"post_id": 21066, "ts": "2026-07-02T20:52:49Z", "hours": 5.9469, "text": "Script multithreading (and concurrency) scripts now run on other thread(s) :D this took a fair bit of cleanup, but it’s working. changes script workers moved script execution onto worker thread(s) worked on script worker concurrency dynamically clamp the number of active workers based on how many callbacks are actually running, so idle threads aren’t just spinning doing nothing garbage collection did some work on the GC as well. introduced external root tracking fixed a few issues around GC roots while getting multithreaded script execution working cleanup spent some time cleaning up a bunch of backend stuff while getting all of this working. build system updated CMake so all executables, scripts, and (project) templates are output to a single build/bin directory instead of being messy. multithreading yay :)"}, {"post_id": 20164, "ts": "2026-07-01T18:24:52Z", "hours": 3.945, "text": "ive been mostly messing around with getting the ObSL language to be thread-safe and refactoring some things, so I don’t have much to show but my end goal is to be able to get scripts to run concurrently and outside of the main thread"}, {"post_id": 19379, "ts": "2026-06-30T17:52:06Z", "hours": 4.6878, "text": "Editor & Scene Management been working on the editor mostly. changes ECS implemented generational ID masks for the ECS. this should prevents issues with stale entity references since IDs can now properly track generations instead of just relying on raw IDs. (i encountered this issue when testing multiple scenes in one project) scene manager fully implemented the SceneManager so it can actually be used by the editor & game layer. this allows the editor to properly load/save/validate/find and generally handle scenes through a unified API (goes for gamelayer aswell but it only really loads them) bug fixing spent a lot of time fixing various issues around: project folder management scene management loading / saving behaviour asset loading (cache was causing some problems on loading scenes but its all fixed now :D) mostly backend work but things are becoming a lot more stable and the editor foundation is starting to come together…."}, {"post_id": 18509, "ts": "2026-06-29T17:58:54Z", "hours": 7.6317, "text": "Namespace Refactor & Project Management Work Dependencies finally caused me to run into a namespace conflict after being lazy and unorganized… instead of being sane and just renaming one class.. I decided to refactor the entire project to use proper namespaces everywhere.. changes namespaces Refactored the entire codebase into proper namespaces project management / editor backend I don’t really have much visually to show this update since I’ve mostly been working on backend stuff. Working on: project management scene management VFS improvements editor saving/loading I’m using nativefiledialog-extended to work on proper file dialogs for saving and loading from the editor. Also been doing a lot of testing around project creation and loading. alot of this is in the hope i can get this working multi-platform and not just on linux (though i have yet to try and compile on another os) Things are working… for now… so progress :D"}, {"post_id": 17698, "ts": "2026-06-28T16:44:24Z", "hours": 1.5475, "text": "Editor Picking & Project Management because my EditorLayer uses a framebuffer, I can now utilize framebuffer color picking in the editor i updated the shaders to store an entity ID, so now I can click on entities directly in the editor scene view and it selects them. …and it’s pixel perfect :D changes editor layer added framebuffer based entity picking clicking entities in the scene view selects them!!!! selection is based on the exact pixel under the mouse (i mean to implement gizmos i first need to know what the hell my mouse is on) project management also started laying the groundwork for actual project management. now that I have some sort of VFS implemented, I’m working on a way to properly manage Projects instead of relying on the current setup. still figuring out the exact structure, but ive been working on setting up the Project class"}, {"post_id": 16940, "ts": "2026-06-27T14:41:38Z", "hours": 3.1197, "text": "VFS & Editor layer implemented a basic VFS (Virtual File System) . all asset loading is now routed through the VFS instead of directly loading files. this is mainly preparation for adding proper project management later instead of relying on a hardcoded project.json in the project root i was testing with changes VFS added a basic VFS implementation routed asset loading through the VFS the idea is that the VFS will make it easier to manage project assets and not have everything depend on hardcoded paths. editor layer still experimenting a bit with the editor placeholder UI. added: (new EditorCamera derived class of Camera ) camera panning in the editor viewport camera zoom toggling top-down / isometric perspective with keybinds the top-down view should be useful later when I add actual map editing stuff most of the editor UI is still just placeholder right now, I’m mostly testing layouts and figuring out how I want the editor to feel and look ImGuizmo also added ImGuizmo to the project since I’m planning to start implementing proper editor stuff soon.. …and well… you need gizmos… I’ve reinvented the wheel enough already, so using a proper gizmo library seems like the better choice :) (also integrates very nicely with ImGui)"}, {"post_id": 16309, "ts": "2026-06-26T15:23:43Z", "hours": 2.0242, "text": "Editor UI & Framebuffer Experiments i’ve started experimenting with the ImGui docking branch in the EditorLayer . (switched branch had some build errors blah blah blah but its all set up now) Implemented some placeholder editor UI to test out the docking stuff and get a feel for how the editor layout might end up being like changes editor layer placeholder UI using ImGui docking features testing editor panel layouts framebuffer implemented a framebuffer system for the editor viewport. the scene is currently rendering in the editorlayer via a frame buffer so it can fit in the little thingy (i forgot the name) while testing I noticed some resizing issues when running on my nvidia dGPU: the framebuffer resize works, but resizing the viewport can appear somewhat choppy? the framebuffer and docking setup seem to be working, so i guess this im close to actually start to build proper tooling :)"}, {"post_id": 15851, "ts": "2026-06-25T19:34:56Z", "hours": 4.3886, "text": "refactoring for editor foundation Refactored rendering and culling systems and made broader architectural changes to decouple the game from the application layer. Rendering & Culling Refactored frustum culling logic to be lil more performant and generally cleaner Cleaned up and improved parts of the rendering pipeline since i had alot of old unused code lurking in them since i switched to a multithreaded architechture Application Architecture the engine is now structured around an ApplicationLayer system. The core Application class now runs a single active ApplicationLayer Each layer exposes: Init Update Render Shutdown Game class refactor The Game implementation has been converted into a derived ApplicationLayer Game logic is now fully driven through the layer system instead of hardcoded to the application class (the different executable mains decide now) Editor Layer added a new EditorLayer Intended for a future scene editor application. (right now all it does is render a given scene on the screen) CMake changes reworked the project to generate multiple executables: obliberry_engine core engine executable (ig runtime) obliberry_editor editor application layer changes: Engine and core systems (i.e ObSL, Renderer, etc) are now compiled as libraries Executables link against shared engine libraries instead of duplicating code Editor executable links against engine modules summary Game logic is now layer-based Engine and tools are separated Editor can proceed independently from the game runtime"}, {"post_id": 15286, "ts": "2026-06-24T20:32:54Z", "hours": 3.7039, "text": "multithreading & rendering I think I got some form of multithreading working now. The renderer has been moved onto its own dedicated thread, separating rendering from the main engine thread :) Changes Rendering Thread Moved rendering execution to a separate thread (alot had to be refactored for this to work lol) Thread Safety i tried (imgui was a pain) Rendering Optimizations Added frustum culling to the renderer. big optimizeD? actual rendering (i.e gpu calls) is now seperated from the main thread :D …it looks like its working for now"}, {"post_id": 14758, "ts": "2026-06-23T23:48:42Z", "hours": 0.4239, "text": "I think i fixed most of the silly bugs from trying to make rendering thread safe, im still gonna double check some stuff and do some testing but moving rendering to its own render thread will be coming soon :))))"}, {"post_id": 14743, "ts": "2026-06-23T23:15:37Z", "hours": 1.1569, "text": "kinda reverted changes from the last log and tried again to convert everything to be thread safe before actually trying to run on a seperate thread… things are going.. interestingly"}, {"post_id": 14522, "ts": "2026-06-23T17:41:20Z", "hours": 0.8647, "text": "im trying to make the renderer run on another thread… few issues… cant see (entity) meshes?, and closing the window seems to cause a freeze…. :))"}, {"post_id": 14480, "ts": "2026-06-23T16:45:32Z", "hours": 1.2731, "text": "Been mostly just fixing some window rendering stuff Moved away from hardcoded resolution / aspect ratio and made it handle itself on the fly also removed the padding bars i had before so rendering actually takes up full screen New native engine binding in EngineLib too: Window_SetFullscreen (takes a bool) I’m planning on starting to work on making the engine multithreaded soon…"}, {"post_id": 14379, "ts": "2026-06-23T14:22:29Z", "hours": 0.8064, "text": "“project” file system prototype Started implementing support for engine project files instead of hardcoding a scene path like i was before for testing. The engine will now deserialize a project.json file containing configuration, includes: name Project name (unused for now) version Project version (also unused) start_scene Path to the scene the engine loads on startup Window configuration: width height title fullscreen while implementing this, I uncovered some unexpected behaviour related to fullscreen handling caused by how window sizing was previously managed. i spent time refactoring and fixing the window size logic to make fullscreen behaviour… work.. project loading is now starting to come together, less hardcoded stuff yippie (im planning on making an editor in the future so.. this is why)"}, {"post_id": 14345, "ts": "2026-06-23T13:22:42Z", "hours": 1.3275, "text": "Porting ECS systems to ObSL Fully ported the InteractionSystem to ObSL through EngineLib. Camera movement and player movement are now handled through dedicated ObSL scripts instead of being hardcoded ECS systems. This moves more gameplay logic into the scripting layer and makes systems easier to modify and iterate on :) Changes System Migration Ported InteractionSystem from ECS code to ObSL Basically Moved camera movement & player movement logic into ObSL scripts Interaction system is no longer hardcoded engine-side gameplay system New EngineLib Bindings Math / Hex Grid Math_WorldToHex Converts world coordinates into hex grid coordinates SetSelectedHex Updates the currently selected hex tile Camera Camera_SetZoom Sets the camera zoom level Window Window_GetHeight Gets the current window height Window_GetWidth Gets the current window width Input Input_IsKeyReleased Checks if a key was released Input_IsMouseDown Checks if a mouse button is currently held Input_IsMouseReleased Checks if a mouse button was released Input_GetMouseX Gets the mouse X position Input_GetMouseY Gets the mouse Y position Input_GetScrollX Gets horizontal scroll input Input_GetScrollY Gets vertical scroll input Please ignore the weird graphical artifacting in the attached video, my pc has been acting up recently :("}, {"post_id": 13950, "ts": "2026-06-22T22:00:49Z", "hours": 3.1867, "text": "more EngineLib work Implemented several improvements to the scripting and entity systems. changes prefab caching Added caching for prefabs to improve performance when repeatedly instantiating entities Entity Access in Scripts Added GetEntity , which returns the entity Object that the script is attached to. Added support for the this keyword in ObSL scripts. this is a wrapper around GetEntity() to provide direct access to the current entity custom components Added support for script-defined components: entity.AddCustomComponent entity.GetCustomComponent This allows scripts to attach and retrieve custom data/components without requiring engine side component definitions entity validation Updated all entity object calls (such as GetComponent ) to validate the entity before executing (in both native bindings & engine source code) Entity operations now check: registry.isValid(id) before accessing the entity. This prevents errors caused by accessing deleted entities during scenarios such as scene unloading/loading cleanup"}, {"post_id": 13774, "ts": "2026-06-22T16:02:35Z", "hours": 0.8908, "text": "EngineLib I may have forgotten to mention this in my previous log, but I also implemented an Instantiate method in EngineLib. Instantiate takes an entity definition as a JSON file (ig a prefab) and spawns the entity into the current scene. I also added scene related functionality to EngineLib: LoadScene Loads a scene from a given path GetCurrentScenePath Returns the path of the currently loaded scene"}, {"post_id": 13737, "ts": "2026-06-22T15:02:47Z", "hours": 3.4014, "text": "I’m using miniaudio to implement audio support in the game engine, with an AudioEngine class to abstract the audio functionality. I’ve also updated SceneProperties to include a new background_music property. This allows each scene to define a background music track (via filepath) that will automatically loop through the AudioEngine while that scene is active. It all seems to be currently working well, Next I’m starting to integrate audio functionality into EngineLib so that scripts can interact with the audio system. changes Added AudioEngine abstraction layer using miniaudio Added background_music support to SceneProperties (w. proper serialization/deserialization ofc) Implemented looping background music per scene"}, {"post_id": 13262, "ts": "2026-06-21T18:28:09Z", "hours": 2.735, "text": "EngineLib Script Integration I fully replaced the previously hardcoded PlayerMovementSystem with an ObSL script implementation using new EngineLib bindings. The movement logic is now handled externally through scripting instead of being directly implemented in C++. New EngineLib Bindings entity management Added bindings for basic entity operations: CreateEntity Creates a new entity Destroy Removes an entity HasComponent Checks whether an entity has a specific component RemoveComponent Removes a component from an entity global functions get_dt Retrieves delta time CloseWindow Closes the glfw window Input System Added script access to input handling: Input_IsKeyDown Checks if a key is currently held Input_IsKeyPressed Checks for a key press event Input_IsMousePressed Checks if a mouse button is pressed Input_GetMouseWorldPos Gets the mouse position converted to world space Movement / Hex Grid Functions Added bindings for interacting with movement components: GetSelectedHex Gets the currently hovered hex tile SetPathToHex Sets a movement target path for an entity with a MovementComponent Camera Added camera manipulation support: Camera_GetPosition Gets the camera position Camera_SetPosition Sets the camera position Camera_Move Moves the camera Camera_PanScreenSpace Moves the camera relative to screen space Camera_GetZoom Gets the current camera zoom Hex Rendering Added bindings for controlling grid visuals: ClearSelectionOverlay Clears the hex selection overlay ClearPathTarget Clears the path target visual marker ClearPathTarget is currently named poorly. It only clears the grid overlay visualization, not the actual movement target!!! summary Removed the old hardcoded PlayerMovementSystem Migrated player movement logic into script format Added engine bindings required for script-driven gameplay Camera movement, input handling, and hex selection now work through scripts Even more gameplay code can now be modified without recompiling the engine :)"}, {"post_id": 12232, "ts": "2026-06-19T23:34:06Z", "hours": 2.7347, "text": "I’ve got a good basis for the Engine integration library for the ObSL Scripting Language. In the attached video, I’m changing the player’s size using a ping-pong function (?forgot the name…), fully through an ObSL script ( ScriptComponent ) attached to the “Player” entity. The language now has support for the following through the EngineLib : Entity Objects Find GetName SetName GetComponent Components Transform SetPosition SetRotation SetScale GetPosition GetRotation GetScale (uses ObSL arrays) Point Light SetColor (Vec3) SetIntensity SetRadius MovementComponent GetIsMoving SetIsMoving SetTimePerStep MapStateComponent GetHasSelection GetSelectedHex GetPathToHex DirectionalTextureComponent SetIndex GetIndex PlayerInputComponent is still w.i.p. Tag Components currently don’t have any methods since they are only used as tags. Planned I’m planning to keep expanding the EngineLib api with more methods, such as: Has(component) AddComponent RemoveComponent(name or ref) Destroy(EntityID) GetEntityID(entity object ref)"}, {"post_id": 12030, "ts": "2026-06-19T16:56:29Z", "hours": 2.8408, "text": "I’ve got the scripting language integrating with the engine via a ScriptComponent on the player entity, seems to be working all good though I still have to implement the actual Engine library for everything… but I have simple scripts running on entities as components in the game engine, which went faster than I expected, so i’m happy with it :)"}, {"post_id": 11605, "ts": "2026-06-18T21:53:02Z", "hours": 15.6978, "text": "Drafting a readme for the scripting language before I plan on the Engine bindings"}, {"post_id": 9500, "ts": "2026-06-15T21:05:05Z", "hours": 6.1578, "text": "added switch statements, foreach-loop, objects, modules (imports), and a standard library to the scripting language"}, {"post_id": 8966, "ts": "2026-06-14T22:36:48Z", "hours": 2.3381, "text": "I’m working down my todo-list for the scripting language (ObSL). Right now i’ve got arrays implemented! i also made a method to define functions from the c++ source so that I can access c++ stuff (like std::chrono functions that im using for testing right now from the test.obsl script), and whatever other functions i want to have accessible, this will be very useful later on as I to integrate the scripting language with the game engine, as now i have an easy way to call functions already defined in the engine source code from the scripting language by just calling interpreter.bind_native(args blah blah); and then I can call the function from the interpreted scripts.. very useful :D"}, {"post_id": 8716, "ts": "2026-06-14T14:08:32Z", "hours": 2.1228, "text": "the scripting language now has some more mathematical operators and functions !"}, {"post_id": 8434, "ts": "2026-06-14T01:00:46Z", "hours": 2.25, "text": "The scripting language is now technically Turing complete, as i have added state environment (basically variables persist throughout the session), conditional branching via if / else statements basic repetition via while & for loops the screenshot below shows a fibonacci sequence & an example of the conditional branching w. looping . of course it’s not done yet though, i still have a lot of work ahead :)"}, {"post_id": 8361, "ts": "2026-06-13T21:59:28Z", "hours": 2.07, "text": "still working on parsing and implementing new nodes :)"}, {"post_id": 8255, "ts": "2026-06-13T18:48:40Z", "hours": 2.3453, "text": "Working on trying to implement a scripting language for my game engine… i’ve got a simple parser working, it definitely went faster than i expected. Going back and reviewing an old parser i made in C# a while ago helped a lot in this :)"}, {"post_id": 8113, "ts": "2026-06-13T15:24:08Z", "hours": 3.8419, "text": "I’d like Entities to be scriptable in a future editor application / in general without having to edit c++ source files of the editor to implement new logic systems for one entity, so i’m planning on implementing a very basic scripting language, the way i plan on it working is that you attach a script to an entinty as a component, and it will hold the actual game logic in that script, im not great at explaining with words but what im doing now is starting on implementing lexical analysis for a simple interpreter just to test things out, while I have written small interpreters before, alot of this is still new to me so I am learning along the way. the idea is that its just a very basic scripting language to interact with entities and the current scene, with basic apis for interacting with the current scenes ECS registry,we will see how it goes :)"}, {"post_id": 7654, "ts": "2026-06-12T19:56:36Z", "hours": 2.1944, "text": "I’m working on a simple map lighting system, which seems to be working alright. Also scene files now have background color information (which ends up getting wired into glClearColor), also implemented name field for entities because why not. I’m also messing around a bit with the UI since im not super experienced with ImGui but I like trying things out…"}, {"post_id": 7507, "ts": "2026-06-12T15:05:30Z", "hours": 2.1106, "text": "I’ve been focusing mostly on my scene serialization lately. First, I refactored the maps to remove the hardcoded TileTypes enum, which used to map 0 to grass and 1 to sand. Instead, I implemented a system where this is defined in the grid section of the scene’s json file. The “id” property is now a generic unsigned integer for the tile type, and the “texture” property references a specific asset loaded in the scene. I also added a “properties” section for the scene’s name and a “clear_color” array. This lets you dynamically change the window’s background color on the fly instead of always defaulting to a hardcoded black. Writing the new methods and sorting out the custom serialization logic took a bit of work, but it is working great now. also bumped the map file “version” to 2, even though the reading/writing of map files didn’t change at all, the usage of some bytes did kind of change (for the tiletype) so i felt it was fitting"}, {"post_id": 7189, "ts": "2026-06-12T00:17:40Z", "hours": 1.3681, "text": "i’ve been playing with loading in entities and meshes.. ignore the weird fps drops and generally low fps (compared to normally), screenshots and recordings loves messing with performance for some reason"}, {"post_id": 7135, "ts": "2026-06-11T22:23:21Z", "hours": 5.1658, "text": "i’ve implemented instanced draw calls alongside regular draw calls in my renderer, which currently im using instancing for drawing the map, I also implemented culling for the map depending on viewport and some other small optimizations, I also spent some time on fixing and improving my “Systems” and some general cleanup"}, {"post_id": 6799, "ts": "2026-06-11T12:20:56Z", "hours": 1.5519, "text": "Managed to fix the segfault.. Mesh::Upload was updating buffer data without binding its own VAO first, which polluted the global OpenGL state. When a new scene loaded, the driver tweaked out on the broken index bindings and crashed on the next draw call …"}, {"post_id": 6484, "ts": "2026-06-10T22:04:02Z", "hours": 1.4136, "text": "I’ve got saving scenes working fully now! ^-^, but an issue ive run into is a segmentation fault on switching scenes, I theorize that it’s due to me not cleaning up / reassigning things when I load in new meshes etc from the scene, thus leaving old pointers in the render queue which don’t exist anymore. This i will work on fixing next.. But for now I am quite happy that i have scenes loading and saving to json :)"}, {"post_id": 6400, "ts": "2026-06-10T19:22:44Z", "hours": 4.4556, "text": "I’ve got loading in scenes working pretty well, but I still have work todo before I can save them properly, im pretty tired already since i spent all day chasing a bug regarding render sorting and ended up refactoring a ton of stuff that i probably didnt have too as i was searching for the issue, but atleast the codebase is somewhat cleaner"}, {"post_id": 6187, "ts": "2026-06-10T12:05:48Z", "hours": 0.365, "text": "running some tests.. messing around with funny map generation shapes too but i dont know how i feel about them"}, {"post_id": 5958, "ts": "2026-06-09T23:43:23Z", "hours": 5.3872, "text": "rather than using another custom file format i decided to just use json to serialize scenes which is coming along rather nicely …"}, {"post_id": 5695, "ts": "2026-06-09T16:10:54Z", "hours": 2.3658, "text": "I’ve been restructuring the and moving things to run actual game logic via “Systems”. I’ve temporarily been testing this in a messy way directly in the scene class, but I’m planning on implementing maybe some sort of basic scripting language that can be used for game logic in entities as a Component w. accompanying systems ofc, so game logic can be defined outside of engine source files and serialized into a scene’s registry from a given file rather than the things im messing around with now. serialization of scenes is what im planning to implement next once im happy with how scenes are working, but i need to plan ahead alot. So for now I’m still going to focus on making sure my Scene implementation is good enough before I focus on implementing serialization and scripting etc, and I have alot to think about regarding the design and architecture of this thing that seems to have evolved into a Game Engine :)"}, {"post_id": 5539, "ts": "2026-06-09T10:55:05Z", "hours": 2.0847, "text": "working on getting Scenes implemented"}, {"post_id": 5225, "ts": "2026-06-08T22:43:53Z", "hours": 2.7831, "text": "I completely refactored my ECS into an actual proper entity component system and added a lil fancy inspector for entities/components in the UI, everything works with the new system :) Now that my ECS is properly implemented I’m going to start focusing on implementing proper Levels/Scenes rather than the mess I have right now in my “Game” class which I’ve been using for testing stuff (ignore the weird framedrops my screen recorder was tweaking out)"}, {"post_id": 4858, "ts": "2026-06-08T12:03:11Z", "hours": 0.5367, "text": "i made a npc (the red super mutant) that just wanders around"}, {"post_id": 4844, "ts": "2026-06-08T11:26:15Z", "hours": 0.9856, "text": "I’ve been having a bit of fun with player sprites (currently som fallout 1 super-mutant sprites i found online) and the renderer sorting sorting code to avoid the player appearing under the ground"}, {"post_id": 4599, "ts": "2026-06-07T23:21:51Z", "hours": 0.7331, "text": "I implemented reading from the previously saved map file, with some tests ofc :D please ignore the player flying away at the end.. as of the time of writing it was a sloppy bug which is already fixed"}, {"post_id": 4582, "ts": "2026-06-07T22:30:26Z", "hours": 1.5031, "text": "I’ve implemented saving the current grid to my own custom file format, and some tests to check that it’s working and all seems good.. but now, the real test is to see if I can load back in that file properly :)"}, {"post_id": 4281, "ts": "2026-06-07T15:19:30Z", "hours": 3.5969, "text": "I did a few things i made it highlight what hex the player is currently moving towards in white fixed a bug causing it to crash when i tried to use my dgpu (issue with my GLdebug class trying to load unavailable glDebugMessageCallback since my dgpu driver uses an older OpenGL version than my igpu and i kinda forgot to check if it the callback function was available BEFORE calling it.. .-.) refactored some of my Hex code to prepare for making some sort of system to load maps from files, so i generally cleaned up some stuff and opted for smaller datatypes for my needs (i.e using int16_t rather than ints for hex coords r & q, since that’s really all you need unless your map is massive) i also added some more fancy ui with imgui to play around with and generally just cleaned up some code… in short im basically preparing myself to implement some sort of map file loader w. accompanying filetype?"}, {"post_id": 3847, "ts": "2026-06-06T22:12:28Z", "hours": 1.7772, "text": "I managed to setup a basic ImGui window to control map generation, I also tried to optimize my rendering by fixing a sloppy bug i had in my batching implementation and caching transformation matrices per transform (dirty flag pattern) fps does seem stable :) (please ignore the video artifacting)"}, {"post_id": 3544, "ts": "2026-06-06T15:07:32Z", "hours": 11.2967, "text": "I redid almost everything with what i’ve learnt from trying the first time (ECS, ResourceManager & MeshFactory are basically the same though) I managed to implement A* pathfinding for the player movement. I got to render out the map with textures i made. tried to recreate movement like Fallout has, where you move the mouse to pan and click to move to a tile with stepping. The hex grid is reperesented via an odd-r offset layout."}, {"post_id": 2707, "ts": "2026-06-05T12:48:03Z", "hours": 1.4394, "text": "Experimenting with camera stuff and input, now i can zoom with the scrollwheel and i’m trying to get an isometric perspective working better"}, {"post_id": 2669, "ts": "2026-06-05T10:44:01Z", "hours": 1.9911, "text": "im getting a simple resource manager implemented :)"}, {"post_id": 2395, "ts": "2026-06-04T21:04:46Z", "hours": 3.0553, "text": "It may not look like much, but I’ve been working on implementing a form of an ECS , rewriting some stuff too. I kind of broke some camera stuff in the process which I’m going to fix soon, and actually get this stuff to be the correct perspective and such…."}, {"post_id": 2168, "ts": "2026-06-04T14:49:59Z", "hours": 3.0614, "text": "i’ve been experimenting with some stuff back and forth, now im working on testing basic “Player” movement with WASD"}, {"post_id": 1448, "ts": "2026-06-03T14:24:00Z", "hours": 2.3058, "text": "I’ve implemented proper debug logging for OpenGL, optimized rendering with a queue that sorts RenderCommands to avoid unnecessarily binding & unbinding, a basic InputManager class, and very basic materials."}, {"post_id": 1055, "ts": "2026-06-02T21:13:14Z", "hours": 1.5414, "text": "i’ve got a basic hex grid “map” rendering and working well"}, {"post_id": 890, "ts": "2026-06-02T16:46:10Z", "hours": 0.7936, "text": "Implemented a basic camera which im messing around with a bit to rotate (around) my mesh"}, {"post_id": 858, "ts": "2026-06-02T15:50:32Z", "hours": 1.3153, "text": "I now have textures working, and a basic “meshfactory”"}, {"post_id": 801, "ts": "2026-06-02T13:58:30Z", "hours": 2.4436, "text": "I’ve gotten transforms and basic rendering implemented of objects implemented via a “Mesh” class that gets passed to Draw() in the Renderer Class :)"}, {"post_id": 403, "ts": "2026-06-01T19:57:36Z", "hours": 0.2883, "text": "Setup basic GLFW Window boilerplate & CMake Project :)"}]...
|
Title: obliberry by @torkel | Stardance
Devlogs:
Title: obliberry by @torkel | Stardance
Devlogs:
Setup basic GLFW Window boilerplate & CMake Project :)
I’ve gotten transforms and basic rendering implemented of objects implemented via a “Mesh” class that gets passed to Draw() in the Renderer Class :)
I now have textures working, and a basic “meshfactory”
Implemented a basic camera which im messing around with a bit to rotate (around) my mesh
i’ve got a basic hex grid “map” rendering and working well
I’ve implemented proper debug logging for OpenGL, optimized rendering with a queue that sorts RenderCommands to avoid unnecessarily binding & unbinding, a basic InputManager class, and very basic materials.
i’ve been experimenting with some stuff back and forth, now im working on testing basic “Player” movement with WASD
It may not look like much, but I’ve been working on implementing a form of an ECS , rewriting some stuff too. I kind of broke some camera stuff in the process which I’m going to fix soon, and actually get this stuff to be the correct perspective and such….
im getting a simple resource manager implemented :)
Experimenting with camera stuff and input, now i can zoom with the scrollwheel and i’m trying to get an isometric perspective working better
I redid almost everything with what i’ve learnt from trying the first time (ECS, ResourceManager & MeshFactory are basically the same though) I managed to implement A* pathfinding for the player movement. I got to render out the map with textures i made. tried to recreate movement like Fallout has, where you move the mouse to pan and click to move to a tile with stepping. The hex grid is reperesented via an odd-r offset layout.
I managed to setup a basic ImGui window to control map generation, I also tried to optimize my rendering by fixing a sloppy bug i had in my batching implementation and caching transformation matrices per transform (dirty flag pattern) fps does seem stable :) (please ignore the video artifacting)
I did a few things i made it highlight what hex the player is currently moving towards in white fixed a bug causing it to crash when i tried to use my dgpu (issue with my GLdebug class trying to load unavailable glDebugMessageCallback since my dgpu driver uses an older OpenGL version than my igpu and i kinda forgot to check if it the callback function was available BEFORE calling it.. .-.) refactored some of my Hex code to prepare for making some sort of system to load maps from files, so i generally cleaned up some stuff and opted for smaller datatypes for my needs (i.e using int16_t rather than ints for hex coords r & q, since that’s really all you need unless your map is massive) i also added some more fancy ui with imgui to play around with and generally just cleaned up some code… in short im basically preparing myself to implement some sort of map file loader w. accompanying filetype?
I’ve implemented saving the current grid to my own custom file format, and some tests to check that it’s working and all seems good.. but now, the real test is to see if I can load back in that file properly :)
I implemented reading from the previously saved map file, with some tests ofc :D please ignore the player flying away at the end.. as of the time of writing it was a sloppy bug which is already fixed
I’ve been having a bit of fun with player sprites (currently som fallout 1 super-mutant sprites i found online) and the renderer sorting sorting code to avoid the player appearing under the ground
i made a npc (the red super mutant) that just wanders around
I completely refactored my ECS into an actual proper entity component system and added a lil fancy inspector for entities/components in the UI, everything works with the new system :) Now that my ECS is properly implemented I’m going to start focusing on implementing proper Levels/Scenes rather than the mess I have right now in my “Game” class which I’ve been using for testing stuff (ignore the weird framedrops my screen recorder was tweaking out)
working on getting Scenes implemented
I’ve been restructuring the and moving things to run actual game logic via “Systems”. I’ve temporarily been testing this in a messy way directly in the scene class, but I’m planning on implementing maybe some sort of basic scripting language that can be used for game logic in entities as a Component w. accompanying systems ofc, so game logic can be defined outside of engine source files and serialized into a scene’s registry from a given file rather than the things im messing around with now. serialization of scenes is what im planning to implement next once im happy with how scenes are working, but i need to plan ahead alot. So for now I’m still going to focus on making sure my Scene implementation is good enough before I focus on implementing serialization and scripting etc, and I have alot to think about regarding the design and architecture of this thing that seems to have evolved into a Game Engine :)
rather than using another custom file format i decided to just use json to serialize scenes which is coming along rather nicely …
running some tests.. messing around with funny map generation shapes too but i dont know how i feel about them
I’ve got loading in scenes working pretty well, but I still have work todo before I can save them properly, im pretty tired already since i spent all day chasing a bug regarding render sorting and ended up refactoring a ton of stuff that i probably didnt have too as i was searching for the issue, but atleast the codebase is somewhat cleaner
I’ve got saving scenes working fully now! ^-^, but an issue ive run into is a segmentation fault on switching scenes, I theorize that it’s due to me not cleaning up / reassigning things when I load in new meshes etc from the scene, thus leaving old pointers in the render queue which don’t exist anymore. This i will work on fixing next.. But for now I am quite happy that i have scenes loading and saving to json :)
Managed to fix the segfault.. Mesh::Upload was updating buffer data without binding its own VAO first, which polluted the global OpenGL state. When a new scene loaded, the driver tweaked out on the broken index bindings and crashed on the next draw call …
i’ve implemented instanced draw calls alongside regular draw calls in my renderer, which currently im using instancing for drawing the map, I also implemented culling for the map depending on viewport and some other small optimizations, I also spent some time on fixing and improving my “Systems” and some general cleanup
i’ve been playing with loading in entities and meshes.. ignore the weird fps drops and generally low fps (compared to normally), screenshots and recordings loves messing with performance for some reason
I’ve been focusing mostly on my scene serialization lately. First, I refactored the maps to remove the hardcoded TileTypes enum, which used to map 0 to grass and 1 to sand. Instead, I implemented a system where this is defined in the grid section of the scene’s json file. The “id” property is now a generic unsigned integer for the tile type, and the “texture” property references a specific asset loaded in the scene. I also added a “properties” section for the scene’s name and a “clear_color” array. This lets you dynamically change the window’s background color on the fly instead of always defaulting to a hardcoded black. Writing the new methods and sorting out the custom serialization logic took a bit of work, but it is working great now. also bumped the map file “version” to 2, even though the reading/writing of map files didn’t change at all, the usage of some bytes did kind of change (for the tiletype) so i felt it was fitting
I’m working on a simple map lighting system, which seems to be working alright. Also scene files now have background color information (which ends up getting wired into glClearColor), also implemented name field for entities because why not. I’m also messing around a bit with the UI since im not super experienced with ImGui but I like trying things out…
I’d like Entities to be scriptable in a future editor application / in general without having to edit c++ source files of the editor to implement new logic systems for one entity, so i’m planning on implementing a very basic scripting language, the way i plan on it working is that you attach a script to an entinty as a component, and it will hold the actual game logic in that script, im not great at explaining with words but what im doing now is starting on implementing lexical analysis for a simple interpreter just to test things out, while I have written small interpreters before, alot of this is still new to me so I am learning along the way. the idea is that its just a very basic scripting language to interact with entities and the current scene, with basic apis for interacting with the current scenes ECS registry,we will see how it goes :)
Working on trying to implement a scripting language for my game engine… i’ve got a simple parser working, it definitely went faster than i expected. Going back and reviewing an old parser i made in C# a while ago helped a lot in this :)
still working on parsing and implementing new nodes :)
The scripting language is now technically Turing complete, as i have added state environment (basically variables persist throughout the session), conditional branching via if / else statements basic repetition via while & for loops the screenshot below shows a fibonacci sequence & an example of the conditional branching w. looping . of course it’s not done yet though, i still have a lot of work ahead :)
the scripting language now has some more mathematical operators and functions !
I’m working down my todo-list for the scripting language (ObSL). Right now i’ve got arrays implemented! i also made a method to define functions from the c++ source so that I can access c++ stuff (like std::chrono functions that im using for testing right now from the test.obsl script), and whatever other functions i want to have accessible, this will be very useful later on as I to integrate the scripting language with the game engine, as now i have an easy way to call functions already defined in the engine source code from the scripting language by just calling interpreter.bind_native(args blah blah); and then I can call the function from the interpreted scripts.. very useful :D
added switch statements, foreach-loop, objects, modules (imports), and a standard library to the scripting language
Drafting a readme for the scripting language before I plan on the Engine bindings
I’ve got the scripting language integrating with the engine via a ScriptComponent on the player entity, seems to be working all good though I still have to implement the actual Engine library for everything… but I have simple scripts running on entities as components in the game engine, which went faster than I expected, so i’m happy with it :)
I’ve got a good basis for the Engine integration library for the ObSL Scripting Language. In the attached video, I’m changing the player’s size using a ping-pong function (?forgot the name…), fully through an ObSL script ( ScriptComponent ) attached to the “Player” entity. The language now has support for the following through the EngineLib : Entity Objects Find GetName SetName GetComponent Components Transform SetPosition SetRotation SetScale GetPosition GetRotation GetScale (uses ObSL arrays) Point Light SetColor (Vec3) SetIntensity SetRadius MovementComponent GetIsMoving SetIsMoving SetTimePerStep MapStateComponent GetHasSelection GetSelectedHex GetPathToHex DirectionalTextureComponent SetIndex GetIndex PlayerInputComponent is still w.i.p. Tag Components currently don’t have any methods since they are only used as tags. Planned I’m planning to keep expanding the EngineLib api with more methods, such as: Has(component) AddComponent RemoveComponent(name or ref) Destroy(EntityID) GetEntityID(entity object ref)
EngineLib Script Integration I fully replaced the previously hardcoded PlayerMovementSystem with an ObSL script implementation using new EngineLib bindings. The movement logic is now handled externally through scripting instead of being directly implemented in C++. New EngineLib Bindings entity management Added bindings for basic entity operations: CreateEntity Creates a new entity Destroy Removes an entity HasComponent Checks whether an entity has a specific component RemoveComponent Removes a component from an entity global functions get_dt Retrieves delta time CloseWindow Closes the glfw window Input System Added script access to input handling: Input_IsKeyDown Checks if a key is currently held Input_IsKeyPressed Checks for a key press event Input_IsMousePressed Checks if a mouse button is pressed Input_GetMouseWorldPos Gets the mouse position converted to world space Movement / Hex Grid Functions Added bindings for interacting with movement components: GetSelectedHex Gets the currently hovered hex tile SetPathToHex Sets a movement target path for an entity with a MovementComponent Camera Added camera manipulation support: Camera_GetPosition Gets the camera position Camera_SetPosition Sets the camera position Camera_Move Moves the camera Camera_PanScreenSpace Moves the camera relative to screen space Camera_GetZoom Gets the current camera zoom Hex Rendering Added bindings for controlling grid visuals: ClearSelectionOverlay Clears the hex selection overlay ClearPathTarget Clears the path target visual marker ClearPathTarget is currently named poorly. It only clears the grid overlay visualization, not the actual movement target!!! summary Removed the old hardcoded PlayerMovementSystem Migrated player movement logic into script format Added engine bindings required for script-driven gameplay Camera movement, input handling, and hex selection now work through scripts Even more gameplay code can now be modified without recompiling the engine :)
I’m using miniaudio to implement audio support in the game engine, with an AudioEngine class to abstract the audio functionality. I’ve also updated SceneProperties to include a new background_music property. This allows each scene to define a background music track (via filepath) that will automatically loop through the AudioEngine while that scene is active. It all seems to be currently working well, Next I’m starting to integrate audio functionality into EngineLib so that scripts can interact with the audio system. changes Added AudioEngine abstraction layer using miniaudio Added background_music support to SceneProperties (w. proper serialization/deserialization ofc) Implemented looping background music per scene
EngineLib I may have forgotten to mention this in my previous log, but I also implemented an Instantiate method in EngineLib. Instantiate takes an entity definition as a JSON file (ig a prefab) and spawns the entity into the current scene. I also added scene related functionality to EngineLib: LoadScene Loads a scene from a given path GetCurrentScenePath Returns the path of the currently loaded scene
more EngineLib work Implemented several improvements to the scripting and entity systems. changes prefab caching Added caching for prefabs to improve performance when repeatedly instantiating entities Entity Access in Scripts Added GetEntity , which returns the entity Object that the script is attached to. Added support for the this keyword in ObSL scripts. this is a wrapper around GetEntity() to provide direct access to the current entity custom components Added support for script-defined components: entity.AddCustomComponent entity.GetCustomComponent This allows scripts to attach and retrieve custom data/components without requiring engine side component definitions entity validation Updated all entity object calls (such as GetComponent ) to validate the entity before executing (in both native bindings & engine source code) Entity operations now check: registry.isValid(id) before accessing the entity. This prevents errors caused by accessing deleted entities during scenarios such as scene unloading/loading cleanup
Porting ECS systems to ObSL Fully ported the InteractionSystem to ObSL through EngineLib. Camera movement and player movement are now handled through dedicated ObSL scripts instead of being hardcoded ECS systems. This moves more gameplay logic into the scripting layer and makes systems easier to modify and iterate on :) Changes System Migration Ported InteractionSystem from ECS code to ObSL Basically Moved camera movement & player movement logic into ObSL scripts Interaction system is no longer hardcoded engine-side gameplay system New EngineLib Bindings Math / Hex Grid Math_WorldToHex Converts world coordinates into hex grid coordinates SetSelectedHex Updates the currently selected hex tile Camera Camera_SetZoom Sets the camera zoom level Window Window_GetHeight Gets the current window height Window_GetWidth Gets the current window width Input Input_IsKeyReleased Checks if a key was released Input_IsMouseDown Checks if a mouse button is currently held Input_IsMouseReleased Checks if a mouse button was released Input_GetMouseX Gets the mouse X position Input_GetMouseY Gets the mouse Y position Input_GetScrollX Gets horizontal scroll input Input_GetScrollY Gets vertical scroll input Please ignore the weird graphical artifacting in the attached video, my pc has been acting up recently :(
“project” file system prototype Started implementing support for engine project files instead of hardcoding a scene path like i was before for testing. The engine will now deserialize a project.json file containing configuration, includes: name Project name (unused for now) version Project version (also unused) start_scene Path to the scene the engine loads on startup Window configuration: width height title fullscreen while implementing this, I uncovered some unexpected behaviour related to fullscreen handling caused by how window sizing was previously managed. i spent time refactoring and fixing the window size logic to make fullscreen behaviour… work.. project loading is now starting to come together, less hardcoded stuff yippie (im planning on making an editor in the future so.. this is why)
Been mostly just fixing some window rendering stuff Moved away from hardcoded resolution / aspect ratio and made it handle itself on the fly also removed the padding bars i had before so rendering actually takes up full screen New native engine binding in EngineLib too: Window_SetFullscreen (takes a bool) I’m planning on starting to work on making the engine multithreaded soon…
im trying to make the renderer run on another thread… few issues… cant see (entity) meshes?, and closing the window seems to cause a freeze…. :))
kinda reverted changes from the last log and tried again to convert everything to be thread safe before actually trying to run on a seperate thread… things are going.. interestingly
I think i fixed most of the silly bugs from trying to make rendering thread safe, im still gonna double check some stuff and do some testing but moving rendering to its own render thread will be coming soon :))))
multithreading & rendering I think I got some form of multithreading working now. The renderer has been moved onto its own dedicated thread, separating rendering from the main engine thread :) Changes Rendering Thread Moved rendering execution to a separate thread (alot had to be refactored for this to work lol) Thread Safety i tried (imgui was a pain) Rendering Optimizations Added frustum culling to the renderer. big optimizeD? actual rendering (i.e gpu calls) is now seperated from the main thread :D …it looks like its working for now
refactoring for editor foundation Refactored rendering and culling systems and made broader architectural changes to decouple the game from the application layer. Rendering & Culling Refactored frustum culling logic to be lil more performant and generally cleaner Cleaned up and improved parts of the rendering pipeline since i had alot of old unused code lurking in them since i switched to a multithreaded architechture Application Architecture the engine is now structured around an ApplicationLayer system. The core Application class now runs a single active ApplicationLayer Each layer exposes: Init Update Render Shutdown Game class refactor The Game implementation has been converted into a derived ApplicationLayer Game logic is now fully driven through the layer system instead of hardcoded to the application class (the different executable mains decide now) Editor Layer added a new EditorLayer Intended for a future scene editor application. (right now all it does is render a given scene on the screen) CMake changes reworked the project to generate multiple executables: obliberry_engine core engine executable (ig runtime) obliberry_editor editor application layer changes: Engine and core systems (i.e ObSL, Renderer, etc) are now compiled as libraries Executables link against shared engine libraries instead of duplicating code Editor executable links against engine modules summary Game logic is now layer-based Engine and tools are separated Editor can proceed independently from the game runtime
Editor UI & Framebuffer Experiments i’ve started experimenting with the ImGui docking branch in the EditorLayer . (switched branch had some build errors blah blah blah but its all set up now) Implemented some placeholder editor UI to test out the docking stuff and get a feel for how the editor layout might end up being like changes editor layer placeholder UI using ImGui docking features testing editor panel layouts framebuffer implemented a framebuffer system for the editor viewport. the scene is currently rendering in the editorlayer via a frame buffer so it can fit in the little thingy (i forgot the name) while testing I noticed some resizing issues when running on my nvidia dGPU: the framebuffer resize works, but resizing the viewport can appear somewhat choppy? the framebuffer and docking setup seem to be working, so i guess this im close to actually start to build proper tooling :)
VFS & Editor layer implemented a basic VFS (Virtual File System) . all asset loading is now routed through the VFS instead of directly loading files. this is mainly preparation for adding proper project management later instead of relying on a hardcoded project.json in the project root i was testing with changes VFS added a basic VFS implementation routed asset loading through the VFS the idea is that the VFS will make it easier to manage project assets and not have everything depend on hardcoded paths. editor layer still experimenting a bit with the editor placeholder UI. added: (new EditorCamera derived class of Camera ) camera panning in the editor viewport camera zoom toggling top-down / isometric perspective with keybinds the top-down view should be useful later when I add actual map editing stuff most of the editor UI is still just placeholder right now, I’m mostly testing layouts and figuring out how I want the editor to feel and look ImGuizmo also added ImGuizmo to the project since I’m planning to start implementing proper editor stuff soon.. …and well… you need gizmos… I’ve reinvented the wheel enough already, so using a proper gizmo library seems like the better choice :) (also integrates very nicely with ImGui)
Editor Picking & Project Management because my EditorLayer uses a framebuffer, I can now utilize framebuffer color picking in the editor i updated the shaders to store an entity ID, so now I can click on entities directly in the editor scene view and it selects them. …and it’s pixel perfect :D changes editor layer added framebuffer based entity picking clicking entities in the scene view selects them!!!! selection is based on the exact pixel under the mouse (i mean to implement gizmos i first need to know what the hell my mouse is on) project management also started laying the groundwork for actual project management. now that I have some sort of VFS implemented, I’m working on a way to properly manage Projects instead of relying on the current setup. still figuring out the exact structure, but ive been working on setting up the Project class
Namespace Refactor & Project Management Work Dependencies finally caused me to run into a namespace conflict after being lazy and unorganized… instead of being sane and just renaming one class.. I decided to refactor the entire project to use proper namespaces everywhere.. changes namespaces Refactored the entire codebase into proper namespaces project management / editor backend I don’t really have much visually to show this update since I’ve mostly been working on backend stuff. Working on: project management scene management VFS improvements editor saving/loading I’m using nativefiledialog-extended to work on proper file dialogs for saving and loading from the editor. Also been doing a lot of testing around project creation and loading. alot of this is in the hope i can get this working multi-platform and not just on linux (though i have yet to try and compile on another os) Things are working… for now… so progress :D
Editor & Scene Management been working on the editor mostly. changes ECS implemented generational ID masks for the ECS. this should prevents issues with stale entity references since IDs can now properly track generations instead of just relying on raw IDs. (i encountered this issue when testing multiple scenes in one project) scene manager fully implemented the SceneManager so it can actually be used by the editor & game layer. this allows the editor to properly load/save/validate/find and generally handle scenes through a unified API (goes for gamelayer aswell but it only really loads them) bug fixing spent a lot of time fixing various issues around: project folder management scene management loading / saving behaviour asset loading (cache was causing some problems on loading scenes but its all fixed now :D) mostly backend work but things are becoming a lot more stable and the editor foundation is starting to come together….
ive been mostly messing around with getting the ObSL language to be thread-safe and refactoring some things, so I don’t have much to show but my end goal is to be able to get scripts to run concurrently and outside of the main thread
Script multithreading (and concurrency) scripts now run on other thread(s) :D this took a fair bit of cleanup, but it’s working. changes script workers moved script execution onto worker thread(s) worked on script worker concurrency dynamically clamp the number of active workers based on how many callbacks are actually running, so idle threads aren’t just spinning doing nothing garbage collection did some work on the GC as well. introduced external root tracking fixed a few issues around GC roots while getting multithreaded script execution working cleanup spent some time cleaning up a bunch of backend stuff while getting all of this working. build system updated CMake so all executables, scripts, and (project) templates are output to a single build/bin directory instead of being messy. multithreading yay :)
ObSL Scripting Library Moved the scripting language into its own repository :) It’s now included in the engine as a library using git submodules and public headers instead of living directly in the engine source code Makes the project structure a lot cleaner .. for both projects ( ObSL can now be found at https://github.com/torkelicious/ObSL )
actually working on the editor I’m finally getting around to actually implementing the editor ..it still looks pretty similar (well mostly the same) but most of the UI before was just placeholder. changes editor implemented a Project Settings window implemented a Scene Properties window made the component widgets actually do something now load textures assign scripts change material colors change meshes change shaders etc…. added an Add Component button added Remove buttons to components it works.. so thats good :D
editor Gizmos! :DD this took a lot longer than I’d like to admit… but it’s finally working. changes gizmos got all gizmos working.. but had issues with rotation and scale at first figured out the issues with rotation/scaling ended up patching ImGuizmo at first to get things working, but after digging through the code I eventually figured out how to do it properly with the normal library translation, rotation, and scale gizmos all work now :)))))) honestly I learnt quite a bit just from messing around with the ImGuizmo internals.. but it was painful editor added a few more UI improvements as well. i.e billboard sprites now explicitly mention that rotation doesn’t do anything, instead of letting you wonder why nothing happens gizmos are one of those things I’ve been waiting on implementing.. but im finally happy to have them
Project Packaging been working on a packaging format for projects. the goal is basically to package an entire project into a single container while preprocessing assets that make sense to preprocess. Also makes shipping a game made in the engine in the future alot easier / cleaner, and portable. changes packaging implemented the start of a proper project packaging system. currently it: parses ObSL scripts ahead of time and stores serialized ASTs instead of source code (basically very similar to some sort of a very very simple AOT compiler) converts project, scene and prefab JSON files into MessagePack stores media and other binary assets directly in the package optionally compresses package entries with LZ4 the idea is that the engine has less work to do at runtime since scripts don’t need parsing and JSON doesn’t need parsing either. and a single “package” file is alot cleaner in general for a finished game “build” package format also implemented the actual container format itself. different asset types are stored as different entry types (scripts, binary JSON, media, shaders, etc.), so the loader knows exactly how each asset should be handled. tools added standalone packaging tools as well for packing and unpacking projects, mostly for testing. still a work in progress, but the whole packaging pipeline is starting to come together.
Project Packaging is Working been spending a lot of time working on project packaging, and it’s finally working now. the engine can now load projects directly from .obpak files, and I’ve got basic tooling to create them as well. the plan is to integrate the tooling i have now with the editor to “build” an obpak archive (i think its called an archive?) changes packaging implemented the full packaging/loading pipeline yippie :D currently the packer: pre-generates ASTs for ObSL scripts converts project, scene(s) and prefab(s) JSON into MessagePack bundles everything into a single .obpak container compresses the package with LZ4 assets like textures, audio and shaders just get copied into the package without any conversion runtime the engine can now load packaged projects directly instead of relying on loose project files. all of this goes through the VFS, so from the engine’s point of view it doesn’t really matter whether assets are coming from a folder or from an .obpak (i.e it can still load loose project files of course) tooling added command-line tools for packing and unpacking projects, i originally made it for testing but it’s actually pretty nice to work with so im probably keeping it. still probably things to polish, but it’s pretty satisfying seeing the engine load an entire packaged project properly pls ignore the lag in the video, i promise its not as terrible as it looks, its just that recording is pretty buggy for me
Project Exporting been working on making projects exportable from the editor it’s now able to export a project to the selected folder, package all the assets into an .obpak , and then copy over the runtime so the exported project is runnable changes project exporting added export to the editor choose an output folder for the exported project packages the project into an .obpak copies the runtime into the export folder renames the runtime to match the project name (just 2 files for full project!, executable and .obpak) the whole process is pretty much one click now instead of manually packaging everything together. file dialogs refactored my entire filedialog implementation cuz it was kinda broken packaging did some more work on the packaging pipeline while implementing exporting and put it in the editor ui im pretty happy that its all working and i can actually export stuff, and run it feels cool :)
editor rework & map editing groundwork been working on the editor again this update was mostly about cleaning up the editor architecture so I can actually keep adding features without everything turning into spaghetti. I also finally started laying the groundwork for proper map editing. changes editor reworked the editor state system. instead of instantly swapping between states, transitions are now deferred until a safe point during the update loop. this makes switching between Edit, Play, Map Edit, and the Hub a lot cleaner, and the editor now remembers which editing mode you were in before hitting Play. (i’ll admit… i was getting a bunch of weird, seemingly unexplainable crashes before eventually realizing my mistake was instantly switching states while things were still being updated/rendered…) also moved more UI responsibility into the individual states instead of having EditorLayer decide how everything should be drawn. map editor started putting together the map editor. currently i have: map hover and tile selection working placeholder Paint / Erase / Select tools the beginnings of a tile palette system a placeholder tile editor panel the actual editing logic isn’t implemented yet, but the foundations are there now :) asset picker ripped out the old “open a native file dialog for every asset field” flow. instead, the editor now lets you pick existing textures, meshes, materials and shaders directly from the ResourceManager , which is a lot nicer to work with and also avoids accidentally importing duplicate assets. (the old workflow would happily create a brand new object every time you imported something… which was fine for testing, but definitely wasn’t something i wanted to keep) rendering fixed a few editor rendering issues while i was at it. materials with invalid shaders now fall back to the default shader instead of silently disappearing fixed some edge cases with framebuffer entity picking currently unused, but functional shader hot reloading tests misc smoothed out editor camera movement and zoom added a few helper utilities for the map editor reorganized the editor UI code a bit doesn’t look massively different in screenshots, but makes future work alot easier/cleaner map painting is next ?..
map editor preveiw ig kinda didnt have much time to do anything today but im working on the tile editor
Map Editing, Brushes, and a 4(?) hour ImGui Bug The map editor is finally coming together It’s still a bit… rough but it does feel nice to be able to paint a map in the editor I did, however, spend an embarrassing amount of time trying to figure out why my click and drag “painting” wasn’t working… well.. ImGui was eating my inputs because it thought I was trying to drag the Scene View window around.. yeah.. changes map editor actually got the map editing tools working for real this time. the paint and erase tools actually place and remove tiles now instead of just being placeholder buttons added a brush radius slider, so you can paint in bigger hex rings added a preview outline that renders around your cursor so you can see before clicking toggling “is walkable” on a tile now properly syncs with the grid pathfinding editor ui spent some time making the tile palette and material editing.. work.. video explains better ngl im not good at describing ui stuff math laid some groundwork in the hex math system ( Lerp , CubeRound , and GetHexLine ) this is mostly for some future evil plans… still a WIP…
Logging Cleanup replaced all the random std::cout / std::cerr calls scattered throughout the project with an actual logging system logging implemented a proper logging system. replaced std::cout / std::cerr throughout the engine added support for different log levels optional logging to a log file centralized all engine logging into one place thread safe !!!! nothing particularly flashy or fancy, but its cleaner, easier to work with, and generally just nice i probably should’ve done this a long time ago :)
editor polish still nothing super flashy.., mostly a bunch of small things changes window titles the editor now updates its window title based on what youre working on. it’ll now include things like the current project and scene, or map project loading cleaned up project loading a bit. the editor now properly syncs the loaded project configuration into the engine context instead of relying on stale data also added menu in the map editor that lets you save and load map files (create new is just placeholder for now) UI added a small helper for rendering framebuffer textures in ImGui without needing to remember to flip the UVs every time. and made the tile Editor use it also forgot to mention in the last log that i cleaned up the “project browser” ui a bit logging fixed up some more logging :)
Undo/Redo! :) been working on some editor QoL stuff again… the biggest addition this time is a proper undo/redo system. it’s still very early and pretty barebones, but having the foundations in place is nice changes editor commands implemented the beginnings of a proper command system for the editor instead of modifying things directly, editor actions now go through commands, which means they can be undone and redone currently supports: entity transforms movement rotation scaling adding components removing components (with the exception of ScriptComponent for now.. that’ll get its own custom command due to the way it works) also keeps a command history, and the usual shortcuts are hooked up now: Ctrl + Z : Undo Ctrl + Y : Redo its still pretty basic, but it works and feels nice to use. input for this, I added proper key-combination support to the input manager. things like: Ctrl + S Ctrl + Z Ctrl + Y can now be handled properly instead of manually checking modifier keys everywhere logging did a bit more cleanup to the logging system as well. the logger now goes through a proper interface instead of everything depending directly on one concrete implementation, which should make it a bit easier to swap things around later if I ever want to. mostly backend work again… but undo/redo is fire
Undo/Redo …again! been working on the editor again the undo/redo system now covers a lot more than just gizmo transforms. but there’s still a few things left (entity creation/deletion mainly). changes undo/redo expanded the command system to cover most editor actions. currently supports: entity transforms adding/removing components adding/removing scripts editing project settings editing scene properties also fixed the undo/redo shortcuts so they only trigger once per key press instead of repeatedly firing while the keys are held… which is probably how they should’ve worked from the start map editor continued working on map editing. painting and erasing now properly integrate with the command system. also, an entire brush stroke is treated as a single undo step instead of undoing one tile at a time. also cleaned up a couple of edge cases while doing this, like preserving existing tile data and avoiding unnecessary commands when nothing actually changed. misc did a bit of cleanup around the editor while wiring everything together. centralized a few bits of duplicated UI logic cleaned up window title updates continued refactoring the command system the undo system is still unfinished, but it covers most of the important stuff and feels nice.. also.. still gotta fix some ui window-size stuff soon too but .. thats for later
Performance & Zero Copy Assets been spending some time under the hood… this one’s almost entirely backend. no new features, mostly went through the render thread, asset pipeline, & a handful of ECS loops to squeeze out more performance. it was incredibly rage inducing at times.. but seeing the profiler diff against baseline.. i am satisfied.. almost at peace.. but was considering becoming a farmer & never touching a computer again.. mostly because i thought i’d messed up more than i did.. but.. im happy now. changes threading & ecs i’ve reinvented the wheel enough already… but had to redo how tasks are dispatched. ThreadPool used to take a std::function , which heap allocates if you capture more than a couple pointers. scripts dispatch through this every frame, so it added up. swapped it for a custom Task type a 56-byte inline buffer, no heap allocs swapped the pending-task counter to a lock free atomic decrement instead of a mutex on every completion… rendering been cleaning up how the main thread interacts with the render thread. the main & render threads used to awkwardly poll eachothers framebuffers. now theres a m_ReadyFrames deque main pushes a frame index, render pops it. much cleaner :) ImGui draw data is now reused in-place instead of allocating & freeing a fresh clone every frame (ive put off fixing that hack for a while so its nice to finally come around to it). instanced draws no longer store a vector<mat4> per draw call, transforms get appended into one giant staging buffer per frame now. added SubmitPersistent for things that already own a long-lived buffer (like the map tile renderer) to skip the copy entirely. swapped a bunch of unordered_map s for flat vectors in the texture/VAO/uniform caches for a handful of items, linear scan beats hashing. batched rendering also caches the last bound texture & color uniform so b2b batches sharing a texture dont rebind needlessly. added a zero-size window safeguard for Wayland so it stops wrecking the renderer when the window briefly reports 0x0 during resize (also turned vsync back on, weird syscall spam otherwise) assets & packaging added VFS::ReadVirtualView to hand out string_view s directly into memory instead of owned strings for packaged builds, ContainerReader now mmap s the .obpak file directly, uncompressed stuff (textures, uncompiled maps) gets handed right to the parser without a copy. also now move only, with a destructor that unmaps memory instead of holding a copied vector of chars scripting the script hot-reloader was doing a stat() syscall on every script file every frame . oops. now polls every 300 frames & caches resolved paths.. thought i already debounced this.. guess not.. the on_update & on_destroy work buckets used to be freshly allocated vectors every frame… now static , so they just clear & reuse capacity editor & ui finally ripped out the old in game debug UI ( GameUI.cpp ), it had fallen out of sync with the ECS anyway (used it for debug visuals while implementing the first version of the ecs.. then forgot about it) the editors inspector does all of this better now, so replaced it with a minimal FPS counter audio & map audio engine now sets an explicit period size (2048 frames) via miniaudio to cut IPC roundtrips to the audio daemon.. (this one was annoying to figure out.. god bless strace & gdb) the map’s visible transforms buffer is now double buffered, rebuilds write to the back buffer while the render thread reads the front, no race conditions. also swapped typeMats from an unordered_map to a flat vector nothing user facing changed this time, but frame pacing feels noticeably smoother (somewhat suprised), & the packaged build starts noticeably faster i know it could probably be a lot better, but im still a bit of a noob at C++, so this is one hell of a learning project
GPU Lighting & Graphics Settings been doing a bit of rendering work again… mostly trying to optimize things. the biggest change is that I completely rewrote the lighting system previously all the point light calculations were happening on the CPU, and after doing some profiling (and spending way too long staring at compiler generated assembly annotations) it became pretty obvious that this was one of the bigger performance bottlenecks (well THE biggest excluding driver overhead) lighting now runs entirely on the GPU through shaders instead changes lighting rewrote the lighting system. lighting is now shader-based and runs on the GPU removed the old CPU-side lighting calculations moved engine shaders (like the base shader and lighting shader) into built-in InternalShaders (hardcoded string literals, it might seem messy but i prefer it like that) the internal shader change mostly exists because they’re pretty fundamental to the renderer. if they were treated like normal project assets and someone accidentally deleted them… well… suddenly nothing renders (unless they had setup their own shaders, which is fully supported!) and lighting completely falls over, also i prefer it to loading them from the filesystem anyways overall I’m pretty happy with how the new lighting system turned out graphics settings also started working on configurable graphics settings instead of baking them into the project, the engine now loads graphics settings from a separate JSON file. this doesn’t get packed into the .obpak , so users can tweak their graphics settings after exporting a game currently supports: resolution fullscreen MSAA (toggle + sample count) target FPS VSync it’s weirdly fun actually being back in OpenGL code again instead of just working with engine abstractions sometimes it’s nice to get back into the weeds.. even if its.. painfull :D
the OpenGL State Machine Strikes Back… I spent the entire day trapped in hell: debugging a corrupted OpenGL state… it may not show up as tracked hours.. since most of it was just staring at various forms of text.. but it was painful. problem so since i turned the lightmap to run on gpu .. well… Whenever I transitioned from the editor ( MapEditState ) into Play mode, the map would turn into like a bunch of weird diamonds, and the corruption would persist indefinitely until I remounted the current project. because it only happened on state transition, i spent hours chasing ghosts in my state management code and scene cleanup routines… (in the end though i did make some changes to the cleanup routines, but between states rather than scenes.. so i guess i was halfway there?) the culprit It was the lighting pass… took me forever to figure it out, but i had the genius and definitely NOT a very late and obvious idea i shouldve had hours ago , to see if the issue happened when i turned off the lighting system. so i put some early returns in my lighting system functions and.. it didnt corrupt.. inside LightingSystem::Update() , the renderer was modifying global OpenGL state changing depth functions, blending modes, and texture bindings, but not restoring them to their original defaults properly When the engine swapped states, the next frame inherited this dirty, half configured state, causing the whole thing to become a mess. the fix I went through the lighting system and made sure the state changes are wrapped and properly restored through the render thread.. LightingSystem.h : Full GL state save/restore around the light pass. now explicitly backing up and restoring the FBO, program, VAO, blend state, draw buffers, clear color, viewport, and active texture. MapEditState.cpp : OnExit() now properly nulls out m_MapComp and m_CurrentGrid . OnEnter() and will refetch them from the current registry so it isnt holding onto outdated references. EditorLayer.cpp : Added a call to renderer->Clean() after state transfers to clear out stale VAO and mesh caches.(bc its multithreaded things go kinda weird but.. it works now) glad thats over with :D Also heres a fun peek of what ObSL can do with EngineLib, yes, it can make your entire map look like hell..! i am totally not going insane
Editor QoL, Graphics Configs & Prefabs new devlog… mostly been focusing on editor ui and qol changes this time around. kinda tired of hardcoded settings for the graphics settings, so i finally built a proper interface for it, plus some prefab management stuff in the editor changes graphics settings i built a dedicated graphics configurator window in the window, for the current project ( GraphicsConfigEditor ). it hooks directly into the UndoManager using the command pattern ( GraphicsConfigUpdateCommand ) serializes everything out to graphics.json . added QuerySupportedSampleCounts which asks the active GL context ( before it gets handed to the render thread ) what MSAA sample counts it supports. the editor now dynamically generates the dropdown and snaps to a valid sample count (i.e 1, 2, 4, 8, 16). prefab management the editor now supports prefab management that i implemented earlier .. instead of directly writing it in the scene json file you can spawn entities directly into the scene from prefab json files you can revert a prefab, which wipes any local overrides and resets the entity back to whatever is saved in the file you can break a prefab, severing the link to the json file and turning it into a normal, standalone entity in the registry ui & editor cleanup spent some time making the editor less annoying.. in general the editor layout stops resetting itself , it now checks if imgui.ini exists on startup, and if it does, it skips rebuilding the default dockspace ripped the hardcoded hub drawing code out of the EditorLayer and made it its own state for the editor state machine refactored the config windows ( ProjectConfigEditor , SceneConfigEditor , and the new GraphicsConfigEditor ) to inherit from a base ConfigEditor class so its cleaner and easier to maintain.. fixed the script widget since the ui was kinda messy
Particles! :) Ive started working on a particle system. i have got the core pieces in place and it seems to be working nicely so far…. changes particles implemented the foundations of the particle system currently has: ParticleEmitterComponent ParticleSystem ParticlePool emitters currently support: configurable particle limits and emission rates randomized lifetimes and velocities “gravity” size over lifetime color over lifetime world space simulation materials obviously so far it’s all behaving pretty well… EngineLib next up is getting particles exposed through the EngineLib API so scripts can spawn and control emitter components we will see how it goes…
mostly just spent some time going through some old code.. nothing really important, but i’ve also replaced the placeholder assets.. with my own placeholder assets that i drew in GIMP, considering i probably do not have the rights at all to distribute the previous assets.. :)
More Particle work… been spending some time on the particle system… changes particles expanded the particle system quite a bit. currently supports: randomized size ranges randomized rotation configurable emitter shapes (support quad, circle, and soft circle) alpha and additive blending configurable render order (still kinda broken but im working on it) per-particle color over lifetime particle presets that can be saved and loaded (as JSON) also added an editor preview mode, so particles can be previewed while editing instead of only showing up in play mode renderer had to do a bit of renderer work to support all of this particles now use their own dedicated shader added support for per-instance colors during instanced rendering added an overlay render pass for effects that should render on top of the scene cleanup also did a some more project cleanup, splitting up my Utils header into multiple files.. nothing special though misc particle emitters can now be saved as reusable presets (some which will be shipped as defaults ofc) as suggested by @sol4r_on_hackclub cleaned up a few asset importing edge cases fixed a couple of packaging issues too I’m pretty happy with how the particle system is coming along :D
UI Experiments since working on the particle system, I feel like it’s in a pretty good place for the current scope. I don’t really know what else I want to add to it right now, so I decided to finally start on something that’s been sitting in the back of my mind for a long time… a proper UI system. changes particles mostly just spent some time testing and polishing the particle system to make sure everything behaves properly I’m pretty happy with where it’s at for now UI started prototyping a custom UI system it’s very early, but I’ve got the basic rendering pipeline up and running currently working on: a UIElement system a dedicated UI renderer text rendering font loading using FreeType right now it’s mostly just enough to prove everything works, but it’s the foundation for the runtime UI system ive wanted for a long time the goal is for games made in the editor to be able to have their own UI, with everything exposed through EngineLib so scripts can create and interact with UI elements as well honestly, for now.. I was expecting it to go alot worse.. FreeType isn’t as bad as it seems once you get it working with GL The screenshot below dosent show much, but you can see the rendering of Text and rects, it also supports textured rects (which is what the text is currently using to render from a texture atlas)
game UI Progress been continuing work on the UI system. changes UI made some good progress UI system currently have: font importing working texture support for UI elements basic text rendering a simple editor view panel for UI it’s still very much WIP editor right now it’s pretty basic, but it’s enough to start experimenting with how creating and editing UI might actually work inside the editor there’s still a lot left to do before I’d call it usable, but im making progress.. getting text working is painfull, and still unfinished.. but im workin on it…
more ui ive been kinda sick so i aint really had the motivation to do a lot but ive been working more on the UI system im kinda tired so i dont really feel like writing more for now -.-
Scripted UI, Map Workflow, & a Bunch of Bug Fixes alot of bug hunting… changes scripting & ui scripts can now actually interact with the UI system. added bindings for things like: creating UI buttons, text, rects, and images finding UI elements destroying UI elements these return wrapped objects with basic getters/setters for position, visibility, and button state map workflow spent a fair bit of time cleaning up the map editor flow. maps no longer get a fake default path on creation switching to the Map Editor tab now auto-creates a map (empty) if there isn’t one yet mapFilePath now stays project dir relative instead of randomly becoming absolute tile materials are now shared properly instead of silently duplicating state rendering & lifetime bugs i’ve been doing alot of testing recently, so i found alot of bugs… this was probably the biggest pain point. renderer submissions now keep materials and meshes alive for the frame instead of trusting the caller replaced the old Shader::Default() singleton hack with a real fallback shader (internalshaders base) fixed the lightmap quad so it keeps its own VAO and clears correctly when there are no lights fixed a Texture move bug that was double-deleting GL handles sometimes editor polish also cleaned up a bunch of editor behavior while I was in there. Ctrl+S now behaves correctly depending on whether editing a scene or a map scene loading now rebinds editor panels properly save/load dialogs now append file extensions automatically added more inline warnings in the inspector and panels (i.e if an entity has no material it will tell you it wont render) and ive probably forgotten something else … in summary ive just been testing out some UI/UX changed and hunting down bugs untill I feel it is ready to maybe start prearing some sort of demo :)
Entity Hierarchy & Scripting Integration finally caved & added actual parent/child relationships to entities changes entity hierarchy entities can now have a parent & children via a new RelationshipComponent . Registry::Reparent() handles moving an entity under a new parent, with cycle & self-parenting protection so you cant do anything silly like parenting an entity to its own descendant. TransformComponent now has a worldTransform alongside the existing local one, a new HierarchySystem systems that care about actual position (i.e AISystem ) read worldTransform now instead of assuming local == world. destroying an entity recursively destroys its children too & unlinks it from its parent’s child list scene serialization now saves & restores the hierarchy editor the Registry panel is a proper collapsible tree now instead of a flat list drag & drop reparenting, plus a right click menu for “Create Child”, “Detach”, & “Set Parent”. scripting pulled all the entity/component script bindings out into their own EngineLibRegistry.cpp module, they were kind of scattered around before & this makes them way easier to find & extend. scripts can now walk the hierarchy too (get children, etc), same module. added SetFont / GetFont bindings so scripts can assign or query a button’s font, small thing but script generated buttons wont have visible text without it :) misc cleanup small modernization stuff while i was in these files anyway: dropped redundant ternary parens, swapped a bunch of auto x = ...; if (x) into if-with-initializer, dropped some unnecessary global qualifiers, const-correctness fixes on UISystem::Update & UIRenderer::Flush . (yes i know the gizmos are offset and buggy, i kind of forgot to update the gizmo code after changing transforms :p )
working in a windows vm trying to get it to compile on windows… it is obviously going great… -.-
Windows Build The Windows build seems to be working.. I don’t have proper OpenGL passthrough in my VM… However, the Windows executable compiles perfectly in the VM and is running fine under Wine. so I consider that a win for now…
Bugs bugs bugs… I’ve been working on a demo project to both test the engine properly (looking for bugs and all), and also have something to actually show off made in my engine… this is the project you’ve been seeing in the last couple logs btw :) of course… since I’ve been using the editor for actual “work”, I have found a bunch of bugs. the biggest one being the entity ID situation… or.. disaster? changes the entity ID mess in the past, out of laziness… entity ID 0 was being used as both a real, valid entity handle and the “no entity / invalid” value depending on where you looked. which worked fine… mostly because of pure luck. the annoying part was that after working on this for a while I wasn’t even sure anymore if I was using 0 , -1 , or something else for invalid entities.. yep.. so I finally cleaned it up there is now a proper INVALID_ENTITY_ID constant, and entity index 0 is reserved for invalid entities. real entities now start from 1 . went through and replaced a bunch of random == 0 / != 0 checks across ECS, serialization, prefab handling, editor panels, and scripting bindings. project templates added support for multiple project templates. new project creation now scans the Templates/ folder instead of everything being hardcoded to “Default”. currently has: DemoProject Empty the demo project is mostly there to show off the newer UI/scripting stuff (the same demo as mentioned before), while Empty is just a completely blank scene. hierarchy & transforms fixed entity and UI reparenting. previously moving something to a new parent could randomly change its position because it was just applying the new local transform now reparenting keeps the world transform, so dragging things around in the hierarchy behaves properly UI & text rendering fixed a bunch of UI text issues. text now centers vertically using actual glyph metrics instead of a random offset I was “pretty sure” was correct it was not, in fact, correct button text now scales to fit inside the button fonts can now load directly from VFS memory instead of requiring a real filesystem path the VFS font loading one was something I completely forgot about when testing outside packaged projects… oops. packaging implemented .pakignore instead of a hardcoded ignore list, the packer now supports gitignore-style patterns in a .pakignore file and properly skips ignored folders/files also fixed a few smaller packaging issues while testing exported projects. misc a bunch of smaller things: map save/load dialogs now default to the project maps folder fixed scene switching bindings in editor play mode fixed a lightmap redraw bug font importer now only accepts .ttf / .otf added a small README with build instructions since im planning on publishing the repo soon (and writing all the docs… scary..) nothing super flashy this time.. but important
the repo is public been working on gettin things ready for that, mostly writing some docs and getting GitHub Actions set up so I can build and release cross-platform builds also did some small code cleanup / fixes while I was going through everything. changes github actions i setup a workflow to compile the project on linux, windows, and mac, and then publish a release (mac is untested but compiles). im real happy though that its actually compiling on all “major” platforms though docs finally wrote some actual documentation… there are a few files in the docs/ folder now and a proper README still a WIP obviously, but at least there’s something there… misc implemented create new map button i forgot about completely repo there is already a build published as a test of the github actions thingy, try it out if you want :D https://github.com/torkelicious/obliberry
Lighting Fixes been fixing a few small things with the lighting system mainly fixed lights using the wrong entity transform I forgot to account for entity parenting when I implemented that… also added a per-scene toggle for enabling/disabling the lighting system
scripts can schedule stuff for later Added SetTimeout to the scripting API changes SetTimeout SetTimeout(fn, ms) calls fn() after ms milliseconds. simple to call from obsl timers live in a plain std::vector<Timer> in a new Platform::Time namespace, polled once a frame from Scene::Update no threads, no async bs or whatever :) the callback itself is a SmallTask , which falls back to a heap allocation if the closure is too big to fit inline fine for this since timeouts aren’t really a hot path timeout callback fires from an arbitrary point in Update , so it gets its own ScriptCommandBuffer set up on the worker just for the duration of the call, then flushed right after also gc.add_root / remove_root the function around the callback so it doesn’t get collected while it’s sitting in the timer list waiting to fire Documented it in the api reference alongside the other Time functions also tiny UI tweak in the tile editor: it now warns “no tile types defined, no map will be visible!” instead of just “no tile types defined” was seeing people get confused about why a new map looked empty after trying to paint also small updates to docs in general and stuff but nothing super interesting
…the default imgui theme first off, huge thanks for all the incredibly kind reviews on my last ship !!! most of this work was also inspired by someone pointing out that i was still using the default imgui theme. fairs… so i spent some time making the editor actually customizable and messing around with having some kinda-nice defaults :) editor ui & theming live theme editor: built a proper window to tweak colors, spacing, padding, rounding, etc. in real-time. semantic palettes: added a semantic color system so you can build out a theme from a small set of base colors, rather than manually adjusting every single internal imgui color enum (though you can still override individual colors if you need to). serialization: themes dump straight out to a theme.json sitting right next to the editor executable. undo/redo: the theme adjustments go through the undo/redo system! help menu: put in a placeholder help menu. turns out literally nobody likes reading docs, so i guess i gotta start explaining how to use the engine from inside the engine… not implemented yet though editor groundwork did a bit of backend cleanup as well. added an EditorContext for editor-specific state, separate from the runtime EngineContext (currently just used for theme stuff) started working on editor font support with a FontSet for things like Body, Bold, Monospace, and Icons, not implemented though the font stuff is mostly groundwork for now, but the theming system is actually working and makes the editor feel nice :D
fighting with fonts font-management rabbit hole in the theme editor… still wip changes font management in the theme editor the theme editor now has a proper Fonts section import .ttf / .otf fonts directly from the editor assign fonts to roles like Body, Bold, Monospace, Icons, etc. merge fonts together so icon fonts can be stacked on top of regular fonts rename, delete, and change the size of fonts fontsets are now saved as part of the theme, so imported fonts persist across restarts the role system isn’t fully wired up yet currently Body is used as the default editor font and Monospace is used for the console. im still working on the whole font management system here and its very unfinished and kinda untested.. very WIP!!! hot-reloading the annoying part was getting font changes to work while the renderer is running on another thread. rebuilding the ImGui font atlas in the middle of a frame was… not ideal, and eventually resulted in an assertion. now font changes mark the atlas as dirty, and the editor waits for the render thread to finish before rebuilding the atlas at a safe point. not the prettiest solution, but it seems to be working.. kind of dpi & freetype also experimented with DPI handling for fonts and wrapped FreeType into a single shared instance instead of creating separate instances everywhere. still figuring out exactly how I want the DPI/font sizing stuff to behave, but it’s getting there. bug fixes while doing all of this I also ended up fixing a few unrelated things: fixed an old GUI rendering bug where text could stop rendering or become garbled because of a pointer race thanks to @staneko for helping test/report that one since I couldn’t reproduce it properly on my system fixed a weird compilation issue related to namespace escaping bumped the vendored ImGui version for some dynamic font-related fixes a few other small UI changes and cleanup still working on this, and the font management side definitely isn’t finished yet… most of this time was just spent trying to get it to half-work so.. yep..
mostly ui stuff (and fighting windows wide chars) yay pretty ui editor ui theming ui blah blah idk what to call it kinda cleaned up some stuff into proper members so the ui state doesn’t get all weird and persistent when you close the theme window discarding changes: actually works now. closing the window used to revert colors but keep your staged font changes, which was dumb (didnt really cause issues since changes werent applied anyways unless you saved beforehand but still.) font role indicators: added a little visual thingamabob where the font list now shows a star next to whatever font is actively set as the body font (also font name is now rendered in its proper font) path tooltips: added a hover tooltip on the font list items that shows the full file path of the font also some placeholder stuff in the code for searching the customization menu i might be implementing soon windows compat std::filesystem::path everything: went through and switched out the raw std::string usage for font paths inside FontConfig , replacing them with std::filesystem::path . this was purely because my windows ci build was failing. i was passing raw char strings around and doing weird string conversions, which completely blows up on windows because it expects wide chars for paths and i didnt consider that when i was being lazy and doing silly conversions and stuff because i just wanted to pass ez pz to a c library. freetype & serialization cleanup: updated all the internal freetype helper functions ( GetFontName , etc.) and the json theme serializer to play nice with the new paths instead of passing raw char pointers kinda mostly just making it a lil more prettier
scrips can change things on the map yippie changes scripting scripts can now modify maps through EngineLib added: Map_SetHexWalkable Map_SetTileType yes, i made sure changes to walkability properly update the map’s pathfinding data instead of leaving it with stale information… sanitizers added sanitizer builds…. got ASan + UBSan working through CMake, along with presets for testing… it has helped already :) timers SetTimeout : if a script created a timer and then the scene changed before it fired, the callback could still run against the old scene state. timers now use generations, so changing/reloading a scene invalidates any timers belonging to the previous scene. editor fixed another map editor bug where discarding unsaved changes didn’t actually discard them… it would clear the dirty state but leave the edited map in memory… i knew about this bug and fix for a while, but i kept on forgetting about it… but its finally done -.- also added an Edit button to script entries in the project browser so scripts can be opened directly (launches default app it detects for the file via ur os)
more docs… and some bug fixes some small bugs that have been annoying me for a while finally got fixed… and I wrote more docs than I probably needed to…? or maybe too litte.. who knows changes entity selection actually clears now fixed an issue where clicking empty space in the viewport wouldn’t reliably clear the current selection. the pick-result handling was structured wrong, so the “nothing was selected” case basically never got handled properly. also explicitly clear the entity ID framebuffer attachment every frame so it doesn’t leave stale IDs around from previous frames. i knew this was broken, and figured the fix would be pretty simple for a while.. but i just kinda forgot to fix it.. oops…. fixed parent transforms during scene loading fixed a bug with parented entities getting their transforms messed up when loading a scene. the issue was that scene loading was using the same Reparent() logic as interactive editor reparenting. that function intentionally recalculates the local transform to preserve world position, which is what you don’t want when loading a transform that’s already been serialized correctly… was eepy when writing that i guess added Registry::SetParentDirect() for scene loading, which just sets up the parent/child relationship without touching the transforms. interactive reparenting still uses the old behaviour, so dragging entities around in the hierarchy still preserves their world position misc cleaned out some old commented-out code docs, docs, docs also wrote proper editor documentation section covering things like: editor concepts usage scenes prefabs components and some even have screenshots.. yes i know.. fancy the help button in the editor links to some of these pages now. i guess “figure it out yourself” wasn’t really an acceptable documentation strategy anymore…. i mean i had some docs.. but they weren’t that good for editor-usage and more technical stuff.. so yep.. also made the README headers slightly more obvious because people were still asking where the download link was ….
persistent Entities been working on persistent entities via a tag.. the same idea as Unity’s DontDestroyOnLoad, except you mark entities as persistent in the editor instead of doing it through scripts (scripts can do it too though). everything keeps breaking or half-working help.
persistent entities… again kinda scrapped most of the first attempt at persistent entities and decided to redo it instead of setting persistence in the editor, I went with something closer to Unity’s DontDestroyOnLoad , where scripts explicitly mark entities as persistent. makes more sense and is a lot less weird around scene changes. (i.e this.SetPersistent(true); ) changes scripting added: entity.SetPersistent(true) entity.IsPersistent() persistence persistent entities are tagged before the scene unloads, serialized normally, then re-injected and reparented when the new scene loads. the persistence tag itself isn’t serialized, so it won’t accidentally end up saved into the scene dedup added some basic deduplication so persistent entities don’t get duplicated if the new scene already contains an entity with the same name. its name based for now… not very great, but good enough
mostly windows fixes changes SetLightmap took a raw Lightmap* and just held onto it for the frame swapped it for a small value type the renderer copies out immediately instead… this sometimes caused crashes but seemingly only on windows?.. just my luck.. LightingSystem had the same issue, was writing back into ECS memory through a raw pointer from a GL init task. now creates the framebuffer/vao up front and just calls Invalidate() on them SubmitPersistent was also holding a raw pointer into caller-owned memory, now copies into the staging buffer like everything else does RenderBatch used to just silently not draw anything if a batch went over MAX_INSTANCES . now it chunks into multiple draw calls instead of dropping the whole thing InvalidateGLCache wasn’t resetting the dynamic instance buffers, only the VAO cache, so they could point at dead GL objects after a context loss actual windows fixes opening files tries to open via already existing file associationg, otherwise falls back to the “open with” dialog if there’s no default handler also the paths get normalized to backslashes now asset import for scripts and so just does a file copy now instead of going through the old import path
code cleanup & optimization currently going through a bunch of older code and fixing / optimizing things. prolly way too much to actually write about, and most of it is just boring small changes, bug fixes, and a lil cleanup big pr i guess soon idk
hardening + performance stuff so this is kinda the continuation of the last log(s) where i was going through some old code kinda boooring but its important performance mainly been trying to get rid of unnecessary allocations and full scans stuff optimized ECS entity/component lookups and removal reworked hierarchy propagation to avoid unnecessary registry scans reduced allocations in scripting and UI command buffers cached script wrappers so they can be reused instead of constantly recreated improved UI lookups with a proper name index made particle/lightmap updates only rebuild when actually needed cached project browser directory scans capped the editor console and added clipping for large logs also did a bunch of smaller optimizations around scripting task scheduling and resource loading things thread safety went through a lot of the cross-thread stuff as well made ResourceManager access properly synchronized experimenting with the audio locking guarded FreeType access made window size and pending scene state thread-safe fixed some render thread / GL context handling basically trying to make all the multithreading stuff a little less “it seems to work” type stuff though alot of this probably wasnt actually causing any issues YET , it would be very hard to debug in the future if I didn’t try to fix it now so yeahh correctness fixed several out-of-bounds issues in VFS/package parsing made VFS path resolution properly stay inside the VFS root (oops…) fixed hierarchy reparenting allowing cycles fixed a few dangling references in hierarchy code fixed some component pool and packaged asset lifetime issues undo history now clears when loading a scene cleaned up a few map editor edge cases fixed text centering fixed the triangle mesh made engine context non copyable also updated the demo template while I was at it (since a recent movementcomponent update it wasnt behaving properly due to the addition of a new field) there are other small things i probably didn’t mention here too but it’s mostly all a collection of a bunch of small things im still testing this though and looking into a few other small things…..
ui editing gizmos!!!1 you can finally drag UI elements around in the editor (instead of typing position/scale values into the inspector) changes ui gizmo added a proper UI gizmo with resize handles and dragging support and that corners resize both axes, edges resize one axis dragging the body moves the element resizing from the top/left keeps the opposite edge anchored added a small drag deadzone so clicking doesn’t accidentally create an undo step UI transforms now go through TransformUIElementCommand , so they’re undo/redo -able also renamed the existing entity gizmo code and naming gets confusing otherwise… coordinate stuff the gizmo needed mouse coordinates relative to the viewport rather than the whole window, so added some better viewport coordinate handling for that… maybe a lil late ui editing mode buttons won’t randomly enter their hover/pressed states just because your mouse is sitting over them now in the editor beccause its a lil annoying when editing small optimization also fixed UIText and UIButton recalculating their text layout every frame when nothing changes feels nice :)
custom meshes im trynna make it so you can draw your own custom 2d meshes in the editor its still a lil buggy but it’s mostly working, serializes and all that :) very fun…
experimenting with post processing working on a lil post-processing pipeline still very wip but im mostly just playing around with various shaders and stuff changes the pipeline PostProcessor is a simple “ping-pong” chain: scene renders to an off-screen FrameBuffer , then each enabled effect runs full-screen-triangle shaders bouncing between two ping-pong buffers, in whatever order they were added I’m working on a system via variants to get uniforms to be easily serializable and such, it seems to be working but I havent actually wired it into anything just yet. editor and runtime a lil bigger change than expected. i implemented a unified fbo for both editor/runtime rather than the weird jank i was doing before editor: scene renders into m_SceneFrameBuffer , post effects run, then it gets sent into the ImGui viewport image like before runtime: same scene framebuffer, same post effects, then PresentToScreen goes to the default framebuffer instead just some general cleanup for that ig crt shader i wrote a lil silly CRT looking shader to test it out as shown below, it’s cool but kind of useless, but very fun to play with!!!
more post processing!!!! this took way longer than i thought it would but uh whateveer. i think i still gotta fix some small things but its working pretty alright :D editor ui added a proper ui for post processing :) threw in an import button and stuff so you can load in fragment shaders as post proc fx you can edit the uniforms directly in the ui now stuff glsl uniform parser: wrote a very simple basic glsl uniforms parser. this is what makes the ui editing possible, but it also helps a ton with serialization so i don’t have to hardcode everything serialization: implemented saving and loading for post processing effects and also made post processing effects bound per-scene instead of being a global engine thing yay post processing funny effects shaders aaaaaaaah
shader preprocessing been working on a small shader preprocessor thing while also finishing up the final bits of post-processing right now the preprocessor is pretty simple, mostly just adding support for: #include #pragma once I haven’t actually needed it yet, I just kinda had the urge to make it… so now I have a shader preprocessor …? its pretty extendable and all though so usefull to have ig :)
too many post proc fx? followup to the post processing / shader experiments… changes shader includes shaders can #include "rand.glsl" etc and it resolves properly. it checks the project VFS first, then falls back to the engine’s own shader helper directory if it isn’t found there. engine shader helpers also get packaged into exported games under engine/shaders/ , so includes keep working at runtime. added a few helper include files: rand.glsl / auto_rand.glsl - seeded hash-based random, with auto_rand reseeding per frame from u_Time color.glsl - HSV conversion, lift/gamma/gain, contrast, saturation, and three-way color wheels commons.glsl - engine-provided uniform declarations so you don’t have to redeclare u_Resolution , etc. in every shader for engine-provided uniforms the helpers use #ifndef / #define guards, so auto_rand.glsl can include rand.glsl without causing double declarations if the effect shader or another include declare the same uniforms or includes. more built-in effects added a few more built-in post processing effects: ColorGrading - exposure, contrast + pivot, saturation, lift/gamma/gain, and shadow/midtone/highlight color wheels using color.glsl FilmGrain - chunky per-cell grain with u_GrainSize controlling the cell size Vingette - yes i know its mispelled. uniforms with Wheel in the name now get the wheel-style color picker instead of the regular color picker, since a normal RGB slider cleaned up effect registration used to have two separate lists, one for raw shader registration and one for the default effect chain. this meant adding an effect involved touching two different structs in two different places. merged those into one PPRegistration list with an inDefaultChain flag shader debug name added an actual m_DebugName field and made error messages / the material inspector fall back to it when there isn’t a real file path. docs wrote up some post-processing editor docs ….. i hate writing docs.. also .shader is now a valid extension for importing custom effect shaders, alongside .frag / .glsl trimmed down the miniaudio CMake config by disabling its examples, tests, and tools, along with Vorbis/Opus/FLAC support since i’m not using any of that….
sllight hub overhaul redid the project hub screen and added recent projects tracking, since up to now opening anything meant going through a file dialog every single time… changes recent projects get tracked in a PROJECTHIST file (next to the editor executable) …dead simple format, one filepath per line, each pointing at a project’s .json . capped at 5 entries, oldest just get removed off the list. hub screen is basically remade two docked panels now instead of one. left panel is the same buttons as before (new project, open project, etc), right panel is the new recent-projects list, up to 5 entries since that’s all the history file holds. also removed some unused dead code i found… QoL type stuff i guess :D
copy paste (kinda) also too much time fighting windows builds tried to get entity copy/paste working and it’s… janky. also ended up wasting a stupid amount of time just getting windows builds to actually build again because i lowk forgot again about how it wont let me pass paths as strings implictly as it does on every other damn os… changes copy/paste (wip, kinda broken) started on ctrl+c/ctrl+v for entities & ui in the editor it kinda works but is really janky and does not feel good to use, also tried implementing it in the context menu but its not workiong at all -.- other the windows fixes…. some resharper reccomendation inspection type shi but lowk its been a while since i logged soo yep
collision stuff been working on a collider system. still pretty early and not hooked into EngineLib yet, but most of the basic backend + editor stuff is there planning to expose it to scripts in a similar way to how Unity handles collision callbacks / triggers, but that’s for later……. collision added a new ColliderComponent with: box and circle colliders offsets size / radius trigger support collision system currently handles: box vs box circle vs circle box vs circle collision normals + penetration depth ‘trigger’ collisions also added a CollisionWorld that keeps track of collisions between frames and generates Enter , Stay , and Exit events. mostly groundwork for when I hook this into EngineLib… collider editing colliders are editable from the editor theres a collider inspector widget for changing the shape, offset, size/radius, and whether it’s a trigger, plus a viewport gizmo for directly moving and resizing them collider edits also go through the undo system, because every new editor feature needs to become an undo/redo problem eventually……… :D other editor fixes entity copy/paste now copies the whole child hierarchy instead of only the selected entity pasted hierarchies keep their parent relationships added copy/paste to the entity and UI context menus fixed stale entity / UI selections after the thing being selected gets deleted fixed single-key shortcuts like V , T , R , etc. firing while Ctrl/Alt/Shift was held keyboard camera movement no longer fights with Ctrl/Alt shortcuts a few smaller include / cleanup things mostly collision work though. next step is probably getting the collision events into EngineLib and experimentiung w. it its still a bit jank of course but it works i guess :DDDDD
collision system round 2 i guess ended up pretty much reworking most of the collision system….. the first version was still basically 2D, with separate box vs box / circle vs circle / box vs circle functions. that worked as a starting point, but it was gonna get annoying … so… it is 3D now. colliders ColliderComponent now supports: boxes spheres cylinders 3D offsets / dimensions triggers entity-space or billboard orientation billboard colliders follow the same camera-facing basis as billboard rendering, which means billboard sprites can still have colliders that actually line up with how they appear on screen. GJK got rid of all the individual boxVBox , boxVCircle , etc. collision functions and replaced them with support-mapped collision detection using GJK. each collider shape just provides a support point now, the intersection test doesn’t care what combination of shapes it’s checking. i dont fully understand the math completely yet.. but it kinda makes sense :D still no collision response / physics yet. this is just detection + events, i think ill prolly get it into EngineLib.. soon… events the CollisionWorld still tracks collisions between frames and generates: Enter Stay Exit trigger state is kept with the collision too. this is for EngineLib integration. scripts should be able to react to collisions / triggers like unity I have not gotten around to this yet though… collider gizmos also had to redo the collider gizmos now that colliders aren’t just flat 2D shapes anymore… its a lil janky but it works.. billboard cleanup while doing the billboard collider stuff I also cleaned up billboard rendering a bit billboards used to have their world transform temporarily modified by SpriteBillboardSystem before rendering. now the billboard matrix is generated when the entity is submitted to the renderer instead, so the actual ECS transform can stay as the real entity transform there’s now one shared billboard matrix helper used by both rendering and collision, which is considerably less cursed. um scripting integration next i guess.. if something dosent explode ! :D
collision callbacks scripts can do collision things now….!!! script collision callbacks ObSL scripts can now define collision hooks: on_collision_enter(other) on_collision_stay(other) on_collision_exit(other) on_trigger_enter(other) on_trigger_stay(other) on_trigger_exit(other) the other argument is a normal EngineLib entity wrapper, scripts can do stuff like check its name, components, etc. collision events get collected by the CollisionWorld , then dispatched to the relevant script instances afterwards. they’re also run through the existing script command buffer ofc 2D collider shapes are back too… added explicit 2D shapes alongside the 3D ones: Rectangle Circle so the full set is now: Box Sphere Cylinder Rectangle Circle rectangle / circle are flat shapes. which is nicer for sprites and other 2d things movement actually respects colliders hex movement now checks whether an entity can actually occupy its next tile before moving there. added a CanOccupy() collision query which builds the entity’s collider at the target position, it blocks the move if something solid is in the way. triggers don’t block movement. collision robustness stuff also did a bunch of smaller fixes around the collision added a shared collision tolerance instead of random 1e-6 s in different places AABB overlap now uses that tolerance too improved collider validation depending on the actual shape fixed gizmo world-to-local conversion to use the proper inverse transform more finite-value / clipping checks in the collider gizmo GJK Indeterminate results preserve the previous collision state instead of automatically counting as a collision p.s, heres a lil photo of my attempt at making syntax highlighting for obsl using textmate grammar… :D
spritesheets / animation finally … spritesheet support spritesheets added a new SpriteSheetComponent with: texture rows / columns optional row + column spacing start frame animation length FPS looping playing / paused state current frame basically the renderer can now render only a specific UV region of a texture animation also added a small sprite animation system that advances frames based on FPS and handles looping / stopping at the end etc etc animations also update while in the editor… might be annoying for some, might be less annoying for others.. but thats how i like it editor stuff you can pick the texture, set rows / columns and spacing, choose the start frame + animation length, change FPS, toggle looping / playback, scrub the current frame, restart the animation, etc. etc EngineLib scripts can inspect stuff like the current frame, frame count, FPS, rows / columns and texture, and can also change the texture/grid/animation, set frames, play, pause, restart and stop animations. Collider also has a proper EngineLib component wrapper instead of collision only being accessible through the callback hooks. right now that’s just getting / setting whether it’s a trigger, but it’s there. also added both Collider and SpriteSheet to the normal GetComponent , AddComponent , RemoveComponent , HasComponent , etc. obviously. some cleanup did a bit of registry / EngineLib locking cleanup while I was in there too, mostly around entity wrappers being created while the registry lock is already held. also fixed one very stupid collision callback typo where on_collision_stay was looking up the wrong hook… oops….. im also starting on documenting this stuff…. yep.. pain… spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly
btw pls star on girhub animation clips / refactoring spritesheets …kinda refactoring the whole spritesheet animation thing already the first version worked, but having FPS / looping / frame ranges etc directly on the SpriteSheetComponent was gonna get pretty limiting cuz what if I wanted multiple animations for one sprite. it might sound stupid but for me it’s always worked to get a prototype working, then refactor/reimplement it. thats even what i did for this entire project early on, before it deleoped into a full on engine :D so now the spritesheet is mostly just the sheet + currently displayed frame, and animation playback is seperate animation clips working on proper animation sets + clips. an animation asset can have one spritesheet and multiple named clips, with each clip containing its own list of frames :D each frame also has its own duration now instead of the whole animation just sharing one FPS value, so stuff like holding a frame longer or doing irregular timing is possible without clips can loop independently too animator component added a separate SpriteAnimatorComponent which handles the actual playback state: animation asset initial clip autoplay current clip current frame inside that clip elapsed time playing state the normal SpriteSheetComponent is way simpler now… it just says what sheet + frame should currently be rendered (the animator updates that for it) animation assets animation sets are assets now under assets/animations/ they serialize separately and contain the spritesheet setup plus all the clips / frames / durations they are loaded through the normal asset system and registered in the ResourceManager scene serialization now keeps the animator config like the selected animation asset, initial clip, and autoplay editor stuff the sprite sheet inspector got reworked for the current thing but whole UI stuff isnt finished once an animator is attached it owns the sheet/frame instead of both systems trying to edit the same thing. I still need a proper UI for actually making / editing animation assets and clips though. i shall work on this next!!! (right now the backend is pretty much all ive done but its taken a lil longer than i thought… who wouldve thought adding cips cleanly would take this whole aah refactor) scripting EngineLib updates too SpriteAnimator in scripts can now do: Play("walk") Restart("walk") Pause() Resume() Stop() IsPlaying() GetClip() it is now based on named clips so i guess not anything flashy to show but… its stuff :)
animation editor continued working on the animation system and made the editor UI…. animation editor there’s now a Sprite Animation Editor you can: choose the spritesheet texture edit rows / columns / spacing create, rename and delete clips toggle looping per clip edit individual frame indices + durations move frames up / down duplicate / remove frames expand / collapse the frame list also added range generation so adding a normal animation doesn’t make you manually enter every frame one by one….. theres also an Apply FPS to All Frames button ! preview added a live preview for the selected clip. you can play, pause and restart it woaw it shows the current clip frame and spritesheet index while it runs…. project browser integration animation assets are properly integrated into the project browser now too there’s an Animations section where you can create, import, edit and delete animation assets creating a new one lets you choose its path then opens it in the animation editor. the animation asset workflow is mostly usable from inside the editor :D erm even more enginelib changes for the new systen that i still have to document… ( Play() Restart() etc) some cleanup working on… some mostly const-correctness, explicit casts, ranges, include cleanup and some other small stuff etc etc.. god bless resharper c++ also cleaned up some EngineLib entity wrapper code around registry locking so it can create wrappers safely when the registry mutex is already held spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly
I will not elaborate
asset system refactor + some editor stuff been wanting to redo how assets work for a while now. until now scenes carried the asset definitions with them, and loading scenes would keep throwing resources into the global resource manager. worked fine enough , but it also meant resources could kinda just accumulate forever.. i seperated them now!! assets.json projects now have a project-wide assets.json catalog. textures, shaders, meshes, materials, fonts, animation sets, etc. live there instead of getting serialized into every single scene. scenes / prefabs / UI / animations etc. just store resource IDs and the definitions live in one place besides making scene files considerably less bloated, this means saving a scene no longer serializes whatever random collection of resources happens to currently exist in the resource manager lazy asset loading having one project-wide catalog does not mean loading the entire project into memory. scene loading now scans for the resources that scene actually references and loads those from the catalog this includes stuff referenced by: entities maps / tile types UI post processing spritesheets / animators dependencies get resolved too so if something needs a material, its shader + texture get pulled in first. animation sets pull in their spritesheet texture, etc. etc. now the the resource manager should only contain what is actually being used asset lifetime stuff added SceneAssetScope for keeping track of what assets a scene has acquired. assets are retained while something needs them and can actually be unloaded once the last scope using them disappears so changing scenes repeatedly should no longer turn the resource manager into yummy more objects :O forever…. persistent entities reacquire the resources they need when moving between scenes too. there’s also handling for catalog entries being replaced / deleted while their old resource is still loaded. those can be marked stale and discarded safely once the old scene lets go of them instead of leaving weird zombie resources around. engine assets still stay around like normal. editor asset workflow the editor now goes through the asset catalog too. creating / importing / replacing / deleting things like: textures shaders meshes materials fonts animation sets updates assets.json instead of depending on scene serialization to preserve them…. supported editor selections / script setters can also acquire catalog assets on demand and attach them to the current scene’s asset scope old projects old projects obviously still have all their assets embedded inside their scene files, so I added an ob_asset_migrator tool. it can scan the old scenes and merge all of those definitions into a project-level assets.json . there’s: dry-run validation conflict detection optional removal of the old scene assets sections backups before it starts rewriting stuff uses backups because i dont trust myself enough .. might vaporize projects who knows… docs docs docs also updated a stupid amount of documentation for the new asset model … since of course.. there’s now a full assets.json format page covering the different asset types, dependencies, lazy loading, asset scopes, editor behavior and migration. updated the scene / prefab / animation / post-processing docs too since all of those previously described assets as being stored directly in scenes. also cleaned up the main README + docs index a bit and updated the feature list because quite a lot of it was outdated at this point…. theme presets also did some work on editor themes. split the built-in theme definitions out and added some interesting presets: Obliberry Dark ImGui Classic Dark Obliberry Light ew imagine using light themes… High Contrast Dark Haxxorman Green editable and all… tldr: resourcemanager is now longer an infintly growing landfill…
save system i wanted this to be pretty generic instead of the engine having some hardcoded idea of what a “player save” or whatever is, so the actual save data is ba sically just key/value storage that scripts can use for whatever they want!!! save data there’s now a SaveGameManager which keeps one active save in memory. save values can currently be: booleans numbers strings the file format is versioned and also stores a display name + created / updated timestamps. the actual save data itself doesn’t really care what the values mean. it is any key value pair that persists. there’s also locking around the active save since scripts can be running across multiple workers….. project UUIDs projects also have their own UUID now. it’s generated when the project is created or when a project that does not already have one is opened right now it’s mainly used to give each project its own save-data directory without name collisions but im sure its good to have outside that!!! save files the basic save file operations too create a new save write the current active save load a save delete a save list existing saves start a fresh unsaved “game” save filenames are generated from timestamps. the human-readable name stays inside the file, display names don’t need to also be valid / unique filenames. save_list() also gives creation + update timestamps, and saves are sorted by most recently updated. writes are atomic too, so it writes through a temporary file before replacing the real save instead of directly nuking the existing one and hoping for the best per-project save directories save data is stored outside the project itself in the normal OS application data home each project gets its own directory based on its UUID <data home>/obliberry/<project uuid>/saves/ projects with the same name don’t fight over the same saves.. (i have several projects just called “UntitledProject” lol) this is LocalAppData on Windows, Application Support on macOS, and XDG_DATA_HOME / ~/.local/share on Linux. both the editor and runtime configure the save manager when the project is loaded, and it gets reset again when the editor closes the project ! ObSL ObSL savedata enginelib intergration: basic data stuff: save_set(key, value) save_get(key) save_has(key) save_remove(key) save_clear() save_new() save file management: save_create(name) save_write() save_load(filename) save_delete(filename) save_list() save_list() returns an array with the filename, display name, creation time and last update time some cleanup also pulled the atomic file writing stuff into a shared OS file utility, so assets.json can use the same code instead of having its own implementation. bunch of formatting stuff too i still have to document this and do some more testingf but yeahhh
uuids, collision layers, save settings, and other stuff bit of a mixed bag this time. mostly cleaning up some systems that were already there and filling in stuff I’d need… entity UUIDs entities have proper UUIDs now, separate from their normal runtime entity IDs. the regular generational ID still does all the normal ECS stuff, while the UUID is a stable identity that gets serialized with the entity. this mostly fixes how persistent entities work between scenes. previously I was deduplicating persistent entities by name , which was obviously not ideal since names aren’t actually identities. persistent entities + their children now keep their UUIDs when moving between scenes, and if the destination already has an entity with the same UUID it gets replaced by the carried-over one. two things can have the exact same name now without persistence randomly deciding they’re the same thing. normal prefab instances / newly created entities still get new UUIDs. collision layers colliders now have proper layers + masks. there are 32 collision layers, and every collider has: a layer a 32-bit mask of layers it accepts both colliders have to accept each other’s layer for the pair to interact. the same filtering is used for normal overlap events and movement blocking, so there isn’t a separate set of collision rules depending on which system happens to be asking. added editor controls for this too, including the layer selector, all 32 mask toggles, and select all / deselect all buttons because clicking 32 checkboxes individually sounds incredibly fun. scripts can also read / change the layer and mask now. collision-aware script movement also added Transform.TryMoveTo(x, y, z) to ObSL. unlike SetPosition , this checks whether the entity can actually occupy the destination before moving it. the normal hex movement system uses the same helper now too, so script-controlled collision-aware movement and normal movement go through the same path. direct SetPosition is still basically teleporting, which is intentional. also fixed on_collision_stay actually looking up the collision stay callback instead of the trigger stay callback. whoops. more save settings did some more work around the save system from the last update. saving can now be enabled / disabled per project, and projects can choose where save files go: Data Home , the normal OS application-data location Portable , relative to the executable both still use the project UUID underneath so different projects don’t start sharing save files because somebody named both of them game . these are editable from Project Settings now. also added a confirmation dialog when regenerating the project UUID since doing that changes which save directory the project looks at. the old saves aren’t deleted, the project just gets a new identity and stops finding them automatically. graphics config stuff changed packaged builds so graphics.json can live beside the executable and override the version inside the package. (i.e if someone decides to unignore the graphics config and package it) couple random fixes particle emitters now keep their actual live particle count, so GetAliveCount() in ObSL finally returns the real value instead of the completely useless placeholder it had before. fixed a prefab revert issue where the code was reading the prefab path from the component after destroying the entity. very intelligent. also made theme font loading a bit less fragile. missing / broken font files get logged and skipped instead of potentially taking the whole theme load down with them, plus some parsing cleanup. and updated another mountain of docs to match all the collision, persistence, save, prefab, post-processing and export changes.
unit tests (& some fixes) uhhhh started adding actual unit tests… i was kinda putting it off but i gotta have it… set up GoogleTest + CTest and started covering some stuff ECS registry / generational IDs entity UUIDs entity serialization hierarchy / parenting collision events + movement blocking save games maps bugs bugs bugs… and unsurprisingly, writing tests immediately started exposing some smaller issues. fixed stale entity handles being able to mess with components belonging to a recycled entity slot, and cleaned up some hierarchy transform / rotation handling that wasn’t preserving transforms correctly in certain parenting cases. also tightened up a couple math helpers while testing them. im still gonna write even more tests.. its very needed at this point and will prolly help me find some more bugs i missed before…
more tests (more bugs) kept going with the unit tests the test suite now covers most of the important stuff, including: ECS / entity IDs / UUIDs serialization + hierarchies collision geometry, events and movement maps animation saves ObSL + some EngineLib bindings assets / asset lifetime VFS + packaged projects configuration editor undo commands also added a couple integration tests for audio and rendering (OpenGL tests are optional) finding things unsurprisingly this found some actual problems too. stale entity handles can no longer remove / access components from an entity that reused the same slot, and editor undo commands are a bit safer around entities or components disappearing. also fixed some hierarchy rotation decomposition weirdness, cleaned up VFS / package mounting state so old package data can’t leak into the next mount, and added a few other small null / cleanup checks around scenes and rendering resources.
export dependencies + prefab asset loading redid how exporting figures out what needs to go into the package previously editor export was basically much closer to just packing the project directory. now it builds a dependency manifest first figuring out what to export export starts from the project + scenes and follows the things they reference: catalog assets used by entities, maps, UI and post processing map files attached ObSL scripts script using imports scenes loaded from scripts prefabs instantiated from scripts music / sound files material textures + shaders animation sheets shader #include s referenced scenes and prefabs get scanned too, dependencies keep chaining from there. it then generates a new filtered assets.json specifically for the package instead of sticking the entire project catalog in there. the actual project’s catalog is untouched. script analysis added a ScriptAssetAnalyzer which walks the ObSL AST without actually running anything. literal stuff can be narrowed down properly, including things like: PlayMusic("assets/audio/music.ogg", 1.0) or even constant string concatenation… asset setters like SetTexture / SetFont get tracked too. if a texture or font ID is dynamic, export keeps that entire asset category. if a runtime file path for stuff like LoadScene , Instantiate , PlayMusic or PlaySound2D can’t be figured out, it falls back to keeping the eligible project files + full asset catalog. unknown / indirect calls are done the same too so simple projects get smaller exports, while weird dynamic scripting should still work… .pakignore still applies, and required files being missing or ignored is now an export error prefab assets also fixed prefabs properly interacting with the lazy asset system. instantiating a prefab now scans its components, acquires whatever catalog assets it needs, resolves their dependencies, and retains them in the scene before creating the entity. so a prefab can use an asset that wasn’t already referenced by the scene and it should just work. scene asset scopes got changed a bit for this too. instead of accumulating a new scope every time something acquires assets, they’re merged into one scene scope and duplicate asset references are ignored. also made prefab revert a little safer so the old entity isn’t destroyed unless the replacement prefab actually instantiated successfully. packaging / ci things editor packaging is stricter in general now. script dependency validation can fail the export, missing dependencies stop it, and PackageCurrentProject reports failure so the rest of the export doesn’t continue pretending everything is fine. shader includes are followed during dependency collection too, while the engine shader helpers still get bundled for runtime includes. also cleaned up CI a decent bit… also some more tests too for the packaging and script analysis lowk sorry for just posting an image of the logs idk how else to show it since it’s mostly backend / file stuff 😭
undo stuff + render lifetime fixes undo / redo the undo system relied way too much on runtime entity IDs and direct pointers into components. that works until an entity gets deleted, an ECS slot gets recycled, or a dense component pool moves stuff around… entity commands now store the entity UUID and resolve the current runtime entity when they execute / undo instead. this now applies to transforms, renaming, adding / removing components, script changes, component field edits and map painting. so older commands can still find the right entity even if it was deleted and later restored with a completely different runtime ID. deleting things is actually undoable now finally added proper undo for deleting entities. !!!!!! deleting an entity snapshots the whole subtree first, including components, UUIDs, names, hierarchy + sibling order, scripts, custom data and asset references. undo rebuilds the tree, reloads required assets, restores the UUIDs and puts everything back where it was. this also means edits from before the deletion still work afterwards, since those commands just resolve the restored entity by UUID. paste uses the same snapshot system now too, so undo / redo keeps the same pasted entity identities instead of creating unrelated ones every time. there are checks for conflicting UUIDs, missing parents, invalid hierarchies, missing assets etc. failed restores shouldn’t leave half-created entities behind. failed commands also no longer get added to undo history or wipe an existing redo chain. custom ObSL data custom script data needed special handling too. arrays / objects can share references or even be cyclic, so just copying ObSL::Value s wasn’t enough. there’s now a snapshot format that captures the object graph and rebuilds it through the interpreter + GC when an entity is restored. CustomDataComponent also roots stored ObSL values properly so GC-managed objects stay alive. runtime functions aren’t snapshotable though, so deletion just fails instead of restoring garbage. render thread lifetime stuff also did a pretty big pass over renderer resource lifetime, mostly because scene switching could unload resources while an already submitted frame was still using them. (this started because someone mightve pointed out a lil crash for me…) render commands now pin the meshes, materials, shaders and textures they need until that frame is done. same idea for UI textures and the editor viewport framebuffer. OpenGL objects also don’t call glDelete* from whichever thread destroys the C++ object anymore. textures, shaders, buffers, VAOs and framebuffers queue deletion for the render thread, while it actually owns the GL context. less bugs yay frame state + shutdown renderer state that can change while the render thread is behind is captured per frame now too, including clear color, post-processing and UI resolution / projection state. shutdown is also more deliberate now: worker threads stop first, background font loads finish, scripts stop, scenes/resources are cleared, renderer/UI resources shut down, then the remaining GL delete queue is processed while a context still exists. font loading uses tracked jthread s now too instead of detached threads. small things exporting now reports success / failure back to the editor and shows a little result popup instead of silently relying on the console. also added tests around delete / restore, UUID reuse, hierarchy restoration, script components, map edits, pasting, command failures and repeated undo / redo without leaking entities or asset references. so. .. . less explosions hopefully sorry if wording is weird.. character limit..
uhhh changes dont nuke scene on failed load scene deserialization moved out of Scene::OnEnter into SceneManager::LoadScene , and now runs before the old scene gets torn down. if the new one fails, you stay in the old scene ( LoadSceneByPath returns a bool now) loading is stricter. missing map files, bad/out-of-range/cyclic parent values and broken UI sections fail the load instead of logging an error and limping on persistent entity migration happens before the swap too, so a failed asset acquire can’t leave you half in the new scene the editor’s LoadScene used to clear the current project before trying to load. now undo history and selection only get cleared once the load actually worked saving: map write failures now propagate instead of reporting success, and files get closed before the error check destroying entities DestroyEntity was recursive, now it’s iterative with a visited set. deep hierarchies, cycles and duplicate child entries no longer kaboom the stack or double delete, and children go first (wow that sounds dark) Reparent and SetParentDirect go through CanSetParent , which rejects cycles and stale parents, even if the existing hierarchy is already cyclic script DestroyEntity / entity.Destroy() now use RequestDestroy to tag the entity and its whole subtree instead of deleting immediately, so on_destroy runs before deletion. scene exit drains the destroy queue too, including entities tagged by exit hooks the script wrapper cache evicts an entity when it’s destroyed a dumb one…: the hot-reload cleanup list had on_exit in it twice and no on_destroy , so on_destroy GC roots never got released … the script system was holding raw ScriptComponent* across initialization, which dangles if a script spawns enough entities to grow the pool. it looks components up by entity ID now script runtime reinitialization after a scene change uses the VFS path and reruns setup, so using imports keep working from the mounted project ui undo UI elements have UUIDs now, and undo commands resolve them by UUID instead of holding raw pointers. removing an element captures the whole subtree plus its sibling position, so undo restores the hierarchy and order. renaming also updates the name index live. smaller fixes collision broadphase is a “spatial hash grid” now instead of checking every pair lightmap rebakes when ambient changes, and handles maps with no tiles atomic file writes use unique temp names so concurrent writers don’t trip over each other project changes wait for background asset loads to finish timeout timers are mutex-protected, and callbacks can schedule more timers without deadlocking SmallTask over-aligned captures fall back to the heap VFS::Resolve("..") had UB from a std::mismatch that wasn’t bounded on the second range… PlayMusic stops, swaps and starts under the lock now instead of racing!!! tests wrote a pile of tests alongside all this: atomic writes, wrapper cache, hierarchy safety, map serialization, save concurrency, scene loading failures, script lifecycle, script modules, SmallTask and timeouts. expanded to the editor command, save game and VFS tests. so EVEN LESS explosions !!! Woo!
map edit kinda overhauled changes map edit stuff the brush size is now 1 to 8 instead of 1 to 5. size 1 is one hex, size 2 is 7, size 3 is 19, etc. Ctrl +scroll also changes the size added Rect and Circle shapes alongside the brush. they work with Paint, Erase and Select. Rect uses opposite corners, Circle goes from a center out to the hex you release on. both apply on release paint previews are green, erase previews are red, and selection previews are yellow. selected tiles get a blue overlay added tool hotkeys: B for Paint, E for Erase and Q for Select Esc cancels a drag. Rect and Circle do nothing if cancelled, while a brush stroke gets reverted instead of leaving half the changes behind loading a map now prompts before discarding a dirty map, and successfully creating or loading a map clears the old undo history selecting and editing multiple tiles Select now supports click and drag, Shift +drag to add to the selection and Ctrl +drag to remove from it the toolbar shows the selection count and has Clear and Delete buttons. Delete removes all selected tiles in one undo step the Tile Editor can edit the type and walkability of the whole selection at once. when selected tiles differ, the controls show mixed values etc. material editing only appears when every selected tile shares a type. Override Current Type changes the material for every tile using that type, while Save as New Type assigns a matching type to the selection without changing every other tile using the old type brush strokes, Rect/Circle fills, deletes and bulk type or walkability changes are each grouped into one undo step. changing a type’s material itself is still not undoable…. the console…. logging now has a sink system, so the same formatted log messages can go to different outputs the editor now has separate Logs and ObSL panels. engine/application logs go to Logs now, and script stdout goes to ObSL the panels have Clear and Copy buttons and keep the latest 2000 lines. the UI sink buffers incoming logs under a mutex before the editor consumes them closing the editor closing the window now goes through a callback, so unsaved scene or project changes trigger the save/discard prompt instead of immediately closing removed the old global Esc -to-quit shortcut. ObSL’s CloseWindow() no longer closes the editor while in Editor mode. it logs that it was called instead. in the runtime, it still closes the window windows and smaller fixes enabled /MP for MSVC builds, and the editor/runtime targets use the Windows GUI subsystem so they don’t launch with a console window attached atomic file writes now write the byte buffer explicitly and retry Windows file replacement when it fails with access-denied or sharing-violation errors, for up to about 2 seconds a bit of cleanup around collision pair sorting, const-correctness and naming docs updated the editor guide and screenshot to cover the new tools, shapes, selection controls, shortcuts and undo behavior. blah blah …map editing is finally a lot less barebones…
uuid-bound script wrappers…, logger sinks…., and a pile of small editor stuff…. mostly scripting + logging plumbing this time, plus a couple of editor things I’d been wanting… changes script wrappers are uuid-bound now entity wrappers used to capture the raw runtime id, which is a problem if ids get recycled or the registry gets rebuilt. now every wrapper holds the entity’s uuid and resolves the live id on each call, so it keeps pointing at the right entity (or does nothing if it’s gone). new FindEntityByUUID(uuid) global and GetUUID() / .uuid on entity objects SetParent matches an entity object by uuid, a plain number is still a runtime id same treatment for UI wrappers: they resolve by uuid instead of name, so renaming or duplicate names don’t break them added FindUIByUUID , GetUUID() and Destroy() on UI elements, and SetImage / GetImage on images (acquires the texture through the scene asset scope like fonts do) still by name: FindUI , DestroyUI and the button state queries ( WasClicked / IsHovered / IsHeld ). UI scripting is still weird… work in progress i guess… logger sinks the old way was swapping the logger’s std::ostream for a stringstream that the UI panel also read from, which was a data race waiting to happen (logger thread writes, main thread reads). replaced it with actual sinks: ILogSink with ConsoleSink (stdout/stderr like before) and UILogSink (mutex -ed pending buffer the panel drains each frame) the editor and runtime both register a ConsoleSink , and the editor adds the UI sink on top, so the Logs panel is always there now instead of only when there’s no tty console panels color lines by severity now interpreter output goes through a small UiStream ostream into the ObSL panel, with stdout and stderr split (needed the bumped obsl, Interpreter takes both streams now…) ObSL panel clears when you enter play mode editor F focuses the camera on the selected entity, press it again to go back to the origin. its smooth…., ..panning cancels the focus keyboard pan only gets called when there’s actually input now.. editing a material in the inspector no longer mutates shared runtime-only materials. if it isn’t a catalog asset it gets cloned into assets.json first, and edits to catalog materials get “upserted” back to the catalog. “Clone Material” writes to the catalog too new scripts from the project browser come with an on_update stub instead of just a comment scripting runtime script top-level code now runs with the command buffer in “immediate” mode ( BeginImmediate / EndImmediate ), so registry writes at the top of a script apply right away instead of waiting for a flush that hasn’t been set up yet during init Hex_GetNeighbors wasn’t GC protecting its array while filling it, fixed…. grid tile textures a tile type with no texture used to fall back to hex_tex both when collecting dependencies and when loading scenes, which would pull in a texture that might not exist. now no texture means no texture… as it should… misc bumped obsl (new using alias feature, and err output stream settings) docs for all the uuid stuff, the F key, and the new UI/image methods… of course… oh also … new demo scene testin thingamabob im messing with…
script properties & UUID types scripts can now declare properties that show up in the inspector and get saved per entity. also ripped std::string UUIDs out of most of the engine in favor of an actual Core::UUID type, plus some scripting additions and a few tests. changes script properties Prop("SpeedOrSomething", 2.5) , PropEntity("TargetEntity") and PropUI("MyRect") for regular values, entities and UI elements properties show up under each script slot in the inspector, with appropriate controls and per-slot values values are only readable during top-level script execution, so store them in variables for use in hooks. Prop in a hook just returns the fallback saved as scriptProperties in scene JSON, omitted when empty property edits support undo, including live number/string editing. unused saved properties can be pruned with undo too.. ScriptSlot is move-only now Core::UUID replaced string UUIDs across the registry, UI, editor commands, project config, save directories and scripting with a 16-byte Core::UUID registry UUID lookups now use an index instead of looping through entities malformed UUIDs in files fall back to generated or nil UUIDs UI UUIDs are saved and restored, including nested elements. duplicate UI UUIDs are handled without crashing the loader savegame directories etc take a UUID directly scripting & UI script objects now have identity values and wrappers are readonly , along with various scripting result objects. came with an ObSL bump UI wrappers get SetParent(parent) and a uuid field. null reparents an element to the root UISystem::Reparent preserves ownership and prevents parenting an element under its own descendant new created scripts use fn on_update(dt) (I wrote on_update() last time …oops…) smaller stuff UndoManager::Execute returns whether the command applied script list shows filenames with Remove beside them tests and docs more tests and docs updated ofc… so u can reference entities in scripts without using Find() now!!!
Ships:
obliberry feels usable enough that i think its a good time for a first ship :) obliberry is a fallout-inspired isometric game engine for hex-grid games, written in C++20 with OpenGL, featuring a visual editor, an ECS core, its own scripting language, and single-file packaging/exports. this has all been rather challenging, but an incredibly fun learning project, especially regarding using modern C++, OpenGL, and making my own programming language it is still obviously not fully complete of course, but I think it’s in a rather good state :D...
|
1792821255.310022
|
1792907655.310022
|
|
45298
|
City Defenders TD by @nautrw | Stardance
|
nautrw
|
0
|
120.8
|
0
|
[]
|
[{"post_id": 81498, "ts": "202 [{"post_id": 81498, "ts": "2026-10-21T14:31:28Z", "hours": 6.4322, "text": "There’s been a lot of progress, I think. The game is pretty much done at this point. What’s left is just to balance the game. Renamed Ground Zero to Magic Forest : Magic Forest sounds like a much cooler name that fits the theme of the game, so I just renamed it. Data Saving : I finally got around to saving the data when closing. I just made a function that closed the game and then saved the data, and then any pathway that exits the game just calls that function. Save and quit : I added a save and quit feature to the pause menu. I am now tracking a state inside the pause menu GUI manager. There is first a save and quit option, and then that leads to a second menu that warns the player and asks them to confirm their choice. There is also an X button in the main menu that straight up quotes the game, too. Archipelago : I made a new map, the Archipelago. This follows a thin strip of land on which the enemies walk. I actually had to rework how the map system worked, adding an option to draw the ground on top or below the blocked layer. I also had to add an extra check on the logic for determining if a player can place a tower. Flamethrower : I added a new flamethrower tower. As of right now, it has the same stats as the cannon. I am going to be balancing the whole thing soon. This is going to be the final tower I think."}, {"post_id": 80831, "ts": "2026-10-18T22:49:30Z", "hours": 6.415, "text": "I’ve been kind of behind again, but I think I’ve made some cool stuff. Tower shop is now an official mechanic. I just remembered I need to set the default shards back to 0, but it’s fully working now. Main menu : I ended up setting the background of it to a stone wall, which to be honest is just taken from the tower shop background. I was wasting too much time on drawing. Map selector music : I finally got some music for the map selector. It’s some public domain guitar music like the tower shop, but different. I think it sounds pretty nice. Victory & defeat scene revamp : I revamped the victory and defeat scenes. Now, they show a banner in the center of the screen and the amount of shards the player receives. A defeat will get 1/2 of the shards reward, to allow them to actually improve. 3x speed setting : While waiting for the enemies to get to the end so I could test the defeated scene, I got tired and decided to add a new 3x speed button. I ended up refactoring the whole thing but now the code is much cleaner."}, {"post_id": 78524, "ts": "2026-10-11T03:01:21Z", "hours": 7.6825, "text": "I’ve been working on 2 major things that look small but are actually pretty big: Currency buttons : I’ve had to do some major revamps to several parts of the GUI system, but now I have buttons that show the currency. I am now using these for the upgrades, buy towers, and the new tower shop with the shards. I am now allowing for icon elements to be passed into the Button class. This allows for custom positioning, and thus this new way of buttons. Then I had to change the way that elements refreshed in the GUI managers. It took a while to figure out, but now they will be red if there isn’t enough currency. Main menu background : Art is incredibly time-consuming for me, and I keep scrapping designs but I think this one is the one and the one I’ll stick with for the finished thing."}, {"post_id": 77585, "ts": "2026-10-07T15:31:34Z", "hours": 6.0606, "text": "I’ve started work on a tower shop. I spent several hours drawing the background, but I think it came out looking really good. It only took so much time, which is why I’m making the log now. I also used a template human model for the merchant. I am going to show the different upgrades on the menu. I haven’t added the buy functionality yet, but that will probably be pretty easy. I got some chill guitar music from opengameart."}, {"post_id": 77288, "ts": "2026-10-06T13:27:04Z", "hours": 6.6089, "text": "A little bit faster progress now. Tower Shop : I have started work on a tower shop. I want it to be from the POV of the player looking into a medieval stall. As of right now, I’m still working on drawing it, and also it’s still hidden and non-functional. I edited all the towers to have a requirement of another tower, so as to make it a progression later on, Data Saving : I am going to start implementing a save system. For this, I just put some values into a data class and then implemented a way to save it to and load it from JSON. Molten Lands : There is a new map now, the molten lands. I also made a lava slime which is a bit stronger than the other enemies except for the bosses. It took a while to draw the sandy tiles for it, but I feel as though I’ve gotten much better at drawing than before. Logging : I added logging. This probably should’ve been added earlier, but this will help tremendously to fix any bugs in the code. For now, I am logging pretty much everything that doesn’t happen every frame, like when an enemy dies or the user clicks on a button."}, {"post_id": 76508, "ts": "2026-10-03T19:37:01Z", "hours": 7.5089, "text": "Progress has been (very) slow but there’s some more new content: Crabs & Bat : I added crab enemies. There is a normal crab that is like a slime and then an armored crab (not shown in video) that is bigger and meant to be a boss. There is also a bat enemy. Pause Menu : Theere is a pause menu now. It allows the user to retry the map or go back to the main menu. I am finally making use of the other features of the scene manager. It’s a different scene but it’s rendered on top of the main game scene. I had to modify the scene manager to draw each scene on top of the last one in the stack. Otherwise, this is just the same usage of my GUI system. Rebalances : I did some rebalancing of the game. Towers generally cost different amounts of coins now and do different amounts of damage. I’ll probably have to do it again by the end of the project but this will do for now. Music : I am in the process of adding music. I am getting them from https://opengameart.org and crediting all publishers. I have a system where it will queue music files from a playlist and play those in sequence. They are pretty long files, but just in case. I’m probably forgetting some stuff (last time I touched this was like a week ago), but those are the major things."}, {"post_id": 72935, "ts": "2026-09-24T02:19:28Z", "hours": 5.8756, "text": "I am very glad stardance got extended! This definitely eases the pressure A LOT . Bit of a shorter devlog so as to not accidentally pass the 10h deadline. Here are the updates: Venom shooter : The venom shooter is a plant that shoots venom. It will poison the enemy. I did this through another effect. The recording doesn’t show it’s full potential, because I kind of force pushed to the repository and now I lost the change, but I have it on another computer. Essentuially, the damage over time is going to increase with the update instead of staying static and linked to the effect. More tiles! : I added the stone path tiles. They still need a little bit of work, as some areas don’t fully connect. The nice thing about working with stone sprites is that the textures connect pretty well regardless, but it’s still something I need to fix. New Map : I added a new map, Frontier. This one is just a somewhat harder version of Ground Zero, mostly to test out if the map selector and the new tiles actually worked. The map selector just had to be tweaked to refresh the UI when a new button is clicked, which is only one line, but otherwise everything went smoothly. Ghost : I added a new enemy, the Ghost. The ghost looks like a tortured soul, and at the moment he hasn’t received proper stats, so he’s just a clone of the slime. I want to make it somewhere in between the slime and fast slime. It uses a lot more frames than the other enemies to make it somewhat smooth. Ok chat I think we got this in the bag im tryna get that bambu a1 3d printer frfr i think i can get it now that the deadline has been increased tysm stardance devs!!!!"}, {"post_id": 71575, "ts": "2026-09-21T02:32:58Z", "hours": 7.1853, "text": "Ok, so a lot of progress, though it has been slow because the school year has genuinely driven a train through my productivity: Upgrades : This is the most recent thing, but basically I added upgrades. This is handled by using a list of values instead of single values when creating a new subclass of a Tower class. I track an upgrade index and increase it to change the index and some other stuff. I made some icons and added it to the tower selected menu. I will show the coins cost of the upgrade next, because I forgot to do that. I also made new sprites for the upgrades, and a complete resprite for the cannon, which badly needed it. I also remade the tower base, which looks much better now. Speed setting : I added a speed setting. This was a matter of tracking a delta time multiplier, and then multiplying it with everything that uses delta time. Remember that delta time is the amount of time between frames. It lets the developer do things like move an enemy at a movement speed independent of the frame rate, because the movement is split between the delta time. Frostspire : I added a new Frostspire tower. This is a tower that shoots icicles at enemies and makes them slower. To do the slower part, I made an effect system that gets appended to an array in the enemy. Effects have an overlay color, and will have several attributes that are applied to the enemy if it has them. As of right now, there is just a movement speed multiplier. I want to add a final venom tower that damages enemies over time, and that should be pretty easy. Tank slime : I added a tank slime, which is supposed to be the final boss of the Ground Zero map. I’m not sure if I have the inspiration to make more enemies other than slimes, or the drawing skills. Essentially it’s just a much bigger slime (takes up the whole width of the path) and green, and slower, and has a lot of health. I have to take the time to balance everything though, because 2 of the basic crossbows can kill it as of right now."}, {"post_id": 68312, "ts": "2026-09-14T22:14:49Z", "hours": 6.0117, "text": "I did this devlog mostly because I wanted to get a screenshot of (hopefully) six seven hours , but there has been some progress, even if it’s slow because now I have other things to do . Map Selector : I implemented a map selector, which will come in useful later on when I add more maps. I also want to do a little thing where every map is its own globe that kind of shows the outline of the map. I think it’ll look cool. Wave Control : I changed the wave logic to make it be controlled by the player. I was inspired by Bloons TD 6, and I think this makes it much better. Now, the player has as much time as they need to prepare for the next wave, or if they are feeling good they can just call in multiple waves and get it over with. Game Icon : I made a game icon, a shield with a golden cross and ruby in the center. I made it be the icon for the window, and it will be the icon for the .exe file when it’s time to ship. Canon : I added a cannon turret. It’s still kind of buggy, but the idea is that it will leave an explosion and that will also be the AoE so it can shoot multiple enemies, kind of like for crowd control. Generally, I really need to spend some time balancing the game, but I think that will come at a later time."}, {"post_id": 65687, "ts": "2026-09-11T00:36:05Z", "hours": 7.2467, "text": "I’ve kind of gotten into a slump, mostly because of school, but I think I’m back on track to finish this by the 30th of this month. Though I gotta say, it’s genuinely been slog to work on this now. I think I’m burning out Anyway, for the updates: Turret anti-aliasing : To fix the issue of turrets looking terribly when rotating, I used a new function that zooms and rotates the sprite, but also applies anti-aliasing. I can set the zoom scale to 1 and it will rotate the sprite but also anti-alias it. The jaggedness seen in other demos was because the actual map is rended in very low resolution (360x240) and then scaled up. GUI Makeover : I have given another makeover to the GUI. Now, most of it in the main game is a sleek semi-transparent black surface. I did this mostly because I couldn’t settle on a particular theme, and I didn’t know how to go about drawing such large sprites while still looking good. Waves : I finally got around to adding waves. They are a little buggy, but I ended up making a dictionary structure for the maps and put them in one big dictionary. This way, I can define which enemies spawn in which order, the interval between waves, etc. Enemies and turrets are also in their own dictionaries. Health : I added the health mechanic! It will now check if the health is equal or below 0 and send the user to a game over screen. Those screens will eventually get improved. Menus : I added a main menu, mostly because I had people trying the game, and it had to happen at some point. As of right now I am working on a map selector that harnesses that maps dictionary from earlier. (I did the devlog now because I was afraid of getting to 10h ) More menus and turrets : I added a ballista tower, which is slower but has higher range. I still have to balance it some more, and make a bolt projectile, and also probably make the tower control the damage instead of the arrow. That way I can subtract health from the enemy directly, which would fix an annoying bug where the turret shoots but the bullet doesn’t collide with the enemy, so it just stays there until it collides with another enemy. There is also another slime (the red slime) which is faster. This is to force the player to have at least 2 turrets."}, {"post_id": 63381, "ts": "2026-09-07T05:26:00Z", "hours": 6.885, "text": "Quite a bit of progress! Pixel art revamp : The pixel art has generally improved massively. I actually took the time to get some inspiration from Google and worked on the tileset. It now includes a lake and also generally just looks better, with borders around the paths. It did take a lot of time, though. I also implemented animations for this, for the slime, and perhaps for the crossbow too. I also made a little card container for the top 2 stats. Waves : I added waves! It’s now technically a fully playable tower defense game, I guess. As of right now it’s going to crash as soon as it gets farther than Wave 3 because I don’t have anything to do after it, but soon I will add another scene for that."}, {"post_id": 61219, "ts": "2026-09-04T01:33:38Z", "hours": 7.2719, "text": "Lots of progress again! This one was slightly more in the background, as I started a little bit of housekeeping: Transition from Rects to FRects : FRects are the same thing as normal Rects, except that they allow for floats. This didn’t really have an impact on the game other than making it easier to work with vectors for positioning, as they also use floats. UI Changes : I changed the positioning aspect of the UI. I recreated the Rect placement system of pygame, where you can select a point (eg. top left, center, midbottom, etc.) to use to position the rect. This is very flexible, and I copied it. Now, I can do things like place text with much more ease. I also changed the colors of the UI to make it darker and overall nicer. I made it so that the user had to select a turret and then go to a menu to see the cost and other attributes of it, which will be better for the future. Coins : I added coins, which will be the temporary currency when inside the game. This will be used to buy towers and such. Outside the main game, I am planning to create another one that is used to buy skills and stuff, just to make it more realistic."}, {"post_id": 57916, "ts": "2026-08-30T07:51:39Z", "hours": 7.0772, "text": "It took a while, but there have been some pretty big improvements. Transition to 1440x960px : I eventually found that being limited to 360x240 was going to be very limiting, specially with text because at low resolutions it looked like a jumbled mess. Thus I embarked on a pretty hard journey (not hard in retrospect) to figure out how to change the resolution but also keep the pixelated style without having to draw sprites at 4 times the resolution. The solution I ended up finding was to store a scale factor of 4 (360x4=1440, 240x4=960), and then scaling a separate surface to that resolution. Now, a surface is created with the same dimensions as the map, and everything is drawn to that surface instead of the map (I used to draw enemies, turrets, bullets, etc. onto the map because they moved together), and then that surface gets scaled. This allows me to keep the pixelated graphics on the actual game, and have crisp text on the GUI. For the offsets, I just moved the function that translated the screen coordinates to map ones from the map to the scene, and then adjusted it to take in the scale factor. Everything else works pretty much the same, as its only the image and mouse clicks getting scaled instead of rectangles. I scaled the button sprites to 32x32 to make them easier to draw, and then I have it in the config to scale them to 64x64. I decided to do that mostly for ease, because most of the other sprites are around that resolution anyway. Turret placement : I added more buttons to the GUI and added turret placement. The GUI itself is always going to be kind of janky. I moved it into its own class so as to sort of clean up the code in the main scene, but now the GUI manager does weird things like self.scene.game.screen.width which isn’t very pretty. It’ll do, though. I track a variable storing the turret to be placed (None if it’s not in that state) and a variable that stores whether it can be placed. I check for collisions between the path tiles (I knew it would be useful!) and the sprite to check if it can be placed. I also modified the draw function of the turret to make it red or green depending on it. GUI : Generally, for the GUI, I keep a state from an Enum (basically a fancy way of storing a string for a state), and then change the UI according to that state. I designed it in a way where it only rebuilds it on command, so it won’t rebuild the whole thing every frame, in hopes to save some sort of performance. Overall, some very good progress, even if it’s not 100% visible!"}, {"post_id": 56469, "ts": "2026-08-28T07:48:03Z", "hours": 6.7975, "text": "I decided to just write the GUI from scratch. This is kind of uncharted territory for me. I tried using pygame_gui but it felt really restrictive and the use of a json file for customization is absurd to me. I made a basic element abstract class so that all elements must have an update and draw method. I then made a button class and a container class. All elements have an ID, and when a button is clicked it sends out a pygame event, which is a feature I did like from pygame_gui. I think I will end up eventually making an UI manager class, as handling the state within the scene is getting clunky and weird."}, {"post_id": 54261, "ts": "2026-08-25T04:49:22Z", "hours": 6.2936, "text": "I’ve probably progressed more in these ~6.25 hours than the rest of the project combined. Fixed the map dragging boundary checks. This was just a matter of separating the if statement into one for each axis. Now, even if the map won’t move on the y-axis, it can move on the x-axis, for example. I added an enemy. This was also pretty simple. They take in a path instead of a position, and their initial position is just the first index of the path (the path is a list of coordinates that they walk to). Vector math made this much easier, as I could just subtract the current position of the enemy from the target, and multiply it with movement speed to move it. The enemy is actually a parent class, and the specific slime in the video is a very simple subclass of it that just has some stats. Default enemy behavior is handled in that parent class. I made a customizable health bar class. The cool part about it is that it uses linear interpolation to change its color as the health changes relative to the maximum. I made a ballistic projectile parent class and an arrow subclass. It takes a position and a target, as well as other stats, and uses vector math to move to the target. When it hits an enemy it takes health from the enemy and then ceases to exist. There is a turret class and a crossbow. The turret takes a projectile class (the crossbow takes the arrow, for example). It will make a new instance of the projectile when shooting. It has a circle for a range of effect, and it will point to and shoot at enemies within the circle. The r key will toggle between drawing the areas and not. Quite a lot of progress!"}, {"post_id": 53480, "ts": "2026-08-24T01:35:31Z", "hours": 7.2239, "text": "I decided to give up on the isometry because I wasn’t really getting anything done. I have gone back to using a 2d map instead.| The map is made with the Tiled Map Editor ( https://thorbjorn.itch.io/tiled ) and saved as a JSON file. Tiled is good for visually building maps but a pain to work with. I’d much rather write a map editor from scratch, genuinely. I might do it at some point, honestly. The map is actually split up into 3 layers: the ground, where turrets can be placed; the path tiles, where enemies will walk; and the path polygon, which is a line that the enemies will follow. This allows me to have separate path and ground groups which will simplify turret-path collisions later. In theory, I will be able to make the enemies follow the polygon, too. I had to write a whole function just to parse the map JSON files. It organizes the layers into a dictionary of keys and 2-dimensional Numpy arrays. For the path polygon, it converts it from a list of dicts to tuples. It also removes any other inconsistencies with the original file and only keeps the important stuff. I made the map bigger than the screen itself so that it is draggable. The checks for boundaries are kind of buggy but it’ll do for now. This was just a matter of keeping a variable to track if the map is being dragged, keeping an offset, checking for boundaries, and checking for mouse movements. I know this was kind of a setback, but real progress can be made now!"}, {"post_id": 44368, "ts": "2026-08-10T02:37:52Z", "hours": 5.3789, "text": "Turns out, rendering isometric grids is pretty hard! I followed a tutorial by DaFluffyPotato on isometric rendering which let me understand the drawing part, but there are going to be some issues with the grid system in the future. I had an issue in which the grid wouldn’t draw half of itself, and it was because it was drawing everything to the right of the top tile outside it. I got it to work by multiplying the grid width by 2 and then adding an offset, but it’s kind of a band-aid and I want to research more into how to actually solve it. I did actually draw the sprites myself, though, and I have a grass block that looks really nice but that’ll be for later."}, {"post_id": 43389, "ts": "2026-08-08T16:28:30Z", "hours": 6.8456, "text": "I’ve been working for a while, mostly on backwards-facing stuff about the general project structure: A basic game class is used for the actual game instance, letting me manage variables and such and then pass them around. A scene manager class manages different screens in the game. Abstract methods are used to make sure scenes will always handle events, update, and render by making sure the methods are always implemented. Each scene is a class object with several methods. A config manager takes in a bunch of dataclasses and allows accessing the config like globals. Tests check to make sure that an error is raised if a wrong key is accessed, and other stuff. Player ships all inherit from one overall base ship class, and so do turret from their base turret class. Turrets have an attachment point and player ships have points to attach to. Both sprites are joined at the points so as to create a mounting system in which the same ship can use different turret configurations. The next thing to work on is to allow the turret to rotate as if it was on top of the ship, and to handle ship movement, having it rotate to face where it is moving. The following image is actually 2 different sprites: the turret (green) and the ship (below). It draws them by blitting the turret on top of the ship sprite. I have decided to change the theme of the project. The vast majority of the time in this devlog was the background, and luckily I didn’t have much progress on the actual game part. It will now be a tower defense game."}]...
|
Title: City Defenders TD by @nautrw | Stardance
D Title: City Defenders TD by @nautrw | Stardance
Devlogs:
I’ve been working for a while, mostly on backwards-facing stuff about the general project structure: A basic game class is used for the actual game instance, letting me manage variables and such and then pass them around. A scene manager class manages different screens in the game. Abstract methods are used to make sure scenes will always handle events, update, and render by making sure the methods are always implemented. Each scene is a class object with several methods. A config manager takes in a bunch of dataclasses and allows accessing the config like globals. Tests check to make sure that an error is raised if a wrong key is accessed, and other stuff. Player ships all inherit from one overall base ship class, and so do turret from their base turret class. Turrets have an attachment point and player ships have points to attach to. Both sprites are joined at the points so as to create a mounting system in which the same ship can use different turret configurations. The next thing to work on is to allow the turret to rotate as if it was on top of the ship, and to handle ship movement, having it rotate to face where it is moving. The following image is actually 2 different sprites: the turret (green) and the ship (below). It draws them by blitting the turret on top of the ship sprite. I have decided to change the theme of the project. The vast majority of the time in this devlog was the background, and luckily I didn’t have much progress on the actual game part. It will now be a tower defense game.
Turns out, rendering isometric grids is pretty hard! I followed a tutorial by DaFluffyPotato on isometric rendering which let me understand the drawing part, but there are going to be some issues with the grid system in the future. I had an issue in which the grid wouldn’t draw half of itself, and it was because it was drawing everything to the right of the top tile outside it. I got it to work by multiplying the grid width by 2 and then adding an offset, but it’s kind of a band-aid and I want to research more into how to actually solve it. I did actually draw the sprites myself, though, and I have a grass block that looks really nice but that’ll be for later.
I decided to give up on the isometry because I wasn’t really getting anything done. I have gone back to using a 2d map instead.| The map is made with the Tiled Map Editor ( https://thorbjorn.itch.io/tiled ) and saved as a JSON file. Tiled is good for visually building maps but a pain to work with. I’d much rather write a map editor from scratch, genuinely. I might do it at some point, honestly. The map is actually split up into 3 layers: the ground, where turrets can be placed; the path tiles, where enemies will walk; and the path polygon, which is a line that the enemies will follow. This allows me to have separate path and ground groups which will simplify turret-path collisions later. In theory, I will be able to make the enemies follow the polygon, too. I had to write a whole function just to parse the map JSON files. It organizes the layers into a dictionary of keys and 2-dimensional Numpy arrays. For the path polygon, it converts it from a list of dicts to tuples. It also removes any other inconsistencies with the original file and only keeps the important stuff. I made the map bigger than the screen itself so that it is draggable. The checks for boundaries are kind of buggy but it’ll do for now. This was just a matter of keeping a variable to track if the map is being dragged, keeping an offset, checking for boundaries, and checking for mouse movements. I know this was kind of a setback, but real progress can be made now!
I’ve probably progressed more in these ~6.25 hours than the rest of the project combined. Fixed the map dragging boundary checks. This was just a matter of separating the if statement into one for each axis. Now, even if the map won’t move on the y-axis, it can move on the x-axis, for example. I added an enemy. This was also pretty simple. They take in a path instead of a position, and their initial position is just the first index of the path (the path is a list of coordinates that they walk to). Vector math made this much easier, as I could just subtract the current position of the enemy from the target, and multiply it with movement speed to move it. The enemy is actually a parent class, and the specific slime in the video is a very simple subclass of it that just has some stats. Default enemy behavior is handled in that parent class. I made a customizable health bar class. The cool part about it is that it uses linear interpolation to change its color as the health changes relative to the maximum. I made a ballistic projectile parent class and an arrow subclass. It takes a position and a target, as well as other stats, and uses vector math to move to the target. When it hits an enemy it takes health from the enemy and then ceases to exist. There is a turret class and a crossbow. The turret takes a projectile class (the crossbow takes the arrow, for example). It will make a new instance of the projectile when shooting. It has a circle for a range of effect, and it will point to and shoot at enemies within the circle. The r key will toggle between drawing the areas and not. Quite a lot of progress!
I decided to just write the GUI from scratch. This is kind of uncharted territory for me. I tried using pygame_gui but it felt really restrictive and the use of a json file for customization is absurd to me. I made a basic element abstract class so that all elements must have an update and draw method. I then made a button class and a container class. All elements have an ID, and when a button is clicked it sends out a pygame event, which is a feature I did like from pygame_gui. I think I will end up eventually making an UI manager class, as handling the state within the scene is getting clunky and weird.
It took a while, but there have been some pretty big improvements. Transition to 1440x960px : I eventually found that being limited to 360x240 was going to be very limiting, specially with text because at low resolutions it looked like a jumbled mess. Thus I embarked on a pretty hard journey (not hard in retrospect) to figure out how to change the resolution but also keep the pixelated style without having to draw sprites at 4 times the resolution. The solution I ended up finding was to store a scale factor of 4 (360x4=1440, 240x4=960), and then scaling a separate surface to that resolution. Now, a surface is created with the same dimensions as the map, and everything is drawn to that surface instead of the map (I used to draw enemies, turrets, bullets, etc. onto the map because they moved together), and then that surface gets scaled. This allows me to keep the pixelated graphics on the actual game, and have crisp text on the GUI. For the offsets, I just moved the function that translated the screen coordinates to map ones from the map to the scene, and then adjusted it to take in the scale factor. Everything else works pretty much the same, as its only the image and mouse clicks getting scaled instead of rectangles. I scaled the button sprites to 32x32 to make them easier to draw, and then I have it in the config to scale them to 64x64. I decided to do that mostly for ease, because most of the other sprites are around that resolution anyway. Turret placement : I added more buttons to the GUI and added turret placement. The GUI itself is always going to be kind of janky. I moved it into its own class so as to sort of clean up the code in the main scene, but now the GUI manager does weird things like self.scene.game.screen.width which isn’t very pretty. It’ll do, though. I track a variable storing the turret to be placed (None if it’s not in that state) and a variable that stores whether it can be placed. I check for collisions between the path tiles (I knew it would be useful!) and the sprite to check if it can be placed. I also modified the draw function of the turret to make it red or green depending on it. GUI : Generally, for the GUI, I keep a state from an Enum (basically a fancy way of storing a string for a state), and then change the UI according to that state. I designed it in a way where it only rebuilds it on command, so it won’t rebuild the whole thing every frame, in hopes to save some sort of performance. Overall, some very good progress, even if it’s not 100% visible!
Lots of progress again! This one was slightly more in the background, as I started a little bit of housekeeping: Transition from Rects to FRects : FRects are the same thing as normal Rects, except that they allow for floats. This didn’t really have an impact on the game other than making it easier to work with vectors for positioning, as they also use floats. UI Changes : I changed the positioning aspect of the UI. I recreated the Rect placement system of pygame, where you can select a point (eg. top left, center, midbottom, etc.) to use to position the rect. This is very flexible, and I copied it. Now, I can do things like place text with much more ease. I also changed the colors of the UI to make it darker and overall nicer. I made it so that the user had to select a turret and then go to a menu to see the cost and other attributes of it, which will be better for the future. Coins : I added coins, which will be the temporary currency when inside the game. This will be used to buy towers and such. Outside the main game, I am planning to create another one that is used to buy skills and stuff, just to make it more realistic.
Quite a bit of progress! Pixel art revamp : The pixel art has generally improved massively. I actually took the time to get some inspiration from Google and worked on the tileset. It now includes a lake and also generally just looks better, with borders around the paths. It did take a lot of time, though. I also implemented animations for this, for the slime, and perhaps for the crossbow too. I also made a little card container for the top 2 stats. Waves : I added waves! It’s now technically a fully playable tower defense game, I guess. As of right now it’s going to crash as soon as it gets farther than Wave 3 because I don’t have anything to do after it, but soon I will add another scene for that.
I’ve kind of gotten into a slump, mostly because of school, but I think I’m back on track to finish this by the 30th of this month. Though I gotta say, it’s genuinely been slog to work on this now. I think I’m burning out Anyway, for the updates: Turret anti-aliasing : To fix the issue of turrets looking terribly when rotating, I used a new function that zooms and rotates the sprite, but also applies anti-aliasing. I can set the zoom scale to 1 and it will rotate the sprite but also anti-alias it. The jaggedness seen in other demos was because the actual map is rended in very low resolution (360x240) and then scaled up. GUI Makeover : I have given another makeover to the GUI. Now, most of it in the main game is a sleek semi-transparent black surface. I did this mostly because I couldn’t settle on a particular theme, and I didn’t know how to go about drawing such large sprites while still looking good. Waves : I finally got around to adding waves. They are a little buggy, but I ended up making a dictionary structure for the maps and put them in one big dictionary. This way, I can define which enemies spawn in which order, the interval between waves, etc. Enemies and turrets are also in their own dictionaries. Health : I added the health mechanic! It will now check if the health is equal or below 0 and send the user to a game over screen. Those screens will eventually get improved. Menus : I added a main menu, mostly because I had people trying the game, and it had to happen at some point. As of right now I am working on a map selector that harnesses that maps dictionary from earlier. (I did the devlog now because I was afraid of getting to 10h ) More menus and turrets : I added a ballista tower, which is slower but has higher range. I still have to balance it some more, and make a bolt projectile, and also probably make the tower control the damage instead of the arrow. That way I can subtract health from the enemy directly, which would fix an annoying bug where the turret shoots but the bullet doesn’t collide with the enemy, so it just stays there until it collides with another enemy. There is also another slime (the red slime) which is faster. This is to force the player to have at least 2 turrets.
I did this devlog mostly because I wanted to get a screenshot of (hopefully) six seven hours , but there has been some progress, even if it’s slow because now I have other things to do . Map Selector : I implemented a map selector, which will come in useful later on when I add more maps. I also want to do a little thing where every map is its own globe that kind of shows the outline of the map. I think it’ll look cool. Wave Control : I changed the wave logic to make it be controlled by the player. I was inspired by Bloons TD 6, and I think this makes it much better. Now, the player has as much time as they need to prepare for the next wave, or if they are feeling good they can just call in multiple waves and get it over with. Game Icon : I made a game icon, a shield with a golden cross and ruby in the center. I made it be the icon for the window, and it will be the icon for the .exe file when it’s time to ship. Canon : I added a cannon turret. It’s still kind of buggy, but the idea is that it will leave an explosion and that will also be the AoE so it can shoot multiple enemies, kind of like for crowd control. Generally, I really need to spend some time balancing the game, but I think that will come at a later time.
Ok, so a lot of progress, though it has been slow because the school year has genuinely driven a train through my productivity: Upgrades : This is the most recent thing, but basically I added upgrades. This is handled by using a list of values instead of single values when creating a new subclass of a Tower class. I track an upgrade index and increase it to change the index and some other stuff. I made some icons and added it to the tower selected menu. I will show the coins cost of the upgrade next, because I forgot to do that. I also made new sprites for the upgrades, and a complete resprite for the cannon, which badly needed it. I also remade the tower base, which looks much better now. Speed setting : I added a speed setting. This was a matter of tracking a delta time multiplier, and then multiplying it with everything that uses delta time. Remember that delta time is the amount of time between frames. It lets the developer do things like move an enemy at a movement speed independent of the frame rate, because the movement is split between the delta time. Frostspire : I added a new Frostspire tower. This is a tower that shoots icicles at enemies and makes them slower. To do the slower part, I made an effect system that gets appended to an array in the enemy. Effects have an overlay color, and will have several attributes that are applied to the enemy if it has them. As of right now, there is just a movement speed multiplier. I want to add a final venom tower that damages enemies over time, and that should be pretty easy. Tank slime : I added a tank slime, which is supposed to be the final boss of the Ground Zero map. I’m not sure if I have the inspiration to make more enemies other than slimes, or the drawing skills. Essentially it’s just a much bigger slime (takes up the whole width of the path) and green, and slower, and has a lot of health. I have to take the time to balance everything though, because 2 of the basic crossbows can kill it as of right now.
I am very glad stardance got extended! This definitely eases the pressure A LOT . Bit of a shorter devlog so as to not accidentally pass the 10h deadline. Here are the updates: Venom shooter : The venom shooter is a plant that shoots venom. It will poison the enemy. I did this through another effect. The recording doesn’t show it’s full potential, because I kind of force pushed to the repository and now I lost the change, but I have it on another computer. Essentuially, the damage over time is going to increase with the update instead of staying static and linked to the effect. More tiles! : I added the stone path tiles. They still need a little bit of work, as some areas don’t fully connect. The nice thing about working with stone sprites is that the textures connect pretty well regardless, but it’s still something I need to fix. New Map : I added a new map, Frontier. This one is just a somewhat harder version of Ground Zero, mostly to test out if the map selector and the new tiles actually worked. The map selector just had to be tweaked to refresh the UI when a new button is clicked, which is only one line, but otherwise everything went smoothly. Ghost : I added a new enemy, the Ghost. The ghost looks like a tortured soul, and at the moment he hasn’t received proper stats, so he’s just a clone of the slime. I want to make it somewhere in between the slime and fast slime. It uses a lot more frames than the other enemies to make it somewhat smooth. Ok chat I think we got this in the bag im tryna get that bambu a1 3d printer frfr i think i can get it now that the deadline has been increased tysm stardance devs!!!!
Progress has been (very) slow but there’s some more new content: Crabs & Bat : I added crab enemies. There is a normal crab that is like a slime and then an armored crab (not shown in video) that is bigger and meant to be a boss. There is also a bat enemy. Pause Menu : Theere is a pause menu now. It allows the user to retry the map or go back to the main menu. I am finally making use of the other features of the scene manager. It’s a different scene but it’s rendered on top of the main game scene. I had to modify the scene manager to draw each scene on top of the last one in the stack. Otherwise, this is just the same usage of my GUI system. Rebalances : I did some rebalancing of the game. Towers generally cost different amounts of coins now and do different amounts of damage. I’ll probably have to do it again by the end of the project but this will do for now. Music : I am in the process of adding music. I am getting them from https://opengameart.org and crediting all publishers. I have a system where it will queue music files from a playlist and play those in sequence. They are pretty long files, but just in case. I’m probably forgetting some stuff (last time I touched this was like a week ago), but those are the major things.
A little bit faster progress now. Tower Shop : I have started work on a tower shop. I want it to be from the POV of the player looking into a medieval stall. As of right now, I’m still working on drawing it, and also it’s still hidden and non-functional. I edited all the towers to have a requirement of another tower, so as to make it a progression later on, Data Saving : I am going to start implementing a save system. For this, I just put some values into a data class and then implemented a way to save it to and load it from JSON. Molten Lands : There is a new map now, the molten lands. I also made a lava slime which is a bit stronger than the other enemies except for the bosses. It took a while to draw the sandy tiles for it, but I feel as though I’ve gotten much better at drawing than before. Logging : I added logging. This probably should’ve been added earlier, but this will help tremendously to fix any bugs in the code. For now, I am logging pretty much everything that doesn’t happen every frame, like when an enemy dies or the user clicks on a button.
I’ve started work on a tower shop. I spent several hours drawing the background, but I think it came out looking really good. It only took so much time, which is why I’m making the log now. I also used a template human model for the merchant. I am going to show the different upgrades on the menu. I haven’t added the buy functionality yet, but that will probably be pretty easy. I got some chill guitar music from opengameart.
I’ve been working on 2 major things that look small but are actually pretty big: Currency buttons : I’ve had to do some major revamps to several parts of the GUI system, but now I have buttons that show the currency. I am now using these for the upgrades, buy towers, and the new tower shop with the shards. I am now allowing for icon elements to be passed into the Button class. This allows for custom positioning, and thus this new way of buttons. Then I had to change the way that elements refreshed in the GUI managers. It took a while to figure out, but now they will be red if there isn’t enough currency. Main menu background : Art is incredibly time-consuming for me, and I keep scrapping designs but I think this one is the one and the one I’ll stick with for the finished thing.
I’ve been kind of behind again, but I think I’ve made some cool stuff. Tower shop is now an official mechanic. I just remembered I need to set the default shards back to 0, but it’s fully working now. Main menu : I ended up setting the background of it to a stone wall, which to be honest is just taken from the tower shop background. I was wasting too much time on drawing. Map selector music : I finally got some music for the map selector. It’s some public domain guitar music like the tower shop, but different. I think it sounds pretty nice. Victory & defeat scene revamp : I revamped the victory and defeat scenes. Now, they show a banner in the center of the screen and the amount of shards the player receives. A defeat will get 1/2 of the shards reward, to allow them to actually improve. 3x speed setting : While waiting for the enemies to get to the end so I could test the defeated scene, I got tired and decided to add a new 3x speed button. I ended up refactoring the whole thing but now the code is much cleaner.
There’s been a lot of progress, I think. The game is pretty much done at this point. What’s left is just to balance the game. Renamed Ground Zero to Magic Forest : Magic Forest sounds like a much cooler name that fits the theme of the game, so I just renamed it. Data Saving : I finally got around to saving the data when closing. I just made a function that closed the game and then saved the data, and then any pathway that exits the game just calls that function. Save and quit : I added a save and quit feature to the pause menu. I am now tracking a state inside the pause menu GUI manager. There is first a save and quit option, and then that leads to a second menu that warns the player and asks them to confirm their choice. There is also an X button in the main menu that straight up quotes the game, too. Archipelago : I made a new map, the Archipelago. This follows a thin strip of land on which the enemies walk. I actually had to rework how the map system worked, adding an option to draw the ground on top or below the blocked layer. I also had to add an extra check on the logic for determining if a player can place a tower. Flamethrower : I added a new flamethrower tower. As of right now, it has the same stats as the cannon. I am going to be balancing the whole thing soon. This is going to be the final tower I think....
|
1792619351.3911572
|
1793224151.3911572
|
|
6029
|
Lucrose-C by @learningppcb | Stardance
|
learningppcb
|
1
|
14.0
|
126
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T06:25:14Z", "hours": 14.0, "multiplier": 8.89, "payout": 126, "blessing": "neutral", "text": "I create a domain specific language, in this the hard part was not to create the lexer or parser but was on deciding what to create, I guess I can say that it was a pretty fun experience… I learned a lot from this. I finally understood what lexer and parser was. To tell the truth I did not actually want to do this, i wanted to make a general purpose language, and the first version was something like that… But after some trial and error i could not make it proper. So we are here. Now the language itself, is a pretty small language, with small usability, this is aimed to be like a database system. Why was this created? It was created to make lists better. To tell the truth i felt the prices were constantly changing on flavortown shop, and it made me annoyed. So I wanted to make a language in which u can easily save the prices, and then make lists, make programs around it… but then i thought while trying to build it, Why? who would even use it? so i planned on creating a general domain specific language. also i forgot to mention that in the GitHub i might have added the wrong test.lcr i think the one attached is the one with error… so ya change it. The syntax is easy and self explained so ya i hope u understand it", "repo": "https://github.com/CrowCrow611/Lucrose-C", "demo": "https://github.com/CrowCrow611/Lucrose-C/releases"}]...
|
[{"post_id": 8150, "ts": "2026 [{"post_id": 8150, "ts": "2026-06-13T16:23:30Z", "hours": 2.1833, "text": "added errors… In this mega update, i finally added errors, and warnings, for stuff like leaving colons(error), repeating numbers in {} and for price and count being 0"}, {"post_id": 4790, "ts": "2026-06-08T08:54:51Z", "hours": 3.4528, "text": "after some incredible works, after working my bines out… And screaming at myself, trying to debug using AI… We present you this… Yes i haven’t fixed a problem, instead added a fancier windoww!!!!!!!!!"}, {"post_id": 2095, "ts": "2026-06-04T12:53:10Z", "hours": 1.46, "text": "Debugged, and added automatic size!!1 in code type let width x (the x is a number, if none specified automatic) it looks amazing right? RIGHT!!!"}, {"post_id": 2043, "ts": "2026-06-04T10:21:55Z", "hours": 0.5056, "text": "after some insane debugging"}, {"post_id": 2017, "ts": "2026-06-04T09:19:38Z", "hours": 1.7186, "text": "um created the format, the display… it works, but still has a small problem"}, {"post_id": 1666, "ts": "2026-06-03T20:06:19Z", "hours": 2.4431, "text": "Is this tears of happniess? The parser has some mistakes, which needs to be corrected, but still it works, and is not crasing!!"}, {"post_id": 1451, "ts": "2026-06-03T14:27:34Z", "hours": 2.4042, "text": "Umm this is a small project, hence it took a little less time then other projects… I have done the Lexer… This reads the .lcr files and breaks them down"}]...
|
Title: Lucrose-C by @learningppcb | Stardance
Dev Title: Lucrose-C by @learningppcb | Stardance
Devlogs:
Umm this is a small project, hence it took a little less time then other projects… I have done the Lexer… This reads the .lcr files and breaks them down
Is this tears of happniess? The parser has some mistakes, which needs to be corrected, but still it works, and is not crasing!!
um created the format, the display… it works, but still has a small problem
after some insane debugging
Debugged, and added automatic size!!1 in code type let width x (the x is a number, if none specified automatic) it looks amazing right? RIGHT!!!
after some incredible works, after working my bines out… And screaming at myself, trying to debug using AI… We present you this… Yes i haven’t fixed a problem, instead added a fancier windoww!!!!!!!!!
added errors… In this mega update, i finally added errors, and warnings, for stuff like leaving colons(error), repeating numbers in {} and for price and count being 0
Ships:
I create a domain specific language, in this the hard part was not to create the lexer or parser but was on deciding what to create, I guess I can say that it was a pretty fun experience… I learned a lot from this. I finally understood what lexer and parser was. To tell the truth I did not actually want to do this, i wanted to make a general purpose language, and the first version was something like that… But after some trial and error i could not make it proper. So we are here. Now the language itself, is a pretty small language, with small usability, this is aimed to be like a database system. Why was this created? It was created to make lists better. To tell the truth i felt the prices were constantly changing on flavortown shop, and it made me annoyed. So I wanted to make a language in which u can easily save the prices, and then make lists, make programs around it… but then i thought while trying to build it, Why? who would even use it? so i planned on creating a general domain specific language. also i forgot to mention that in the GitHub i might have added the wrong test.lcr i think the one attached is the one with error… so ya change it. The syntax is easy and self explained so ya i hope u understand it...
|
1792820883.9496732
|
1792907283.9496732
|
|
27224
|
My very own WebOS by @nevasood | Stardance
|
nevasood
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T14:51:23Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a WEBOS about myself with 3 specific apps. It contains a shopping list, a calculator and a notepad. It was challenging to make the shopping list. It was difficult to code in Javascript, which I did more effectively through the use of AI.", "repo": "https://github.com/itzzneva/my-own-web-OS", "demo": "https://itzzneva.github.io/my-own-web-OS/"}]...
|
[{"post_id": 81500, "ts": "202 [{"post_id": 81500, "ts": "2026-10-21T14:49:05Z", "hours": 4.77, "text": "my web os complete"}, {"post_id": 60255, "ts": "2026-09-02T14:50:53Z", "hours": 0.315, "text": "I have added a background colour. I might add some extra apps such as a calculator."}, {"post_id": 59615, "ts": "2026-09-01T15:11:30Z", "hours": 7.3794, "text": "I have currently added a window. I have struggled with making it draggable but it can close properly. I plan on adding more apps or windows. I plan to make it fit a certain theme, by adding certain images."}]...
|
Title: My very own WebOS by @nevasood | Stardance
Title: My very own WebOS by @nevasood | Stardance
Devlogs:
I have currently added a window. I have struggled with making it draggable but it can close properly. I plan on adding more apps or windows. I plan to make it fit a certain theme, by adding certain images.
I have added a background colour. I might add some extra apps such as a calculator.
my web os complete
Ships:
I made a WEBOS about myself with 3 specific apps. It contains a shopping list, a calculator and a notepad. It was challenging to make the shopping list. It was difficult to code in Javascript, which I did more effectively through the use of AI....
|
1792784918.0671082
|
1792871318.0671082
|
|
41053
|
Fizzy Sea by @Nik0la_278 | Stardance
|
Nik0la_278
|
4
|
34.62
|
355
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-11T00:59:03Z", "hours": 8.0, "multiplier": 16.45, "payout": 137, "blessing": "neutral", "text": "The game got a few key functions, changes and optimizations! -The game is more light weight due to water optimization! -The map had some changes with more stuff added to it like Soda barrels and an additional cocoa tree! -Now when you press P, a pause menu appears where you can quit game! -Assets like Rafts and Targets are now re textured! -Lighting optimized for better appearance! Crosshair more accurate! WAY MORE STUFF COMING SOON!", "repo": "https://github.com/Nik0la278/Fizzy_Sea", "demo": "https://nik0la278.itch.io/fizzy-sea"}, {"ship_num": 2, "ts": "2026-10-01T16:23:43Z", "hours": 6.0, "multiplier": 14.51, "payout": 90, "blessing": "neutral", "text": "WHATS NEW IN MY GAME! Shootable Canzzzz and Bottlezzzzz New UI (Crosshair and Health Bar) Tutorial Signs! COCOA PODS!!! That you can shoot off the trees New shooting ability where you shoot a bigger water ball! (It has a 3s cooldown) Trash bags!….. they just sit there and take up space to fill in the map! Much more coming SOON!", "repo": "https://github.com/Nik0la278/Fizzy_Sea", "demo": "https://nik0la278.itch.io/fizzy-sea"}, {"ship_num": 3, "ts": "2026-09-21T19:47:29Z", "hours": 9.0, "multiplier": 9.86, "payout": 93, "blessing": "neutral", "text": "Fizzy Sea, Ship: 2 I added a WHOLE NEW MAP that include animated water, a tree (That will have a function later on), fences and targets to shoot! I also added the ability to shoot with left click! The blue spheres are projectiles you shoot! The spheres are placeholders for water shot from a water gun! When you change the camera to third person (by pressing C), you can see the main character model is included with a water gun attached to his wrist! Animation for walking, jumping and shooting will be added later on (When I figure out how in the world animation works), but for now he stays in a T-Pose! The game is still in progress but I’m working as best and fast I can! :3", "repo": "https://github.com/Nik0la278/Fizzy_Sea", "demo": "https://nik0la278.itch.io/fizzy-sea"}, {"ship_num": 4, "ts": "2026-08-16T18:29:42Z", "hours": 10.0, "multiplier": 3.51, "payout": 35, "blessing": "neutral", "text": "I made mechanics for a game I am making in unreal engine! Current mechanics feature WASD movement, Shift for sprint and 2 cameras that switch when pressed C, switching from 1st to 3rd person. The most challenging part (and the part I was most proud of) was figuring out the 3rd person camera movement because the code didn’t let camera move vertically at first but now it does!", "repo": "https://github.com/Nik0la278/Fizzy_Sea", "demo": "https://nik0la278.itch.io/fizzy-sea"}]...
|
[{"post_id": 81502, "ts": "202 [{"post_id": 81502, "ts": "2026-10-21T14:51:28Z", "hours": 1.6167, "text": "I made a Projectile (Fire Ball) model and texture in blender that will be thrown by a BurninWag (Skeleton on fire) who is one of the main enemys in the maps of my game. It was really painful and took me a while because Red parts are meant to glow on their own and I forgot to save a few times which caused the textures to disappear and black out (Which made me wanna cry a lot…) which made me have to redo everything a bunch of times!"}, {"post_id": 78503, "ts": "2026-10-11T00:31:29Z", "hours": 1.7053, "text": "I have made custom textures for the Rafts and Targets in my game, switching from temporary templates. had complications where I had to reimport assets multiple times to get them in the engine properly and I was having a lot of changes of mind when it comes to color shades!"}, {"post_id": 78183, "ts": "2026-10-09T22:00:20Z", "hours": 1.6942, "text": "First I modeled and textured a barrel for my game, then I placed some placeholder textures on the ship I have modeled to see what I want, then I added the barrels to the game and I made a Game Pause Function and an option to quit game! Also I adjusted the crosshair to match the shooting area."}, {"post_id": 76826, "ts": "2026-10-04T18:45:16Z", "hours": 3.0006, "text": "Optimization So first thing I did was optimize the trash bags because they had a ton of polygons, then I optimized the ocean around the rafts because it was lagging the packaged game a lot, then I adjusted the lighting and added shadows which took more time than I wanted! I went through pain to get the shadows working."}, {"post_id": 76541, "ts": "2026-10-03T21:29:11Z", "hours": 1.9328, "text": "New Map I made a base mesh for the ship that will be in the next scene/stage/level of my game, had some trouble recording this lapse due to Blender crashing while I was messing with polygons (My mini pc wasn’t built for this ;-;). I am proud of how it all turned out BUT it’s still undone. The plan is that my character will walk around the ship doing chores. The ship will be the first real story related level after tutorial!"}, {"post_id": 75728, "ts": "2026-09-30T21:34:12Z", "hours": 1.1844, "text": "Today I fixed the shooting ability a little bit, I have added tutorial signs, fixed some collisions that didn’t match objects and a few code checks."}, {"post_id": 75356, "ts": "2026-09-29T20:40:22Z", "hours": 1.81, "text": "I have built a few things today! First, I optimized my trash bag models and put them on the map to fill in the empty space. I added armature to my enemy model and tried a little bit of posing with it. Made a new WaterBlast shooting ability (took a lot of time on that), I had problems with it but menaged to code it out. And finally added a few minor fixes to the drowned screen like stoping error messages and updating the drowned screen a tiny bit."}, {"post_id": 74209, "ts": "2026-09-26T22:23:49Z", "hours": 1.3503, "text": "I have cocoa fruits to the trees and gave them physics, making them fall off when shot and I added a “Drowned Screen” that shows when you fall off the platform with a functioning “Try Again” Button! I have tried to animate health to be bubbles that pop but I didn’t finish it."}, {"post_id": 72813, "ts": "2026-09-23T19:39:30Z", "hours": 1.8525, "text": "I HAVE ADDED PHYSICS Mainly I made it so when you shoot the cans and bottles, they actually get physics. On paper it sounds simple and it is, until for some reason they’d just fall on their side before getting shot, so I had to make them not have physics until shot!"}, {"post_id": 62983, "ts": "2026-09-06T15:34:17Z", "hours": 1.4097, "text": "I added a water gun and shooting mechanic to my game."}, {"post_id": 61107, "ts": "2026-09-03T20:37:40Z", "hours": 0.4994, "text": "Texturing and Modeling Clothes! The physics will be added in engine! But for now I like how clothes turned out (Even if I might change them laer) Currently, clothes feature A cap and a shorts!"}, {"post_id": 60482, "ts": "2026-09-02T20:40:21Z", "hours": 0.7333, "text": "I made a shorts for my character to wear. It looks rough around he edges but it will look good in engine!"}, {"post_id": 59838, "ts": "2026-09-01T20:16:02Z", "hours": 1.4639, "text": "I have placed the player character into the game! This is Barnaby! The main character of my RPG game! I him into the game and had a lot of trouble with positioning him to not gloat or walk inside the floor! At the end I managed to get him to the floor and now its time to add animation and functions!"}, {"post_id": 57966, "ts": "2026-08-30T09:32:31Z", "hours": 0.35, "text": "A watter bottle that will be given physics code to be shot at!"}, {"post_id": 57589, "ts": "2026-08-29T19:42:59Z", "hours": 0.4497, "text": "A Fish Can that will have physics so it can be knocked over with a water gun."}, {"post_id": 57170, "ts": "2026-08-29T08:39:41Z", "hours": 0.9356, "text": "I made a few assets for my game! Fence will (try) to keep the player (you) from falling (on accident), The tree will grow Cocoa on it and the cocoa will be shot with water making it fall and when you eat the Cocoa you gain health! as for Lifebuoy, it will just be a decoration on the side."}, {"post_id": 54970, "ts": "2026-08-26T12:23:43Z", "hours": 1.3169, "text": "I made a raft where my games Tutorial testing Map will be happening on!"}, {"post_id": 51938, "ts": "2026-08-21T21:37:51Z", "hours": 2.2314, "text": "BurninWag is a min enemy that will appear throughout the game and this is a 3d model of one of 3+ variants. The idea is that this variant will be in a areas on the map and once it spots the player it throws fireballs on the player. When shot with waer it will turn into a pile of bones but if the player stays in one place for too long, the bones will reignite and reform into a fresh BurninWag that will attack the player again!"}, {"post_id": 48378, "ts": "2026-08-16T18:15:19Z", "hours": 0.3931, "text": "Fixed Some Code! I removed blur and fixed the camera movement in 3rd person! Try out what I did in the demo!"}, {"post_id": 40988, "ts": "2026-08-04T21:19:03Z", "hours": 1.2333, "text": "Prototype Model For The Boss. Materials are allright but the model might be a little rough around the edges but that is fixable in animation part."}, {"post_id": 40941, "ts": "2026-08-04T19:52:32Z", "hours": 2.8442, "text": "Oil Monster Boss Concept Concept Art for Materials, 3D Model and Animation"}, {"post_id": 40341, "ts": "2026-08-03T19:43:33Z", "hours": 2.9683, "text": "Fizzy Sea Concept! One of the parts of the Game and title screen background concept! The guy siting under the palm… thing is the main character with a water gun and the big glowing thing on a rocky island is A Beacon with a special purpose!"}, {"post_id": 38948, "ts": "2026-08-01T15:45:17Z", "hours": 1.265, "text": "Water Gun for my game! Textures will come next but I wanna have a few models upfront before texturing!"}, {"post_id": 38760, "ts": "2026-08-01T10:05:09Z", "hours": 1.2392, "text": "Trash Bag Asset for Game Environment"}]...
|
Title: Fizzy Sea by @Nik0la_278 | Stardance
Devlo Title: Fizzy Sea by @Nik0la_278 | Stardance
Devlogs:
Trash Bag Asset for Game Environment
Water Gun for my game! Textures will come next but I wanna have a few models upfront before texturing!
Fizzy Sea Concept! One of the parts of the Game and title screen background concept! The guy siting under the palm… thing is the main character with a water gun and the big glowing thing on a rocky island is A Beacon with a special purpose!
Oil Monster Boss Concept Concept Art for Materials, 3D Model and Animation
Prototype Model For The Boss. Materials are allright but the model might be a little rough around the edges but that is fixable in animation part.
Fixed Some Code! I removed blur and fixed the camera movement in 3rd person! Try out what I did in the demo!
BurninWag is a min enemy that will appear throughout the game and this is a 3d model of one of 3+ variants. The idea is that this variant will be in a areas on the map and once it spots the player it throws fireballs on the player. When shot with waer it will turn into a pile of bones but if the player stays in one place for too long, the bones will reignite and reform into a fresh BurninWag that will attack the player again!
I made a raft where my games Tutorial testing Map will be happening on!
I made a few assets for my game! Fence will (try) to keep the player (you) from falling (on accident), The tree will grow Cocoa on it and the cocoa will be shot with water making it fall and when you eat the Cocoa you gain health! as for Lifebuoy, it will just be a decoration on the side.
A Fish Can that will have physics so it can be knocked over with a water gun.
A watter bottle that will be given physics code to be shot at!
I have placed the player character into the game! This is Barnaby! The main character of my RPG game! I him into the game and had a lot of trouble with positioning him to not gloat or walk inside the floor! At the end I managed to get him to the floor and now its time to add animation and functions!
I made a shorts for my character to wear. It looks rough around he edges but it will look good in engine!
Texturing and Modeling Clothes! The physics will be added in engine! But for now I like how clothes turned out (Even if I might change them laer) Currently, clothes feature A cap and a shorts!
I added a water gun and shooting mechanic to my game.
I HAVE ADDED PHYSICS Mainly I made it so when you shoot the cans and bottles, they actually get physics. On paper it sounds simple and it is, until for some reason they’d just fall on their side before getting shot, so I had to make them not have physics until shot!
I have cocoa fruits to the trees and gave them physics, making them fall off when shot and I added a “Drowned Screen” that shows when you fall off the platform with a functioning “Try Again” Button! I have tried to animate health to be bubbles that pop but I didn’t finish it.
I have built a few things today! First, I optimized my trash bag models and put them on the map to fill in the empty space. I added armature to my enemy model and tried a little bit of posing with it. Made a new WaterBlast shooting ability (took a lot of time on that), I had problems with it but menaged to code it out. And finally added a few minor fixes to the drowned screen like stoping error messages and updating the drowned screen a tiny bit.
Today I fixed the shooting ability a little bit, I have added tutorial signs, fixed some collisions that didn’t match objects and a few code checks.
New Map I made a base mesh for the ship that will be in the next scene/stage/level of my game, had some trouble recording this lapse due to Blender crashing while I was messing with polygons (My mini pc wasn’t built for this ;-;). I am proud of how it all turned out BUT it’s still undone. The plan is that my character will walk around the ship doing chores. The ship will be the first real story related level after tutorial!
Optimization So first thing I did was optimize the trash bags because they had a ton of polygons, then I optimized the ocean around the rafts because it was lagging the packaged game a lot, then I adjusted the lighting and added shadows which took more time than I wanted! I went through pain to get the shadows working.
First I modeled and textured a barrel for my game, then I placed some placeholder textures on the ship I have modeled to see what I want, then I added the barrels to the game and I made a Game Pause Function and an option to quit game! Also I adjusted the crosshair to match the shooting area.
I have made custom textures for the Rafts and Targets in my game, switching from temporary templates. had complications where I had to reimport assets multiple times to get them in the engine properly and I was having a lot of changes of mind when it comes to color shades!
I made a Projectile (Fire Ball) model and texture in blender that will be thrown by a BurninWag (Skeleton on fire) who is one of the main enemys in the maps of my game. It was really painful and took me a while because Red parts are meant to glow on their own and I forgot to save a few times which caused the textures to disappear and black out (Which made me wanna cry a lot…) which made me have to redo everything a bunch of times!
Ships:
I made mechanics for a game I am making in unreal engine! Current mechanics feature WASD movement, Shift for sprint and 2 cameras that switch when pressed C, switching from 1st to 3rd person. The most challenging part (and the part I was most proud of) was figuring out the 3rd person camera movement because the code didn’t let camera move vertically at first but now it does!
Fizzy Sea, Ship: 2 I added a WHOLE NEW MAP that include animated water, a tree (That will have a function later on), fences and targets to shoot! I also added the ability to shoot with left click! The blue spheres are projectiles you shoot! The spheres are placeholders for water shot from a water gun! When you change the camera to third person (by pressing C), you can see the main character model is included with a water gun attached to his wrist! Animation for walking, jumping and shooting will be added later on (When I figure out how in the world animation works), but for now he stays in a T-Pose! The game is still in progress but I’m working as best and fast I can! :3
WHATS NEW IN MY GAME! Shootable Canzzzz and Bottlezzzzz New UI (Crosshair and Health Bar) Tutorial Signs! COCOA PODS!!! That you can shoot off the trees New shooting ability where you shoot a bigger water ball! (It has a 3s cooldown) Trash bags!….. they just sit there and take up space to fill in the map! Much more coming SOON!
The game got a few key functions, changes and optimizations! -The game is more light weight due to water optimization! -The map had some changes with more stuff added to it like Soda barrels and an additional cocoa tree! -Now when you press P, a pause menu appears where you can quit game! -Assets like Rafts and Targets are now re textured! -Lighting optimized for better appearance! Crosshair more accurate! WAY MORE STUFF COMING SOON!...
|
1792821172.2189655
|
1792907572.2189655
|
|
70818
|
Bearnie by @pd541664 | Stardance
|
pd541664
|
0
|
10.08
|
0
|
[]
|
[{"post_id": 81509, "ts": "202 [{"post_id": 81509, "ts": "2026-10-21T15:12:21Z", "hours": 10.0844, "text": "Js ported beanie here since I haven’t submitted it else, will spend like a hour or so and then submit it"}]...
|
Title: Bearnie by @pd541664 | Stardance
Devlogs:
Title: Bearnie by @pd541664 | Stardance
Devlogs:
Js ported beanie here since I haven’t submitted it else, will spend like a hour or so and then submit it...
|
1792597629.0228157
|
1793202429.0228157
|
|
16345
|
Slackbot by @Zizik | Stardance
|
Zizik
|
1
|
4.0
|
29
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:45:15Z", "hours": 4.0, "multiplier": 5.98, "payout": 29, "blessing": "neutral", "text": "Ship checkout the version 1.0 devlog definitely because I got through everything inside it so here will be some shorter version of the devlog here are all the commands that my bot does: Available Commands: /zizik-ping - Check bot latency /zizik-catfact - Get a cat fact /zizik-joke - Get a random joke /zizik-translatetomylanguage - Translate text to my language /zizik-translator - First specify your language and then type the text after a space. /zizik-isssatellites - Get the current ISS location Well I had a lot of struggeles along the way like for example not copying the tokens right inside the nest or that I could not copy inside nest and I still can not or that I had problems with even getting the code right for the first time and everything else just spiraled out of my way really that is amybe why this bot is okay but like I think has some cool features so yeah it was very okay i would definitely say but i thought that it will be faster but it was not at all so I will see how everyone will like it! Yeah and i had a giant problem with me naming things differently because it wa the first time I was actually doing something a little harder and I hope that I at least did something that soemone might enjoy! AI was used for troubleshooting images in readme and soem terminal problems!", "repo": "https://github.com/UltraZizik/slackbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BAELQSNJV"}]...
|
[{"post_id": 8151, "ts": "2026 [{"post_id": 8151, "ts": "2026-06-13T16:24:27Z", "hours": 0.3042, "text": "Version 1.0 Well this was a journey from learning how to set this bot up or how to set him on the Nest so it runs 24/7 and learning so much more in the process. The bot has 4 of the commands from the tutorial and 3 mine : [5:59 PM]:robot_face: Available Commands: /zizik-ping - Check bot latency /zizik-catfact - Get a cat fact /zizik-joke - Get a random joke /zizik-translatetomylanguage - Translate text to my language /zizik-translator - First specify your language and then type the text after a space. /zizik-isssatellites - Get the current ISS location This is the final devlog for this bot or maybe I will return to this and add new things but who knows! Now I will tell you what I been through becasue I ran into many problems through this journey: I didn’t know where to communicate with the bot so i found it online and connected after that I had some problems with the tokens because yeah iInamed them tokens.env not .env so I figured it out with AI because Github had memory of me uploading this code that has things that shouldn’t be shared but overall I found the issue and resolved it. My second problem was that I couldn’t paste anything when I was in ssh to my nest so I badly copied the tokens-YEAH- and I figured it out after like half an hour and the second I used AI even though it was absolutely useless. Third problem was that I don’t really know how to code in javascript even though I did something(minecraft related) it was not the same at all only what iknew were const and console.log() and some other little things so I used a little bit of AI and other projects for brainstorming on how to ´make user specify the language in the translator and rewrited the code better for me so I understand what I typed and made thats why in the translation you have so much comments because I had to tell myself what it does so I don’t forget it anytime in the near future! That are overall my problems because I really enjoyed this somehow and it was great my bot does a lot and means a lot to me. I stated everywhere my AI usage and in readme.md there was some too but not much and I tried to rewrite most of it so it sound like me more and so it speaks to my experience from it more! Now if everything will be allright i will move onto other project maybe the hadkpad or something on my own!"}, {"post_id": 8110, "ts": "2026-06-13T15:17:46Z", "hours": 2.2261, "text": "So today was very productive Firstly I made a transalator that translates to Czech That was very great easy and fast. Only thing that like I didnt know how was what api to use for translator and well I used Google translate Same goes for the second command that translates everything into anything and I found it really hard to make the logic on how to see the first command that specifies the language and well I found it in other project and well I modified it a little and typed what everything does so I can use something or undesrstand something like this better in the future The third just tells you where ISS satellites are which is kind of insane that I thought about this and yeah I got inspired by others that put mars pictures and etc so I put satelite commands in there! Overall this was the most productive day but the most stressfull to and I will ship it after I make some solid README. I knew absolutely nothing about this from the start and well my ssh and knowledge in this was really bad I was always mainly making modpacks or etc. It was absolutely different and overall I would say even thought it took me soo long than some other people it was still great experince and i learned so much from this which is absolutely insane!"}, {"post_id": 7601, "ts": "2026-06-12T18:25:30Z", "hours": 1.1717, "text": "Slackbot update! So it begings with me badly copying the token from the original code! For some reason ctrl+v does not work when in ssh… I still dont know why? It is how it is so I had to type all of the tokens and commands with my hand and got bored of it so I imported the .env file because why the hell not and it copied badly :) after that I got myself into big troubles with that I made the folders and everything in different spots so i had to learn how to move file and etc. the time I got into this… I somehow misread the thing and yeah my commands were not unique so it colided with others and after some time I figured it out! I still dont know how? Now the next time I will do this I will make something new and maybe more fun for me than learning something from linux, some dumb mistakes because I didnt understand some things or thought that it is easy and yeah I used lots of AI for troubleshooting but im not ashamed to say so because troubleshooting is so boring and i dont want to sit here for hours more trying to figure it out! Overall I enjoyed todays run more than yesterday it was fun, good and it made sense so next time I will make it do something maybe more fun or more useful but after that I will be moving onto some different project! :)"}, {"post_id": 7027, "ts": "2026-06-11T19:47:17Z", "hours": 0.3869, "text": "Slackbot Well this was some kind of experience I didn’t knew I needed but I worked on this and got into some troubles like big ones! First one was that fucking Tokens didn’t work for me! I had to put path inside the config of dotenv because I don’t fucking know why but I had to do it… Second was git or more of a GitHub issue so I literally named the .env file differently as an absolute idiot and brought me pain😓 because the file was not hidden from GitHub and it remembered so I had to use ai and ask it on how to erase the memory of that thing.😕 Third was the same as first but on nest and I didn’t figure out how to fix this one somehow? But I made to work: /dsb-ping /dsb-catfact /dsb-joke And tried to make one myself Overall I had a good time with this but I was struggling a lot and I think this is not my cup of tea really like I think I will try something different next time but I want to make this work and get this mission done! As everyone says you always need to learn something you don’t like or you don’t understand so yeah I made that today👍 Sometimes in the future my devlog will maybe improve and I will improve with it as well"}]...
|
Title: Slackbot by @Zizik | Stardance
Devlogs:
Sl Title: Slackbot by @Zizik | Stardance
Devlogs:
Slackbot Well this was some kind of experience I didn’t knew I needed but I worked on this and got into some troubles like big ones! First one was that fucking Tokens didn’t work for me! I had to put path inside the config of dotenv because I don’t fucking know why but I had to do it… Second was git or more of a GitHub issue so I literally named the .env file differently as an absolute idiot and brought me pain😓 because the file was not hidden from GitHub and it remembered so I had to use ai and ask it on how to erase the memory of that thing.😕 Third was the same as first but on nest and I didn’t figure out how to fix this one somehow? But I made to work: /dsb-ping /dsb-catfact /dsb-joke And tried to make one myself Overall I had a good time with this but I was struggling a lot and I think this is not my cup of tea really like I think I will try something different next time but I want to make this work and get this mission done! As everyone says you always need to learn something you don’t like or you don’t understand so yeah I made that today👍 Sometimes in the future my devlog will maybe improve and I will improve with it as well
Slackbot update! So it begings with me badly copying the token from the original code! For some reason ctrl+v does not work when in ssh… I still dont know why? It is how it is so I had to type all of the tokens and commands with my hand and got bored of it so I imported the .env file because why the hell not and it copied badly :) after that I got myself into big troubles with that I made the folders and everything in different spots so i had to learn how to move file and etc. the time I got into this… I somehow misread the thing and yeah my commands were not unique so it colided with others and after some time I figured it out! I still dont know how? Now the next time I will do this I will make something new and maybe more fun for me than learning something from linux, some dumb mistakes because I didnt understand some things or thought that it is easy and yeah I used lots of AI for troubleshooting but im not ashamed to say so because troubleshooting is so boring and i dont want to sit here for hours more trying to figure it out! Overall I enjoyed todays run more than yesterday it was fun, good and it made sense so next time I will make it do something maybe more fun or more useful but after that I will be moving onto some different project! :)
So today was very productive Firstly I made a transalator that translates to Czech That was very great easy and fast. Only thing that like I didnt know how was what api to use for translator and well I used Google translate Same goes for the second command that translates everything into anything and I found it really hard to make the logic on how to see the first command that specifies the language and well I found it in other project and well I modified it a little and typed what everything does so I can use something or undesrstand something like this better in the future The third just tells you where ISS satellites are which is kind of insane that I thought about this and yeah I got inspired by others that put mars pictures and etc so I put satelite commands in there! Overall this was the most productive day but the most stressfull to and I will ship it after I make some solid README. I knew absolutely nothing about this from the start and well my ssh and knowledge in this was really bad I was always mainly making modpacks or etc. It was absolutely different and overall I would say even thought it took me soo long than some other people it was still great experince and i learned so much from this which is absolutely insane!
Version 1.0 Well this was a journey from learning how to set this bot up or how to set him on the Nest so it runs 24/7 and learning so much more in the process. The bot has 4 of the commands from the tutorial and 3 mine : [5:59 PM]:robot_face: Available Commands: /zizik-ping - Check bot latency /zizik-catfact - Get a cat fact /zizik-joke - Get a random joke /zizik-translatetomylanguage - Translate text to my language /zizik-translator - First specify your language and then type the text after a space. /zizik-isssatellites - Get the current ISS location This is the final devlog for this bot or maybe I will return to this and add new things but who knows! Now I will tell you what I been through becasue I ran into many problems through this journey: I didn’t know where to communicate with the bot so i found it online and connected after that I had some problems with the tokens because yeah iInamed them tokens.env not .env so I figured it out with AI because Github had memory of me uploading this code that has things that shouldn’t be shared but overall I found the issue and resolved it. My second problem was that I couldn’t paste anything when I was in ssh to my nest so I badly copied the tokens-YEAH- and I figured it out after like half an hour and the second I used AI even though it was absolutely useless. Third problem was that I don’t really know how to code in javascript even though I did something(minecraft related) it was not the same at all only what iknew were const and console.log() and some other little things so I used a little bit of AI and other projects for brainstorming on how to ´make user specify the language in the translator and rewrited the code better for me so I understand what I typed and made thats why in the translation you have so much comments because I had to tell myself what it does so I don’t forget it anytime in the near future! That are overall my problems because I really enjoyed this somehow and it was great my bot does a lot and means a lot to me. I stated everywhere my AI usage and in readme.md there was some too but not much and I tried to rewrite most of it so it sound like me more and so it speaks to my experience from it more! Now if everything will be allright i will move onto other project maybe the hadkpad or something on my own!
Ships:
Ship checkout the version 1.0 devlog definitely because I got through everything inside it so here will be some shorter version of the devlog here are all the commands that my bot does: Available Commands: /zizik-ping - Check bot latency /zizik-catfact - Get a cat fact /zizik-joke - Get a random joke /zizik-translatetomylanguage - Translate text to my language /zizik-translator - First specify your language and then type the text after a space. /zizik-isssatellites - Get the current ISS location Well I had a lot of struggeles along the way like for example not copying the tokens right inside the nest or that I could not copy inside nest and I still can not or that I had problems with even getting the code right for the first time and everything else just spiraled out of my way really that is amybe why this bot is okay but like I think has some cool features so yeah it was very okay i would definitely say but i thought that it will be faster but it was not at all so I will see how everyone will like it! Yeah and i had a giant problem with me naming things differently because it wa the first time I was actually doing something a little harder and I hope that I at least did something that soemone might enjoy! AI was used for troubleshooting images in readme and soem terminal problems!...
|
1792839241.9694133
|
1792925641.9694133
|
|
62931
|
GitWrapped by @NEBULA_X | Stardance
|
NEBULA_X
|
1
|
20.56
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:44:02Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a project called GitWrapped. It can turn any GitHub profile into a Spotify wrapped style story. The most challenging things in this project for me were the CSS page CSS errors, positioning was also acting up, I think I had a sort of variable conflict or something, almost pushing my tokens to github which was automatically blocked, but that presented another pushing general issue, I eventually had to create a New repo since trying to fix the old one was too much unnecessary work. Im proud of the fact that I was able to think up an idea and build and deploy a working model all from scratch, thats pretty awesome to me. The software requires a VALID github username (obviously), any other information check out the README! It would be great if i could get feedback on the project itself from other people, so if you guys dont mind, drop what you think of it.", "repo": "https://github.com/IsraelAdedeji/GIT-WRAPPED-V2", "demo": "https://git-wrapped-v2.vercel.app/"}]...
|
[{"post_id": 81512, "ts": "202 [{"post_id": 81512, "ts": "2026-10-21T15:24:31Z", "hours": 3.5833, "text": "UHHHHHH, Finally almost done with the restyling (almost, I think), made a lot of changes, especially to the downloadable card, there were A LOTTT of errors EVERYWHERE!, and a small mistake will make you scratch your head for hours, I literally forgot to comment out ONE line of code, and it almost ruined everything, anyways, I should be making the finally touches soon (There genuinely is an github account for any name haha)"}, {"post_id": 79783, "ts": "2026-10-15T12:06:33Z", "hours": 2.8828, "text": "Added a dialogue box to the input screen inspired by the orpheus overlay Ive seen, although i want to use it for every screen, lets see how it goes. I almost broke the entire thing trying to make the dialogue box a global variable that can be used on every screen, so I quickly reversed all the changes, will try to do it again later I also used a default smiley face emoji as a placeholder, im still deciding whether to use pixel art or trying drawing a character myself (even though I cant really draw 0…0)"}, {"post_id": 78455, "ts": "2026-10-10T20:37:08Z", "hours": 1.8867, "text": "I created a simple welcome screen, with an animation as well too, and also a sort of dropping curtain overlay for when the button is clicked that comes down from the top, switches to the next screen then goes back up again. At first I encountered an issue where the overlay started from the middle of the screen to the top and bottom, but i was able to fix that after a few tweaks. I used the pixel font from google fonts because… well thats what I wanted to see when i open the software so…"}, {"post_id": 71850, "ts": "2026-09-21T17:26:59Z", "hours": 1.2119, "text": "#UPDATE I did a little retouch to the UI because it apparently looked like I used AI heavily for it (I used it to do some code correction and implementation issues mainly), but I have redone it with my own personal touch (based on what ive learned while building the first version). I changed the background to a simple color gradient instead of the characteristic glossy AI looking background and adjusted the color code a little. The overall layout is still pretty much the same."}, {"post_id": 71337, "ts": "2026-09-20T17:31:41Z", "hours": 2.7936, "text": "Final devloggggg!!! Im finally done with version one of GitWrapped!!! Honestly this has been one of the most exciting but frustrating projects ive ever done. I spruced up the UI a bit to make it feel more appealing. I added a work history heatmap, downloadable summary card that can be shared with friends, link to the github account the summary is referencing, and a bunch of other tiny fixes/updates. Deploying was a bit problematic too cause of the GitHub PAT I used, so I had to find a better secure work around. Learning stuff for the first time can be crazy, cause the tiniest of mistakes can cause an error and lead you on wild goose chases lasting hours, my final bug for this project was literally just a single “.”, thats it, I started wondering whats wrong but after a while i was able to discover it. So thats pretty much it for GitWrapped, Hope you guys like it!"}, {"post_id": 70858, "ts": "2026-09-19T21:39:44Z", "hours": 5.5714, "text": "Javascriptttttttt!!! It was a battle getting everything to work like i intended, when you try fixing something, something else breaks. Well… Ive made the software interactive, it can fetch and display live data from github over the github API. I also designed an activity heatmap, similar to the one in github to show work. I spent soooooooo much time on debugging, i discovered bugs that i didnt notice during the html and css phase. Visibility toggling, incorrect id syntax in HTML css caching as well too, (although i learned i could disable it later on so…) and screens stacking on each other were some of my major problems. I feel im almost done done, ill just do one last polish and readme as well."}, {"post_id": 70571, "ts": "2026-09-19T11:47:00Z", "hours": 1.7011, "text": "Finally done with the CSS for this project (I think) I learned about a bunch of new css elements and using the :root tag too, which makes it quite a lot easier to make changes. Colour gradients make it look even nicer too. Well, uhmmm… Thats it I guess, dont know what to write anymore, gonna work on the interactivity next"}, {"post_id": 69330, "ts": "2026-09-16T20:29:24Z", "hours": 0.5092, "text": "And im back again after a long break, this time im working on GitWrapped, spotify wrapped inspired interface. For now ive only built the html code for the frontend. Its supposed to take the username of the github account and pull information about it to be displayed in an interesting format. I actually decided to build this cause a similar situation happened recently where people were trying to show off their accounts, so i thought making a fun in piece of software for doing that would be nice. The fetching your story… part isnt supposed to be visible btw, its supposed to display after the user has entered A VALID username, ill work on those functionalities next (after the styling obviously)"}]...
|
Title: GitWrapped by @NEBULA_X | Stardance
Devlog Title: GitWrapped by @NEBULA_X | Stardance
Devlogs:
And im back again after a long break, this time im working on GitWrapped, spotify wrapped inspired interface. For now ive only built the html code for the frontend. Its supposed to take the username of the github account and pull information about it to be displayed in an interesting format. I actually decided to build this cause a similar situation happened recently where people were trying to show off their accounts, so i thought making a fun in piece of software for doing that would be nice. The fetching your story… part isnt supposed to be visible btw, its supposed to display after the user has entered A VALID username, ill work on those functionalities next (after the styling obviously)
Finally done with the CSS for this project (I think) I learned about a bunch of new css elements and using the :root tag too, which makes it quite a lot easier to make changes. Colour gradients make it look even nicer too. Well, uhmmm… Thats it I guess, dont know what to write anymore, gonna work on the interactivity next
Javascriptttttttt!!! It was a battle getting everything to work like i intended, when you try fixing something, something else breaks. Well… Ive made the software interactive, it can fetch and display live data from github over the github API. I also designed an activity heatmap, similar to the one in github to show work. I spent soooooooo much time on debugging, i discovered bugs that i didnt notice during the html and css phase. Visibility toggling, incorrect id syntax in HTML css caching as well too, (although i learned i could disable it later on so…) and screens stacking on each other were some of my major problems. I feel im almost done done, ill just do one last polish and readme as well.
Final devloggggg!!! Im finally done with version one of GitWrapped!!! Honestly this has been one of the most exciting but frustrating projects ive ever done. I spruced up the UI a bit to make it feel more appealing. I added a work history heatmap, downloadable summary card that can be shared with friends, link to the github account the summary is referencing, and a bunch of other tiny fixes/updates. Deploying was a bit problematic too cause of the GitHub PAT I used, so I had to find a better secure work around. Learning stuff for the first time can be crazy, cause the tiniest of mistakes can cause an error and lead you on wild goose chases lasting hours, my final bug for this project was literally just a single “.”, thats it, I started wondering whats wrong but after a while i was able to discover it. So thats pretty much it for GitWrapped, Hope you guys like it!
#UPDATE I did a little retouch to the UI because it apparently looked like I used AI heavily for it (I used it to do some code correction and implementation issues mainly), but I have redone it with my own personal touch (based on what ive learned while building the first version). I changed the background to a simple color gradient instead of the characteristic glossy AI looking background and adjusted the color code a little. The overall layout is still pretty much the same.
I created a simple welcome screen, with an animation as well too, and also a sort of dropping curtain overlay for when the button is clicked that comes down from the top, switches to the next screen then goes back up again. At first I encountered an issue where the overlay started from the middle of the screen to the top and bottom, but i was able to fix that after a few tweaks. I used the pixel font from google fonts because… well thats what I wanted to see when i open the software so…
Added a dialogue box to the input screen inspired by the orpheus overlay Ive seen, although i want to use it for every screen, lets see how it goes. I almost broke the entire thing trying to make the dialogue box a global variable that can be used on every screen, so I quickly reversed all the changes, will try to do it again later I also used a default smiley face emoji as a placeholder, im still deciding whether to use pixel art or trying drawing a character myself (even though I cant really draw 0…0)
UHHHHHH, Finally almost done with the restyling (almost, I think), made a lot of changes, especially to the downloadable card, there were A LOTTT of errors EVERYWHERE!, and a small mistake will make you scratch your head for hours, I literally forgot to comment out ONE line of code, and it almost ruined everything, anyways, I should be making the finally touches soon (There genuinely is an github account for any name haha)
Ships:
This is a project called GitWrapped. It can turn any GitHub profile into a Spotify wrapped style story. The most challenging things in this project for me were the CSS page CSS errors, positioning was also acting up, I think I had a sort of variable conflict or something, almost pushing my tokens to github which was automatically blocked, but that presented another pushing general issue, I eventually had to create a New repo since trying to fix the old one was too much unnecessary work. Im proud of the fact that I was able to think up an idea and build and deploy a working model all from scratch, thats pretty awesome to me. The software requires a VALID github username (obviously), any other information check out the README! It would be great if i could get feedback on the project itself from other people, so if you guys dont mind, drop what you think of it....
|
1792813984.7469547
|
1792900384.7469547
|
|
45078
|
streaming-tools by @Pikacnu | Stardance
|
Pikacnu
|
0
|
87.59
|
0
|
[]
|
[{"post_id": 81520, "ts": "202 [{"post_id": 81520, "ts": "2026-10-21T15:44:55Z", "hours": 8.1031, "text": "Not planned, but… AI found lots of bugs and issues. They aren’t fixed or implemented yet (I didn’t even know that). So… still fixing them and building the Graph System."}, {"post_id": 79739, "ts": "2026-10-15T08:17:11Z", "hours": 11.6878, "text": "Still finishing graph layer to gst. Frontend not start yet."}, {"post_id": 77492, "ts": "2026-10-07T07:13:59Z", "hours": 11.975, "text": "Finished implementing the basic function for parseNode. Still need to update the graph to add more capabilities directly to the node system (such as removing pads from nodes, which is not yet implemented)."}, {"post_id": 73084, "ts": "2026-09-24T10:46:11Z", "hours": 9.0183, "text": "The node rewrite is almost complete, with only a few nodes left to migrate to the new type. Once all tests pass and the migrations are finished, I can start working on the stream (making sure it can push and verify first using the test pipeline built on top of the node system). After that, I’ll move on to building the frontend."}, {"post_id": 70152, "ts": "2026-09-18T15:57:35Z", "hours": 10.1275, "text": "I am rewriting the node system(which allows frontend nodes to be transformed into backend nodes,and then builds a gst.pipeline to process them), Which is still incomplete. My goal is to let you create a pipeline with minimal media processing knowledge, while still being able to control most things and understand the process (just simpler)."}, {"post_id": 65455, "ts": "2026-09-10T16:26:09Z", "hours": 9.1967, "text": "Designing Nodes (GStreamer) Wrap GStreamer components into nodes (like a box) and sync with the frontend. But with the features GStreamer has, I need to check the differences between the frontend and backend graphs and apply them to the GStreamer pipeline. Which is difficult, and I haven’t come up with a good idea yet. If anyone can give me some advice, that would be great."}, {"post_id": 51369, "ts": "2026-08-21T00:32:15Z", "hours": 8.7414, "text": "Add a simple frontend using SvelteFlow (This is my first time using Svelte) Wrap GStreamer into node-like abstractions (This will sync with the frontend) Note: This workflow is just to get started with SvelteFlow; it’s not the final result. Note: The GStreamer component is still a work in progress (WIP)."}, {"post_id": 47875, "ts": "2026-08-16T04:14:56Z", "hours": 8.3892, "text": "Figuring out how to parse video and mux it into the target format (FLV). Asked AI to understand how GStreamer works and how to build a proper pipeline. Also tried to start SRT and WHIP listeners. *WHIP doesn’t work for this use case because it can’t handle multiple audio tracks."}, {"post_id": 45894, "ts": "2026-08-12T17:15:12Z", "hours": 10.3536, "text": "Try to use gst to encode / decode video (from file now) Use 2 mpv to play video and audio(autoaudio/video won’t work and i have no idea.) Also platfrom’s chat room fetcher (not complete yet) There is it’s pipeline: filesrc → matroskademux ──(video/x-av1)→ av1parse → av1dec → videoconvert → x264enc → queue → appsink ─→ mpv #1 (H.264) └──(audio/x-opus)→ opusdec → queue → audioconvert → wavenc → appsink ─→ mpv #2 (WAV)"}]...
|
Title: streaming-tools by @Pikacnu | Stardance
De Title: streaming-tools by @Pikacnu | Stardance
Devlogs:
Try to use gst to encode / decode video (from file now) Use 2 mpv to play video and audio(autoaudio/video won’t work and i have no idea.) Also platfrom’s chat room fetcher (not complete yet) There is it’s pipeline: filesrc → matroskademux ──(video/x-av1)→ av1parse → av1dec → videoconvert → x264enc → queue → appsink ─→ mpv #1 (H.264) └──(audio/x-opus)→ opusdec → queue → audioconvert → wavenc → appsink ─→ mpv #2 (WAV)
Figuring out how to parse video and mux it into the target format (FLV). Asked AI to understand how GStreamer works and how to build a proper pipeline. Also tried to start SRT and WHIP listeners. *WHIP doesn’t work for this use case because it can’t handle multiple audio tracks.
Add a simple frontend using SvelteFlow (This is my first time using Svelte) Wrap GStreamer into node-like abstractions (This will sync with the frontend) Note: This workflow is just to get started with SvelteFlow; it’s not the final result. Note: The GStreamer component is still a work in progress (WIP).
Designing Nodes (GStreamer) Wrap GStreamer components into nodes (like a box) and sync with the frontend. But with the features GStreamer has, I need to check the differences between the frontend and backend graphs and apply them to the GStreamer pipeline. Which is difficult, and I haven’t come up with a good idea yet. If anyone can give me some advice, that would be great.
I am rewriting the node system(which allows frontend nodes to be transformed into backend nodes,and then builds a gst.pipeline to process them), Which is still incomplete. My goal is to let you create a pipeline with minimal media processing knowledge, while still being able to control most things and understand the process (just simpler).
The node rewrite is almost complete, with only a few nodes left to migrate to the new type. Once all tests pass and the migrations are finished, I can start working on the stream (making sure it can push and verify first using the test pipeline built on top of the node system). After that, I’ll move on to building the frontend.
Finished implementing the basic function for parseNode. Still need to update the graph to add more capabilities directly to the node system (such as removing pads from nodes, which is not yet implemented).
Still finishing graph layer to gst. Frontend not start yet.
Not planned, but… AI found lots of bugs and issues. They aren’t fixed or implemented yet (I didn’t even know that). So… still fixing them and building the Graph System....
|
1792612063.787812
|
1793216863.787812
|
|
57652
|
AgendaHub by @cesarmoal11 | Stardance
|
cesarmoal11
|
0
|
45.9
|
0
|
[]
|
[{"post_id": 81524, "ts": "202 [{"post_id": 81524, "ts": "2026-10-21T15:56:27Z", "hours": 1.0136, "text": "I’ve done a timer for AgendaHub. I think it’s a useful tool for this website, because it will be used mainly by students. A timer is useful for dividing your time, studying, and school stuff. It maintains the time while you change between sections. Also it’s draggable, I have learned how to do that right now."}, {"post_id": 76690, "ts": "2026-10-04T10:57:37Z", "hours": 2.115, "text": "I have been doing a few things to the web, Improving the responsive the design for phones and also improving the AgendaHub guide for beginners, in which you can find all the instructions of how to use this web."}, {"post_id": 75237, "ts": "2026-09-29T15:36:23Z", "hours": 3.7958, "text": "I have done a very cool sub-section I’m really proud of. I’ve always wanted in AgendaHub something to track your habits and see your progress. This is perfect, because you can create your own customizable habits and see all the statistics. Also you can see a calendar with all the feeling you have been having through the year. I used AI for learning some new things (like making the chart). I hope you’ll like it."}, {"post_id": 74435, "ts": "2026-09-27T11:35:03Z", "hours": 1.1172, "text": "I created another functionality for events. Now, if you have an event which is repeating, you can choose to edit all the repetitions of that event or only an individual event of those."}, {"post_id": 73750, "ts": "2026-09-25T21:03:08Z", "hours": 1.2989, "text": "I fixed som errors with the event repetition."}, {"post_id": 72764, "ts": "2026-09-23T18:08:21Z", "hours": 3.8686, "text": "I have done a very significant part of my project. I decided to combine the two different main databases I had to create only one called “events”. These events are shown by 2 different ways: on the calendar section (calendar, week or day view) and on the new schedule section. Both sections are connected so all the changes you make are update in both sections. A new functionality for events is you can repeat them the times you want, choosing the days and all that stuff."}, {"post_id": 71800, "ts": "2026-09-21T16:00:53Z", "hours": 1.6764, "text": "I did a new section for my webb. I have created a new way to organize yourself in agendahub. It’s a regular schedule, in which you can create the different tasks you usually have on your daily life. However, if you have something which happens once you can not repeat it. The duration is also a good way to organize your day. The main purpose of the section is to see quickly all the ordinary tasks of your week."}, {"post_id": 71162, "ts": "2026-09-20T11:44:11Z", "hours": 2.9183, "text": "I have almost done the responsive design for mobile phones."}, {"post_id": 70216, "ts": "2026-09-18T18:35:58Z", "hours": 0.5508, "text": "I have started with the responsive design for mobiles."}, {"post_id": 69701, "ts": "2026-09-17T16:38:28Z", "hours": 0.8422, "text": "I have done a few more changes. NOw you can change the password in case you forget it. Also you can create events and tasks without selecting a subject."}, {"post_id": 69236, "ts": "2026-09-16T17:03:59Z", "hours": 1.0986, "text": "I added a few changes in the user section. Now you can change the profile picture by choosing a picture from your computer. Also you can select the dates of beginning and end of your course to visualize the progress bar. I also added the count of the days to the end of the course. Finally I added the log out button."}, {"post_id": 68722, "ts": "2026-09-15T16:48:16Z", "hours": 0.9089, "text": "I have finished the connection between my web and supabase. Right now, people who wants to use the web must create an account using an email. By this way AgendaHub is gonna be so much efficient and customizable. All the events, tasks, subjects and more that you create using your account are stored on the database, to save them forever. The next thing I wanna do is the user-settings part."}, {"post_id": 68215, "ts": "2026-09-14T18:24:53Z", "hours": 0.5758, "text": "I have continued doing the necessary changes to connect AgendaHub to supabase instead of localStorage. I have changed the user system, the subjects and the calendars-events. Now I have to do the same with tasks and marks."}, {"post_id": 67566, "ts": "2026-09-13T18:24:30Z", "hours": 2.9464, "text": "I am trying to get AgendaHub to the next level. My idea is to use a database for creating an user system, allowing people to create accounts and that stuff. By that way everything is gonna be more organized and also I’m gonna be able to create more personalize stuff to improve the web."}, {"post_id": 66483, "ts": "2026-09-12T10:09:35Z", "hours": 0.6811, "text": "I have finished the version 1.0 of Agendahub. All the sections and its functionalities which I first made up are already working. I also added different messages when the web is clean so the user is able to know the function of each section and what can he do in there. I’ll be adding more stuff, but the web I made up is officialy done. I’m so proud of it because I really think it is sooo helpul for students to organise everything (also for me) and I have practised and learn lots of things. :)"}, {"post_id": 66139, "ts": "2026-09-11T19:22:34Z", "hours": 1.2033, "text": "I have done the initial dashboard. Now, when the user enters on the website there’s a summary of his tasks, events and marks. Any idea to add to the website?"}, {"post_id": 65468, "ts": "2026-09-10T16:47:44Z", "hours": 1.2425, "text": "I have done the marks section, which is very similar to the subjects section. It has subject cards too, but here is shown the average mark of each subject. Also there is a general average mark and a lot of progress bars which I really like."}, {"post_id": 64940, "ts": "2026-09-09T17:51:03Z", "hours": 1.7594, "text": "I have continued with the subject content. Now, apart from having the main info at the top of the subject section, you can visualize all the events, tasks and marks from that subject. Also by clicking you can see all the info of each one."}, {"post_id": 64305, "ts": "2026-09-08T16:22:55Z", "hours": 1.8203, "text": "I did the subject settings, so now when the user creates a subject he can change later its info and settings. Also you can upload an image to be the subject front page."}, {"post_id": 63887, "ts": "2026-09-07T21:57:48Z", "hours": 1.7894, "text": "Hii. I have started the marks section, however, I decided to set aside it to do another section which is more important: Subjects. The idea of this section is quite simple: the user can create a subject depending on his needs, and all his own personalize subjects will appear on the menus of the calendar, tasks and marks to create all those stuff. You can create infinite subjects and choose their color, which will appear too in the events and tasks. The next step is doing individual windows for each subject, so the user can enter into it by clicking on the subjects."}, {"post_id": 63031, "ts": "2026-09-06T16:30:05Z", "hours": 2.6111, "text": "I have finished the tasks sectiooon!! It is divided into several parts: the header which contains the title and the button to create new tasks, the counters which each one counts different aspects of the tasks (completed, for tomorrow…), the “tomorrow” part which contains a list with the tasks for the next day, the “state” part which contains 3 blocks that contain the tasks depending on its state (to-do, in progress or done) and finally the all part which contains a list with all the tasks."}, {"post_id": 62532, "ts": "2026-09-05T23:18:23Z", "hours": 0.9003, "text": "I have done the “sketch” for the new section of my web, the tasks section. In here, the user will be able to create tasks and see them on different places. There will be an account of the tasks made, the tasks which have been made and that stuff. Also there will be a list with the most urgent tasks for the next day. Each task will have a title, a subject, a date… There will be another section in which the tasks will be ordered by their state."}, {"post_id": 62360, "ts": "2026-09-05T18:06:58Z", "hours": 2.0114, "text": "I have create a very functional and extended functionality. In all the calendars you can create different calendars to separate your events and tasks. I did that. Now you can create your own calendar which the name you prefer and create in it all the events you want. Using the side menu you can hide each calendar by clicking on them and also delete them."}, {"post_id": 62113, "ts": "2026-09-05T11:22:55Z", "hours": 0.6206, "text": "I did a few new functionalities on the calendar section. Now, if there are more than 3 events in the same day, the rest are hidden in the calendar view. However, the user can see the whole events in the other views. Another functionality I have made is the button “Hoy” (today). If the user do click on it, it shows the actual day on the selected view. Also the number in the current day is highlighted."}, {"post_id": 61826, "ts": "2026-09-04T22:35:45Z", "hours": 3.1517, "text": "Hii I’m so excited about the progress of AgendaHub. After creating the template for the calendar which calculate automatically the days and all the stuff I did the other views. The user can use the button on the top of the section for moving along them. The template changes depending on the view the user has chosen. Also, the user can create events (exams usually) using the + button OOOR by clicking on the day the prefer. After doing one of those things, the user has to fill a form to create the event (title, date, subject, time and a description). If these gaps are empty when the user clicks the save button, an error alert will warn the user to fill them. Besides, the user can see all the information of the events by clicking on them. Also they are editable (if the user has to change the date or something else). I’m really proud of this because I think it looks great and also is SOO USEFUL (specially for students and productive people). I have used chat gpt to learn how to do the java script stuff (the calculations of the days, months…)."}, {"post_id": 61418, "ts": "2026-09-04T10:09:12Z", "hours": 0.8514, "text": "I’m so proud of this new section which I have created. It consists on a calendar, which is formed depending on the date of the user. Also you can explore and see the previews and next months by using the buttons. It’s made with javascript. Honestly, this is my first time creating a calendar like this and I have use AI for learning and understanding how to do it. I’m sooo happy with the final result."}, {"post_id": 60914, "ts": "2026-09-03T15:58:54Z", "hours": 1.0492, "text": "I have done a new button in the calendar section, which allows the user (in the future) to change the view of the events. I also made the event-creator title and date compulsory, showing an error if the user doesn’t fill those gaps. The next step is creating the different views."}, {"post_id": 60777, "ts": "2026-09-03T11:28:29Z", "hours": 0.375, "text": "I start doing the calendar section. Now theres only the place where I’m gonna create it. I did the modal which allows the user to create en event. I still follow the design of the web, I really like it. The next step is to make this modal work and create some events, then I will create the calendar and fill it with the events."}, {"post_id": 60761, "ts": "2026-09-03T10:53:45Z", "hours": 0.3872, "text": "I improved the sidebar and header design. From now on the web design is gonna be like this, using this color palette, basic shadows, floating elements… Now I’m gonna start with the sections"}, {"post_id": 60496, "ts": "2026-09-02T21:23:58Z", "hours": 0.7217, "text": "I just started this exicitn project. The idea is to build a functional agenda to organise my work (tasks, exams, marks…). I want to add these: a calendar (monthly and weekly) to see what I have to do, an interactive list with my tasks (and organize them by categories), a section to have the marks from my exams, a section with the different subjects I have and all the information of each one and finally a section with objectives. Right now there’s only the header, the next step is to make it functional. I also have decided the color palette to my project."}]...
|
Title: AgendaHub by @cesarmoal11 | Stardance
Devl Title: AgendaHub by @cesarmoal11 | Stardance
Devlogs:
I just started this exicitn project. The idea is to build a functional agenda to organise my work (tasks, exams, marks…). I want to add these: a calendar (monthly and weekly) to see what I have to do, an interactive list with my tasks (and organize them by categories), a section to have the marks from my exams, a section with the different subjects I have and all the information of each one and finally a section with objectives. Right now there’s only the header, the next step is to make it functional. I also have decided the color palette to my project.
I improved the sidebar and header design. From now on the web design is gonna be like this, using this color palette, basic shadows, floating elements… Now I’m gonna start with the sections
I start doing the calendar section. Now theres only the place where I’m gonna create it. I did the modal which allows the user to create en event. I still follow the design of the web, I really like it. The next step is to make this modal work and create some events, then I will create the calendar and fill it with the events.
I have done a new button in the calendar section, which allows the user (in the future) to change the view of the events. I also made the event-creator title and date compulsory, showing an error if the user doesn’t fill those gaps. The next step is creating the different views.
I’m so proud of this new section which I have created. It consists on a calendar, which is formed depending on the date of the user. Also you can explore and see the previews and next months by using the buttons. It’s made with javascript. Honestly, this is my first time creating a calendar like this and I have use AI for learning and understanding how to do it. I’m sooo happy with the final result.
Hii I’m so excited about the progress of AgendaHub. After creating the template for the calendar which calculate automatically the days and all the stuff I did the other views. The user can use the button on the top of the section for moving along them. The template changes depending on the view the user has chosen. Also, the user can create events (exams usually) using the + button OOOR by clicking on the day the prefer. After doing one of those things, the user has to fill a form to create the event (title, date, subject, time and a description). If these gaps are empty when the user clicks the save button, an error alert will warn the user to fill them. Besides, the user can see all the information of the events by clicking on them. Also they are editable (if the user has to change the date or something else). I’m really proud of this because I think it looks great and also is SOO USEFUL (specially for students and productive people). I have used chat gpt to learn how to do the java script stuff (the calculations of the days, months…).
I did a few new functionalities on the calendar section. Now, if there are more than 3 events in the same day, the rest are hidden in the calendar view. However, the user can see the whole events in the other views. Another functionality I have made is the button “Hoy” (today). If the user do click on it, it shows the actual day on the selected view. Also the number in the current day is highlighted.
I have create a very functional and extended functionality. In all the calendars you can create different calendars to separate your events and tasks. I did that. Now you can create your own calendar which the name you prefer and create in it all the events you want. Using the side menu you can hide each calendar by clicking on them and also delete them.
I have done the “sketch” for the new section of my web, the tasks section. In here, the user will be able to create tasks and see them on different places. There will be an account of the tasks made, the tasks which have been made and that stuff. Also there will be a list with the most urgent tasks for the next day. Each task will have a title, a subject, a date… There will be another section in which the tasks will be ordered by their state.
I have finished the tasks sectiooon!! It is divided into several parts: the header which contains the title and the button to create new tasks, the counters which each one counts different aspects of the tasks (completed, for tomorrow…), the “tomorrow” part which contains a list with the tasks for the next day, the “state” part which contains 3 blocks that contain the tasks depending on its state (to-do, in progress or done) and finally the all part which contains a list with all the tasks.
Hii. I have started the marks section, however, I decided to set aside it to do another section which is more important: Subjects. The idea of this section is quite simple: the user can create a subject depending on his needs, and all his own personalize subjects will appear on the menus of the calendar, tasks and marks to create all those stuff. You can create infinite subjects and choose their color, which will appear too in the events and tasks. The next step is doing individual windows for each subject, so the user can enter into it by clicking on the subjects.
I did the subject settings, so now when the user creates a subject he can change later its info and settings. Also you can upload an image to be the subject front page.
I have continued with the subject content. Now, apart from having the main info at the top of the subject section, you can visualize all the events, tasks and marks from that subject. Also by clicking you can see all the info of each one.
I have done the marks section, which is very similar to the subjects section. It has subject cards too, but here is shown the average mark of each subject. Also there is a general average mark and a lot of progress bars which I really like.
I have done the initial dashboard. Now, when the user enters on the website there’s a summary of his tasks, events and marks. Any idea to add to the website?
I have finished the version 1.0 of Agendahub. All the sections and its functionalities which I first made up are already working. I also added different messages when the web is clean so the user is able to know the function of each section and what can he do in there. I’ll be adding more stuff, but the web I made up is officialy done. I’m so proud of it because I really think it is sooo helpul for students to organise everything (also for me) and I have practised and learn lots of things. :)
I am trying to get AgendaHub to the next level. My idea is to use a database for creating an user system, allowing people to create accounts and that stuff. By that way everything is gonna be more organized and also I’m gonna be able to create more personalize stuff to improve the web.
I have continued doing the necessary changes to connect AgendaHub to supabase instead of localStorage. I have changed the user system, the subjects and the calendars-events. Now I have to do the same with tasks and marks.
I have finished the connection between my web and supabase. Right now, people who wants to use the web must create an account using an email. By this way AgendaHub is gonna be so much efficient and customizable. All the events, tasks, subjects and more that you create using your account are stored on the database, to save them forever. The next thing I wanna do is the user-settings part.
I added a few changes in the user section. Now you can change the profile picture by choosing a picture from your computer. Also you can select the dates of beginning and end of your course to visualize the progress bar. I also added the count of the days to the end of the course. Finally I added the log out button.
I have done a few more changes. NOw you can change the password in case you forget it. Also you can create events and tasks without selecting a subject.
I have started with the responsive design for mobiles.
I have almost done the responsive design for mobile phones.
I did a new section for my webb. I have created a new way to organize yourself in agendahub. It’s a regular schedule, in which you can create the different tasks you usually have on your daily life. However, if you have something which happens once you can not repeat it. The duration is also a good way to organize your day. The main purpose of the section is to see quickly all the ordinary tasks of your week.
I have done a very significant part of my project. I decided to combine the two different main databases I had to create only one called “events”. These events are shown by 2 different ways: on the calendar section (calendar, week or day view) and on the new schedule section. Both sections are connected so all the changes you make are update in both sections. A new functionality for events is you can repeat them the times you want, choosing the days and all that stuff.
I fixed som errors with the event repetition.
I created another functionality for events. Now, if you have an event which is repeating, you can choose to edit all the repetitions of that event or only an individual event of those.
I have done a very cool sub-section I’m really proud of. I’ve always wanted in AgendaHub something to track your habits and see your progress. This is perfect, because you can create your own customizable habits and see all the statistics. Also you can see a calendar with all the feeling you have been having through the year. I used AI for learning some new things (like making the chart). I hope you’ll like it.
I have been doing a few things to the web, Improving the responsive the design for phones and also improving the AgendaHub guide for beginners, in which you can find all the instructions of how to use this web.
I’ve done a timer for AgendaHub. I think it’s a useful tool for this website, because it will be used mainly by students. A timer is useful for dividing your time, studying, and school stuff. It maintains the time while you change between sections. Also it’s draggable, I have learned how to do that right now....
|
1792716651.6562145
|
1793321451.6562145
|
|
70823
|
fort.desktop by @ryni | Stardance
|
ryni
|
1
|
32.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T16:15:51Z", "hours": 32.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is fort.desktop! a tiny little client for fort.ind (my own game archive/sharkey instance) its made in universal windows platform and C# it has a couple features like browsing the fort.ind game archive, logging in with a fort.social account and browsing the instance and making posts! (that was tha hardest thing to get working) and live tiles. so like.. how do you use this since uwp apps are a core part of windows, all you need is ti extract the zip install the cert and click the .msix file and install from there (i also made a tiny script to speed up install if you dont wanna do that)", "repo": "https://github.com/fort-ind/uwp", "demo": "https://github.com/fort-ind/uwp/releases"}]...
|
[{"post_id": 81526, "ts": "202 [{"post_id": 81526, "ts": "2026-10-21T16:05:51Z", "hours": 32.2781, "text": "honestly been a while since i worked on this project.. but i bulit a lot (and learned how to not break a sharkey instance) these past few months ive been learning how to push content to a live tile :) i did also try out getting the windows share and ink apis to work.. a bunch of trial and error but now i can see i have inking support i got a lot more ideas to work on soon."}]...
|
Title: fort.desktop by @ryni | Stardance
Devlogs: Title: fort.desktop by @ryni | Stardance
Devlogs:
honestly been a while since i worked on this project.. but i bulit a lot (and learned how to not break a sharkey instance) these past few months ive been learning how to push content to a live tile :) i did also try out getting the windows share and ink apis to work.. a bunch of trial and error but now i can see i have inking support i got a lot more ideas to work on soon.
Ships:
this is fort.desktop! a tiny little client for fort.ind (my own game archive/sharkey instance) its made in universal windows platform and C# it has a couple features like browsing the fort.ind game archive, logging in with a fort.social account and browsing the instance and making posts! (that was tha hardest thing to get working) and live tiles. so like.. how do you use this since uwp apps are a core part of windows, all you need is ti extract the zip install the cert and click the .msix file and install from there (i also made a tiny script to speed up install if you dont wanna do that)...
|
1792601222.781931
|
1792687622.781931
|
|
57689
|
very cool personal website by @estevao | Stardance
|
estevao
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T16:18:14Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "a website for me to put my thoughts and stuff :) it has topics and tabs, like a personal forum just for me", "repo": "https://github.com/EAlbqrq/personal-website", "demo": "https://ealbqrq.github.io/personal-website/"}]...
|
[{"post_id": 81530, "ts": "202 [{"post_id": 81530, "ts": "2026-10-21T16:17:00Z", "hours": 1.1897, "text": "finalized layout"}, {"post_id": 61862, "ts": "2026-09-05T00:04:19Z", "hours": 1.3972, "text": "It’s been quite the work but it’s fun to learn html and css :) (spent 2 hours to learn how to center the whole thing)"}]...
|
Title: very cool personal website by @estevao | St Title: very cool personal website by @estevao | Stardance
Devlogs:
It’s been quite the work but it’s fun to learn html and css :) (spent 2 hours to learn how to center the whole thing)
finalized layout
Ships:
a website for me to put my thoughts and stuff :) it has topics and tabs, like a personal forum just for me...
|
1792716732.1149776
|
1792803132.1149776
|
|
19459
|
BLarm by @mygulash | Stardance
|
mygulash
|
0
|
7.78
|
0
|
[]
|
[{"post_id": 81537, "ts": "202 [{"post_id": 81537, "ts": "2026-10-21T16:44:43Z", "hours": 7.7839, "text": "Blarm aka Bee alarm 🐝🐝🐝 I have built the schematic and the case now my goal is to ship it to receive the parts so i can actually build it irl!"}]...
|
Title: BLarm by @mygulash | Stardance
Devlogs:
Bl Title: BLarm by @mygulash | Stardance
Devlogs:
Blarm aka Bee alarm 🐝🐝🐝 I have built the schematic and the case now my goal is to ship it to receive the parts so i can actually build it irl!...
|
1792691232.0812912
|
1793296032.0812912
|
|
8880
|
Where the Meteor at by @adwitya | Stardance
|
adwitya
|
1
|
3.34
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T21:02:17Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a meteor predictor to innovate i ask user for location and they can have the list meteor and best viewing time and angle i used other parameter such as pollution light in surrounding and aqi to improve output Using flask for the first time was challenging ai eased the pain a bit but surely there were times where i regretted the project but at the end i loved it as any Hollywood film would say i am proud that i was able to move outside my comfort zone and make a project with real parameters and make a io project that may actually help a niche amount of people i tested most of the edge cases using ai for debugging but if occurs please do a pr or publish an issue would love to look into it the code is clean readable and was mentored by me as the v0 and v1 code was mainly written by me", "repo": "https://github.com/AdwityaIO/WhereTheMeteorAt", "demo": "https://where-the-meteor-at.vercel.app/"}]...
|
[{"post_id": 81543, "ts": "202 [{"post_id": 81543, "ts": "2026-10-21T17:02:52Z", "hours": 0.2731, "text": "made a new wiki type page where people can find more about the type of comet they want to know about and also learned how to handle multiple pages at once in a vercel site"}, {"post_id": 80478, "ts": "2026-10-17T19:49:34Z", "hours": 2.0719, "text": "when i started Where the Meteor at , the idea was pretty straightforward : ask for someone’s location , account for the condition in their sky ,and tell them how many meteors they could realistically see instead of just throwing the theoretical ZHR at them. The first couple of sessions were mostly about figuring out the logic and getting the Flask backend to work . I was learning as i went , breaking things , debugging them , and occasionally wondering why did i even pick this project because of the back and forth but i finally gave the UI the project Deserved. The redesign I took a lot of inspiration from Teenage Engineering’s Industrial design language . I wanted the interface to feel like a scientific instrument rather than another generic AI dashboard as it looked before . SO i went with a warm off-white background ,near-black text and a sharp orange accent .Syne handles the big heading while jetbrains mono gives the measurement and data a technical , instrument-panel feel. I also re-worked the layout around how someone would actually use the tool . Location search and sky condition sit in their sidebar , while the meteor shower gets the main stage . The estimated meteor count is the first thing you notice and the more detailed information stays tucked inside expandable rows until you need it . those rows contain things like radiant altitude , viewing direction air quality and the best viewing window .I also kept the hourly chart so you can get a better idea of how the condition change instead of relying on one number . The goal was to make the interface feel engineered not just decorated. No unnecessary elements ; just a strong grid , deliberate typography , and i especially love the orange accents Conclusion This project has been a bit out of my comfort zone i started out learning and experimenting with Flask , and ended up with a project that combines astronomy environmental data , calculation and interface design. The direction the UI took was amazing .It finally feels like a coherent product instead of a collection of features i managed to get working. The next step is to finish the final check , update the documentation , and ship it If you spot a bug or have an idea for improving the prediction ; feel free to open an issue or submit a PR. I’d genuinely love to see what people do with it"}, {"post_id": 18628, "ts": "2026-06-29T20:28:58Z", "hours": 0.7372, "text": "man i love vibe coding was just learning here and there how to vibe code trying get along it and seeing ,did a bit of ammature practice"}, {"post_id": 14142, "ts": "2026-06-23T03:58:58Z", "hours": 0.4519, "text": "first devlog this is going to be about how this project is gonna be traced firstly i would scrap the comets and hardcode them into my dataset then i would make a engine that would calculate showers and predict them I’m using flask as I’m proficient in python to connect it to a html and then i would calculate how much meteor is visible ,viable angle using parameter like aqi sky clarity and latitude longitude i would later add dynamic location picker using map (in v0 u need to log latitude and longitude manually)"}]...
|
Title: Where the Meteor at by @adwitya | Stardance Title: Where the Meteor at by @adwitya | Stardance
Devlogs:
first devlog this is going to be about how this project is gonna be traced firstly i would scrap the comets and hardcode them into my dataset then i would make a engine that would calculate showers and predict them I’m using flask as I’m proficient in python to connect it to a html and then i would calculate how much meteor is visible ,viable angle using parameter like aqi sky clarity and latitude longitude i would later add dynamic location picker using map (in v0 u need to log latitude and longitude manually)
man i love vibe coding was just learning here and there how to vibe code trying get along it and seeing ,did a bit of ammature practice
when i started Where the Meteor at , the idea was pretty straightforward : ask for someone’s location , account for the condition in their sky ,and tell them how many meteors they could realistically see instead of just throwing the theoretical ZHR at them. The first couple of sessions were mostly about figuring out the logic and getting the Flask backend to work . I was learning as i went , breaking things , debugging them , and occasionally wondering why did i even pick this project because of the back and forth but i finally gave the UI the project Deserved. The redesign I took a lot of inspiration from Teenage Engineering’s Industrial design language . I wanted the interface to feel like a scientific instrument rather than another generic AI dashboard as it looked before . SO i went with a warm off-white background ,near-black text and a sharp orange accent .Syne handles the big heading while jetbrains mono gives the measurement and data a technical , instrument-panel feel. I also re-worked the layout around how someone would actually use the tool . Location search and sky condition sit in their sidebar , while the meteor shower gets the main stage . The estimated meteor count is the first thing you notice and the more detailed information stays tucked inside expandable rows until you need it . those rows contain things like radiant altitude , viewing direction air quality and the best viewing window .I also kept the hourly chart so you can get a better idea of how the condition change instead of relying on one number . The goal was to make the interface feel engineered not just decorated. No unnecessary elements ; just a strong grid , deliberate typography , and i especially love the orange accents Conclusion This project has been a bit out of my comfort zone i started out learning and experimenting with Flask , and ended up with a project that combines astronomy environmental data , calculation and interface design. The direction the UI took was amazing .It finally feels like a coherent product instead of a collection of features i managed to get working. The next step is to finish the final check , update the documentation , and ship it If you spot a bug or have an idea for improving the prediction ; feel free to open an issue or submit a PR. I’d genuinely love to see what people do with it
made a new wiki type page where people can find more about the type of comet they want to know about and also learned how to handle multiple pages at once in a vercel site
Ships:
i made a meteor predictor to innovate i ask user for location and they can have the list meteor and best viewing time and angle i used other parameter such as pollution light in surrounding and aqi to improve output Using flask for the first time was challenging ai eased the pain a bit but surely there were times where i regretted the project but at the end i loved it as any Hollywood film would say i am proud that i was able to move outside my comfort zone and make a project with real parameters and make a io project that may actually help a niche amount of people i tested most of the edge cases using ai for debugging but if occurs please do a pr or publish an issue would love to look into it the code is clean readable and was mentored by me as the v0 and v1 code was mainly written by me...
|
1792810414.7422664
|
1792896814.7422664
|
|
59545
|
lexi OS by @IcedThrower_95 | Stardance
|
IcedThrower_95
|
0
|
3.14
|
0
|
[]
|
[{"post_id": 81545, "ts": "202 [{"post_id": 81545, "ts": "2026-10-21T17:08:54Z", "hours": 3.1431, "text": "In the 3 hours I worked, I built four apps A very simple wallpaper storage app Next, I made a notes app - I first built simple notes in the notes app, then I realised, why don’t we add relationships between each node like in an artificial neural network, so I did, for which I took help from AI I built a translator app which converts select languages for now. The final one is a currency converter, which as of now has 5 currencies. Tomorrow I will be working on improving these apps, this is just the first iteration hehehe"}, {"post_id": 71816, "ts": "2026-09-21T16:30:34Z", "hours": 0.0, "text": "#devlog 3 , I just fiddled around with the music player adding more features to it making it a unique player out there in a webos"}, {"post_id": 71327, "ts": "2026-09-20T17:08:03Z", "hours": 0.0, "text": "last two days, i spent my time building the apps calculator and the music player and fiddling with the styling of the apps, still a little confused in my head. any suggestion on what amount of blur is ideal is much appreciated"}, {"post_id": 70179, "ts": "2026-09-18T17:04:03Z", "hours": 0.0, "text": "#devlog1 today i spent time working and learning to implement the dock and the mouse movements for the draggable windows, for now i am using the the mac os style, after developing my own UI in figma I hope to change it. The style i am is a blend of GlassMorphism and Neumorphism. And also i develop the icon is figma but i wasn’t quite able to fit them properly, will look into it tomorrow. For now thats it guys"}]...
|
Title: lexi OS by @IcedThrower_95 | Stardance
Dev Title: lexi OS by @IcedThrower_95 | Stardance
Devlogs:
#devlog1 today i spent time working and learning to implement the dock and the mouse movements for the draggable windows, for now i am using the the mac os style, after developing my own UI in figma I hope to change it. The style i am is a blend of GlassMorphism and Neumorphism. And also i develop the icon is figma but i wasn’t quite able to fit them properly, will look into it tomorrow. For now thats it guys
last two days, i spent my time building the apps calculator and the music player and fiddling with the styling of the apps, still a little confused in my head. any suggestion on what amount of blur is ideal is much appreciated
#devlog 3 , I just fiddled around with the music player adding more features to it making it a unique player out there in a webos
In the 3 hours I worked, I built four apps A very simple wallpaper storage app Next, I made a notes app - I first built simple notes in the notes app, then I realised, why don’t we add relationships between each node like in an artificial neural network, so I did, for which I took help from AI I built a translator app which converts select languages for now. The final one is a currency converter, which as of now has 5 currencies. Tomorrow I will be working on improving these apps, this is just the first iteration hehehe...
|
1792803119.8894753
|
1793407919.8894753
|
|
63863
|
Antelope-Hackclub Website by @inatlusnamor | Stard Antelope-Hackclub Website by @inatlusnamor | Stardance...
|
inatlusnamor
|
2
|
17.0
|
123
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T17:23:05Z", "hours": 7.0, "multiplier": 14.42, "payout": 108, "blessing": "neutral", "text": "I made a club website where my club members can find resources and learn about our website. A cool feature that I added is that my discord bot is integrated into my website. I can add things to the gallery and to the guides via our discord server. I am really proud of that!", "repo": "https://github.com/Romanhery/Antelope-Hackclub-Website", "demo": "https://antelope-hackclub.vercel.app/"}, {"ship_num": 2, "ts": "2026-09-20T17:15:15Z", "hours": 10.0, "multiplier": 2.84, "payout": 15, "blessing": "neutral", "text": "We made our own website for our Hackclub Chapter . The parts that were challenging were the merge conflicts and the commits. Another thing that was challenging was integrating our discord bot into the gallery because it was my first time using a discord bot and other 3rd party libraries in python so I actually learned alot. If you want to try the project you have to join the discord server and go the gallery text channel and type in /add-gallery and type in your paramenters and then it will add it to the gallery section in our website!", "repo": "https://github.com/Romanhery/Antelope-Hackclub-Website", "demo": "https://antelope-hackclub.vercel.app/"}]...
|
[{"post_id": 81548, "ts": "202 [{"post_id": 81548, "ts": "2026-10-21T17:19:47Z", "hours": 4.4219, "text": "I reworked the whole entire website Features I added were the ui I made it look better I also added the current programs we are running and thats it"}, {"post_id": 74770, "ts": "2026-09-28T06:30:59Z", "hours": 1.7292, "text": "Devlog #4 I added some features that people in my last ship said I should do and some that I wanted to do. Additions Added navbar across all pages I made the gallery and guide images on the cards actually fill their container instead of the old one cropped I also changed the join community link to the discord because that is where everyone is I also added a styles.css for each page because one styles.css was very hard to navigate and was tangled a lot Challenges I faced It was hard to code the css all over again and I had major setbacks, the things that were hard were the sizing and the layout if you touch one thing another thing moves so PHEW I finished that. Future Plans Fixing up the events page and integrating my discord bot to add and remove events there also to ping everyone! Add more things to the home page Add more starter guides because that is a huge hassle I also wanna add a faq because some questions are already answered A members page Contact Page Some more I hope!"}, {"post_id": 73484, "ts": "2026-09-25T07:00:12Z", "hours": 1.3222, "text": "I am loggin my hours for today! I added a feature that moves the nav link up !"}, {"post_id": 70761, "ts": "2026-09-19T18:34:46Z", "hours": 9.6464, "text": "I added a function to my website where I can recieve json from a discord bot that can update my gallery and add cards to it ! Its now easier to add cards to my gallery easier than ever!"}]...
|
Title: Antelope-Hackclub Website by @inatlusnamor Title: Antelope-Hackclub Website by @inatlusnamor | Stardance
Devlogs:
I added a function to my website where I can recieve json from a discord bot that can update my gallery and add cards to it ! Its now easier to add cards to my gallery easier than ever!
I am loggin my hours for today! I added a feature that moves the nav link up !
Devlog #4 I added some features that people in my last ship said I should do and some that I wanted to do. Additions Added navbar across all pages I made the gallery and guide images on the cards actually fill their container instead of the old one cropped I also changed the join community link to the discord because that is where everyone is I also added a styles.css for each page because one styles.css was very hard to navigate and was tangled a lot Challenges I faced It was hard to code the css all over again and I had major setbacks, the things that were hard were the sizing and the layout if you touch one thing another thing moves so PHEW I finished that. Future Plans Fixing up the events page and integrating my discord bot to add and remove events there also to ping everyone! Add more things to the home page Add more starter guides because that is a huge hassle I also wanna add a faq because some questions are already answered A members page Contact Page Some more I hope!
I reworked the whole entire website Features I added were the ui I made it look better I also added the current programs we are running and thats it
Ships:
We made our own website for our Hackclub Chapter . The parts that were challenging were the merge conflicts and the commits. Another thing that was challenging was integrating our discord bot into the gallery because it was my first time using a discord bot and other 3rd party libraries in python so I actually learned alot. If you want to try the project you have to join the discord server and go the gallery text channel and type in /add-gallery and type in your paramenters and then it will add it to the gallery section in our website!
I made a club website where my club members can find resources and learn about our website. A cool feature that I added is that my discord bot is integrated into my website. I can add things to the gallery and to the guides via our discord server. I am really proud of that!...
|
1792814080.8371866
|
1792900480.8371866
|
|
36002
|
Shelf-fish by @Ansh904 | Stardance
|
Ansh904
|
0
|
67.69
|
0
|
[]
|
[{"post_id": 81554, "ts": "202 [{"post_id": 81554, "ts": "2026-10-21T17:48:39Z", "hours": 9.8519, "text": "5 days plan ready Self-fish devlog #11 (Very Important) So in the last devlog I had completed the add item screen, since then I have been making plans for the future of this app, and i think I am finally ready to reveal it. What have I done? Added tiers and a ration norm to the item and detection table, I will explain later in this devlog, what they do Made the whole backend more secure from wrong answers generated by gemini: since I am using gemini, there is a possiblity that it does not follow the schema I gave it, if that happens, the backend would crash, but now have added field validators for all crucial columns where the the model is most likely to generate wrong answers. While testing I also found out that at sometimes, the model would face a lot of traffic and it would return a 503 and the server crashed, but now the backend has 2 models, gemini-3.1-flash-lite and gemini-2.5-flash-lite, each with 5 retries. So if gemini-3.1-flash-lite, which was getting a lot of traffic, fails, the backend fallsback to 2.5, which I believe should have less traffic Also in the last devlog I had forgot the add tag button which I have added, I already had the function to add but I think the 25 day gap made me forgot that, I also added tiers to page but I still haven’t added ration_norm cuz I have to devlog first What’s the plan? A lot of people don’t actually know what communism is, so I will explain it first, communism is a stateless, moneyless and classless society where the people own the methods of production, It is a type of socialism that came into existence through Karl Marx So in true communist state, there is no money, therefore I dropped the price column from my items table. Instead I have divided everything into 3 categories: **1. Essentials - These items are basic necessities that are needed to surve, example: food, water, soap, clothes, etc. These would be distributed equally to everyone who uses the app, ie the people of the state. **2. Useful Items - These items are not necessary but they improve your quality of life, these include things like a normal mouse, a laptop, etc. These are not distributed equally, instead you have to write 2 lines, just 2 cuz I know when others would review my project, they wouldn’t want to write a whole para to check the working of my app, so those 2 lines would go to gemini once again and it would check if the person gets the item or not. 3. Wants - These items are not necessary and do not improve the quality of life, but they are important to satisfy the personal wishes of the user. These include top tier laptops, high end gaming mouses etc. For this I want to connect to hackatime, I had seen some project on stardance that connected to hackatime, so the plan would be to connect to hackatime and get the no. of hours coded by the user. These hours would be used as labor hours. Whenever the user wants to get these items with the want tier, they would give some of their labor hours to get their item along 2 lines to satisfy the model. So that’s how the app would work, I have just finished the first part of the app, this probably is the 2nd hardest part of the project, the next step would be to create a page where all the items are listed, this would be very easy but after that would be the hardest part of the project, it would be the form where the user can request the item. The images: Well they are both the same, As you can see I have Tiers and add button to this page, everything else is the same, there are 3 buttons (pressables) with the tiers, the default tier is selected by gemini, the user can change them, The ‘+’ button would be present next to the last tag, It can toggle adding, the user can then enter the tag name and press the + button next to the input field. The section below the tag selector displays the description of the tags."}, {"post_id": 81000, "ts": "2026-10-19T15:36:48Z", "hours": 9.7072, "text": "I spent 10 hrs on single page (screen) Shelf-fish Devlog # 10 I didn’t knew it would take that long So the add item page took around 10 hours to make, more than 10 hours if we include the time I spent 25 days ago to make it work, so here is what I have done: Completely change the design of the page, the previous design really sucked, It was there just so to make everything work, my previous self, for some reason, didn’t care about the design The new design uses something similar to drop-shadow except there is no box or drop/box shadow in native-wind, so i had to come up with a way to make my own, i used a self-closing View tag with absolute positioning, no inset and translated to some ammount with a background color… This offset View works as a drop shadow or box, it really doesn’t make difference here as I am working with rectangles. The Offset component worked when I using with a static color and size but for some parts of the design I needed different colors of shadow like the item image which uses red shadow or the tags which require small shadows as they themselves are pretty small. I made it dynamic by using inline css cuz native-wind calculates colors statically Though for some parts I didn’t used the component but used another View in the same way as the component cuz I was frustated and wanted flexibility which the component lacked at that time. The whole app now has a communist theme as explained in the previous devlog I have switched from using native-wind colors to using my own, these are the same i used for my earlier project I have also changed how inputs look, they really sucked previously as they didn’t had titles and the design was low effort too, now the title sits above the main input field and the input field has a sharp look with borders and drop-shadow The tags took the most amount of time, I tried so many designs, but all looked very repetitive with the inputs and I wanted them to fit in too. Also I needed to have 2 designs for the tags, as i have a button to toggle removing, when not removing the tags are small and cute but when you toggle removing, they become big so that it is easier to touch them. The final add button also took a lot of time, the same issue as the tags, since it is the main call-to-action, it needs to be unique, so I had to make it different, It incorporates all the three colors in the design, black, gold and black along with the communist logo. It also has 2 states, the normal state is what is in the attached screenshot, but when it is submitting the add request to the backend, it sticks to its shadow by translating to its shadow, i mean it just animation That’s it for this devlog, since the last devlog was very short, I had to compensate for that and I over-explained in this one The next steps would probably be to connect the detecting code to route to this page with the item object, and also work on the main distribution part which i think would be the hardest."}, {"post_id": 80296, "ts": "2026-10-17T05:20:55Z", "hours": 6.8294, "text": "Where I’ve been Soooooo It’s been 25 days since my last devlog, that means I haven’t coded for 25 days, the culprit for this is my exams, I literally have forgotten where I was in the project, also the hours associated with this devlog are also 25 days old, soo this devlog won’t tell you much, the only thing i remember is that I was making the add item page and it was working, i just had to do the ui for it. My next steps would be to figure out where I was and create some kind of plan to complete the project also since an inventory management app would not be unique, I want to give it my touch and make it communist, I would try to incorporate accuratee communist economy make this the inventory of the people."}, {"post_id": 72221, "ts": "2026-09-22T14:09:34Z", "hours": 5.5131, "text": "Ooopppss I exposed jwt tokens in github Shelf-fish Devlog #8 Yepp I exposed my jwt tokens in my github, but trust me I knew what I was doing, those tokens are long expired, my backend isn’t published yet and i will change the exposed passwords, which was 12345678, cuz why not Anyways I have done a lot things, in the last devlog, i had connected the frontend with the backend and made the detection endpoint work with the frontend. i had to manually type the authentication tokens cuz i had not set up auth in the frontend, but I have now fixed this Here’s what I have done: Created tokenStorage.js - it handles getting the tokens, saving them and clearing them using expo-secure-store, i used expo-secure-store cuz it saves tokens in keychains rather than files that makes them much less likely to leak or read by anyone/app/malwares Created authService.js - this one handles send the get and post requests for registering, logging in and getting current user data Added interceptors to Api, i am using a single api instance using axios.create() across the app, so i have added interceptors to attach auth tokens and check if they are valid or expired Created the login and register screens, they don’t look good now but will work on the ui after i get everything set up, I will make everything exist first, the designs can be taken care of afterwards I also created a new api route at ‘/users’, this one is responsible for getting user data, right now it just gets the user info but I think i would also make it update it… I also added navigation using react-navigation What’s next ? I haven’t finished the home screen yet, well nothing is finished yet, but the home screen just greets the user, i will add buttons to navigate to camera and upload components I will also create the item related pages, that will show all items and let the user create items after detecting the product The images: They look soo bad but as I said I will make everything exist first and then make the ui good The register page The login page, it’s not even filled yet, cuz i want to add text and a logo, i will create a logo too lol i forgot about that The home page, empty page with a greeting and a sign out button, it was made to check if everything is working or not"}, {"post_id": 71725, "ts": "2026-09-21T11:55:08Z", "hours": 6.1961, "text": "Frontend Connected Shelf-fish devlog # 7 In the last devlog, I had finished creating the detection logic using gemini api, after that I have done a lot of things and suffered a lot of headaches too What have I done?? Created api endpoints for detections at /detections and added it to the fastapi app. Added authentication dependency to the detection api so that only authenticated users can upload images and we can know who detects which item. Created the Camera and Upload image logic, I have used expo-camera and expo-imagepicker for that, it was pretty easy, expo’s docs are straight forward and I have used them before Created the uploading function that will send a post request containing the image to the backend. I also added storage fn to upload the captured/picked image to cloud using cloudinary. What’s next? Now I will work on the ui and create login and register screens cuz manually typing the authentication token to the uploading fn is really frustrating I also have an idea for this project which would make it very unique cuz at this point it just looks like just any other inventory management systems. The images- console log of the item after it was detected by gemini and saved to database, the image being displayed after clicking the url, the images in cloudinary, the other one is stock image and was there automatically."}, {"post_id": 70482, "ts": "2026-09-19T08:27:30Z", "hours": 5.4297, "text": "Detection Working!!! Shelf-fish Devlog #6 TL;DR What have done? Created a basic jwt auth Used Gemini Api and Gemini 3.1 Flash Lite to create the product detection logic What’s next? I will now make api routes for detection that would output the brand, item name and category of the item Got lots of time? Sooo the auth and detection logic is complete, we are now close to ending the backend, earlier after dropping the plan of using a classification model, I had decided to use an ocr to detect text from the input photo and then use that text as an input for openai api and ask it to identify the brand name, item name and category from the image, but since I am broke , I couldn’t use openai api as it costs money and then learned that gemini has free api plans that include multi-modal inputs like images and give out text, so I swited to that and it works flawlessly, the rate limits are also generous, at 500 requests per day and 15 per minute. I tested it with 6 text images and it gave 100% acc but the sample size is pretty small to say that it is 100% accurate, but it does work. The detection logic, at this point, is just a function, i need to make api routes for that and add a detection log table, the log table would be useful at providing data about rate limits and is also nice to have if the project get bigger, I also have to make a list of categories out of which gemini would choose the category of the product cuz at this point, it outputs anything it likes as a category"}, {"post_id": 69694, "ts": "2026-09-17T16:22:17Z", "hours": 3.2419, "text": "Backend is Up Shelf-fish Devlog #5 What have I done?? Set up FastAPI and SQLModel - I have successfully connected and set up the backend with the database, I am using neon’s postgres db Created Item table - I also created the first table of item, it has the following columns- Name, id, quantity, category and price Set up CRUD - set up basic crud end points for the item table What’s next?? I will now create auth using pyjwt and passlib Next I will work on the core mechanism for extracting name from the product image using ocr"}, {"post_id": 69500, "ts": "2026-09-17T06:01:39Z", "hours": 1.8783, "text": "Dropping the plan Shelf-fish Devlog #4 Heyy gng, since the past few days I have been just editing and reviewing images and they don’t seem to finish any time soon but stardance is finishing soon and I want to finish this project before that so I am dropping the workplan of using a classification model for identifying items That approach was flawed, I had not thought about that earlier instead I was biased by my previous successful project using the classification approach to identify pokemon I think a better approach would be to use an ocr and then ask an llm to parse that into brand name, item name and weight and other things Despite the my orignal plan failing, I want to highlight that engineering, in all forms, is itterative, no one finds the solution to the problem in their first try and the things I have made before, ie- my scraper, is not obselete at all, it works so good, like it scraped 150k images in 6 hours, that’s really insane and very useful too, I will make it as another seperate project in the future cuz I think it deserves some more recognition and will improve it too first 3 images- images of clean dataset, products are cropped and all noises are deleted last image - for comparison, an unclean dataset, a lot of noises in it like people and some images dont even have the product"}, {"post_id": 67508, "ts": "2026-09-13T17:04:56Z", "hours": 4.1303, "text": "Who is Who - Shelf-Fish devlog #3 There were so many duplicate images So in the last devlog, I told my scraper scraped nearly 150k images, but when I began cleaning them I noticed a lot of images were exact duplicates, I thought it was just for a class or two but It was for every single one of them , except Oreo After manually cleaning 14 classes with duplicates, I gave up, and decided to use python to delete duplicates, I used hashlib and md5 hash to detect exact duplicate images inside all folders of my root train images folder which each represent one class, and I used os.remove to delete those duplicates. I ended up deleting around 34k images which brings my dataset from 150k to 100k images, but this would change too cuz the 100k maybe unique but they still have a lot of discrepencies, like random products and all. I also used matplotlib to plot a graph of the images remaining, and the results dont look good for a few classes which have now less than 300 images, others are in range 500 - 800, remember they were around 1100 images earlier, so around 800 images were duplicates of the remaining 300. I know what’s causing this, multiple search queries, since google images only displays a fixed 400 images per search, I made my scraper in a way that it searches for the same product multiple times but with a different query which causes popular images to be duplicates One more thing, the dataset would not only decrease in number, but after cleaning the images, I would augment them which would drastically increase the number of images and also make the model less likely to overfit. Also the graph is really ugly cuz there are like 130 classes on the x axis and they dont really fit well and I am not an expert in pyplot so I dont know how to make it look good"}, {"post_id": 64891, "ts": "2026-09-09T16:30:10Z", "hours": 5.8064, "text": "Shelf-Fish Devlog #2 My Scraper is on steroids !!! I scraped 150,000 images Yooooo guys the scraper worked too good now, it scraped roughly 150,000 images in just 6 hours , that is insane, the speed was around 7 images per second or 420 images per minute, that is really crazy, my old scraper took a full day for 75k images, this is like a million times faster!!! In the last devlog, I acheived a speed of around 1079 images in 10 minutes or around 100 images per hour, so since then I have made it 4x times faster. Here’s what I did: Added premature scrolling - earlier the scraper would miss a lot of images or would wait for a long period of time for the images to load and then scroll, but now as soon as the main div appears on the screen, the scraper scrolls down a bit triggering lazy load instantly and then scrolls down to the bottom triggering te lazy load 2 times in a cycle, this made the whole scrolling thing so much quicker. Fixed downloads not cancelling - I am storing some extra urls so that if one or more of the urls failed to download, I have backup for completing the target, but I am using a ThreadPoolExecutor to download images concurrently, when it reaches the target the executor used to just break but this didnt prevent it from downloading all other images stored in my array even tho they aren’t saved on the disc, this caused the scraper to wait indefinitely for a long time, since it now has to fetch double or sometimes more the amount, but I have now fixed that Next steps? I will now clean the dataset, and since by cleaning the dataset I am actively contributing to the completion of the project, I have got permission to use lapse to record that time"}, {"post_id": 57888, "ts": "2026-08-30T06:43:01Z", "hours": 9.1103, "text": "Shelf-Fish Devlog #1 What is Shelf-Fish? It is a computer vision based cross platform inventory management and billing system that I am making with react native as frontend and probably a fastapi backend. How will the project work? The project would be made in several phases that are listed below: Phase 01 - Scraper In this phase I will make a fast scraper with selenium that would scrape 1000-1500 images for over 130 grocery items that I have listed. Phase 02 - Training In this phase I would clean the dataset and train the model!! Phase 03 - Backend I would build a basic cors backend in fastapi and add some user relations Phase 04 - Frontend This phase involves building a cross platform fronend with react native. Phase 05 - ESP 32 This one is not confirmed yet, but if i get the time, instead of using a phone, I would use the esp 32 and esp32 cam to register objects and create bills, or perhaps I should make this the main focus of the project and make this a hardware project, I am still not sure. What have I done till now? I am modifying my old scraper that I used for my previous pokedex project, which was very very slow, I have changed it completely, It now directly goes to the image search url instead of going to google.images.com and then manually typing the words. It now also downloads images concurrently using the ThreadPoolExecutor , earlier this part was the slowest but in just 2 seconds, it downloads 125 images, But it is still pretty slow, It took over 10 min to scrape 1079 images, and it was a bit short of the 1125 target images which is due to slow network that caused the images to not load. For the next devlog I will try to make it sub 8 min or faster"}]...
|
Title: Shelf-fish by @Ansh904 | Stardance
Devlogs Title: Shelf-fish by @Ansh904 | Stardance
Devlogs:
Shelf-Fish Devlog #1 What is Shelf-Fish? It is a computer vision based cross platform inventory management and billing system that I am making with react native as frontend and probably a fastapi backend. How will the project work? The project would be made in several phases that are listed below: Phase 01 - Scraper In this phase I will make a fast scraper with selenium that would scrape 1000-1500 images for over 130 grocery items that I have listed. Phase 02 - Training In this phase I would clean the dataset and train the model!! Phase 03 - Backend I would build a basic cors backend in fastapi and add some user relations Phase 04 - Frontend This phase involves building a cross platform fronend with react native. Phase 05 - ESP 32 This one is not confirmed yet, but if i get the time, instead of using a phone, I would use the esp 32 and esp32 cam to register objects and create bills, or perhaps I should make this the main focus of the project and make this a hardware project, I am still not sure. What have I done till now? I am modifying my old scraper that I used for my previous pokedex project, which was very very slow, I have changed it completely, It now directly goes to the image search url instead of going to google.images.com and then manually typing the words. It now also downloads images concurrently using the ThreadPoolExecutor , earlier this part was the slowest but in just 2 seconds, it downloads 125 images, But it is still pretty slow, It took over 10 min to scrape 1079 images, and it was a bit short of the 1125 target images which is due to slow network that caused the images to not load. For the next devlog I will try to make it sub 8 min or faster
Shelf-Fish Devlog #2 My Scraper is on steroids !!! I scraped 150,000 images Yooooo guys the scraper worked too good now, it scraped roughly 150,000 images in just 6 hours , that is insane, the speed was around 7 images per second or 420 images per minute, that is really crazy, my old scraper took a full day for 75k images, this is like a million times faster!!! In the last devlog, I acheived a speed of around 1079 images in 10 minutes or around 100 images per hour, so since then I have made it 4x times faster. Here’s what I did: Added premature scrolling - earlier the scraper would miss a lot of images or would wait for a long period of time for the images to load and then scroll, but now as soon as the main div appears on the screen, the scraper scrolls down a bit triggering lazy load instantly and then scrolls down to the bottom triggering te lazy load 2 times in a cycle, this made the whole scrolling thing so much quicker. Fixed downloads not cancelling - I am storing some extra urls so that if one or more of the urls failed to download, I have backup for completing the target, but I am using a ThreadPoolExecutor to download images concurrently, when it reaches the target the executor used to just break but this didnt prevent it from downloading all other images stored in my array even tho they aren’t saved on the disc, this caused the scraper to wait indefinitely for a long time, since it now has to fetch double or sometimes more the amount, but I have now fixed that Next steps? I will now clean the dataset, and since by cleaning the dataset I am actively contributing to the completion of the project, I have got permission to use lapse to record that time
Who is Who - Shelf-Fish devlog #3 There were so many duplicate images So in the last devlog, I told my scraper scraped nearly 150k images, but when I began cleaning them I noticed a lot of images were exact duplicates, I thought it was just for a class or two but It was for every single one of them , except Oreo After manually cleaning 14 classes with duplicates, I gave up, and decided to use python to delete duplicates, I used hashlib and md5 hash to detect exact duplicate images inside all folders of my root train images folder which each represent one class, and I used os.remove to delete those duplicates. I ended up deleting around 34k images which brings my dataset from 150k to 100k images, but this would change too cuz the 100k maybe unique but they still have a lot of discrepencies, like random products and all. I also used matplotlib to plot a graph of the images remaining, and the results dont look good for a few classes which have now less than 300 images, others are in range 500 - 800, remember they were around 1100 images earlier, so around 800 images were duplicates of the remaining 300. I know what’s causing this, multiple search queries, since google images only displays a fixed 400 images per search, I made my scraper in a way that it searches for the same product multiple times but with a different query which causes popular images to be duplicates One more thing, the dataset would not only decrease in number, but after cleaning the images, I would augment them which would drastically increase the number of images and also make the model less likely to overfit. Also the graph is really ugly cuz there are like 130 classes on the x axis and they dont really fit well and I am not an expert in pyplot so I dont know how to make it look good
Dropping the plan Shelf-fish Devlog #4 Heyy gng, since the past few days I have been just editing and reviewing images and they don’t seem to finish any time soon but stardance is finishing soon and I want to finish this project before that so I am dropping the workplan of using a classification model for identifying items That approach was flawed, I had not thought about that earlier instead I was biased by my previous successful project using the classification approach to identify pokemon I think a better approach would be to use an ocr and then ask an llm to parse that into brand name, item name and weight and other things Despite the my orignal plan failing, I want to highlight that engineering, in all forms, is itterative, no one finds the solution to the problem in their first try and the things I have made before, ie- my scraper, is not obselete at all, it works so good, like it scraped 150k images in 6 hours, that’s really insane and very useful too, I will make it as another seperate project in the future cuz I think it deserves some more recognition and will improve it too first 3 images- images of clean dataset, products are cropped and all noises are deleted last image - for comparison, an unclean dataset, a lot of noises in it like people and some images dont even have the product
Backend is Up Shelf-fish Devlog #5 What have I done?? Set up FastAPI and SQLModel - I have successfully connected and set up the backend with the database, I am using neon’s postgres db Created Item table - I also created the first table of item, it has the following columns- Name, id, quantity, category and price Set up CRUD - set up basic crud end points for the item table What’s next?? I will now create auth using pyjwt and passlib Next I will work on the core mechanism for extracting name from the product image using ocr
Detection Working!!! Shelf-fish Devlog #6 TL;DR What have done? Created a basic jwt auth Used Gemini Api and Gemini 3.1 Flash Lite to create the product detection logic What’s next? I will now make api routes for detection that would output the brand, item name and category of the item Got lots of time? Sooo the auth and detection logic is complete, we are now close to ending the backend, earlier after dropping the plan of using a classification model, I had decided to use an ocr to detect text from the input photo and then use that text as an input for openai api and ask it to identify the brand name, item name and category from the image, but since I am broke , I couldn’t use openai api as it costs money and then learned that gemini has free api plans that include multi-modal inputs like images and give out text, so I swited to that and it works flawlessly, the rate limits are also generous, at 500 requests per day and 15 per minute. I tested it with 6 text images and it gave 100% acc but the sample size is pretty small to say that it is 100% accurate, but it does work. The detection logic, at this point, is just a function, i need to make api routes for that and add a detection log table, the log table would be useful at providing data about rate limits and is also nice to have if the project get bigger, I also have to make a list of categories out of which gemini would choose the category of the product cuz at this point, it outputs anything it likes as a category
Frontend Connected Shelf-fish devlog # 7 In the last devlog, I had finished creating the detection logic using gemini api, after that I have done a lot of things and suffered a lot of headaches too What have I done?? Created api endpoints for detections at /detections and added it to the fastapi app. Added authentication dependency to the detection api so that only authenticated users can upload images and we can know who detects which item. Created the Camera and Upload image logic, I have used expo-camera and expo-imagepicker for that, it was pretty easy, expo’s docs are straight forward and I have used them before Created the uploading function that will send a post request containing the image to the backend. I also added storage fn to upload the captured/picked image to cloud using cloudinary. What’s next? Now I will work on the ui and create login and register screens cuz manually typing the authentication token to the uploading fn is really frustrating I also have an idea for this project which would make it very unique cuz at this point it just looks like just any other inventory management systems. The images- console log of the item after it was detected by gemini and saved to database, the image being displayed after clicking the url, the images in cloudinary, the other one is stock image and was there automatically.
Ooopppss I exposed jwt tokens in github Shelf-fish Devlog #8 Yepp I exposed my jwt tokens in my github, but trust me I knew what I was doing, those tokens are long expired, my backend isn’t published yet and i will change the exposed passwords, which was 12345678, cuz why not Anyways I have done a lot things, in the last devlog, i had connected the frontend with the backend and made the detection endpoint work with the frontend. i had to manually type the authentication tokens cuz i had not set up auth in the frontend, but I have now fixed this Here’s what I have done: Created tokenStorage.js - it handles getting the tokens, saving them and clearing them using expo-secure-store, i used expo-secure-store cuz it saves tokens in keychains rather than files that makes them much less likely to leak or read by anyone/app/malwares Created authService.js - this one handles send the get and post requests for registering, logging in and getting current user data Added interceptors to Api, i am using a single api instance using axios.create() across the app, so i have added interceptors to attach auth tokens and check if they are valid or expired Created the login and register screens, they don’t look good now but will work on the ui after i get everything set up, I will make everything exist first, the designs can be taken care of afterwards I also created a new api route at ‘/users’, this one is responsible for getting user data, right now it just gets the user info but I think i would also make it update it… I also added navigation using react-navigation What’s next ? I haven’t finished the home screen yet, well nothing is finished yet, but the home screen just greets the user, i will add buttons to navigate to camera and upload components I will also create the item related pages, that will show all items and let the user create items after detecting the product The images: They look soo bad but as I said I will make everything exist first and then make the ui good The register page The login page, it’s not even filled yet, cuz i want to add text and a logo, i will create a logo too lol i forgot about that The home page, empty page with a greeting and a sign out button, it was made to check if everything is working or not
Where I’ve been Soooooo It’s been 25 days since my last devlog, that means I haven’t coded for 25 days, the culprit for this is my exams, I literally have forgotten where I was in the project, also the hours associated with this devlog are also 25 days old, soo this devlog won’t tell you much, the only thing i remember is that I was making the add item page and it was working, i just had to do the ui for it. My next steps would be to figure out where I was and create some kind of plan to complete the project also since an inventory management app would not be unique, I want to give it my touch and make it communist, I would try to incorporate accuratee communist economy make this the inventory of the people.
I spent 10 hrs on single page (screen) Shelf-fish Devlog # 10 I didn’t knew it would take that long So the add item page took around 10 hours to make, more than 10 hours if we include the time I spent 25 days ago to make it work, so here is what I have done: Completely change the design of the page, the previous design really sucked, It was there just so to make everything work, my previous self, for some reason, didn’t care about the design The new design uses something similar to drop-shadow except there is no box or drop/box shadow in native-wind, so i had to come up with a way to make my own, i used a self-closing View tag with absolute positioning, no inset and translated to some ammount with a background color… This offset View works as a drop shadow or box, it really doesn’t make difference here as I am working with rectangles. The Offset component worked when I using with a static color and size but for some parts of the design I needed different colors of shadow like the item image which uses red shadow or the tags which require small shadows as they themselves are pretty small. I made it dynamic by using inline css cuz native-wind calculates colors statically Though for some parts I didn’t used the component but used another View in the same way as the component cuz I was frustated and wanted flexibility which the component lacked at that time. The whole app now has a communist theme as explained in the previous devlog I have switched from using native-wind colors to using my own, these are the same i used for my earlier project I have also changed how inputs look, they really sucked previously as they didn’t had titles and the design was low effort too, now the title sits above the main input field and the input field has a sharp look with borders and drop-shadow The tags took the most amount of time, I tried so many designs, but all looked very repetitive with the inputs and I wanted them to fit in too. Also I needed to have 2 designs for the tags, as i have a button to toggle removing, when not removing the tags are small and cute but when you toggle removing, they become big so that it is easier to touch them. The final add button also took a lot of time, the same issue as the tags, since it is the main call-to-action, it needs to be unique, so I had to make it different, It incorporates all the three colors in the design, black, gold and black along with the communist logo. It also has 2 states, the normal state is what is in the attached screenshot, but when it is submitting the add request to the backend, it sticks to its shadow by translating to its shadow, i mean it just animation That’s it for this devlog, since the last devlog was very short, I had to compensate for that and I over-explained in this one The next steps would probably be to connect the detecting code to route to this page with the item object, and also work on the main distribution part which i think would be the hardest.
5 days plan ready Self-fish devlog #11 (Very Important) So in the last devlog I had completed the add item screen, since then I have been making plans for the future of this app, and i think I am finally ready to reveal it. What have I done? Added tiers and a ration norm to the item and detection table, I will explain later in this devlog, what they do Made the whole backend more secure from wrong answers generated by gemini: since I am using gemini, there is a possiblity that it does not follow the schema I gave it, if that happens, the backend would crash, but now have added field validators for all crucial columns where the the model is most likely to generate wrong answers. While testing I also found out that at sometimes, the model would face a lot of traffic and it would return a 503 and the server crashed, but now the backend has 2 models, gemini-3.1-flash-lite and gemini-2.5-flash-lite, each with 5 retries. So if gemini-3.1-flash-lite, which was getting a lot of traffic, fails, the backend fallsback to 2.5, which I believe should have less traffic Also in the last devlog I had forgot the add tag button which I have added, I already had the function to add but I think the 25 day gap made me forgot that, I also added tiers to page but I still haven’t added ration_norm cuz I have to devlog first What’s the plan? A lot of people don’t actually know what communism is, so I will explain it first, communism is a stateless, moneyless and classless society where the people own the methods of production, It is a type of socialism that came into existence through Karl Marx So in true communist state, there is no money, therefore I dropped the price column from my items table. Instead I have divided everything into 3 categories: **1. Essentials - These items are basic necessities that are needed to surve, example: food, water, soap, clothes, etc. These would be distributed equally to everyone who uses the app, ie the people of the state. **2. Useful Items - These items are not necessary but they improve your quality of life, these include things like a normal mouse, a laptop, etc. These are not distributed equally, instead you have to write 2 lines, just 2 cuz I know when others would review my project, they wouldn’t want to write a whole para to check the working of my app, so those 2 lines would go to gemini once again and it would check if the person gets the item or not. 3. Wants - These items are not necessary and do not improve the quality of life, but they are important to satisfy the personal wishes of the user. These include top tier laptops, high end gaming mouses etc. For this I want to connect to hackatime, I had seen some project on stardance that connected to hackatime, so the plan would be to connect to hackatime and get the no. of hours coded by the user. These hours would be used as labor hours. Whenever the user wants to get these items with the want tier, they would give some of their labor hours to get their item along 2 lines to satisfy the model. So that’s how the app would work, I have just finished the first part of the app, this probably is the 2nd hardest part of the project, the next step would be to create a page where all the items are listed, this would be very easy but after that would be the hardest part of the project, it would be the form where the user can request the item. The images: Well they are both the same, As you can see I have Tiers and add button to this page, everything else is the same, there are 3 buttons (pressables) with the tiers, the default tier is selected by gemini, the user can change them, The ‘+’ button would be present next to the last tag, It can toggle adding, the user can then enter the tag name and press the + button next to the input field. The section below the tag selector displays the description of the tags....
|
1792659126.2009447
|
1793263926.2009447
|
|
57852
|
-4Y: Frustrations by @birbuh | Stardance
|
birbuh
|
0
|
21.83
|
0
|
[]
|
[{"post_id": 81555, "ts": "202 [{"post_id": 81555, "ts": "2026-10-21T17:51:54Z", "hours": 1.8128, "text": "Alpha Devlog 9: note: don’t let me do textures again I added a better representation of what’s going on (I think) Now you know when the engines/weapons are broken! Also: Added adding ships; Fixed ship just flying in circles after defeating an enemy; Fixed some bugs, deleted unused code and fixed linter warnings. Ship time is approaching very rapidly… Stay hydrated"}, {"post_id": 81013, "ts": "2026-10-19T16:16:33Z", "hours": 3.3297, "text": "Alpha Devlog 8: WERE FRICKIN BACK 🔥 🗣️ 🔥 🗣️ 🔥 I finally got some motivation to work and remade the attack logic! now it’s peak! …at least I think so, correct me if I’m wrong The rotations now don’t take a ducking hour, the ship immediately starts, and it rotates during a slow movement. When it rotates, it starts to actually accelerate. Also, I think I’ll just make a battle sim for now, school gets harder and harder, Shattered Atlas is finally starting to be made… So yeah, I’ll probably make a battle sim and finish it in a year or so. Stay hydrated!"}, {"post_id": 67114, "ts": "2026-09-13T05:32:46Z", "hours": 3.1569, "text": "Alpha Devlog 7: insert scream idk This was pure pain in the beginning, I had no ideas how to accomplish the fighting mechanic. It still isn’t done 100%, I need to make a simple algorithm for the NPCs and clear signalization which module is getting hit (and if it’s getting hit at all…), but yeah… I’ve made it so there are three parts: core , weapons and engines . And shields . shields are getting destroyed first. I’m injuring them based of what’s the current position of an attacker in relation to the target. Then, I basically blast X of damage (13 in this case) on the specific part. So, regardless of the position, shields wear out first. Then, if standing “behind” the ship, engines are attacked. If the attack is happening from either left or right, the weapons are going to leave this world. If weapons are destroyed, you can’t attack other ships. If engines are destroyed, you can’t move. If either of them is already destroyed, it’s uncovering the core part, which, if destroyed, the ship finally despawns. You can also attack the core when you’re in front of the target. Now I need to make an algorithm for the NPCs, which will SUCK, cuz I don’t have a single idea on how to do it… That’s all for now, stay hydrated"}, {"post_id": 65489, "ts": "2026-09-10T17:37:28Z", "hours": 2.3242, "text": "Alpha Devlog 6: I did it… I basically made an error (don’t ask me why) in my code: I entered a FHD RESOLUTION’S RATIO instead of FHD RESOLUTION itself… I think I needed some sleep back then lmao Anyways, I made this: now the ships are assignable (all of them, until I add actual NPCs to the game (idk how am I going to do that tbh)) you can’t order a ship to fly somewhere if it’s already flying you can’t select more than one ship at once That’s all for now ig, health bars and attacking next! Or maybe stations I’m not sure. You can comment to suggest one! Stay hydrated"}, {"post_id": 64024, "ts": "2026-09-08T04:18:33Z", "hours": 1.4928, "text": "Alpha Devlog 5: I’ve wasted around an hour on trying to get the rotations to work smoothly (earlier it just snapped in place)… Nevertheless, I fixed everything I destroyed (accidentally or not) and managed to make everything in around 20 minutes… the rest is just debugging my error-prone code lmao I also added a new triangle ship! Next step: Add giving orders manually. This will be hard… Stay hydrated"}, {"post_id": 63370, "ts": "2026-09-07T04:44:19Z", "hours": 0.6242, "text": "Alpha Devlog 4: Ok so I managed to do what is shown in the video ig, it was quite easy tbh. Have some code: if distance_to_finish < 1. { linvel = Vec2 :: ZERO ; } else if distance_to_finish <= current_speed as f64 * 42. { vel .brake ( acceleration , & time ); } else { vel .add_from_endpoint ( pos , * endpoint , max_vel , acceleration , & time ); } Here’s what I did ealier (I was sooo tired, okay? dont even ask about it ): if distance_to_finish < 1. { vel .linvel = Vec2 :: ZERO ; } else if target_speed == max_vel { vel .add_from_endpoint ( pos , * endpoint , max_vel , acceleration , & time ); } else { vel .brake ( acceleration , & time ); } Stay hydrated (and don’t hate on me)"}, {"post_id": 62860, "ts": "2026-09-06T12:04:14Z", "hours": 2.9356, "text": "Alpha Devlog 3 So I made basic A -> B travel. It works, but only on one example (and not every time)… The next step is to fix it and add rotation at the beginning. Then I’ll experiment with more ships, and add manual orders (that means YOU decide, where the ship goes). TODO: (DONE) universalize this a bit more add rotations experiment with more ships! add actual orders given by the player Stay hydrated"}, {"post_id": 62683, "ts": "2026-09-06T05:27:31Z", "hours": 1.4525, "text": "Alpha Devlog 2 I made so that the “ship” has an order assigned. I also made a sector, and the game is now fullscreen. Nothing more ig. On the next devlog, I hope I’ll show you how it’s moving by itself! Stay hydrated"}, {"post_id": 61670, "ts": "2026-09-04T18:17:46Z", "hours": 4.6992, "text": "Alpha Devlog 1: ”-4Y: Frustrations” (the name can change as the project goes on) is starting as somewhat of a X4: Foundations parody. The base gameplay concepts would be similiar: You manage a fleet of your own faction; You trade (or fight) with NPC factions; and grow your empire. The only downside? I can’t into 3D for now, Stardance is slowly ending and school is getting intense, so if I’m gonna ever make a proper X-like strategy, with 3D mode and everything, it’s not soon. For this month I’ve planned basically a 2D economy/grand strategy. Nothing more I guess. This project is unofficial, I don’t own anything that’s Egosoft’s. Basically a fan parody that can turn into a playable, open-source alternative. Anyways, here’s what I did: In Bevy v0.19.1, I made a few helper functions, few structs which I don’t use yet and automated drawing. Also a basic fighter icon texture. Stay hydrated"}]...
|
Title: -4Y: Frustrations by @birbuh | Stardance
D Title: -4Y: Frustrations by @birbuh | Stardance
Devlogs:
Alpha Devlog 1: ”-4Y: Frustrations” (the name can change as the project goes on) is starting as somewhat of a X4: Foundations parody. The base gameplay concepts would be similiar: You manage a fleet of your own faction; You trade (or fight) with NPC factions; and grow your empire. The only downside? I can’t into 3D for now, Stardance is slowly ending and school is getting intense, so if I’m gonna ever make a proper X-like strategy, with 3D mode and everything, it’s not soon. For this month I’ve planned basically a 2D economy/grand strategy. Nothing more I guess. This project is unofficial, I don’t own anything that’s Egosoft’s. Basically a fan parody that can turn into a playable, open-source alternative. Anyways, here’s what I did: In Bevy v0.19.1, I made a few helper functions, few structs which I don’t use yet and automated drawing. Also a basic fighter icon texture. Stay hydrated
Alpha Devlog 2 I made so that the “ship” has an order assigned. I also made a sector, and the game is now fullscreen. Nothing more ig. On the next devlog, I hope I’ll show you how it’s moving by itself! Stay hydrated
Alpha Devlog 3 So I made basic A -> B travel. It works, but only on one example (and not every time)… The next step is to fix it and add rotation at the beginning. Then I’ll experiment with more ships, and add manual orders (that means YOU decide, where the ship goes). TODO: (DONE) universalize this a bit more add rotations experiment with more ships! add actual orders given by the player Stay hydrated
Alpha Devlog 4: Ok so I managed to do what is shown in the video ig, it was quite easy tbh. Have some code: if distance_to_finish < 1. { linvel = Vec2 :: ZERO ; } else if distance_to_finish <= current_speed as f64 * 42. { vel .brake ( acceleration , & time ); } else { vel .add_from_endpoint ( pos , * endpoint , max_vel , acceleration , & time ); } Here’s what I did ealier (I was sooo tired, okay? dont even ask about it ): if distance_to_finish < 1. { vel .linvel = Vec2 :: ZERO ; } else if target_speed == max_vel { vel .add_from_endpoint ( pos , * endpoint , max_vel , acceleration , & time ); } else { vel .brake ( acceleration , & time ); } Stay hydrated (and don’t hate on me)
Alpha Devlog 5: I’ve wasted around an hour on trying to get the rotations to work smoothly (earlier it just snapped in place)… Nevertheless, I fixed everything I destroyed (accidentally or not) and managed to make everything in around 20 minutes… the rest is just debugging my error-prone code lmao I also added a new triangle ship! Next step: Add giving orders manually. This will be hard… Stay hydrated
Alpha Devlog 6: I did it… I basically made an error (don’t ask me why) in my code: I entered a FHD RESOLUTION’S RATIO instead of FHD RESOLUTION itself… I think I needed some sleep back then lmao Anyways, I made this: now the ships are assignable (all of them, until I add actual NPCs to the game (idk how am I going to do that tbh)) you can’t order a ship to fly somewhere if it’s already flying you can’t select more than one ship at once That’s all for now ig, health bars and attacking next! Or maybe stations I’m not sure. You can comment to suggest one! Stay hydrated
Alpha Devlog 7: insert scream idk This was pure pain in the beginning, I had no ideas how to accomplish the fighting mechanic. It still isn’t done 100%, I need to make a simple algorithm for the NPCs and clear signalization which module is getting hit (and if it’s getting hit at all…), but yeah… I’ve made it so there are three parts: core , weapons and engines . And shields . shields are getting destroyed first. I’m injuring them based of what’s the current position of an attacker in relation to the target. Then, I basically blast X of damage (13 in this case) on the specific part. So, regardless of the position, shields wear out first. Then, if standing “behind” the ship, engines are attacked. If the attack is happening from either left or right, the weapons are going to leave this world. If weapons are destroyed, you can’t attack other ships. If engines are destroyed, you can’t move. If either of them is already destroyed, it’s uncovering the core part, which, if destroyed, the ship finally despawns. You can also attack the core when you’re in front of the target. Now I need to make an algorithm for the NPCs, which will SUCK, cuz I don’t have a single idea on how to do it… That’s all for now, stay hydrated
Alpha Devlog 8: WERE FRICKIN BACK 🔥 🗣️ 🔥 🗣️ 🔥 I finally got some motivation to work and remade the attack logic! now it’s peak! …at least I think so, correct me if I’m wrong The rotations now don’t take a ducking hour, the ship immediately starts, and it rotates during a slow movement. When it rotates, it starts to actually accelerate. Also, I think I’ll just make a battle sim for now, school gets harder and harder, Shattered Atlas is finally starting to be made… So yeah, I’ll probably make a battle sim and finish it in a year or so. Stay hydrated!
Alpha Devlog 9: note: don’t let me do textures again I added a better representation of what’s going on (I think) Now you know when the engines/weapons are broken! Also: Added adding ships; Fixed ship just flying in circles after defeating an enemy; Fixed some bugs, deleted unused code and fixed linter warnings. Ship time is approaching very rapidly… Stay hydrated...
|
1792727547.4855971
|
1793332347.4855971
|
|
70844
|
Termaus by @dahmaus | Stardance
|
dahmaus
|
0
|
0.77
|
0
|
[]
|
[{"post_id": 81562, "ts": "202 [{"post_id": 81562, "ts": "2026-10-21T18:08:51Z", "hours": 0.7678, "text": "TerMaus A terminal which runs in your browser added the first command"}]...
|
Title: Termaus by @dahmaus | Stardance
Devlogs:
T Title: Termaus by @dahmaus | Stardance
Devlogs:
TerMaus A terminal which runs in your browser added the first command...
|
1792608430.6363683
|
1793213230.6363683
|
|
54393
|
orezOS by @hamarisun | Stardance
|
hamarisun
|
0
|
14.87
|
0
|
[]
|
[{"post_id": 81567, "ts": "202 [{"post_id": 81567, "ts": "2026-10-21T18:20:06Z", "hours": 5.5361, "text": "##H2 Another app previously i had made the notes app following the guide. this time i have made photo gallery. Scroll able window!!! Things left to do -login screen -super app(calculator probably"}, {"post_id": 78432, "ts": "2026-10-10T19:54:00Z", "hours": 8.2719, "text": "apps! im trying to make apps. As usually i m not successful. This time at least i know that i just dont get how Java works due to lenguage barrier. Too bad :|"}, {"post_id": 59858, "ts": "2026-09-01T20:39:58Z", "hours": 1.0608, "text": "starting the os"}]...
|
Title: orezOS by @hamarisun | Stardance
Devlogs:
Title: orezOS by @hamarisun | Stardance
Devlogs:
starting the os
apps! im trying to make apps. As usually i m not successful. This time at least i know that i just dont get how Java works due to lenguage barrier. Too bad :|
##H2 Another app previously i had made the notes app following the guide. this time i have made photo gallery. Scroll able window!!! Things left to do -login screen -super app(calculator probably...
|
1792788527.145387
|
1793393327.145387
|
|
59501
|
Minimalistic MediaPlayer by @Tensor | Stardance
|
Tensor
|
0
|
48.39
|
0
|
[]
|
[{"post_id": 81568, "ts": "202 [{"post_id": 81568, "ts": "2026-10-21T18:22:13Z", "hours": 9.9503, "text": "Devlog 12: -Finished the schematic (for the most part) -Did more research and changed some more parts Extra: I’m finally done with the schematic (almost) . I still need to wire the switches after I have decided on what I need. There isn’t much time left to make this so I need to hurry up and finish this so that I can request funding before Stardance ends. Wish me luck"}, {"post_id": 78415, "ts": "2026-10-10T18:39:56Z", "hours": 9.3289, "text": "Devlog 11: -Changed even more components since some were out of stock. -Added the buttons, switches, etc to the schematic. -Started over with the Labels on the schematic. -Did a bunch of research on components and some other things. Extra: I have said it once, and I will say it twice. I HATE MAKING THE SCHEMATIC!!! So much so that my head hurts. … Well. I had to change a lot of the components since they were either out of stock (only Pre-order), or not compatible with the other components. I already did this mistake before. And now I did it again. Kinda dumb of me but that’s just how it is. I also added new components for the controls and some other things . Like buttons, magnetic encoders, and a sliding switch. Here is the battery charger. I think it should work (hopefully) . If you see any issues, pls tell me."}, {"post_id": 75317, "ts": "2026-09-29T18:55:02Z", "hours": 2.7011, "text": "Devlog 10: -Did most of the schematic wiring. -Did a bit more research on the motor and the “motor driver”. Extra: First of all. Making the schematic isn’t fun AT ALL. When I was making my Hackpad I enjoyed it a little bit. But THIS. … It’s just painful. And the other thing is that I did some more research on the motor and it’s driver (not as in a chauffeur, but kinda like that) . Since I don’t want it to disturb the other components with it’s electric fields. Anyway. There isn’t much else to report on, so I guess we are done for today. And I’m tired. Gn"}, {"post_id": 74555, "ts": "2026-09-27T16:52:10Z", "hours": 1.05, "text": "Devlog 9: -Added all of the symbols to the schematic. That’s basically it for today"}, {"post_id": 73992, "ts": "2026-09-26T14:14:06Z", "hours": 4.0489, "text": "Devlog 8: -Did a bunch of research on different components, PCB design/production, and more. -Switched to only SMD components (excluding the Pico2) Extra: I’m back after, like, 5 days, I think… I’m not sure. There are a few reasons to why I haven’t worked these past days, and one of them were that Stardance was nearing it’s end. Buuuuuuut. It got extended by 1 month! 🎉 Anyway I decided on dropping the modules and going for only SMD components instead. I think that the reason I didn’t go for SMD components to begin with is because I was scared of messing everything up since I have never used them before. The footprints and symbols I spent some time on are now useless which is a bit depressing. But it’s still better that way so no problem really. (The Image below is just a placeholder. I’ll switch it too something else soon)"}, {"post_id": 71252, "ts": "2026-09-20T15:05:56Z", "hours": 7.3836, "text": "Devlog 7: -Decided on some changes to the design because I can’t source my own components. -Researched “metal laser cutting” for accent pieces on the finished design. Checked component compatibility with different types of audio devices (headphones, IEMs & speakers). -Learnt (kinda) how to convert and how to make my own symbols and footprints in KiCAD. (Hated it. Never want to do it again ) Extra: It’s been a while since my last devlog. I’m still a bit sick since the last devlog so I’ll keep it a bit shorter than usual. The “rocker thingy” on the side of the TP-7 requires a bit of work and testing for it to work properly, so I will skip it for now. And if I don’t have time or decide to skip it, I’ll just make a version of it that’s integrated into the side of the case. Kinda like the volume button on most phones and tablets. I don’t want the device to just look like a 3d-printed slab. I want it to look like a well polished device that could be mistaken for a real product. So I will do some more research on “cheap” materials that I can use for the overall case. And to make it look even better, I think I’ll add metal accent pieces for the buttons and symbols. I don’t mind using my own money for this since I’m not sure if the fund will cover that. Just let me say that making the symbols and footprints has been the worst and most boring thing about any project that I’ve made. 1st image: Here is a quick sketch I made during class. The 2 black rectangles on the front face are screens. 2nd image: I found a powerbank with (almost) the perfect dimensions. The pink post-it notes have the real dimensions."}, {"post_id": 69255, "ts": "2026-09-16T17:59:13Z", "hours": 4.0922, "text": "Devlog 6: -Researched case materials and production methods -Checked component compatibility -Switched to a Li-Ion battery and some other components too -Checked JLCPCB’s parts library to see if they could mount some components on the PCB for me -Started on a GitHub repo for this project Extra: Haven’t made a devlog in a few days and I’m super tired so I’ll just leave it like this (this time)."}, {"post_id": 67510, "ts": "2026-09-13T17:06:47Z", "hours": 2.5333, "text": "Devlog 5: -Found a better screen for the device -Decided on various types of switches for the device -Checked possible layouts for the electronics -Found another battery with better overall dimensions -Checked some printing materials & options on JLC3DP -Found a few other components for QoL features Extra: I have done quite a lot of research on everything today. The switches: The final layout for the device is not completely decided yet. But I think I’ll keep 2 of the front-facing buttons for “pause/play” and “skip-/previous track”. I’ll also add one “3-position sliding switch” (for motor on/auto/off options) and one “2-position sliding switch” (for device on/off) on the side of the case. The Quality of Life features: Too be able to get that seamless screen look on the TP-7, I can use a processed Acrylic piece. It makes it so that the pixels seem to be floating inside the acrylic window, which looks awesome. I will maybe add a light sensor so it know when it is in a pocket. The sensor will be active/used when the “motor on/auto/off switch” is set to “auto”. The texture & material: I’m not completely sure what material to use yet, but I want the same texture/feel that’s on the LAMY Safari pens (matte Umbra version). There is 1 material on JLC3DP that looks promising. If you are interested and want to see how it turns out. Press follow."}, {"post_id": 66616, "ts": "2026-09-12T13:50:06Z", "hours": 1.45, "text": "Devlog 4: -Think I have figured out what to do with the motor -Searched for a new low-power BLDC motor driver board (what gives power and controls the motor, “kinda” ). Extra: I think I know how to prevent the electric field caused by the motor and the inconsistent power-draw from interfering with the audio components. -Since the motor uses very low power, the fields shouldn’t be as strong as normal. And because of that, some copper-tape wrapped around the motor (with some space between) and then connected to ground should be enough to absorb the electric fields (maybe not the right term but who cares). And to neutralize the inconsistent power-draw, I can just use some resistors (hopefully) between the motor and power-module, and then between the motor and ground. I’ll do a bit more research to be sure. The old motor driver I found apparently needed 8-30V. Which is quite a lot for what I’m making. So after roughly 30 min of searching I finally found the “SparkFun Brushless Motor Driver - 3-Phase (TMC6300)” on their own website. It’s ~18$ + shipping (not that bad), but I really can’t find another one that would work for this specific use case. Searched though AliExpress but just found ones that requiered 5-30V and something else that’s slightly inappropriate (and completely unrelated) instead Here is the module I found:"}, {"post_id": 66068, "ts": "2026-09-11T17:14:56Z", "hours": 1.3978, "text": "Devlog 3: -Finally found good screens -Making sure that the motor won’t theoretically interfere with the other components Extra: I have both good and bad news. The good news is that I finally decided on which screens to use (I’ll probably use 2). And the bad news are that when I did some research yesterday before going to bed. I found out that almost no one else has made their own version of the TP-7 by Teenage Engineering. And that’s because of 2 reasons. First, the complexity. Teenage Engineering made all of the components in-house so that everything would fit together. Which is why their device is so compact. While us on the other hand can only (for the most part) get off-the-shelf components. The second reason is that the motor has a magnetic and an electric field (the magnetic field isn’t as bad as the electric one). Which can interfere with the other electronics, which is very bad for sound focused devices. Guess that’s another problem to solve then. I will not give up until the very end (i think)"}, {"post_id": 65514, "ts": "2026-09-10T18:25:05Z", "hours": 1.5667, "text": "Devlog 2.1: -Still looking for a compatible screen Extra: I’m not sure if I should get a display module or just a display and a connector for it. If I choose the connector option, then I would have to solder like 20-30 pins + add resistors or something like that. If I choose the display module it will take a lot of unnecessary space between it and the nearest edge. If I go for the bare display, then I will probably choose this one:"}, {"post_id": 64978, "ts": "2026-09-09T18:56:52Z", "hours": 1.6786, "text": "Devlog 2: -Made a quick model and drawing of the layout i want. -Searched for components (only the screen…) Extra: Ok guys. Does, ANYONE, know. Where I can get an OLED bar display, that is a single color and not the 0.91 inch model. I have literally been searching for over an hour after a screen that would fit. The whole module needs to be smaller than 60x20mm. Please let me know if you have any recommendations."}, {"post_id": 64375, "ts": "2026-09-08T18:09:48Z", "hours": 1.2069, "text": "Devlog 1: -Researching parts/components. Extra: This is the first devlog of my “Teenage Engineering TP-7” inspired mediaplayer. Ever since I first saw the TP-7 for the first time, I thought it was the coolest “MP3” player ever (kinda correct), and have wanted one myself for a long time. The problem with it is that it is 1500$. … You read that right. 1500$!!! Which is why I want to make my own “TP-7” inspired high-res mediaplayer. It won’t be a straight copy-paste tho. I will add my own gimmicks and features too. I got ~20 days to finish this. And I probably won’t be able to ship this before then (if not for a miracle). I will try my best to make this project a reality. Oh btw, it’s my birthday today. If anyone at HackClub sees this, pls bless me with a 150$ grant"}]...
|
Title: Minimalistic MediaPlayer by @Tensor | Stard Title: Minimalistic MediaPlayer by @Tensor | Stardance
Devlogs:
Devlog 1: -Researching parts/components. Extra: This is the first devlog of my “Teenage Engineering TP-7” inspired mediaplayer. Ever since I first saw the TP-7 for the first time, I thought it was the coolest “MP3” player ever (kinda correct), and have wanted one myself for a long time. The problem with it is that it is 1500$. … You read that right. 1500$!!! Which is why I want to make my own “TP-7” inspired high-res mediaplayer. It won’t be a straight copy-paste tho. I will add my own gimmicks and features too. I got ~20 days to finish this. And I probably won’t be able to ship this before then (if not for a miracle). I will try my best to make this project a reality. Oh btw, it’s my birthday today. If anyone at HackClub sees this, pls bless me with a 150$ grant
Devlog 2: -Made a quick model and drawing of the layout i want. -Searched for components (only the screen…) Extra: Ok guys. Does, ANYONE, know. Where I can get an OLED bar display, that is a single color and not the 0.91 inch model. I have literally been searching for over an hour after a screen that would fit. The whole module needs to be smaller than 60x20mm. Please let me know if you have any recommendations.
Devlog 2.1: -Still looking for a compatible screen Extra: I’m not sure if I should get a display module or just a display and a connector for it. If I choose the connector option, then I would have to solder like 20-30 pins + add resistors or something like that. If I choose the display module it will take a lot of unnecessary space between it and the nearest edge. If I go for the bare display, then I will probably choose this one:
Devlog 3: -Finally found good screens -Making sure that the motor won’t theoretically interfere with the other components Extra: I have both good and bad news. The good news is that I finally decided on which screens to use (I’ll probably use 2). And the bad news are that when I did some research yesterday before going to bed. I found out that almost no one else has made their own version of the TP-7 by Teenage Engineering. And that’s because of 2 reasons. First, the complexity. Teenage Engineering made all of the components in-house so that everything would fit together. Which is why their device is so compact. While us on the other hand can only (for the most part) get off-the-shelf components. The second reason is that the motor has a magnetic and an electric field (the magnetic field isn’t as bad as the electric one). Which can interfere with the other electronics, which is very bad for sound focused devices. Guess that’s another problem to solve then. I will not give up until the very end (i think)
Devlog 4: -Think I have figured out what to do with the motor -Searched for a new low-power BLDC motor driver board (what gives power and controls the motor, “kinda” ). Extra: I think I know how to prevent the electric field caused by the motor and the inconsistent power-draw from interfering with the audio components. -Since the motor uses very low power, the fields shouldn’t be as strong as normal. And because of that, some copper-tape wrapped around the motor (with some space between) and then connected to ground should be enough to absorb the electric fields (maybe not the right term but who cares). And to neutralize the inconsistent power-draw, I can just use some resistors (hopefully) between the motor and power-module, and then between the motor and ground. I’ll do a bit more research to be sure. The old motor driver I found apparently needed 8-30V. Which is quite a lot for what I’m making. So after roughly 30 min of searching I finally found the “SparkFun Brushless Motor Driver - 3-Phase (TMC6300)” on their own website. It’s ~18$ + shipping (not that bad), but I really can’t find another one that would work for this specific use case. Searched though AliExpress but just found ones that requiered 5-30V and something else that’s slightly inappropriate (and completely unrelated) instead Here is the module I found:
Devlog 5: -Found a better screen for the device -Decided on various types of switches for the device -Checked possible layouts for the electronics -Found another battery with better overall dimensions -Checked some printing materials & options on JLC3DP -Found a few other components for QoL features Extra: I have done quite a lot of research on everything today. The switches: The final layout for the device is not completely decided yet. But I think I’ll keep 2 of the front-facing buttons for “pause/play” and “skip-/previous track”. I’ll also add one “3-position sliding switch” (for motor on/auto/off options) and one “2-position sliding switch” (for device on/off) on the side of the case. The Quality of Life features: Too be able to get that seamless screen look on the TP-7, I can use a processed Acrylic piece. It makes it so that the pixels seem to be floating inside the acrylic window, which looks awesome. I will maybe add a light sensor so it know when it is in a pocket. The sensor will be active/used when the “motor on/auto/off switch” is set to “auto”. The texture & material: I’m not completely sure what material to use yet, but I want the same texture/feel that’s on the LAMY Safari pens (matte Umbra version). There is 1 material on JLC3DP that looks promising. If you are interested and want to see how it turns out. Press follow.
Devlog 6: -Researched case materials and production methods -Checked component compatibility -Switched to a Li-Ion battery and some other components too -Checked JLCPCB’s parts library to see if they could mount some components on the PCB for me -Started on a GitHub repo for this project Extra: Haven’t made a devlog in a few days and I’m super tired so I’ll just leave it like this (this time).
Devlog 7: -Decided on some changes to the design because I can’t source my own components. -Researched “metal laser cutting” for accent pieces on the finished design. Checked component compatibility with different types of audio devices (headphones, IEMs & speakers). -Learnt (kinda) how to convert and how to make my own symbols and footprints in KiCAD. (Hated it. Never want to do it again ) Extra: It’s been a while since my last devlog. I’m still a bit sick since the last devlog so I’ll keep it a bit shorter than usual. The “rocker thingy” on the side of the TP-7 requires a bit of work and testing for it to work properly, so I will skip it for now. And if I don’t have time or decide to skip it, I’ll just make a version of it that’s integrated into the side of the case. Kinda like the volume button on most phones and tablets. I don’t want the device to just look like a 3d-printed slab. I want it to look like a well polished device that could be mistaken for a real product. So I will do some more research on “cheap” materials that I can use for the overall case. And to make it look even better, I think I’ll add metal accent pieces for the buttons and symbols. I don’t mind using my own money for this since I’m not sure if the fund will cover that. Just let me say that making the symbols and footprints has been the worst and most boring thing about any project that I’ve made. 1st image: Here is a quick sketch I made during class. The 2 black rectangles on the front face are screens. 2nd image: I found a powerbank with (almost) the perfect dimensions. The pink post-it notes have the real dimensions.
Devlog 8: -Did a bunch of research on different components, PCB design/production, and more. -Switched to only SMD components (excluding the Pico2) Extra: I’m back after, like, 5 days, I think… I’m not sure. There are a few reasons to why I haven’t worked these past days, and one of them were that Stardance was nearing it’s end. Buuuuuuut. It got extended by 1 month! 🎉 Anyway I decided on dropping the modules and going for only SMD components instead. I think that the reason I didn’t go for SMD components to begin with is because I was scared of messing everything up since I have never used them before. The footprints and symbols I spent some time on are now useless which is a bit depressing. But it’s still better that way so no problem really. (The Image below is just a placeholder. I’ll switch it too something else soon)
Devlog 9: -Added all of the symbols to the schematic. That’s basically it for today
Devlog 10: -Did most of the schematic wiring. -Did a bit more research on the motor and the “motor driver”. Extra: First of all. Making the schematic isn’t fun AT ALL. When I was making my Hackpad I enjoyed it a little bit. But THIS. … It’s just painful. And the other thing is that I did some more research on the motor and it’s driver (not as in a chauffeur, but kinda like that) . Since I don’t want it to disturb the other components with it’s electric fields. Anyway. There isn’t much else to report on, so I guess we are done for today. And I’m tired. Gn
Devlog 11: -Changed even more components since some were out of stock. -Added the buttons, switches, etc to the schematic. -Started over with the Labels on the schematic. -Did a bunch of research on components and some other things. Extra: I have said it once, and I will say it twice. I HATE MAKING THE SCHEMATIC!!! So much so that my head hurts. … Well. I had to change a lot of the components since they were either out of stock (only Pre-order), or not compatible with the other components. I already did this mistake before. And now I did it again. Kinda dumb of me but that’s just how it is. I also added new components for the controls and some other things . Like buttons, magnetic encoders, and a sliding switch. Here is the battery charger. I think it should work (hopefully) . If you see any issues, pls tell me.
Devlog 12: -Finished the schematic (for the most part) -Did more research and changed some more parts Extra: I’m finally done with the schematic (almost) . I still need to wire the switches after I have decided on what I need. There isn’t much time left to make this so I need to hurry up and finish this so that I can request funding before Stardance ends. Wish me luck...
|
1792803076.1355245
|
1793407876.1355245
|
|
70841
|
escape room python text story!! by @tika_K | Stard escape room python text story!! by @tika_K | Stardance...
|
tika_K
|
0
|
2.55
|
0
|
[]
|
[{"post_id": 81570, "ts": "202 [{"post_id": 81570, "ts": "2026-10-21T18:28:29Z", "hours": 2.5494, "text": "So i typed the text i wrote on a paper at school but there’s a problem: when you finish room red button blue or red i typed in the program room == “red” thinking it would go on and say the text again from room red but it doesn’t ill fix it next time i work on it"}]...
|
Title: escape room python text story!! by @tika_K Title: escape room python text story!! by @tika_K | Stardance
Devlogs:
So i typed the text i wrote on a paper at school but there’s a problem: when you finish room red button blue or red i typed in the program room == “red” thinking it would go on and say the text again from room red but it doesn’t ill fix it next time i work on it...
|
1792608428.1090043
|
1793213228.1090043
|
|
19993
|
DOSEFIELD by @Zhanik | Stardance
|
Zhanik
|
1
|
18.36
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-20T06:48:20Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Today was all about making the site tell the truth about itself instead of just describing itself. I added a Methods and Limitations page that pulls directly from METHODS.md and the README instead of being rewritten into friendly marketing copy. If the documentation and the code ever disagree, the documentation loses immediately because they are now the exact same file. Every page also got an automated footer showing the commit hash, the test count, and the exact verification date. It would have taken five minutes to hardcode a string like “111 tests passing” and move on. Instead, the build script runs the actual test suite first, and if anything fails, the entire build stops cold. This ensures the footer can never claim a passing state that is not true at that exact moment. Wiring a build to gate on its own test results took most of the afternoon because it required thinking through what happens during a failure, not just when everything goes smoothly, but the absolute transparency is worth it. What I like most is that the limitations table on the public site is word-for-word what is in the repository. There is no filtered summary for visitors. The 0.67x gap between my modeled absorbed dose and NASA’s measured RAD numbers reads just as blunt on the public page as it does in the source code. Transparency matters more than hype. Additionally, charts now export at 3200px, and the configuration that produced them gets baked directly into the image itself, meaning a PNG cannot wander off from the settings that generated it. If you want to test it yourself, you can check the live app at DOSEFIELD. Look at the footer for a real commit hash and test count, open the Methods and Limitations page to count the 12 rows in the limitations table, or export a chart to verify the resolution against what is rendered on your screen. The complete source code is also available on GitHub.", "repo": "https://github.com/izbanovj3-prog/DOSEFIELD", "demo": "https://izbanovj3-prog.github.io/DOSEFIELD/"}]...
|
[{"post_id": 81574, "ts": "202 [{"post_id": 81574, "ts": "2026-10-21T18:39:31Z", "hours": 6.3597, "text": "Hey Stardance crew! Three months since my last devlog, so grab a snack and let me catch you up. DOSEFIELD estimates how much radiation an astronaut gets behind shielding on a trip to Mars, then checks itself against real data from NASA’s Curiosity cruise (MSL/RAD). The big news: I found a mistake in my own results. In my first public version, the solar modulation value (W = 30) could not be reproduced from the derivation I had written down. So I went back to the Oulu neutron-monitor data, matched the exact time window RAD used, skipped the solar-storm days, and got W = 47.50. The new numbers look worse, and I kept them: absorbed dose: 0.264 vs 0.458 mGy/day measured (0.58x) dose equivalent: 1.318 vs 1.75 mSv/day (0.75x) mean quality factor: 4.995 vs 3.82 (1.31x) My model skips secondary particles and neutrons, so it under-predicts the dose. I report the gap and leave it alone. Also shipped: a check against the full NIST PSTAR table (max deviation 1.55% from 10 to 1000 MeV), 190 passing tests, a code archive on Zenodo (DOI 10.5281/zenodo.23433384), a revised paper on SSRN, and a website that links to all of it."}, {"post_id": 30550, "ts": "2026-07-18T06:51:49Z", "hours": 2.6992, "text": "DEVLOG #6 Hey everyone!This is probably the last devlog for DOSEFIELD, at least for a while. It’s been an incredible journey—from the first rough prototype to something I’m genuinely proud to share. Thank you to everyone who followed along, tested the project, gave feedback, or simply read these updates. It really meant a lot.v2.3 is the “show your work” release. Nothing changed in the physics—and that’s exactly the point.The biggest addition is a new Methods page that renders the repository’s own METHODS.md and limitations table directly. That means anyone reading the website sees the exact same equations, assumptions, and all 12 limitations that exist in the source code. If the website and the repository ever disagree, the repository is the source of truth.Every page now also includes a provenance footer that’s generated automatically during the build. Instead of typing in a version number by hand, the site runs git rev-parse and the full test suite, then stamps something like:commit e22ef18 · 111/111 tests · verified 2026-07-18The build will actually fail if the tests don’t pass, so it’s impossible to accidentally display a “green” verification badge on a broken build.I also improved chart exports. Figures now render at 3200 px, and each exported chart includes its full configuration in the caption. That makes it much easier to trace a plot back to the exact settings that produced it, whether it’s used in a poster, report, or presentation.One thing I want to be completely clear about: this verification is about the software, not the physics. Passing 111 tests means the implementation behaves as expected according to those tests—it doesn’t prove the scientific model is perfect. The current validation remains the same: about 2× agreement with MSL/RAD, and the 0.67× absorbed-dose gap is still there, clearly documented.That’s exactly what this release is about: transparency over hype, reproducibility over screenshots, and being honest about what the model can—and can’t—do.Thanks for following this project. ❤️"}, {"post_id": 24869, "ts": "2026-07-08T18:38:22Z", "hours": 2.4278, "text": "DEVLOG #5 (might be the last devlog) Hey! It’s been 11 days since the last devlog. DOSEFIELD wasn’t abandoned—I was just busy building instead of writing.This update was really about two things: making the code cleaner and making the site feel like it belongs in a space mission.The first issue was hidden in the background. The NASA validation numbers on the website were calculated separately from the ones used in my research. The math was identical, but it existed in multiple places. That meant one future change could easily make the numbers disagree.So I refactored everything to use a single source of truth. Now every result comes from the same function, making the site much easier to maintain and much harder to break.Then I focused on the design. The old version worked, but it didn’t feel like DOSEFIELD. I redesigned the interface with a mission-control style, added a cleaner layout, and simplified the visuals. I also removed a lot of unnecessary effects—less glow, fewer gradients, and a more purposeful look.After all those changes, I reran every test. All 107 tests still pass, and the stopping-power calculations remain within 1.55% of NIST reference data, exactly as before.There’s still one limitation: my model predicts about 67% of the radiation dose measured by NASA during the trip to Mars. That’s because it doesn’t yet simulate secondary particle production inside spacecraft shielding. It’s an important limitation, and it’s clearly explained on the website rather than hidden.The biggest lesson from this update wasn’t about physics—it was about revisiting old work. Good code doesn’t duplicate logic, and good design doesn’t rely on effects to look impressive. Sometimes the best improvement is simply cleaning up what you already built."}, {"post_id": 16881, "ts": "2026-06-27T12:17:57Z", "hours": 1.2136, "text": "Devlog #4 — Heavy Elements Cut, Liquid Hydrogen Locked In Lead and titanium were off by 50%. I didn’t hide it. My model tracks how particles slow down inside matter. For heavy elements like lead and titanium, you need a correction for the atom’s electron shells — skip it, and your numbers drift by half the actual value. I haven’t built that correction yet. Faking the results to look clean would gut the whole point of the model. So heavy elements are out for now. Liquid hydrogen sits at the opposite extreme. One electron, no shell complexity — the model handles it without shortcuts. I checked against NIST’s official proton data: 0.14% deviation across the full energy range. In physics terms, that’s a bullseye. Five Materials, One Hierarchy I ran five materials together — liquid hydrogen, methane, polyethylene, water, and aluminum — and tested them as a chain. Two things had to hold: thicker shielding means lower dose, and going from hydrogen to aluminum, dose has to climb, because light elements stop protons better. Both held, with no exceptions. Polyethylene and water differ by just 3% in electrons per gram — the model caught even that gap correctly. The sharpest result: at 40 g/cm², liquid hydrogen cuts dose by 44% compared to aluminum. That’s why some spacecraft designs wrap the crew compartment in hydrogen tanks — fuel and radiation shield in one. All five materials are now locked into regression tests. Total: 103 green tests in CI. One Function, One Truth The dashboard and the generated reports used to calculate their numbers separately. Two parallel code paths mean two places for drift to appear. Now both pull from a single shared function. The number on screen and the number in the report are physically incapable of disagreeing."}, {"post_id": 14174, "ts": "2026-06-23T05:11:04Z", "hours": 2.5839, "text": "Devlog #3 — DOSEFIELD Is Live 🚀Hi! Long time no see.DOSEFIELD is now live: https://izbanovj3-prog.github.io/DOSEFIELD/ The entire dosimeter now runs directly in your browser — no installation required. That includes the controls, dose-vs-thickness chart, particle fragmentation toggle, and validation panel.Under the hood, the project is built with Vite and automatically deployed to GitHub Pages through a GitHub Actions workflow. Every push to the main branch triggers a fresh build and deployment. The setup is intentionally simple: deployment uses GitHub’s built-in Actions token, with no external services and no additional secrets.The only challenge in this release wasn’t physics — it was infrastructure. The first deployment failed because GitHub Actions cannot automatically enable GitHub Pages for a repository. The workflow reached that permission boundary and stopped. After enabling Pages in the repository settings and rerunning the workflow, everything deployed successfully.Once the site was live, I verified that all critical assets were being served correctly. The page, stylesheets, and, most importantly, the Web Worker bundle all return HTTP 200 responses with the correct content types.That Web Worker is particularly important because it handles the species-by-species dose integration calculations off the main UI thread. In practice, this means the interface remains responsive while the physics calculations run in the background.No physics models changed in this release, and the known limitations remain the same. This phase was focused entirely on one goal: shipping a fully accessible browser version of DOSEFIELD.The live demo link is now featured at the top of the README."}, {"post_id": 11802, "ts": "2026-06-19T06:41:00Z", "hours": 1.3047, "text": "DOSEFIELD DAY #2:Fragmentation is now in the live app. Until today the web dosimeter only ran the primary-only transport — the most interesting result, that breaking up heavy ions is why hydrogen-rich shielding wins, was buried in a console script. Now there’s a “Primaries only ⇄ + Fragmentation” toggle, and flipping it visibly bends the curves: polyethylene pulls away from aluminium and the mean quality factor drops. Concretely, at solar minimum behind 20 g/cm², polyethylene’s edge over aluminium jumps from 12% to 34% the moment fragmentation turns on — the same figure the validation script prints, read from the same function, not hardcoded. Mean ⟨Q⟩ behind 16 g/cm² of aluminium falls 4.47 → 4.14. Nothing was tuned; the toggle just calls the existing Bradt–Peters model. And the honest ceiling stays put: still no secondary neutrons, so the absorbed-dose gap vs the real MSL/RAD measurement (~0.31 vs 0.46 mGy/day) remains — and the UI footnote says so out loud. 76/76 tests green, build clean. Next: surface the NIST + RAD validation inside the app itself."}, {"post_id": 10579, "ts": "2026-06-17T11:53:38Z", "hours": 1.5142, "text": "Day #1: the hard part is in, now I find out if it’s right I’m building DOSEFIELD, a 1D model that estimates how much radiation an astronaut absorbs on a deep-space mission — and how much shielding actually helps. Cosmic rays in, dose-equivalent out. What’s already solid: the stopping-power core matches NIST PSTAR reference data to within 1.6%, and behind 10 g/cm² of aluminium at solar minimum the model gives 1.96 mSv/day — about 0.70 Sv over a 360-day Mars cruise. That’s 17% past NASA’s 600 mSv career limit. A round trip to Mars quietly blows through the radiation an astronaut is allowed for their entire career. That’s the reason this project exists. But the first version only tracked primary particles, and it showed: my aluminium, polyethylene and water curves were sitting almost on top of each other. That’s physically wrong — polyethylene should shield noticeably better, because hydrogen is good at breaking up heavy ions. The missing piece is nuclear fragmentation. So this week I implemented it — real fragmentation cross sections (Bradt–Peters), not a fudge factor tuned to match NASA’s measured value. The material difference has to come out of the physics: hydrogen has the shortest nuclear interaction length per g/cm², so it should win on its own. No parameter is fit to the answer. Now I’m validating it, and I’m writing the test down BEFORE the result so I can’t quietly move the goalposts. If the physics is right, I should see four things: the curves separate (polyethylene below aluminium), aluminium flatten out at depth, the mean quality factor drop from 4.82 toward ~3.5–4, and the dose move closer to the real MSL/RAD cruise measurement. If they don’t, the model is wrong and I’ll say so. Numbers in the next entry. Either it works or it doesn’t — that’s the whole point of logging the test first. What it still isn’t: 1D, simplified fragmentation, not a replacement for NASA’s HZETRN. Every value traces to a cited source, and the validation suite re-runs on every change."}]...
|
Title: DOSEFIELD by @Zhanik | Stardance
Devlogs:
Title: DOSEFIELD by @Zhanik | Stardance
Devlogs:
Day #1: the hard part is in, now I find out if it’s right I’m building DOSEFIELD, a 1D model that estimates how much radiation an astronaut absorbs on a deep-space mission — and how much shielding actually helps. Cosmic rays in, dose-equivalent out. What’s already solid: the stopping-power core matches NIST PSTAR reference data to within 1.6%, and behind 10 g/cm² of aluminium at solar minimum the model gives 1.96 mSv/day — about 0.70 Sv over a 360-day Mars cruise. That’s 17% past NASA’s 600 mSv career limit. A round trip to Mars quietly blows through the radiation an astronaut is allowed for their entire career. That’s the reason this project exists. But the first version only tracked primary particles, and it showed: my aluminium, polyethylene and water curves were sitting almost on top of each other. That’s physically wrong — polyethylene should shield noticeably better, because hydrogen is good at breaking up heavy ions. The missing piece is nuclear fragmentation. So this week I implemented it — real fragmentation cross sections (Bradt–Peters), not a fudge factor tuned to match NASA’s measured value. The material difference has to come out of the physics: hydrogen has the shortest nuclear interaction length per g/cm², so it should win on its own. No parameter is fit to the answer. Now I’m validating it, and I’m writing the test down BEFORE the result so I can’t quietly move the goalposts. If the physics is right, I should see four things: the curves separate (polyethylene below aluminium), aluminium flatten out at depth, the mean quality factor drop from 4.82 toward ~3.5–4, and the dose move closer to the real MSL/RAD cruise measurement. If they don’t, the model is wrong and I’ll say so. Numbers in the next entry. Either it works or it doesn’t — that’s the whole point of logging the test first. What it still isn’t: 1D, simplified fragmentation, not a replacement for NASA’s HZETRN. Every value traces to a cited source, and the validation suite re-runs on every change.
DOSEFIELD DAY #2:Fragmentation is now in the live app. Until today the web dosimeter only ran the primary-only transport — the most interesting result, that breaking up heavy ions is why hydrogen-rich shielding wins, was buried in a console script. Now there’s a “Primaries only ⇄ + Fragmentation” toggle, and flipping it visibly bends the curves: polyethylene pulls away from aluminium and the mean quality factor drops. Concretely, at solar minimum behind 20 g/cm², polyethylene’s edge over aluminium jumps from 12% to 34% the moment fragmentation turns on — the same figure the validation script prints, read from the same function, not hardcoded. Mean ⟨Q⟩ behind 16 g/cm² of aluminium falls 4.47 → 4.14. Nothing was tuned; the toggle just calls the existing Bradt–Peters model. And the honest ceiling stays put: still no secondary neutrons, so the absorbed-dose gap vs the real MSL/RAD measurement (~0.31 vs 0.46 mGy/day) remains — and the UI footnote says so out loud. 76/76 tests green, build clean. Next: surface the NIST + RAD validation inside the app itself.
Devlog #3 — DOSEFIELD Is Live 🚀Hi! Long time no see.DOSEFIELD is now live: https://izbanovj3-prog.github.io/DOSEFIELD/ The entire dosimeter now runs directly in your browser — no installation required. That includes the controls, dose-vs-thickness chart, particle fragmentation toggle, and validation panel.Under the hood, the project is built with Vite and automatically deployed to GitHub Pages through a GitHub Actions workflow. Every push to the main branch triggers a fresh build and deployment. The setup is intentionally simple: deployment uses GitHub’s built-in Actions token, with no external services and no additional secrets.The only challenge in this release wasn’t physics — it was infrastructure. The first deployment failed because GitHub Actions cannot automatically enable GitHub Pages for a repository. The workflow reached that permission boundary and stopped. After enabling Pages in the repository settings and rerunning the workflow, everything deployed successfully.Once the site was live, I verified that all critical assets were being served correctly. The page, stylesheets, and, most importantly, the Web Worker bundle all return HTTP 200 responses with the correct content types.That Web Worker is particularly important because it handles the species-by-species dose integration calculations off the main UI thread. In practice, this means the interface remains responsive while the physics calculations run in the background.No physics models changed in this release, and the known limitations remain the same. This phase was focused entirely on one goal: shipping a fully accessible browser version of DOSEFIELD.The live demo link is now featured at the top of the README.
Devlog #4 — Heavy Elements Cut, Liquid Hydrogen Locked In Lead and titanium were off by 50%. I didn’t hide it. My model tracks how particles slow down inside matter. For heavy elements like lead and titanium, you need a correction for the atom’s electron shells — skip it, and your numbers drift by half the actual value. I haven’t built that correction yet. Faking the results to look clean would gut the whole point of the model. So heavy elements are out for now. Liquid hydrogen sits at the opposite extreme. One electron, no shell complexity — the model handles it without shortcuts. I checked against NIST’s official proton data: 0.14% deviation across the full energy range. In physics terms, that’s a bullseye. Five Materials, One Hierarchy I ran five materials together — liquid hydrogen, methane, polyethylene, water, and aluminum — and tested them as a chain. Two things had to hold: thicker shielding means lower dose, and going from hydrogen to aluminum, dose has to climb, because light elements stop protons better. Both held, with no exceptions. Polyethylene and water differ by just 3% in electrons per gram — the model caught even that gap correctly. The sharpest result: at 40 g/cm², liquid hydrogen cuts dose by 44% compared to aluminum. That’s why some spacecraft designs wrap the crew compartment in hydrogen tanks — fuel and radiation shield in one. All five materials are now locked into regression tests. Total: 103 green tests in CI. One Function, One Truth The dashboard and the generated reports used to calculate their numbers separately. Two parallel code paths mean two places for drift to appear. Now both pull from a single shared function. The number on screen and the number in the report are physically incapable of disagreeing.
DEVLOG #5 (might be the last devlog) Hey! It’s been 11 days since the last devlog. DOSEFIELD wasn’t abandoned—I was just busy building instead of writing.This update was really about two things: making the code cleaner and making the site feel like it belongs in a space mission.The first issue was hidden in the background. The NASA validation numbers on the website were calculated separately from the ones used in my research. The math was identical, but it existed in multiple places. That meant one future change could easily make the numbers disagree.So I refactored everything to use a single source of truth. Now every result comes from the same function, making the site much easier to maintain and much harder to break.Then I focused on the design. The old version worked, but it didn’t feel like DOSEFIELD. I redesigned the interface with a mission-control style, added a cleaner layout, and simplified the visuals. I also removed a lot of unnecessary effects—less glow, fewer gradients, and a more purposeful look.After all those changes, I reran every test. All 107 tests still pass, and the stopping-power calculations remain within 1.55% of NIST reference data, exactly as before.There’s still one limitation: my model predicts about 67% of the radiation dose measured by NASA during the trip to Mars. That’s because it doesn’t yet simulate secondary particle production inside spacecraft shielding. It’s an important limitation, and it’s clearly explained on the website rather than hidden.The biggest lesson from this update wasn’t about physics—it was about revisiting old work. Good code doesn’t duplicate logic, and good design doesn’t rely on effects to look impressive. Sometimes the best improvement is simply cleaning up what you already built.
DEVLOG #6 Hey everyone!This is probably the last devlog for DOSEFIELD, at least for a while. It’s been an incredible journey—from the first rough prototype to something I’m genuinely proud to share. Thank you to everyone who followed along, tested the project, gave feedback, or simply read these updates. It really meant a lot.v2.3 is the “show your work” release. Nothing changed in the physics—and that’s exactly the point.The biggest addition is a new Methods page that renders the repository’s own METHODS.md and limitations table directly. That means anyone reading the website sees the exact same equations, assumptions, and all 12 limitations that exist in the source code. If the website and the repository ever disagree, the repository is the source of truth.Every page now also includes a provenance footer that’s generated automatically during the build. Instead of typing in a version number by hand, the site runs git rev-parse and the full test suite, then stamps something like:commit e22ef18 · 111/111 tests · verified 2026-07-18The build will actually fail if the tests don’t pass, so it’s impossible to accidentally display a “green” verification badge on a broken build.I also improved chart exports. Figures now render at 3200 px, and each exported chart includes its full configuration in the caption. That makes it much easier to trace a plot back to the exact settings that produced it, whether it’s used in a poster, report, or presentation.One thing I want to be completely clear about: this verification is about the software, not the physics. Passing 111 tests means the implementation behaves as expected according to those tests—it doesn’t prove the scientific model is perfect. The current validation remains the same: about 2× agreement with MSL/RAD, and the 0.67× absorbed-dose gap is still there, clearly documented.That’s exactly what this release is about: transparency over hype, reproducibility over screenshots, and being honest about what the model can—and can’t—do.Thanks for following this project. ❤️
Hey Stardance crew! Three months since my last devlog, so grab a snack and let me catch you up. DOSEFIELD estimates how much radiation an astronaut gets behind shielding on a trip to Mars, then checks itself against real data from NASA’s Curiosity cruise (MSL/RAD). The big news: I found a mistake in my own results. In my first public version, the solar modulation value (W = 30) could not be reproduced from the derivation I had written down. So I went back to the Oulu neutron-monitor data, matched the exact time window RAD used, skipped the solar-storm days, and got W = 47.50. The new numbers look worse, and I kept them: absorbed dose: 0.264 vs 0.458 mGy/day measured (0.58x) dose equivalent: 1.318 vs 1.75 mSv/day (0.75x) mean quality factor: 4.995 vs 3.82 (1.31x) My model skips secondary particles and neutrons, so it under-predicts the dose. I report the gap and leave it alone. Also shipped: a check against the full NIST PSTAR table (max deviation 1.55% from 10 to 1000 MeV), 190 passing tests, a code archive on Zenodo (DOI 10.5281/zenodo.23433384), a revised paper on SSRN, and a website that links to all of it.
Ships:
Today was all about making the site tell the truth about itself instead of just describing itself. I added a Methods and Limitations page that pulls directly from METHODS.md and the README instead of being rewritten into friendly marketing copy. If the documentation and the code ever disagree, the documentation loses immediately because they are now the exact same file. Every page also got an automated footer showing the commit hash, the test count, and the exact verification date. It would have taken five minutes to hardcode a string like “111 tests passing” and move on. Instead, the build script runs the actual test suite first, and if anything fails, the entire build stops cold. This ensures the footer can never claim a passing state that is not true at that exact moment. Wiring a build to gate on its own test results took most of the afternoon because it required thinking through what happens during a failure, not just when everything goes smoothly, but the absolute transparency is worth it. What I like most is that the limitations table on the public site is word-for-word what is in the repository. There is no filtered summary for visitors. The 0.67x gap between my modeled absorbed dose and NASA’s measured RAD numbers reads just as blunt on the public page as it does in the source code. Transparency matters more than hype. Additionally, charts now export at 3200px, and the configuration that produced them gets baked directly into the image itself, meaning a PNG cannot wander off from the settings that generated it. If you want to test it yourself, you can check the live app at DOSEFIELD. Look at the footer for a real commit hash and test count, open the Methods and Limitations page to count the 12 rows in the limitations table, or export a chart to verify the resolution against what is rendered on your screen. The complete source code is also available on GitHub....
|
1792835586.2613776
|
1792921986.2613776
|
|
21477
|
The KB by @Kartik_B | Stardance
|
Kartik_B
|
2
|
18.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-22T17:07:24Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "THE KB I made my personal website with the personal website mission. This website is space themed, it has planets for different thing like Introduction, Projects etc. You have a ship and you explore the planets. The website is made to scroll horizontally. Mobile version isn’t available right now. The website will continue to go on as i make more projects do more stuff in my life.", "repo": "https://github.com/K-BIDDOLIYA/The-KB", "demo": "https://the-kb.vercel.app"}, {"ship_num": 2, "ts": "2026-09-06T18:43:07Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "The-KB i my personal website under the mission personal site. This site is based on space theme. This is my first ship. I will add the designs and some more info later as i go. Right now it has 7 circle (they’re supposed to be planets actually)", "repo": "https://github.com/K-BIDDOLIYA/The-KB", "demo": "https://the-kb.vercel.app"}]...
|
[{"post_id": 81577, "ts": "202 [{"post_id": 81577, "ts": "2026-10-21T18:46:30Z", "hours": 3.3928, "text": "I changed Achievements to Specials. Made some design changes. Added more projects. Added some Specials. Changed the planets and now they play an animation."}, {"post_id": 80549, "ts": "2026-10-18T04:13:35Z", "hours": 4.4444, "text": "I love my project more than anything. That’s why i made a separate projects.html for them with a timeline. All of the projects not included till now. And will not be cause the no. of projects is still increasing day by day. They are mostly on the june to october side cause before that, i used to delete failed projects and also heavy AI usage was there. Here’s a screenshot."}, {"post_id": 68537, "ts": "2026-09-15T08:48:16Z", "hours": 1.6364, "text": "Yoo, i just added some designs that i learned from a tutorial type video. The panel looks cool. But now, i’ll work on another thing inside of it. The Timeline. It will be revealed soon. What do you think about this project."}, {"post_id": 66134, "ts": "2026-09-11T19:11:31Z", "hours": 1.4808, "text": "Just tryna spit some words from the soul here No design work done yet, just plain code. Also, should i add a timeline to show everything i did online. I can use it for scheduling projects also."}, {"post_id": 63104, "ts": "2026-09-06T18:38:30Z", "hours": 1.3342, "text": "Ok, i have completed all the requirements. I’ll do the design stuff later. I’m making the first ship now."}, {"post_id": 62068, "ts": "2026-09-05T09:36:39Z", "hours": 2.0969, "text": "The project is going good. I am planning to ship the version 1 without the info in there, cause i just came to know that the first ship won’t be rated. So, i’ll just have the requirements completed and the project will be get its first ship right away. I have added 7 circles here, what could be the plan for the design? can you guess? Edit: I just left claude and i’m tryna do it alone."}, {"post_id": 60776, "ts": "2026-09-03T11:26:57Z", "hours": 2.7822, "text": "I have made a new plan and design for the website. I am also trying to learn HTML, CSS and JS while building this project that’s why its taking too long. i am learning the thing first before i implement it in the codes. Claude is helping me in the learning part, but i swear i didn’t used it to generate a single line of code. It is just instructing me on what to do next. I will not reveal the plan right now. Try to guess it Here’s a screenshot."}, {"post_id": 58017, "ts": "2026-08-30T11:08:54Z", "hours": 1.0689, "text": "TheKB Devlog - #1 Just started off with learning some HTML and CSS for the first time. I am planning to include soo many stuff about me in this personal website. I don’t really have any design ideas right now, please give me some ideas for how can i make the website look more impressive and crazy. This i the first look btw."}]...
|
Title: The KB by @Kartik_B | Stardance
Devlogs:
T Title: The KB by @Kartik_B | Stardance
Devlogs:
TheKB Devlog - #1 Just started off with learning some HTML and CSS for the first time. I am planning to include soo many stuff about me in this personal website. I don’t really have any design ideas right now, please give me some ideas for how can i make the website look more impressive and crazy. This i the first look btw.
I have made a new plan and design for the website. I am also trying to learn HTML, CSS and JS while building this project that’s why its taking too long. i am learning the thing first before i implement it in the codes. Claude is helping me in the learning part, but i swear i didn’t used it to generate a single line of code. It is just instructing me on what to do next. I will not reveal the plan right now. Try to guess it Here’s a screenshot.
The project is going good. I am planning to ship the version 1 without the info in there, cause i just came to know that the first ship won’t be rated. So, i’ll just have the requirements completed and the project will be get its first ship right away. I have added 7 circles here, what could be the plan for the design? can you guess? Edit: I just left claude and i’m tryna do it alone.
Ok, i have completed all the requirements. I’ll do the design stuff later. I’m making the first ship now.
Just tryna spit some words from the soul here No design work done yet, just plain code. Also, should i add a timeline to show everything i did online. I can use it for scheduling projects also.
Yoo, i just added some designs that i learned from a tutorial type video. The panel looks cool. But now, i’ll work on another thing inside of it. The Timeline. It will be revealed soon. What do you think about this project.
I love my project more than anything. That’s why i made a separate projects.html for them with a timeline. All of the projects not included till now. And will not be cause the no. of projects is still increasing day by day. They are mostly on the june to october side cause before that, i used to delete failed projects and also heavy AI usage was there. Here’s a screenshot.
I changed Achievements to Specials. Made some design changes. Added more projects. Added some Specials. Changed the planets and now they play an animation.
Ships:
The-KB i my personal website under the mission personal site. This site is based on space theme. This is my first ship. I will add the designs and some more info later as i go. Right now it has 7 circle (they’re supposed to be planets actually)
THE KB I made my personal website with the personal website mission. This website is space themed, it has planets for different thing like Introduction, Projects etc. You have a ship and you explore the planets. The website is made to scroll horizontally. Mobile version isn’t available right now. The website will continue to go on as i make more projects do more stuff in my life....
|
1792831841.6139207
|
1792918241.6139207
|
|
69642
|
My macropad! by @0blongPistachi0 | Stardance
|
0blongPistachi0
|
0
|
18.81
|
0
|
[]
|
[{"post_id": 81610, "ts": "202 [{"post_id": 81610, "ts": "2026-10-21T19:11:47Z", "hours": 3.2964, "text": "4 New iterations of my macropad case , I still don’t like the look of them yet (Im very picky) , currently on V10"}, {"post_id": 81129, "ts": "2026-10-20T00:18:54Z", "hours": 6.7769, "text": "Made a handful of sketches for my Macropad case , made 3 new iterations in cad , Redesigned the PCB 3 times , made sure it complies with JLCLONE, ACTUALLY Finalised the PCB!!! ,and organised Gerber , STL and Firmware files like the guide wants , Tomorrow ill start working on firmware , and continue working on designs for the case,"}, {"post_id": 80858, "ts": "2026-10-19T01:29:54Z", "hours": 6.4656, "text": "Made a couple mockups for what i want my Macropad to look like , realised that i dont like the look of it , completely remodeled it , finalised the pcb design and worked on v3 of the case design. Ill start ordering the parts tomorrow and work on optimising the case"}, {"post_id": 80501, "ts": "2026-10-17T21:45:59Z", "hours": 2.2739, "text": "Figuring out how a macropod works , what i want mine to do , what parts i want to use and started on a model , But i completely forgot that Hack pad has a tutorial for this , so ill be using that tomorrow"}]...
|
Title: My macropad! by @0blongPistachi0 | Stardanc Title: My macropad! by @0blongPistachi0 | Stardance
Devlogs:
Figuring out how a macropod works , what i want mine to do , what parts i want to use and started on a model , But i completely forgot that Hack pad has a tutorial for this , so ill be using that tomorrow
Made a couple mockups for what i want my Macropad to look like , realised that i dont like the look of it , completely remodeled it , finalised the pcb design and worked on v3 of the case design. Ill start ordering the parts tomorrow and work on optimising the case
Made a handful of sketches for my Macropad case , made 3 new iterations in cad , Redesigned the PCB 3 times , made sure it complies with JLCLONE, ACTUALLY Finalised the PCB!!! ,and organised Gerber , STL and Firmware files like the guide wants , Tomorrow ill start working on firmware , and continue working on designs for the case,
4 New iterations of my macropad case , I still don’t like the look of them yet (Im very picky) , currently on V10...
|
1792857276.85239
|
1793462076.85239
|
|
69752
|
Smart inspection helmet by @Tejas | Stardance
|
Tejas
|
0
|
8.89
|
0
|
[]
|
[{"post_id": 81618, "ts": "202 [{"post_id": 81618, "ts": "2026-10-21T19:39:38Z", "hours": 6.4294, "text": "Oct 21 Devlog 2 detecting the circle in the gauge i have fixed the fps issue previously and getting stable fps to perform my task through a webcam its mentioned in first devlog so i moved on to next part so after that i started working on detecting gauge and its main pin first i started with detecting the circle and middle point of the gauge so i used gauge image for that for now and then i apply same algorithm in video input so i understanded the geometry of circle to detect circle in the gauge then i get to know that we have prepare the image first for the detection in which we apply grayscale filter and blur to image , blur to reduce the noise after that preparing i used the “cv2.HoughCircles()” library of open cv this library search the circular shapes in images it have multiple parameter we can tweak to get desirable outcome after using that library to detect circle i draw the circle in the image and displayed the output in terminal after detecting the main circle in gauge finding the pin mid point is easy just put an dot on middle of circle(repented by red) Long Part Detecting the needle to detect the main gauge needle we have to mask the dial gray scale the region and using edge detection to highlight the boundaries and line (photos added) then identify the candidate line around the gauge so they all not mix-up (only detects straight lines ) then i visualized the lines i faced like problem in unpacking this detected line coordinates because it is structed as a single integer so i lookup for solution and come accross it we have to use “fatten()” it coverts arrays into one-dimensional array i didnt get it that much but its like assigning multiple coordinate at single point and i got lines on the images but all are not filtered too many line the out put is usable so we have to use filters like in the sence a set rules which line can pass through which are not i mused midpoint formula to calculate the closest line to the mid point to detect the needle after that i used angle calculation too after that i used all of this filtration and all that and combine it together and got the output in last now its detecting the needle and dial of the gauge given in input (some time is inflated due to some error in hackatime i hope it solve asap it tracked my unrelated grokbot session time in this project )"}, {"post_id": 80464, "ts": "2026-10-17T18:37:58Z", "hours": 2.4633, "text": "Oct 18 Devlog 1 Starting up Project Testing all things setting up Making a inspection helmet for industry use where they use it for gauge reading and storing that data and its used for live monitoring What did i do today i checked the new webcam i choose this cam because its best for my use , got its feed on window using python decided using open cv library of python to track the gauge data live learned you to add images in opencv window and add filters to them learned how to apply different types of filters Problems - i faced from in getting stable fps in video feed using web cam so i tried multiple technique then i figured out by lowering the resolution and changing the video format give me output that i want so set the resolution to 640X480 and format to MJPG in future now i am testing in my pc then i shift to my rdk x5 board and use it as computation board and use its npu to render output and attach this to a helmet so works can use this"}]...
|
Title: Smart inspection helmet by @Tejas | Stardan Title: Smart inspection helmet by @Tejas | Stardance
Devlogs:
Oct 18 Devlog 1 Starting up Project Testing all things setting up Making a inspection helmet for industry use where they use it for gauge reading and storing that data and its used for live monitoring What did i do today i checked the new webcam i choose this cam because its best for my use , got its feed on window using python decided using open cv library of python to track the gauge data live learned you to add images in opencv window and add filters to them learned how to apply different types of filters Problems - i faced from in getting stable fps in video feed using web cam so i tried multiple technique then i figured out by lowering the resolution and changing the video format give me output that i want so set the resolution to 640X480 and format to MJPG in future now i am testing in my pc then i shift to my rdk x5 board and use it as computation board and use its npu to render output and attach this to a helmet so works can use this
Oct 21 Devlog 2 detecting the circle in the gauge i have fixed the fps issue previously and getting stable fps to perform my task through a webcam its mentioned in first devlog so i moved on to next part so after that i started working on detecting gauge and its main pin first i started with detecting the circle and middle point of the gauge so i used gauge image for that for now and then i apply same algorithm in video input so i understanded the geometry of circle to detect circle in the gauge then i get to know that we have prepare the image first for the detection in which we apply grayscale filter and blur to image , blur to reduce the noise after that preparing i used the “cv2.HoughCircles()” library of open cv this library search the circular shapes in images it have multiple parameter we can tweak to get desirable outcome after using that library to detect circle i draw the circle in the image and displayed the output in terminal after detecting the main circle in gauge finding the pin mid point is easy just put an dot on middle of circle(repented by red) Long Part Detecting the needle to detect the main gauge needle we have to mask the dial gray scale the region and using edge detection to highlight the boundaries and line (photos added) then identify the candidate line around the gauge so they all not mix-up (only detects straight lines ) then i visualized the lines i faced like problem in unpacking this detected line coordinates because it is structed as a single integer so i lookup for solution and come accross it we have to use “fatten()” it coverts arrays into one-dimensional array i didnt get it that much but its like assigning multiple coordinate at single point and i got lines on the images but all are not filtered too many line the out put is usable so we have to use filters like in the sence a set rules which line can pass through which are not i mused midpoint formula to calculate the closest line to the mid point to detect the needle after that i used angle calculation too after that i used all of this filtration and all that and combine it together and got the output in last now its detecting the needle and dial of the gauge given in input (some time is inflated due to some error in hackatime i hope it solve asap it tracked my unrelated grokbot session time in this project )...
|
1792857352.9158788
|
1793462152.9158788
|
|
70855
|
JP Pad by @Jhenil | Stardance
|
Jhenil
|
0
|
1.42
|
0
|
[]
|
[{"post_id": 81624, "ts": "202 [{"post_id": 81624, "ts": "2026-10-21T20:00:32Z", "hours": 1.4203, "text": "Devlog - 1 Ok so I have started on this hardware project which is JP Pad. Why I chose that name? Because JP are my initials and this is a macropad so pad comes from there. I have designed the schematic for the pcb and have routed the pcb. This was my first time making it but it was fairly quick. I am attaching the images of it down below. Let me know what you think about it. NOTE: IT TOOK ME 39 MINUTES TO MAKE IT BUT THERE IS A SYNC ISSUE WITH LOOKOUT AND HACKATIME FOR ME. I AM REQUESTING THE REVIEWER TO DEFLATE 46 MINUTES OF MY TIME TO ACCOUNT FOR THAT INCREASE DUE TO A SYNC PROBLEM."}]...
|
Title: JP Pad by @Jhenil | Stardance
Devlogs:
Dev Title: JP Pad by @Jhenil | Stardance
Devlogs:
Devlog - 1 Ok so I have started on this hardware project which is JP Pad. Why I chose that name? Because JP are my initials and this is a macropad so pad comes from there. I have designed the schematic for the pcb and have routed the pcb. This was my first time making it but it was fairly quick. I am attaching the images of it down below. Let me know what you think about it. NOTE: IT TOOK ME 39 MINUTES TO MAKE IT BUT THERE IS A SYNC ISSUE WITH LOOKOUT AND HACKATIME FOR ME. I AM REQUESTING THE REVIEWER TO DEFLATE 46 MINUTES OF MY TIME TO ACCOUNT FOR THAT INCREASE DUE TO A SYNC PROBLEM....
|
1792615627.2587628
|
1793220427.2587628
|
|
70858
|
Personal website by @catlover125r | Stardance
|
catlover125r
|
1
|
29.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T20:32:05Z", "hours": 29.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my personal site, built from scratch with plain HTML and CSS and hosted on Vercel. It covers my classes, projects, and what I do at Sequoia. I also featured the papers I made for data science projects (RunScore and RecovHR). A recent addition was a heatmap for my running. If you click “Cross Country & Track” it opens a heatmap of every run I’ve recorded on my COROS watch. Hidden pages: /momrecipe brings you to a collection of my mom’s 345 recipes that I have digitized for her. /reciptpolaroid was built for a party where you can take a photo on your phone and it will print it on a receipt printer for a makeshift polaroid. /CalcPlot3D is a self hosted copy of CalcPlot3D because I like it so much I don’t want to lose it.", "repo": "https://github.com/catlover125r/lukepopler.me", "demo": "https://lukepopler.me"}]...
|
[{"post_id": 81630, "ts": "202 [{"post_id": 81630, "ts": "2026-10-21T20:29:29Z", "hours": 29.4625, "text": "My personal site, built from scratch with plain HTML and CSS and hosted on Vercel. It covers my classes, projects, and what I do at Sequoia. I also featured the papers I made for data science projects (RunScore and RecovHR). A recent addition was a heatmap for my running. If you click “Cross Country & Track” it opens a heatmap of every run I’ve recorded on my COROS watch. Hidden pages: /momrecipe brings you to a collection of my mom’s 345 recipes that I have digitized for her. /reciptpolaroid was built for a party where you can take a photo on your phone and it will print it on a receipt printer for a makeshift polaroid. /CalcPlot3D is a self hosted copy of CalcPlot3D because I like it so much I don’t want to lose it."}]...
|
Title: Personal website by @catlover125r | Stardan Title: Personal website by @catlover125r | Stardance
Devlogs:
My personal site, built from scratch with plain HTML and CSS and hosted on Vercel. It covers my classes, projects, and what I do at Sequoia. I also featured the papers I made for data science projects (RunScore and RecovHR). A recent addition was a heatmap for my running. If you click “Cross Country & Track” it opens a heatmap of every run I’ve recorded on my COROS watch. Hidden pages: /momrecipe brings you to a collection of my mom’s 345 recipes that I have digitized for her. /reciptpolaroid was built for a party where you can take a photo on your phone and it will print it on a receipt printer for a makeshift polaroid. /CalcPlot3D is a self hosted copy of CalcPlot3D because I like it so much I don’t want to lose it.
Ships:
This is my personal site, built from scratch with plain HTML and CSS and hosted on Vercel. It covers my classes, projects, and what I do at Sequoia. I also featured the papers I made for data science projects (RunScore and RecovHR). A recent addition was a heatmap for my running. If you click “Cross Country & Track” it opens a heatmap of every run I’ve recorded on my COROS watch. Hidden pages: /momrecipe brings you to a collection of my mom’s 345 recipes that I have digitized for her. /reciptpolaroid was built for a party where you can take a photo on your phone and it will print it on a receipt printer for a makeshift polaroid. /CalcPlot3D is a self hosted copy of CalcPlot3D because I like it so much I don’t want to lose it....
|
1792615634.3518167
|
1792702034.3518167
|
|
70863
|
DayMap by @srinivasa07 | Stardance
|
srinivasa07
|
0
|
50.77
|
0
|
[]
|
[{"post_id": 81638, "ts": "202 [{"post_id": 81638, "ts": "2026-10-21T20:57:15Z", "hours": 50.765, "text": "I actually created this project for future, so I didn’t do devlogs but anyways here is how I Used it. I spent my time working on flask router and sql db, I had to create a SQLite tables to make sure nothing gets lost if you change a browser, I had to do task management about separating (overcome, today and upcoming ) and react interface with inputs, fetching flask and state handling. Connecting every button to the flask api. Future room using several things and a timer and I hade to do all this while fixing several bugs and with less than 10% ai usage"}]...
|
Title: DayMap by @srinivasa07 | Stardance
Devlogs Title: DayMap by @srinivasa07 | Stardance
Devlogs:
I actually created this project for future, so I didn’t do devlogs but anyways here is how I Used it. I spent my time working on flask router and sql db, I had to create a SQLite tables to make sure nothing gets lost if you change a browser, I had to do task management about separating (overcome, today and upcoming ) and react interface with inputs, fetching flask and state handling. Connecting every button to the flask api. Future room using several things and a timer and I hade to do all this while fixing several bugs and with less than 10% ai usage...
|
1792619235.4223676
|
1793224035.4223676
|
|
30987
|
Dewen by @jaxonpenka127 | Stardance
|
jaxonpenka127
|
4
|
55.0
|
532
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T21:07:25Z", "hours": 14.0, "multiplier": 9.65, "payout": 133, "blessing": "neutral", "text": "Last major ship for Dewen: agents with a Bring Your Own Key structure a desktop app for macOS multilingual support and a new logo (credit to @Jcleo2 for the logo geometry) Feel free to try out the new stuff if you’d like. https://dewen.netlify.app", "repo": "https://github.com/JaxTheDevG008/Dewen", "demo": "https://dewen.netlify.app"}, {"ship_num": 2, "ts": "2026-09-12T21:44:40Z", "hours": 21.0, "multiplier": 12.55, "payout": 262, "blessing": "neutral", "text": "Features Added IndexedDB integration Avatars and more customization options More command bar commands SEO improvements so Dewen can appear in Google search results Two new mini analytics: Upcoming Tasks and Stale Tasks Better responsiveness across devices What was challenging? Probably the IndexedDB integration. It meant moving from a simple storage method to a full database. I had to learn how to create object stores, save data to them, and load that data when the app starts. What am I proud of? The IndexedDB integration and the increased customization. Adding IndexedDB makes Dewen feel much more like a real application than just a project, while features like avatars and theme presets make it much easier for users to personalize their experience. What’s next? Now that the Stardance Challenge is about to wrap up, I’m going to pivot some of my time toward other things, including the Congressional App Challenge and my other projects: AuditionLM, LIAB, and Pocket Lab, while also continue development on Dewen. Thank you for supporting me throughout this challenge and following along as Dewen grew.", "repo": "https://github.com/JaxTheDevG008/Dewen", "demo": "https://dewen.netlify.app"}, {"ship_num": 3, "ts": "2026-07-31T16:18:38Z", "hours": 20.0, "multiplier": 4.19, "payout": 132, "blessing": "neutral", "text": "New Dewen version! Includes: removed topbar and updated sidebar accent color customization animation for collapsing and expanding mini analytics made what to focus on an analytic necessary bug fixes There will be more to come. Thanks for supporting me on this journey!", "repo": "https://github.com/JaxTheDevG008/Dewen", "demo": "https://dewen.netlify.app"}, {"ship_num": 4, "ts": "2026-07-05T13:56:28Z", "hours": 0.0, "multiplier": 3.16, "payout": 5, "blessing": "neutral", "text": "This is my task and project management web app called Dewen, which is meant to be completely subscription-free, AI-optional, and local-first while delivering useful productivity tools. What was definitely challenging was the search and command bar, where I had to rely on AI tools to help me build it. What I’m proud of is how the tools sync with each other. When you add a task, it renders on the calendar, and when you start a focus session, the activity panel logs the action. Finally, users should know that it takes barely any steps to get started, since there are no accounts.", "repo": "https://github.com/JaxTheDevG008/Dewen", "demo": "https://dewen.netlify.app"}]...
|
[{"post_id": 81641, "ts": "202 [{"post_id": 81641, "ts": "2026-10-21T21:04:51Z", "hours": 3.1267, "text": "Last devlog: I decided to add multilingual support to make Dewen more accessible to people around the world. It supports languages like Spanish, French, German, Chinese, Japanese, Korean, and more. Feel free to try it out if you’d like 🙂"}, {"post_id": 74981, "ts": "2026-09-28T19:28:56Z", "hours": 1.0144, "text": "This isn’t really a devlog, but I thought I might just post about it. My app, after not having an identity for so long, finally has its own logo. I feel extremely glad about the logo being over and done with and the colors in the logo as well. I want to give credit to @Jcleo2 for creating the geometry for the logo, which I then refined and added my own colors. So thank you @Jcleo2 . Thanks for reading, and have a great day!"}, {"post_id": 72853, "ts": "2026-09-23T21:26:55Z", "hours": 2.2408, "text": "Now that Stardance is happening for another month, I’m able to do more devlogs, so kudos to everyone for making it happen. Another big milestone for Dewen: It officially has a desktop application now! Now you don’t have to use the website often and instead you can use the desktop application. It uses Tauri to help with wrapping the app in a desktop layer to help make it a legitimate desktop app. A quick heads up for macOS users: because this is an independent, open-source application bundle, macOS may display a warning stating the app is “damaged” on your first launch. You can learn how to do it correctly in the README on the GitHub repo page. Dewen is currently available for macOS, but I hope to expand it to Windows and Linux as well. Thanks for reading, and I hope you have a great day!"}, {"post_id": 70832, "ts": "2026-09-19T20:49:14Z", "hours": 1.7767, "text": "I have added a second agent: the Researcher Agent! To make it work, you need to have a Tavily API key and insert it into the settings. Then you can type what you want and it creates a quick note containing what it researched. Alongside that, I also added agent selection where you can choose which agent you want to use. This prevents weird things from happening if you instruct the wrong agent. I hope you have a great rest of your day! Try out the Researcher Agent now! (if you want to 😁)"}, {"post_id": 70616, "ts": "2026-09-19T13:47:33Z", "hours": 5.6486, "text": "I know I’m contradicting what I said before, that I was done with Stardance, but I thought this was something cool to talk about. Well, I have agents in Dewen now! Integrating AI into Dewen has been one of my top goals since the start. Now it’s actually a reality, and I feel absolute pride in accomplishing this. How it works is you toggle AI in the settings if you want it on or off, then it uses Bring Your Own Key (BYOK) meaning you can insert your API key into the app. Then there’s a button in the sidebar with shapes. Click on that, type in your prompt, and Dewen will do the rest. This is powered by my Python backend, hosted on Render and UptimeRobot opens it every five minutes to prevent it from taking 50 seconds to load the AI. I hope you enjoy using AI in Dewen, and have a great rest of your day!"}, {"post_id": 66915, "ts": "2026-09-12T21:34:55Z", "hours": 4.5225, "text": "Well, this is probably going to be my last devlog for the Stardance Challenge, so let’s make it count. First off, I finally managed to convert Dewen to IndexedDB, one of my long-term goals for the app. LocalStorage was starting to become limiting, and I wanted something more scalable while still keeping Dewen local-first. That’s why I went with IndexedDB. I set up DewenDB in storage.ts, added helper functions in main.ts to save tasks, notes, and activities, and made sure everything loads when the app starts. Now, I want to take a moment to look at how far we’ve come. Dewen started back in December 2025 as a simple to-do list. From there, it evolved into a productivity hub, then a productivity workspace, and now an actual application. The task list, focus timer, quick notes, calendar, activity panel, command bar, and everything else have come a long way from that original task list. Building Dewen, and participating in the Stardance Challenge, has taught me much more than just how to code. It has taught me how to take an idea and turn it into a real application that people can actually use. Now that the Stardance Challenge is wrapping up, I’m going to be shifting some of my time toward other projects while continuing to work on Dewen. First, Dewen is my submission for the 2026 Congressional App Challenge, representing Pennsylvania’s 15th District, so that’s something I’m excited to focus on. I also have several other projects I want to work on alongside Dewen: AuditionLM, an AI benchmark ranking and evaluation app; Local In A Box, or LIAB, a CLI tool for integrating and managing local-first architecture in applications; and Pocket Lab, a portable experimentation device for conducting experiments and exploring science. Stardance may be coming to an end, but Dewen never will. Thank you for following along, supporting the project, and watching it grow."}, {"post_id": 53471, "ts": "2026-08-24T01:15:39Z", "hours": 1.5208, "text": "To improve the customization of Dewen, I thought it would be nice to add theme presets to make choosing a theme faster and more approachable. Themes include default, ocean, forest, sunset, rose, midnight, terminal, and slate. Another thing I added was localStoraging the focus timer state. For example, the focus timer reads 21:57, and you accidentally reload the site. It’ll still have 21:57 and continue going from there! I hope these new features improve the user experience of Dewen, and I want to continue improving them and the core experience of the app. Thanks for reading, and have a great day!"}, {"post_id": 53244, "ts": "2026-08-23T18:05:59Z", "hours": 8.0639, "text": "This week I continued to update Dewen with more polish and power to make it easier for people to use my app. These updates focus on overall experience, faster workflows, and turning Dewen into a more complete workspace. Features include: better responsiveness: To make the experience better for mobile and tablet users, I decided to improve the responsiveness of the app to transition to different layouts easily. more commands: To help keyboard users control their workflow more efficiently, I added new commands like editing tasks and notes, controlling the timer, prioritizing tasks, and more. To learn more about them, type :h in the command bar. new mini analytics: I changed two of the empty cards to contain Upcoming Tasks that are getting close to their due date, and Stale Tasks that haven’t been touched in a while. I hope that these new changes improve the user experience for Dewen, as this is turning into much more than a simple task list. Thank you for reading, and have a great day!"}, {"post_id": 44541, "ts": "2026-08-10T11:36:24Z", "hours": 0.9275, "text": "I wanted to make it so that Dewen could be more discoverable rather than just requiring people to “click a direct link”, so I utilized the Netlify Sitemap plugin and Google Search Console to make that happen! This is a pretty cool milestone for Dewen, as it shows that it isn’t just another website project. Now I want to continue improving its SEO and discoverability so that eventaully, you can type in “dewen app” and it’ll show up. Thank you for reading!"}, {"post_id": 42991, "ts": "2026-08-08T00:31:00Z", "hours": 2.5153, "text": "Before this devlog, the search/command bar used to only do :a <task description> . To make it easier to use Dewen with the keyboard without navigating the app so much, I decided to add more commands to the command bar. New commands include: :n <note content> | creates a note :c <task> | completes a task :d <task> | deletes a task :f <duration> <task> | starts a focus session (e.g. :f 25, take out the trash ) I hope these types of commands make it easier to use my app, especially for keyboard-native users. I’m also planning to implement more command bar commands as I continue improving the app. Thank you!"}, {"post_id": 39635, "ts": "2026-08-02T19:13:55Z", "hours": 3.3336, "text": "Added avatars and profile picture customization. Add your own image to serve as your avatar, look at presets for avatars based on hobbies and careers, and toggle if you want the accent on it on or off! 😁"}, {"post_id": 38276, "ts": "2026-07-31T16:16:14Z", "hours": 1.8494, "text": "Removed two mini analytics and added an animation for expanding and collapsing them"}, {"post_id": 37355, "ts": "2026-07-30T00:36:01Z", "hours": 3.1358, "text": "Added another customization option where you can customize the accent color 😁 (also updated mini analytics a little)"}, {"post_id": 36786, "ts": "2026-07-29T01:54:50Z", "hours": 3.9203, "text": "Added offline support to my website, so no matter where you are, you’re able to access my web app! 😁"}, {"post_id": 35534, "ts": "2026-07-27T01:06:01Z", "hours": 2.7853, "text": "Man, after using a single Vanilla JS file to develop Dewen, I realized I needed a better structure to help scale the project further. But I really underestimated how challenging it was going to be, especially since I don’t know React, meaning I have to learn it. So wish me luck, I guess."}, {"post_id": 34866, "ts": "2026-07-25T22:37:06Z", "hours": 2.5794, "text": "I have officially converted from main.js to main.ts, meaning everything is in TypeScript. Now to make everything modular…🤞"}, {"post_id": 34384, "ts": "2026-07-25T01:51:35Z", "hours": 2.8206, "text": "Currently trying to convert from Vanilla JS to TypeScript and eventually a framework like React. Fingers crossed! 🤞"}, {"post_id": 30471, "ts": "2026-07-18T02:05:51Z", "hours": 2.4369, "text": "Part 1 of redesigning mini analytics: making a risk report featuring overdue tasks, tasks due today, and blocked tasks"}, {"post_id": 29247, "ts": "2026-07-16T01:10:25Z", "hours": 0.0, "text": "New UI changes so far (removed topbar and updated sidebar a little)"}, {"post_id": 26315, "ts": "2026-07-11T01:24:46Z", "hours": 0.0, "text": "This isn’t really a devlog, but rather a heads up about something: Hackatime and Stardance are saying that I’ve worked on this for a few hours. That’s incorrect. I’ve been working on this project since December and January. I’ve used AI to help me with some of the project, but this is in no way a “vibe coded” app. I’ve included a screenshot of my oldest Git commit history for the project to set the record straight. Thanks for the feedback, and I will continue working on improving this web app!"}, {"post_id": 23543, "ts": "2026-07-06T15:56:44Z", "hours": 0.0, "text": "Have any feature ideas for Dewen? Would be happy to help develop them!"}, {"post_id": 22976, "ts": "2026-07-05T17:37:45Z", "hours": 0.0, "text": "Currently working on leveling up the mini analytics (the cards you see under the “Good morning” message) to display useful information. Stay tuned!"}, {"post_id": 22874, "ts": "2026-07-05T14:32:54Z", "hours": 0.0, "text": "Fixed a calendar and decrastinator bug"}, {"post_id": 22831, "ts": "2026-07-05T13:06:36Z", "hours": 0.0, "text": "Energy Gauge"}]...
|
Title: Dewen by @jaxonpenka127 | Stardance
Devlog Title: Dewen by @jaxonpenka127 | Stardance
Devlogs:
Energy Gauge
Fixed a calendar and decrastinator bug
Currently working on leveling up the mini analytics (the cards you see under the “Good morning” message) to display useful information. Stay tuned!
Have any feature ideas for Dewen? Would be happy to help develop them!
This isn’t really a devlog, but rather a heads up about something: Hackatime and Stardance are saying that I’ve worked on this for a few hours. That’s incorrect. I’ve been working on this project since December and January. I’ve used AI to help me with some of the project, but this is in no way a “vibe coded” app. I’ve included a screenshot of my oldest Git commit history for the project to set the record straight. Thanks for the feedback, and I will continue working on improving this web app!
New UI changes so far (removed topbar and updated sidebar a little)
Part 1 of redesigning mini analytics: making a risk report featuring overdue tasks, tasks due today, and blocked tasks
Currently trying to convert from Vanilla JS to TypeScript and eventually a framework like React. Fingers crossed! 🤞
I have officially converted from main.js to main.ts, meaning everything is in TypeScript. Now to make everything modular…🤞
Man, after using a single Vanilla JS file to develop Dewen, I realized I needed a better structure to help scale the project further. But I really underestimated how challenging it was going to be, especially since I don’t know React, meaning I have to learn it. So wish me luck, I guess.
Added offline support to my website, so no matter where you are, you’re able to access my web app! 😁
Added another customization option where you can customize the accent color 😁 (also updated mini analytics a little)
Removed two mini analytics and added an animation for expanding and collapsing them
Added avatars and profile picture customization. Add your own image to serve as your avatar, look at presets for avatars based on hobbies and careers, and toggle if you want the accent on it on or off! 😁
Before this devlog, the search/command bar used to only do :a <task description> . To make it easier to use Dewen with the keyboard without navigating the app so much, I decided to add more commands to the command bar. New commands include: :n <note content> | creates a note :c <task> | completes a task :d <task> | deletes a task :f <duration> <task> | starts a focus session (e.g. :f 25, take out the trash ) I hope these types of commands make it easier to use my app, especially for keyboard-native users. I’m also planning to implement more command bar commands as I continue improving the app. Thank you!
I wanted to make it so that Dewen could be more discoverable rather than just requiring people to “click a direct link”, so I utilized the Netlify Sitemap plugin and Google Search Console to make that happen! This is a pretty cool milestone for Dewen, as it shows that it isn’t just another website project. Now I want to continue improving its SEO and discoverability so that eventaully, you can type in “dewen app” and it’ll show up. Thank you for reading!
This week I continued to update Dewen with more polish and power to make it easier for people to use my app. These updates focus on overall experience, faster workflows, and turning Dewen into a more complete workspace. Features include: better responsiveness: To make the experience better for mobile and tablet users, I decided to improve the responsiveness of the app to transition to different layouts easily. more commands: To help keyboard users control their workflow more efficiently, I added new commands like editing tasks and notes, controlling the timer, prioritizing tasks, and more. To learn more about them, type :h in the command bar. new mini analytics: I changed two of the empty cards to contain Upcoming Tasks that are getting close to their due date, and Stale Tasks that haven’t been touched in a while. I hope that these new changes improve the user experience for Dewen, as this is turning into much more than a simple task list. Thank you for reading, and have a great day!
To improve the customization of Dewen, I thought it would be nice to add theme presets to make choosing a theme faster and more approachable. Themes include default, ocean, forest, sunset, rose, midnight, terminal, and slate. Another thing I added was localStoraging the focus timer state. For example, the focus timer reads 21:57, and you accidentally reload the site. It’ll still have 21:57 and continue going from there! I hope these new features improve the user experience of Dewen, and I want to continue improving them and the core experience of the app. Thanks for reading, and have a great day!
Well, this is probably going to be my last devlog for the Stardance Challenge, so let’s make it count. First off, I finally managed to convert Dewen to IndexedDB, one of my long-term goals for the app. LocalStorage was starting to become limiting, and I wanted something more scalable while still keeping Dewen local-first. That’s why I went with IndexedDB. I set up DewenDB in storage.ts, added helper functions in main.ts to save tasks, notes, and activities, and made sure everything loads when the app starts. Now, I want to take a moment to look at how far we’ve come. Dewen started back in December 2025 as a simple to-do list. From there, it evolved into a productivity hub, then a productivity workspace, and now an actual application. The task list, focus timer, quick notes, calendar, activity panel, command bar, and everything else have come a long way from that original task list. Building Dewen, and participating in the Stardance Challenge, has taught me much more than just how to code. It has taught me how to take an idea and turn it into a real application that people can actually use. Now that the Stardance Challenge is wrapping up, I’m going to be shifting some of my time toward other projects while continuing to work on Dewen. First, Dewen is my submission for the 2026 Congressional App Challenge, representing Pennsylvania’s 15th District, so that’s something I’m excited to focus on. I also have several other projects I want to work on alongside Dewen: AuditionLM, an AI benchmark ranking and evaluation app; Local In A Box, or LIAB, a CLI tool for integrating and managing local-first architecture in applications; and Pocket Lab, a portable experimentation device for conducting experiments and exploring science. Stardance may be coming to an end, but Dewen never will. Thank you for following along, supporting the project, and watching it grow.
I know I’m contradicting what I said before, that I was done with Stardance, but I thought this was something cool to talk about. Well, I have agents in Dewen now! Integrating AI into Dewen has been one of my top goals since the start. Now it’s actually a reality, and I feel absolute pride in accomplishing this. How it works is you toggle AI in the settings if you want it on or off, then it uses Bring Your Own Key (BYOK) meaning you can insert your API key into the app. Then there’s a button in the sidebar with shapes. Click on that, type in your prompt, and Dewen will do the rest. This is powered by my Python backend, hosted on Render and UptimeRobot opens it every five minutes to prevent it from taking 50 seconds to load the AI. I hope you enjoy using AI in Dewen, and have a great rest of your day!
I have added a second agent: the Researcher Agent! To make it work, you need to have a Tavily API key and insert it into the settings. Then you can type what you want and it creates a quick note containing what it researched. Alongside that, I also added agent selection where you can choose which agent you want to use. This prevents weird things from happening if you instruct the wrong agent. I hope you have a great rest of your day! Try out the Researcher Agent now! (if you want to 😁)
Now that Stardance is happening for another month, I’m able to do more devlogs, so kudos to everyone for making it happen. Another big milestone for Dewen: It officially has a desktop application now! Now you don’t have to use the website often and instead you can use the desktop application. It uses Tauri to help with wrapping the app in a desktop layer to help make it a legitimate desktop app. A quick heads up for macOS users: because this is an independent, open-source application bundle, macOS may display a warning stating the app is “damaged” on your first launch. You can learn how to do it correctly in the README on the GitHub repo page. Dewen is currently available for macOS, but I hope to expand it to Windows and Linux as well. Thanks for reading, and I hope you have a great day!
This isn’t really a devlog, but I thought I might just post about it. My app, after not having an identity for so long, finally has its own logo. I feel extremely glad about the logo being over and done with and the colors in the logo as well. I want to give credit to @Jcleo2 for creating the geometry for the logo, which I then refined and added my own colors. So thank you @Jcleo2 . Thanks for reading, and have a great day!
Last devlog: I decided to add multilingual support to make Dewen more accessible to people around the world. It supports languages like Spanish, French, German, Chinese, Japanese, Korean, and more. Feel free to try it out if you’d like 🙂
Ships:
This is my task and project management web app called Dewen, which is meant to be completely subscription-free, AI-optional, and local-first while delivering useful productivity tools. What was definitely challenging was the search and command bar, where I had to rely on AI tools to help me build it. What I’m proud of is how the tools sync with each other. When you add a task, it renders on the calendar, and when you start a focus session, the activity panel logs the action. Finally, users should know that it takes barely any steps to get started, since there are no accounts.
New Dewen version! Includes: removed topbar and updated sidebar accent color customization animation for collapsing and expanding mini analytics made what to focus on an analytic necessary bug fixes There will be more to come. Thanks for supporting me on this journey!
Features Added IndexedDB integration Avatars and more customization options More command bar commands SEO improvements so Dewen can appear in Google search results Two new mini analytics: Upcoming Tasks and Stale Tasks Better responsiveness across devices What was challenging? Probably the IndexedDB integration. It meant moving from a simple storage method to a full database. I had to learn how to create object stores, save data to them, and load that data when the app starts. What am I proud of? The IndexedDB integration and the increased customization. Adding IndexedDB makes Dewen feel much more like a real application than just a project, while features like avatars and theme presets make it much easier for users to personalize their experience. What’s next? Now that the Stardance Challenge is about to wrap up, I’m going to pivot some of my time toward other things, including the Congressional App Challenge and my other projects: AuditionLM, LIAB, and Pocket Lab, while also continue development on Dewen. Thank you for supporting me throughout this challenge and following along as Dewen grew.
Last major ship for Dewen: agents with a Bring Your Own Key structure a desktop app for macOS multilingual support and a new logo (credit to @Jcleo2 for the logo geometry) Feel free to try out the new stuff if you’d like. https://dewen.netlify.app...
|
1792824593.2649305
|
1792910993.2649305
|
|
51788
|
My own web OS by @Dragonfly | Stardance
|
Dragonfly
|
0
|
22.26
|
0
|
[]
|
[{"post_id": 81646, "ts": "202 [{"post_id": 81646, "ts": "2026-10-21T21:20:03Z", "hours": 1.0292, "text": "Yayy I finished my notes app (for now - idk if I want to add things like typing in bold, italics, etc… later) and I added a word and character count that shows the words and characters for text you highlight which is pretty neat."}, {"post_id": 80660, "ts": "2026-10-18T13:01:06Z", "hours": 8.3294, "text": "I think I should probably post a devlog before I reach 10 hrs so here it is. I really should have done another one recently but oh well. I’m almost finished with the first app I’m making. I have finished the ‘my notes’ section - it has a menu of entries of notes and for the ‘your notes’ section, you can write notes that are automatically saved, there are word and character counts and soon I will make it so that the text you highlight, the counts for that will show instead and I might add features like writing in bold, italics, different font, etc… I have also made windows resizeable and I think that’s about it."}, {"post_id": 76253, "ts": "2026-10-02T22:12:55Z", "hours": 3.4939, "text": "Oh my golly goodness why is the time I have ‘spent’ coding so damn high? I feel like this number most likely is inflated by at least a couple hours but I swear I’m not doing it on purpose. The number just keeps rising somehow! Anyway I haven’t finished my first app yet and I’m going pretty damn slow. I now have it so when I click a window it rises to the top and that’s the most of it I think. Nothing compared to what you would expect from allegedly 3.5 more hours coding time from my last dev log!"}, {"post_id": 73915, "ts": "2026-09-26T09:46:09Z", "hours": 3.6764, "text": "I can now drag around, close and open my windows and I’m about to make my first app and after that I’ll make my second, finish the jam and ship it and then start working on it more for WebOS 2."}, {"post_id": 71322, "ts": "2026-09-20T17:00:17Z", "hours": 2.2953, "text": "Devlog #4: I have finished the second part of making my WebOS and will start part 3 soon. I have also added an extra thing with the help of ChatGPT (i made a bottom bar with the time on it that stays in place no matter where you scroll :D). (I am new to this stuff and it’s taking a crap ton of time don’t judge or whatever)"}, {"post_id": 70313, "ts": "2026-09-18T22:34:52Z", "hours": 0.3325, "text": "Ok so the awesome Github AI did it for me and it looks pretty neat."}, {"post_id": 70297, "ts": "2026-09-18T21:54:51Z", "hours": 2.4781, "text": "Devlog 2: My Web OS is coming along better and honestly I probably should have more done for the time I have logged but I am completely new to HTML so I am learning at every step. I want to add a white background around the text next so I’ll do that maybe tommorow because it’s late for me rn. The background is animated which is pretty cool although you can’t see in the screenshot."}, {"post_id": 66781, "ts": "2026-09-12T17:45:58Z", "hours": 0.6264, "text": "I’ve just started my first project and I’m struggling lol. The first part of this thing was meant to only take 30 mins but its been more time than that so far and I’m not even halfway through :(. This devlog won’t be visible to most people yet lol because I’m having trouble doing the identity verification thing because it says I used all my attempts or whatever even though I don’t think I did XD."}]...
|
Title: My own web OS by @Dragonfly | Stardance
De Title: My own web OS by @Dragonfly | Stardance
Devlogs:
I’ve just started my first project and I’m struggling lol. The first part of this thing was meant to only take 30 mins but its been more time than that so far and I’m not even halfway through :(. This devlog won’t be visible to most people yet lol because I’m having trouble doing the identity verification thing because it says I used all my attempts or whatever even though I don’t think I did XD.
Devlog 2: My Web OS is coming along better and honestly I probably should have more done for the time I have logged but I am completely new to HTML so I am learning at every step. I want to add a white background around the text next so I’ll do that maybe tommorow because it’s late for me rn. The background is animated which is pretty cool although you can’t see in the screenshot.
Ok so the awesome Github AI did it for me and it looks pretty neat.
Devlog #4: I have finished the second part of making my WebOS and will start part 3 soon. I have also added an extra thing with the help of ChatGPT (i made a bottom bar with the time on it that stays in place no matter where you scroll :D). (I am new to this stuff and it’s taking a crap ton of time don’t judge or whatever)
I can now drag around, close and open my windows and I’m about to make my first app and after that I’ll make my second, finish the jam and ship it and then start working on it more for WebOS 2.
Oh my golly goodness why is the time I have ‘spent’ coding so damn high? I feel like this number most likely is inflated by at least a couple hours but I swear I’m not doing it on purpose. The number just keeps rising somehow! Anyway I haven’t finished my first app yet and I’m going pretty damn slow. I now have it so when I click a window it rises to the top and that’s the most of it I think. Nothing compared to what you would expect from allegedly 3.5 more hours coding time from my last dev log!
I think I should probably post a devlog before I reach 10 hrs so here it is. I really should have done another one recently but oh well. I’m almost finished with the first app I’m making. I have finished the ‘my notes’ section - it has a menu of entries of notes and for the ‘your notes’ section, you can write notes that are automatically saved, there are word and character counts and soon I will make it so that the text you highlight, the counts for that will show instead and I might add features like writing in bold, italics, different font, etc… I have also made windows resizeable and I think that’s about it.
Yayy I finished my notes app (for now - idk if I want to add things like typing in bold, italics, etc… later) and I added a word and character count that shows the words and characters for text you highlight which is pretty neat....
|
1792684251.4057527
|
1793289051.4057527
|
|
60793
|
YSH for Slack (Bot) by @Yousuff | Stardance
|
Yousuff
|
2
|
11.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T06:59:34Z", "hours": 1.0, "multiplier": 6.35, "payout": 3, "blessing": "neutral", "text": "YSH Slack Bot - truly inspired from YSH terminal with succeing commands like YSH Slack Bot v1.1 — A 24/7 YSH-style Slack bot with 20+ commands, custom ASCII branding, themes, achievements, command history, system information, Easter eggs, and Slack-native utilities. Built with Slack Bolt JS + Socket Mode and deployed on Railway. 21 slash commands 6 themes — Matrix, Blue, Purple, Red, Dark, Light 5 achievements — First Command, Calculator, Explorer, Timekeeper, Themed 20-command history capacity per user 4 Easter-egg/fun commands — /ysh-hello, /ysh-neofetch, /ysh-random, /ysh-404 Live Slack bot: YSH is installed in the Hack Club workspace and runs 24/7 through Slack Socket Mode + Railway. Use /ysh-help in Slack to try it.", "repo": "https://github.com/YousufProjs-exe/YSH-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0C16SN12P5"}, {"ship_num": 2, "ts": "2026-09-11T17:58:05Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "██╗ ██╗ ███████╗ ██╗ ██╗ ██╗ ██╔╝ ██╔════╝ ██║ ██║ ╚████╔╝ ███████╗ ███████║ ╚██╔╝ ╚════██║ ██╔══██║ ██║ ███████║ ██║ ██║ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ YSH Slack Bot v1.1 — A 24/7 YSH-style Slack bot with 20+ commands, custom ASCII branding, themes, achievements, command history, system information, Easter eggs, and Slack-native utilities. Built with Slack Bolt JS + Socket Mode and deployed on Railway. 21 slash commands 6 themes — Matrix, Blue, Purple, Red, Dark, Light 5 achievements — First Command, Calculator, Explorer, Timekeeper, Themed 20-command history capacity per user 4 Easter-egg/fun commands — /ysh-hello, /ysh-neofetch, /ysh-random, /ysh-404 Live Slack bot: YSH is installed in the Hack Club workspace and runs 24/7 through Slack Socket Mode + Railway. Use /ysh-help in Slack to try it.", "repo": "https://github.com/YousufProjs-exe/YSH-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0C16SN12P5"}]...
|
[{"post_id": 81653, "ts": "202 [{"post_id": 81653, "ts": "2026-10-21T22:10:59Z", "hours": 2.6506, "text": "YSH Slack Bot v2 is finally completed with the last added command - /ysh-poll now you can cast a poll with a question and 2 - 5 options !! try it in #ysh-test @Slack"}, {"post_id": 81559, "ts": "2026-10-21T17:59:23Z", "hours": 1.0703, "text": "Added quotes !! 11 unique quotes got some of them from Google , coz I ran of some."}, {"post_id": 81539, "ts": "2026-10-21T16:52:40Z", "hours": 1.1456, "text": "After sooo many tries and fails /ysh-remind is working !! Just added /ysh-remind to help you ofc !"}, {"post_id": 81519, "ts": "2026-10-21T15:42:05Z", "hours": 0.515, "text": "Added password ! now YSH bot can help u suggesting a password ! try /ysh-password in #ysh-test @Slack !"}, {"post_id": 81470, "ts": "2026-10-21T11:57:52Z", "hours": 0.5625, "text": "Added - whoami command which shoes your name and ID ! try - /ysh-whoami in #ysh-test @Slack !"}, {"post_id": 81465, "ts": "2026-10-21T11:22:47Z", "hours": 0.5242, "text": "Yahhh Added Dice to roll any of 6 numbers ofc and Coinflip and Dice working !"}, {"post_id": 81456, "ts": "2026-10-21T10:46:50Z", "hours": 0.5358, "text": "added coinflip to the crew!!!"}, {"post_id": 66784, "ts": "2026-09-12T17:47:32Z", "hours": 0.7272, "text": "now this new YSH Bot is build from scratch and i hope that shipwright now test is correctly, Avoid CODE BLOCK these are Splash Commands , Commands as CODE BLOCK doesnt work! thats basic."}, {"post_id": 66086, "ts": "2026-09-11T17:41:57Z", "hours": 1.1258, "text": "Upgraded v1.0 into a more complete Slack experience with themes, achievements, command history, system info, Easter eggs, and new Slack-native commands. Also completed the 24/7 live deployment. try “/ysh-[command]”"}, {"post_id": 65914, "ts": "2026-09-11T11:34:57Z", "hours": 1.7883, "text": "YSH-v1.0 (Slack Bot), not just a regular Slack bot but v1.0 comes with /ysh- : legacy YSH commands like help, about, whoami, echo, pwd, ls, whatsup; and theres more to come!"}]...
|
Title: YSH for Slack (Bot) by @Yousuff | Stardance Title: YSH for Slack (Bot) by @Yousuff | Stardance
Devlogs:
YSH-v1.0 (Slack Bot), not just a regular Slack bot but v1.0 comes with /ysh- : legacy YSH commands like help, about, whoami, echo, pwd, ls, whatsup; and theres more to come!
Upgraded v1.0 into a more complete Slack experience with themes, achievements, command history, system info, Easter eggs, and new Slack-native commands. Also completed the 24/7 live deployment. try “/ysh-[command]”
now this new YSH Bot is build from scratch and i hope that shipwright now test is correctly, Avoid CODE BLOCK these are Splash Commands , Commands as CODE BLOCK doesnt work! thats basic.
added coinflip to the crew!!!
Yahhh Added Dice to roll any of 6 numbers ofc and Coinflip and Dice working !
Added - whoami command which shoes your name and ID ! try - /ysh-whoami in #ysh-test @Slack !
Added password ! now YSH bot can help u suggesting a password ! try /ysh-password in #ysh-test @Slack !
After sooo many tries and fails /ysh-remind is working !! Just added /ysh-remind to help you ofc !
Added quotes !! 11 unique quotes got some of them from Google , coz I ran of some.
YSH Slack Bot v2 is finally completed with the last added command - /ysh-poll now you can cast a poll with a question and 2 - 5 options !! try it in #ysh-test @Slack
Ships:
██╗ ██╗ ███████╗ ██╗ ██╗ ██╗ ██╔╝ ██╔════╝ ██║ ██║ ╚████╔╝ ███████╗ ███████║ ╚██╔╝ ╚════██║ ██╔══██║ ██║ ███████║ ██║ ██║ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ YSH Slack Bot v1.1 — A 24/7 YSH-style Slack bot with 20+ commands, custom ASCII branding, themes, achievements, command history, system information, Easter eggs, and Slack-native utilities. Built with Slack Bolt JS + Socket Mode and deployed on Railway. 21 slash commands 6 themes — Matrix, Blue, Purple, Red, Dark, Light 5 achievements — First Command, Calculator, Explorer, Timekeeper, Themed 20-command history capacity per user 4 Easter-egg/fun commands — /ysh-hello, /ysh-neofetch, /ysh-random, /ysh-404 Live Slack bot: YSH is installed in the Hack Club workspace and runs 24/7 through Slack Socket Mode + Railway. Use /ysh-help in Slack to try it.
YSH Slack Bot - truly inspired from YSH terminal with succeing commands like YSH Slack Bot v1.1 — A 24/7 YSH-style Slack bot with 20+ commands, custom ASCII branding, themes, achievements, command history, system information, Easter eggs, and Slack-native utilities. Built with Slack Bolt JS + Socket Mode and deployed on Railway. 21 slash commands 6 themes — Matrix, Blue, Purple, Red, Dark, Light 5 achievements — First Command, Calculator, Explorer, Timekeeper, Themed 20-command history capacity per user 4 Easter-egg/fun commands — /ysh-hello, /ysh-neofetch, /ysh-random, /ysh-404 Live Slack bot: YSH is installed in the Hack Club workspace and runs 24/7 through Slack Socket Mode + Railway. Use /ysh-help in Slack to try it....
|
1792813759.351074
|
1792900159.351074
|
|
8298
|
Sephyr Magic mod for Minecraft by @Szczurek | Star Sephyr Magic mod for Minecraft by @Szczurek | Stardance...
|
Szczurek
|
0
|
147.82
|
0
|
[]
|
[{"post_id": 81656, "ts": "202 [{"post_id": 81656, "ts": "2026-10-21T22:33:18Z", "hours": 9.8467, "text": "Multiloader modding is pain Can’t NeoForge and Fabric just have one common api, for all the boring stuff like registration, networking and events? I’ve had enough, so I spent 2 hours porting my mod to Balm , which is a library providing exactly that. The result is beautiful - ~150 lines are gone, and the loader specific subprojects fit under 10 lines of code, as I was able to move everything to common. Now for the worst irony: I spent my time doing all of that and the next thing I’m gonna do is… disable fabric support 😭 Why, you may ask? I was forced into it by reality read on First VFX I made my first VFX, for the leap spell. You can see it in the attached video. It’s going to spawn under player’s legs. For now it’s a really simple one, as I’m rushing to add a bit more of content, than just a single spell, before Stardance ends. It is made using Photon Editor , which is a VFX editor for Minecraft. It has a lot of good stuff, like emitters, timeline and animation curves, which will be crucial in making more advanced effects. Only downside: It doesn’t support Fabric, which is why support for it is going to be disabled for now, until I manage to hopefully make a port it in the future. Reworking spell internals (again) After making the effect, I realized I have no way to run it from the spell code, because spell logic runs server side only, and VFX needs to be played on the client. So I wen’t back to the drawing board, and I’m going to change how spells run. They are going be entities now, but more on that next devlog, because it’s not done yet, as I ran into friction in the code, which triggered me to do the Balm refactor, and in the meantime the time counter hit 9,5h. Do NOT hardcode stuff please I had to do some work on my laptop today, which has NixOS. So I update my Sephyr clone, try to run it, and bada bing bada bum, it doesn’t work! What’s going on? After a hour of debugging, it turned out that NeoForge devs hardcoded their Gradle plugin to run one specific task using Java 21. The rest runs on Java 25 (the one used by Minecraft 26.1). So, be default, a NeoForge setup for Mc 26.1+ requires two java version. Normally the second one is autodownloaded, but that doesn’t work on NixOS, and that’s also bloat. I don’t want that! So I made a bug report . Fortunetely it isn’t really hardcoded, just dumb, and I was able to fix it with this line in build.gradle Update to Burn 0.22 Burn 0.22 was recently released, removing the Backend generic from most of it’s traits. I updated Sepple to work with that. I also had to regenerate the model code for the multipa model. I was hoping the update would provide some speedup to speech processing, but I wasn’t able to measure any difference. Replacing Multipa with Zipa I found a new speech-to-IPA model. It’s called Zipa , and it looks very promising. It’s around 4x smaller then multipa, which means faster processing and less to download for end users. Furthermore, according to it’s paper, and my few tests it has noticeable better accuracy! So I implemnted it. It was a little more trouble then multipa, because the model has a much richer pre-processing. The audio waveform is turned into a mel spectogram, Fourier Transform is done, and other stuff happens. Buuut there is a problem. It turns out the model is great at doing recognition on longer audio sequences, and doesn’t really work that well on short ones. For them it performed worse then multipa! That means it’s not suitable for doing recognition in realtime, at least when plugged in the same way multipa was. However I have a couple ideas to try, which might, hopefully, solve the issue. Until I do that, it is set aside on a separate branch."}, {"post_id": 79314, "ts": "2026-10-13T14:21:33Z", "hours": 10.1344, "text": "Debugging gui is (almost) done What is going on, why already 10 hours passed? This was menat to be a quick sidequest, where I built this gui tool for debugging how well detecting magic keywords is working BUUT given it is the third devlog about it That means it took over 30 hours! Well, happens. So, all of this devlog was spent building all the plumbing needed to capture all the data from the detection pipeline and sending it in realtime to the app. All of it is using done using channels. They are injected into the detection pipeline either as Tap<T> ‘s - a new pipeline element that clones data it sees, sends to channel, and passes it on, or using wrapper types around existing processors. The app then receives the data and displays in on the plot. I also encountered and fixed few bugs, that I didn’t expect. For example originally the zoom went to crazy values, because a timestamp used to determine where the data ends wasn’t converted to be relative to the timeline start. I also found an quite an issue introduced 3 months ago, where the timestamps attached to audio weren’t calculated properly, making entire audio chunks have identical stamps. It was minor enough that I never noticed till now, when the data landed on the plot and resulted in this funny thing you can see on the attached screenshot. Finally I added a simple scrolling animation, to amortize the jitter caused by bigger chunks of audio coming, so the plot doesn’t jump that much when going live, but it’s still not as smooth as I would like it to be. As mentioned before I was using AI assistance in strictly controlled manner (I carefully planned, revieved, cleaned up and adjusted to my liking all the code generated by it) to build this debugging tool faster, and by now I’m very tired of it. At the end of the work it started doing stupid things (possibly because some context was lost?), which made me question if it was making me faster or slower. Luckily the work is mostly over, and I can finally get to other, more interesting stuff, that will be fun to do, with no AI. Next I want to use the tool to improve the detection a bit, and spend more time working on the actual mod."}, {"post_id": 77831, "ts": "2026-10-08T13:13:43Z", "hours": 10.2597, "text": "Keyword detection UI is done Look as this! It’s so pretty! Seeing all the data visualised is quite mesmerizing. I know the image will probably attract more views, so lemme explain what you are looking at. I’m making a minecraft mod where you cast spells by saying custom made up words, and this is a tool for debugging the keyword detection system. It’s meant for me, to help me make the detection more accurate, and reliable. I’ve been building it for the last ~20 hours, and in the last two I built the rendering of all the 8 strips. Check previous devlog if you want to know what exactly they display. It was pretty smooth sailing. As said before, since this is just a debugging tool for me, that I want to have finished quickly for it I’m using AI assistence, by letting it do stuff in small, pre-planned steps, and unsloppifying all the code between them. It’s working well. What helps, is that entire app is built on the egui / eframe crates, which I used before, and are somewhat familiar with. I gotta give credit, where is due, their api is really intuitive for the most part, and simple to use. The entire chart is also zoomable, and scrollable, and making this work was a bit of pain. I wanted to limit the accesible range to only around the data (so you can’t scroll away to far from it), and egui_plot doesn’t really provide a way to do it, so some manual calculations had to be done. I wanted to have some breathing space by allowing 0.25x of the zoom after last audio sample to be visible. This was the worst part, as it’s kind of a recursive problem - the zoom value affects how much zoom is allowed. But after around two hours I manged to figure it out, but keeping the original zoom value independantly of the limit calculated from it. Worth noting - what you see is just a mockup data, and the gui isn’t actually hooked up to the detection system, as that’s what I’m going to do next. After that I can hopefully improve the detection, and the finally go back to minecraft coding."}, {"post_id": 76510, "ts": "2026-10-03T19:41:08Z", "hours": 11.5369, "text": "Visualizing the keyword detection pipeline I’m not happy with the accuracy of the magic words detection system. It work half of the time, sometimes better, sometimes worse depending on the word. This make casting longer spells quite troublesome. Debugging why a specific word wasn’t detected is hard, debug prints can only get you so far. So I decided to go on a crazy sidequest and build a gui tool, that will help me debug this. I spent over 2 hours designing the concept, and over 10 implementing it, and it’s around 40% ready. The tool will display 8 strips / plots, and each plot will display some data, all on a shared timeline on the bottom, that will update live as the audio is processed. Strips 1, 2, and 4 will display waveforms of the audio at different processing stages. Strip 3 will show Voice Activity Detection score (which is used to filter out non-speech). Strips 5, 6 and 7 will display detected IPA tokens, accumulated text buffer, and detected words respectively. Strip 8 will display latency stats, which will help in optimizing it. This way I will be able to easily see, “oh, this phoneme wasn’t detected” or “oh, VAD cut out this word” or “oh, some mess accumulated in the buffer” and tweak my algorithms. AI - it’s bad, or is it? Despite looking quite simple on the surface, the app is still quite an undertaking. And it’s just a debugging tool! A thing to help me get the main goal done! I don’t want to spend too much time on it. So I considered using AI as a tool ( NOT vibecoding ). I hate vibecod(ing, ers), and I’ve always steered off AI, because very often I wasn’t satisfied with the output quality. I take pride in writing good code. But recently I’ve been trying out OpenCode here and there (on free models), and was quite surprised with it’s capabilities. Sure, it’s still often slop, but a one you can quite quickly correct, and sometimes be more effective if used correctly. AI - is it helpful? So I decided to do an experiment - can carefully planned AI usage help me write the debugging tool quickly? I started off by designing the functionality of the tool - I described the idea in detail to MiMo-V2.6-Flash, and asked it to interrogate me about as many details as possible and needed. I had to answer 35 questions, some of which were quite observant, picking me on nooks and crannies. After that a markdown file describing the design was written, and then went through few corrections. Next up, in a new session I asked MiMo to create a bullet point outline of steps needed to be done to implement the tool specified in the design file. Then one by one I went over each bullet point, asking the just released LongCat 2.5 (which has a bigger ctx window) to ask me questions, and formulate an implementation plan of it, present it to me, I gave corrections, and the point in file was replaced. This way I ended up with a second markdown file - an implementation plan. This took way too long, and was really boring. So, finally coding time. I do it like this: Ask opencode to implement a step of the plan Review the diff in vscode Remove fluff and slop manually, make sure all new code is good quality. Give feedback if I something doesn’t work like expected, or also fix it manually. After it’s good - commit Repeat for the next step It’s still not super fun, but at least I’m touching the code now, so much better already. And it is efficient! I believe it definitely would take me longer, if I wasn’t using AI. So the morale is: If you want fun, or doing something important - do it manually. If you want to do something quickly and get it out of the way less important. Here is a screen of how it is looking now: the general shape is in place, but there is no plots yet."}, {"post_id": 72706, "ts": "2026-09-23T15:27:59Z", "hours": 6.3589, "text": "The Stack Overflow For some reason my mod broke and started crashing during startup, and it did so in the worst possible way - without any error message! All I got in the Intellij Idea, was a message that the process exited with the signal code 11. WHAT? That signal corresponds to SIGSEGV signal on Linux, which generally means you did something wrong with the memory. But this is Rust! There shouldn’t be any memory issues! I started searching, and I learned there is a tool called coredumpctl, which lets me access a special dump file generated in such cases, and analyze it in a debugger like GDB. So I did that, and what I found was even more bizzare! The debugger was pointing to a start of a function, before the first line. I added some debug prints, and to my disbelief, the print before calling that function ran, and the the second one, which was the first line inside the function didn’t! Fast forward a bit I managed to figure out the problem, with some help from a friend. It turned out I encountered an stack overflow! When the function was called, Rust tried to expand the stack, and crashed because the stack ran out! Why? Because the code was loaded in Java, and Java by default allocates less memory for the stack ! The solution was manually requesting a bigger stack size during thread creation in Java. I also discovered, why the problem appeared - in the Rust file download code I had allocated an array buffer of 1MB. It landed on the stack, and that was too much! The solution was using a Vec, which lives on the heap instead. Stupid problem, but took 3 hours of my time 😩 Mod init progress reporting Sephyr requires the IPA speech recognition model to work, which needs to be downloaded on the first run, and subsequently loaded from the disk. The logic was overhauled providing more corectness, and hooked up to a series of toasts. File download progress bar is shown, and the intialization state (or failure) is coummunicated to the user! See it in the video"}, {"post_id": 71471, "ts": "2026-09-20T21:50:14Z", "hours": 9.7653, "text": "Wind spells have sound now Using LMMS and ZynAddSubFx I made two wind sound effects, which now play when casting a wind spell. You can hear them in the attached video. Cross-Compiling is fun The speech recognition system is written in Rust, which compiles down to native code. This means that it needs to be compiled separately for each operating system, and processor architecture. Rust is more friendly to it, then C or C++ for example, but as always, compilation finds it own weird ways to break. I took the setup used by Sable as a base, with two Docker containers, one for Linux and Mac, and one for Windows. BUT: The Rust version installed in the docker image was not new enough for one of my dependencies - I had to update the rust toolchain in the container image. Compiling for linux required ALSA headers for audio access - I had to figure out, how to install them in a way, that works for both x86_64 and arm64, without breaking each other. The latest version of the base image has Mac cross compilation broken - I had to use a previous one. The image ships a MacOS SDK from 5 years ago - too old, doesn’t work, so it also had to be replaced. - the container is kinda becoming a Ship of Theseus xD My code was pulling openssl as a dependency, which was failing to compile - I had to spent over an hour, figuring out how to get rid of it from the dependency tree, discovering I can do so by updating a dependency to an unreleased version. Gradle obviously required some tweaks, who doesn’t love Gradle right? In the end I managed to get it working, which brings the mod closer to being usable by the public, outside dev environment. Downloading the model The mod works by running an IPA speech recognition model locally. The model weights around 1.2G, making it too large to be embedded in the mod jar. So I added automatic download support - the model can now be downloaded automatically on the first time an user runs the mod. There is even progress tracking, though it’s not hooked up to Minecraft yet. A Toast is also shown when the loading fails, making the mod more user friendly."}, {"post_id": 69097, "ts": "2026-09-16T11:23:50Z", "hours": 10.2308, "text": "SPELLCASTING WORKS! The main mechanic of the mod is working! YOU CAN CAST SPELLS WITH VOICE! Finally! It took soo long… After over two months of development, I finally have a proof, that my crazy idea actually works, and was worth trying out. As you can see (and hear) in the video I implemented a simple wind leap spell, as the first one in the mod. Note: There are no visuals or sounds yet, but they will be added, and this is just a proof of concept. The spell comes in three variants ʔalɪˈvɑn vɛɾtɛɾ ɛvi ˈonːdˌoː - wind launches you forward ʔalɪˈvɑn vɛɾtɛɾ ɛvi ãntikɔ - wind launches you backward ʔalɪˈvɑn vɛɾtɛɾ ɛvi fɒksɑm - wind launches you up (no matter where you are looking), not shown in the video Additionaly, it can be cast as just ʔalɪˈvɑn vɛɾtɛɾ ɛvi , which is a shortcut for the first variant. This can seen in the third attempt, where the system didin’t catch onːdˌoː , but the spell worked anyway. This flexibility is easily possible, thanks to Mojang’s brigadier library. Brigadier powers the / commands in vanilla, and now the spell syntax and execution in my mod. I settled on it after trying two alternative approaches and failing to make them work. After all, my spells are just sentences, with the only difference, is that you speak them instead of writing."}, {"post_id": 55219, "ts": "2026-08-26T20:03:24Z", "hours": 10.6233, "text": "Note: This one is kinda boring, mostly plumbing stuff to get things to work, feel free to skip it. Sephyr (the mod) I’m working on setting up the the logic for registering and casting spells. This is quite hard, as the design of the mod is far from complete, which means I don’t even know what exactly do I need. I created a registry of elements, which are a source of a color, and are going to have other effects in the future. The first word of a spell is its element. For example in the spell ʔalɪˈvɑn vɛɾtɛɾ ɛvi the word ʔalɪˈvɑn means wind. I also made a basic system for figuring out the spell the player is casting. For now its very simple and can’t handle more complex spells, for example, with optional words. The entirety is a big mess as I’m figuring things out, and the fact I’m making this mod for both Neo and Fabric doesn’t make it any easier. I also updated the mod to Minecraft 26.1.2, which means there is going to be no 1.21.1 release. Sepple (word detection system) I keep working on collecting data to finetine the speech to ipa ml model. After discovering a better way of getting the audio files while writing last devlog I scraped the download script, and instead replaced it with a new one to extract needed files from the 20GB Wiktinary audio dump tar. I also cleaned up the entire code, turning it back to human standards, after a bit of Opencode usage. (Since those are one-time scripts to extract data I decided using a bit of AI in this area won’t hurt. I don’t use AI for the rest of the project.). I also prepared a fourth script, that will use the existing multipa model, to generate IPA transcription of the files. Then files with generated IPA being too different from original IPA will be discarded, as a way to detect files, where the IPA doesn’t match the audio (because the audio contains more text for example)."}, {"post_id": 45897, "ts": "2026-08-12T17:21:05Z", "hours": 10.2356, "text": "Sephyr (the mod) A proper lifecycle of the detection system was added. The IPA model is loaded in background during game start, but the audio capture and processing start waits until you join a world, and stops once you leave it. The Rust code now has a logging hook, so that it can do civilized logging using the Java logger, instead of blatantly writing to stdout. Sepple (the voice casting detection system) I made the pipeline system cancellable, so that the mod can cleanly stop the detection, which was not possible before. Support for running the speech detection inference on GPU was added as a feature flag. For now it is not used by default, as it showed no measurable improvements over running on CPU on my PC, but it might be useful on other, weaker devices. Collecting data for training As I said too many times, the speech to IPA model used for magic speech detection is not quite the quality I would like it to be. I’m hoping to improve it by fine-tuning it on its weak areas, but for that I need some data. My idea is to use wiktionary as a data source. It is a free online dictionary run by the same people who run Wikipedia. Most words on it have the pronunciation attached both as an IPA and an audio file, which makes it ideal for the task. I downloaded a preprocessed jsonl dump file from kaikki and wrote a script to extract just words and ipa from it. Unfortunetely it was missing urls of the audio files. So I had to download a raw xml dump of the entire english wiktionary, and spend few hours writing a script to extract them. Then I used deepseek a generate a third script, to download all the audio files from a list. There is going to be almost 20k of them, and the script is running right now as I’m writing this, and it is going to take multiple hours as I can only download around 1 file per second to respect rate limits and not overburden wikimedia. And just now while writing I realized I’m an idiot, because kaikki provides a 20GB tar file with all the audio, downloading which would be more efficient."}, {"post_id": 41944, "ts": "2026-08-06T14:02:27Z", "hours": 9.6106, "text": "Integrating Rust IPA word detection with Minecraft With the IPA based magic keyword detection (which is written in Rust) working I spent all of this devlog integrating it into Minecraft. I created a new repo for the mod, using the Jared’s template. I decided to go with supporting both Fabric and Neoforge, and picked the 1.21.1 Minecraft version, though in the future I’m planning to move to 26.2 or later. I set up an additional gradle subproject and a rust package, that both together act as a Java to Rust bridge, using the j4rs crate. Using it I managed to initialize Sepple (the detection system), and get it running. The tricky part was going the other direction, to pass detected words from Rust to Java. For some reason Rust wasn’t detecting the JVM and was trying to spawn a new one! After a bit of experimentation I concluded, that I can only call Java from Rust only during the period when Java calls Rust, and only on the same thread. In the end I managed to get it working, by spawning a new thread on the Java side, and calling a blocking Rust function, that kept calling a Java callback passed to it. Originally I tried to use a static function as a callback, but for some reason (probably some kind of classloading isolation) the system was failing with some crazy null errors. I also had to adjust Sepple a bit, to not require a bunch of random json files at specific paths, and to provide an mpsc chanell directly outside its pipeline, for less boilerplate. With that I have a proof of concept working! Minecraft is receiving the detected words and printing them to chat. Note that those are all custom words, created by me specifically for this mod. This is why I had to create an entire new system for detecting them, and why they are written in the International Phonetic Language, which is also why they look a little weird in the minecraft’s font. The Java<->Rust setup is also not very good yet. For example the packaging of compiled Rust is very basic, and you can’t control the word detection from Java - no way to stop it or restart. There is also no good error handling, which means if a file is missing it will just crash everything. But it works, and I can continue working on the mod, and making it better!"}, {"post_id": 36043, "ts": "2026-07-27T21:21:56Z", "hours": 10.1719, "text": "About project Sephyr is a magic mod, with spell casting powered by speech live translated into International Phonetic Alphabet, to detecting custom-made spell words in it. Adding Voice Activity Detection - part 2 After the refactor I was able to finally add the VAD. But after few tests I noticed that the VAD was making things worse, not better! That was as a part of the previous devlog (which ran out of character limit). I added a pipeline part that writes every chunk of audio that passes through it to a file, so it can be inspected. With it I found the main problem: It took few hundred milliseconds before the VAD detected speech, so a small chunk was always cut off from the start. To fix this I added context keeping: A bunch of previous chunks are kept, and when speech is detected they are also taken into consideration. I also made the sliding window chunking aware of VAD - the VAD detector sends a signal when it detects an end of speech. The chunker then flushes its buffer into the pipeline, so that it doesn’t get stuck until next speech, and replaces it with precise amount of silenece. This way the start of next audio doesn’t get cut off later due to the sliding window mechanism. The author of the bunsen crate (providing the VAD model implementation) also released version 0.29.0, which fixed all the issues I encountered in the last devlog, and updated its API slighly, which meant that after adjusting my code I could stop using my own fork of it. Improving word detection from IPA My friend found a crate named phonetics-rs and suggested using it to improve the algorithm. This crate calculates the difference between two IPA strings, taking into account how similar they sound. This is much more accurate than just comparing strings on grapheme level. I modified my algorithm to use it, and it turned out to be a great idea, that significantly improved the detection rate of magic words. I also changed the dictionary to be sorted by longest words first, so that they take priority over short ones. So far, testing and improving the word detection algorithm has been the most fun out of the entire project. Looking at IPA strings, and figuring out why some speech has or hasn’t been classified as some word is quite fascinating. For example, I encountered a string pɾilifɛra which the model output after me saying prizim and fɛra , the two magic words that I made up for the spell system. Surprisingly, my algorithm said the string contained just prizim despite there being a literal fɛra in it. As I found out, pɾilif is closer then pɾili to prizim , and it fell under the threshold, so the algorithm took that part and left out ɛra in the buffer which was too far from fɛra . After seeing this, I made the algorithm scan the string for exact matches first, and then do fuzzy phonetic matching, also ensuring the order is preserved. I also tuned the thresholds, adding more and more tests (there is now 8 of them) to ensure the algorithm behaves well. Finally, I noticed the IPA output from the model changes based on audio’s offset in time. So I wrote a script that lets me test this, and see the effect of different offsets. What’s next There is a saying in data science: garbage in - garbage out. This is also true for my project. The detection works decently, but it also quite often outputs false positives during normal speech. I believe I did I all could to compensate for the unsatisfying quality of the speech to IPA translation model. Now I will be shifting to the Minecraft part of the project - creating a mod, integrating the detection system into it and creating spells. In paralell, I will be exploring the possibility of finetuning the model, to improve the accuracy of it and hopefully get better results. Watch the video with audio, that’s the part that matters right? :)"}, {"post_id": 27916, "ts": "2026-07-13T20:52:15Z", "hours": 30.4097, "text": "Finding words in long IPA strings For the magic system I need to find individual words in the ever accumulating string of IPA characters. To do that I hold a list of valid words in memory. When there is some text, I iterate over the dictionary, calculating a levenshtein distance between each word and start of the string. Then the word with the lowest score is taken and if the score is under a set threshold, the word is considered a match, and the matching part is remved from the buffer. To cover more cases different lengths of the string are checked. If no match is found, one character is removed from the string, and the process repeats, until all words are found. Fun fact: When comparing IPA and other non-ascii strings you need to make sure you are considering graphemes and not characters, because in UTF-8 what we perceive as one symbol, can be encoded as many characters in memory. So far this algorithm works quite well, though in the future it might need some performance optimization, or tuning, if it starts yelding too many false positives. Other misc changes: Migrated main fn to use clap for parsing arguments Added flake.nix with dev env so I can run this code on my NixOS laptop Added time information to the pipeline - Together with the audio from the mic, a timestamp is captured, and passed through entire pipeline up to the end, where it is used to discard text older then 200ms from the buffer, so that stale data doesn’t mess up new words. Adding VAD I noticed that the speech to IPA model likes to output random data when no one is talking, so I decided to add VAD - Voice Activity Detection - a system that detects if someone is talking, and only then passes the audio on. I estimated this to take me around 2 hours, and oh, how wrong I was? It took 10x that, which is why this devlog documents 3x the normal amount of time. And it still isn’t fully ready! So let me tell you what I did and why it took so long. In the Burn (ML/AI lib for Rust) discord I noticed a solution just dropped out of the sky: Merely few days before a Silero VAD model implementation was added to a library named bunsen . ML models take input as Tensor s - multidimensional arrays, which do not say in what form or shape the data is expected. So I had to figure that out myself. Fortunetely it was just 512 elements long chunks of 16khz audio with no additional pre-processing. Knowing that I fed the microphone input to the model and began to watch it output complete nonsense unrelated to whether I was speaking or not. So I started debugging - checked my code, wrote an equivalent in python using the official silero implementation to compare results - completely different. So I cloned the bunsen library, wrote an unit test there and ran off a Opencode agent. I also contacted the library author. He found one major issue, and the agent identified a second problem and wrote a solutuion - Silero VAD expects 64 samples of the previous chunk to be passed along the 512 to work correctly. I cleaned up the code, which was quite a pain because rust-analyzer was super slow on that repository, and made a PR, but it wasn’t merged because the author went with his own way of implementing it. The big refactor Coming back to my project I realized that my code strucutre makes it very hard to integrate VAD into it. So I spent the next 6 hours of so refactoring almost every file in the codebase into a new pipeline system. It lets you compose a pipeline out of a producer, many processors, and a consumer. It makes use of async, which saves on the amount of threads used. Static type checking ensures you can’t compose parts that wouldn’t work together, and all elements can also define contracts on the size of data chunks they produce and consume. I ran out of the character limit, so the rest of VAD story will be in next devlog."}, {"post_id": 11428, "ts": "2026-06-18T18:11:53Z", "hours": 4.8753, "text": "Live speech to IPA transcription in Rust using ML I finished my rough implementation of a live speech transcription pipeline. It captures my speech from the mic, and processes it with the Multipa model using the Burn framework. To make it work live I implemented a sliding window that chunks the audio into 2 second fragments, each of which is processed separately, and then assembled into a single string. The chunks overlap, and are then sliced, so that audio that was on the borders of a cut (which will reduce the quality) is thrown away, and the text for it is taken from the next chunk, for which it is at the center. The inference is running on cpu for simplicity and compatiblity, so by sacraficing a bit of pain I added threading (where each chunk is processed on a separate thread) to make sure the pipeline can keep up. I’m slightly worried about how the perfromance will be when this is going to run along Minecraft, but hopefully I will be able to make it as lightwieght and unintruisive as possible. Finally I reworked how the text is accumulated, switching from a vector of logits to a string. Since IPA has no concept of words, just phonemes, everything I say is appened to one long string. So I added a very simple silence detection, where if a captured chunk returns no text a space is added to the string. For easier teasting I also improved the main function, so that the program can: take a file and process it all at once take a file and process it using the pipeline run live mic capture on the pipeline What’s next - improving the detection In theory this is all I need, and I can start working on the Minecraft mod. However I’m not satisfied with the quality of the transcription, and at the level it currently is most spell detection will probably fail. The quality of the model itself is pretty bad. If the description on github of the Multipa model is correct, the model was trained on merely 9 hours of speech data, which probably explains it. The model is also sensitive to noise, and distractions like other people talking, and sometimes outputs garbage. So the next devlog I will be experimenting with various techinques of filtering and cleaning up the audio the model is receiving, and potentially even training a new model myself on a bigger dataset. Attached video Working demo of live capture and transcription of me talking."}, {"post_id": 9209, "ts": "2026-06-15T13:48:33Z", "hours": 3.7658, "text": "Sephyr - project overview Sephyr is an unique magic mod for Minecraft. It aims to differentiate itself by: Introducing a voice powered spell casting system , that’s both fun to use and intricate. You will be reading spells out loud into your mic in a magic language, and what will you say will affect the result of the spell. Having stunning, detailed visuals unique to each spell. This is going to be achieved by spending way too much effort on rendering. I want spell casting to be something satisfying, and the look is a key part of it. The project consits of two parts: Sephyr - The minecraft mod itself containing the spells, mechanics and visuals, written in kotlin. Sepple - Speech processing engine, responsible for transforming your babble into something Sephyr can work with and figure out what have you just said. Sepple overview Sepple is a foundation of the voice powered spell casting. It is an audio processing library written in rust, that Sephyr will depend on and embed. It captures your mic live and pre-processes the speech. Then it uses the Burn framework to locally and quickly run a speech recognition model called Multipa . The model transcribes speech into the International Phonetic Alphabet (IPA), a textual notation of various sounds that make up the spoken language. Finally it tries to match the result against a custom dictionary of magic words, which will form sentences - the spells you will be casting. This devlog Before Stardance launched I have written a rough skeleton for Sepple. With some trouble I managed to import the Multipa model to Burn via ONNX export from Pytorch, and implement the required post-processing to decode model’s output into IPA. I also started working on a pipeline for mic capture and sliding window processing, so that the audio can be transcribed live. After Stardance started I noticed that the same input audio file gives quite different result in Pytorch then in Rust. I spent few hours debugging why that is, and found a missing piece in my implemenation. For the Multipa model to work correctly the samples need to be normalized using a so-called z-score normalization. That means calculating the mean of the input and its standard deviation (a statistics measure), and applying a formula that rescales the data, so that it has a mean of 0 and standard deviation of 1. After implemenating that the model started to work correctly and give the same output for the same input on both sides. Picture: “Hello Stardance. Sepple is working now” translated to IPA using pytorch and the fixed Rust implementation. It is not veeery accurate, but it is good enough."}]...
|
Title: Sephyr Magic mod for Minecraft by @Szczurek Title: Sephyr Magic mod for Minecraft by @Szczurek | Stardance
Devlogs:
Sephyr - project overview Sephyr is an unique magic mod for Minecraft. It aims to differentiate itself by: Introducing a voice powered spell casting system , that’s both fun to use and intricate. You will be reading spells out loud into your mic in a magic language, and what will you say will affect the result of the spell. Having stunning, detailed visuals unique to each spell. This is going to be achieved by spending way too much effort on rendering. I want spell casting to be something satisfying, and the look is a key part of it. The project consits of two parts: Sephyr - The minecraft mod itself containing the spells, mechanics and visuals, written in kotlin. Sepple - Speech processing engine, responsible for transforming your babble into something Sephyr can work with and figure out what have you just said. Sepple overview Sepple is a foundation of the voice powered spell casting. It is an audio processing library written in rust, that Sephyr will depend on and embed. It captures your mic live and pre-processes the speech. Then it uses the Burn framework to locally and quickly run a speech recognition model called Multipa . The model transcribes speech into the International Phonetic Alphabet (IPA), a textual notation of various sounds that make up the spoken language. Finally it tries to match the result against a custom dictionary of magic words, which will form sentences - the spells you will be casting. This devlog Before Stardance launched I have written a rough skeleton for Sepple. With some trouble I managed to import the Multipa model to Burn via ONNX export from Pytorch, and implement the required post-processing to decode model’s output into IPA. I also started working on a pipeline for mic capture and sliding window processing, so that the audio can be transcribed live. After Stardance started I noticed that the same input audio file gives quite different result in Pytorch then in Rust. I spent few hours debugging why that is, and found a missing piece in my implemenation. For the Multipa model to work correctly the samples need to be normalized using a so-called z-score normalization. That means calculating the mean of the input and its standard deviation (a statistics measure), and applying a formula that rescales the data, so that it has a mean of 0 and standard deviation of 1. After implemenating that the model started to work correctly and give the same output for the same input on both sides. Picture: “Hello Stardance. Sepple is working now” translated to IPA using pytorch and the fixed Rust implementation. It is not veeery accurate, but it is good enough.
Live speech to IPA transcription in Rust using ML I finished my rough implementation of a live speech transcription pipeline. It captures my speech from the mic, and processes it with the Multipa model using the Burn framework. To make it work live I implemented a sliding window that chunks the audio into 2 second fragments, each of which is processed separately, and then assembled into a single string. The chunks overlap, and are then sliced, so that audio that was on the borders of a cut (which will reduce the quality) is thrown away, and the text for it is taken from the next chunk, for which it is at the center. The inference is running on cpu for simplicity and compatiblity, so by sacraficing a bit of pain I added threading (where each chunk is processed on a separate thread) to make sure the pipeline can keep up. I’m slightly worried about how the perfromance will be when this is going to run along Minecraft, but hopefully I will be able to make it as lightwieght and unintruisive as possible. Finally I reworked how the text is accumulated, switching from a vector of logits to a string. Since IPA has no concept of words, just phonemes, everything I say is appened to one long string. So I added a very simple silence detection, where if a captured chunk returns no text a space is added to the string. For easier teasting I also improved the main function, so that the program can: take a file and process it all at once take a file and process it using the pipeline run live mic capture on the pipeline What’s next - improving the detection In theory this is all I need, and I can start working on the Minecraft mod. However I’m not satisfied with the quality of the transcription, and at the level it currently is most spell detection will probably fail. The quality of the model itself is pretty bad. If the description on github of the Multipa model is correct, the model was trained on merely 9 hours of speech data, which probably explains it. The model is also sensitive to noise, and distractions like other people talking, and sometimes outputs garbage. So the next devlog I will be experimenting with various techinques of filtering and cleaning up the audio the model is receiving, and potentially even training a new model myself on a bigger dataset. Attached video Working demo of live capture and transcription of me talking.
Finding words in long IPA strings For the magic system I need to find individual words in the ever accumulating string of IPA characters. To do that I hold a list of valid words in memory. When there is some text, I iterate over the dictionary, calculating a levenshtein distance between each word and start of the string. Then the word with the lowest score is taken and if the score is under a set threshold, the word is considered a match, and the matching part is remved from the buffer. To cover more cases different lengths of the string are checked. If no match is found, one character is removed from the string, and the process repeats, until all words are found. Fun fact: When comparing IPA and other non-ascii strings you need to make sure you are considering graphemes and not characters, because in UTF-8 what we perceive as one symbol, can be encoded as many characters in memory. So far this algorithm works quite well, though in the future it might need some performance optimization, or tuning, if it starts yelding too many false positives. Other misc changes: Migrated main fn to use clap for parsing arguments Added flake.nix with dev env so I can run this code on my NixOS laptop Added time information to the pipeline - Together with the audio from the mic, a timestamp is captured, and passed through entire pipeline up to the end, where it is used to discard text older then 200ms from the buffer, so that stale data doesn’t mess up new words. Adding VAD I noticed that the speech to IPA model likes to output random data when no one is talking, so I decided to add VAD - Voice Activity Detection - a system that detects if someone is talking, and only then passes the audio on. I estimated this to take me around 2 hours, and oh, how wrong I was? It took 10x that, which is why this devlog documents 3x the normal amount of time. And it still isn’t fully ready! So let me tell you what I did and why it took so long. In the Burn (ML/AI lib for Rust) discord I noticed a solution just dropped out of the sky: Merely few days before a Silero VAD model implementation was added to a library named bunsen . ML models take input as Tensor s - multidimensional arrays, which do not say in what form or shape the data is expected. So I had to figure that out myself. Fortunetely it was just 512 elements long chunks of 16khz audio with no additional pre-processing. Knowing that I fed the microphone input to the model and began to watch it output complete nonsense unrelated to whether I was speaking or not. So I started debugging - checked my code, wrote an equivalent in python using the official silero implementation to compare results - completely different. So I cloned the bunsen library, wrote an unit test there and ran off a Opencode agent. I also contacted the library author. He found one major issue, and the agent identified a second problem and wrote a solutuion - Silero VAD expects 64 samples of the previous chunk to be passed along the 512 to work correctly. I cleaned up the code, which was quite a pain because rust-analyzer was super slow on that repository, and made a PR, but it wasn’t merged because the author went with his own way of implementing it. The big refactor Coming back to my project I realized that my code strucutre makes it very hard to integrate VAD into it. So I spent the next 6 hours of so refactoring almost every file in the codebase into a new pipeline system. It lets you compose a pipeline out of a producer, many processors, and a consumer. It makes use of async, which saves on the amount of threads used. Static type checking ensures you can’t compose parts that wouldn’t work together, and all elements can also define contracts on the size of data chunks they produce and consume. I ran out of the character limit, so the rest of VAD story will be in next devlog.
About project Sephyr is a magic mod, with spell casting powered by speech live translated into International Phonetic Alphabet, to detecting custom-made spell words in it. Adding Voice Activity Detection - part 2 After the refactor I was able to finally add the VAD. But after few tests I noticed that the VAD was making things worse, not better! That was as a part of the previous devlog (which ran out of character limit). I added a pipeline part that writes every chunk of audio that passes through it to a file, so it can be inspected. With it I found the main problem: It took few hundred milliseconds before the VAD detected speech, so a small chunk was always cut off from the start. To fix this I added context keeping: A bunch of previous chunks are kept, and when speech is detected they are also taken into consideration. I also made the sliding window chunking aware of VAD - the VAD detector sends a signal when it detects an end of speech. The chunker then flushes its buffer into the pipeline, so that it doesn’t get stuck until next speech, and replaces it with precise amount of silenece. This way the start of next audio doesn’t get cut off later due to the sliding window mechanism. The author of the bunsen crate (providing the VAD model implementation) also released version 0.29.0, which fixed all the issues I encountered in the last devlog, and updated its API slighly, which meant that after adjusting my code I could stop using my own fork of it. Improving word detection from IPA My friend found a crate named phonetics-rs and suggested using it to improve the algorithm. This crate calculates the difference between two IPA strings, taking into account how similar they sound. This is much more accurate than just comparing strings on grapheme level. I modified my algorithm to use it, and it turned out to be a great idea, that significantly improved the detection rate of magic words. I also changed the dictionary to be sorted by longest words first, so that they take priority over short ones. So far, testing and improving the word detection algorithm has been the most fun out of the entire project. Looking at IPA strings, and figuring out why some speech has or hasn’t been classified as some word is quite fascinating. For example, I encountered a string pɾilifɛra which the model output after me saying prizim and fɛra , the two magic words that I made up for the spell system. Surprisingly, my algorithm said the string contained just prizim despite there being a literal fɛra in it. As I found out, pɾilif is closer then pɾili to prizim , and it fell under the threshold, so the algorithm took that part and left out ɛra in the buffer which was too far from fɛra . After seeing this, I made the algorithm scan the string for exact matches first, and then do fuzzy phonetic matching, also ensuring the order is preserved. I also tuned the thresholds, adding more and more tests (there is now 8 of them) to ensure the algorithm behaves well. Finally, I noticed the IPA output from the model changes based on audio’s offset in time. So I wrote a script that lets me test this, and see the effect of different offsets. What’s next There is a saying in data science: garbage in - garbage out. This is also true for my project. The detection works decently, but it also quite often outputs false positives during normal speech. I believe I did I all could to compensate for the unsatisfying quality of the speech to IPA translation model. Now I will be shifting to the Minecraft part of the project - creating a mod, integrating the detection system into it and creating spells. In paralell, I will be exploring the possibility of finetuning the model, to improve the accuracy of it and hopefully get better results. Watch the video with audio, that’s the part that matters right? :)
Integrating Rust IPA word detection with Minecraft With the IPA based magic keyword detection (which is written in Rust) working I spent all of this devlog integrating it into Minecraft. I created a new repo for the mod, using the Jared’s template. I decided to go with supporting both Fabric and Neoforge, and picked the 1.21.1 Minecraft version, though in the future I’m planning to move to 26.2 or later. I set up an additional gradle subproject and a rust package, that both together act as a Java to Rust bridge, using the j4rs crate. Using it I managed to initialize Sepple (the detection system), and get it running. The tricky part was going the other direction, to pass detected words from Rust to Java. For some reason Rust wasn’t detecting the JVM and was trying to spawn a new one! After a bit of experimentation I concluded, that I can only call Java from Rust only during the period when Java calls Rust, and only on the same thread. In the end I managed to get it working, by spawning a new thread on the Java side, and calling a blocking Rust function, that kept calling a Java callback passed to it. Originally I tried to use a static function as a callback, but for some reason (probably some kind of classloading isolation) the system was failing with some crazy null errors. I also had to adjust Sepple a bit, to not require a bunch of random json files at specific paths, and to provide an mpsc chanell directly outside its pipeline, for less boilerplate. With that I have a proof of concept working! Minecraft is receiving the detected words and printing them to chat. Note that those are all custom words, created by me specifically for this mod. This is why I had to create an entire new system for detecting them, and why they are written in the International Phonetic Language, which is also why they look a little weird in the minecraft’s font. The Java<->Rust setup is also not very good yet. For example the packaging of compiled Rust is very basic, and you can’t control the word detection from Java - no way to stop it or restart. There is also no good error handling, which means if a file is missing it will just crash everything. But it works, and I can continue working on the mod, and making it better!
Sephyr (the mod) A proper lifecycle of the detection system was added. The IPA model is loaded in background during game start, but the audio capture and processing start waits until you join a world, and stops once you leave it. The Rust code now has a logging hook, so that it can do civilized logging using the Java logger, instead of blatantly writing to stdout. Sepple (the voice casting detection system) I made the pipeline system cancellable, so that the mod can cleanly stop the detection, which was not possible before. Support for running the speech detection inference on GPU was added as a feature flag. For now it is not used by default, as it showed no measurable improvements over running on CPU on my PC, but it might be useful on other, weaker devices. Collecting data for training As I said too many times, the speech to IPA model used for magic speech detection is not quite the quality I would like it to be. I’m hoping to improve it by fine-tuning it on its weak areas, but for that I need some data. My idea is to use wiktionary as a data source. It is a free online dictionary run by the same people who run Wikipedia. Most words on it have the pronunciation attached both as an IPA and an audio file, which makes it ideal for the task. I downloaded a preprocessed jsonl dump file from kaikki and wrote a script to extract just words and ipa from it. Unfortunetely it was missing urls of the audio files. So I had to download a raw xml dump of the entire english wiktionary, and spend few hours writing a script to extract them. Then I used deepseek a generate a third script, to download all the audio files from a list. There is going to be almost 20k of them, and the script is running right now as I’m writing this, and it is going to take multiple hours as I can only download around 1 file per second to respect rate limits and not overburden wikimedia. And just now while writing I realized I’m an idiot, because kaikki provides a 20GB tar file with all the audio, downloading which would be more efficient.
Note: This one is kinda boring, mostly plumbing stuff to get things to work, feel free to skip it. Sephyr (the mod) I’m working on setting up the the logic for registering and casting spells. This is quite hard, as the design of the mod is far from complete, which means I don’t even know what exactly do I need. I created a registry of elements, which are a source of a color, and are going to have other effects in the future. The first word of a spell is its element. For example in the spell ʔalɪˈvɑn vɛɾtɛɾ ɛvi the word ʔalɪˈvɑn means wind. I also made a basic system for figuring out the spell the player is casting. For now its very simple and can’t handle more complex spells, for example, with optional words. The entirety is a big mess as I’m figuring things out, and the fact I’m making this mod for both Neo and Fabric doesn’t make it any easier. I also updated the mod to Minecraft 26.1.2, which means there is going to be no 1.21.1 release. Sepple (word detection system) I keep working on collecting data to finetine the speech to ipa ml model. After discovering a better way of getting the audio files while writing last devlog I scraped the download script, and instead replaced it with a new one to extract needed files from the 20GB Wiktinary audio dump tar. I also cleaned up the entire code, turning it back to human standards, after a bit of Opencode usage. (Since those are one-time scripts to extract data I decided using a bit of AI in this area won’t hurt. I don’t use AI for the rest of the project.). I also prepared a fourth script, that will use the existing multipa model, to generate IPA transcription of the files. Then files with generated IPA being too different from original IPA will be discarded, as a way to detect files, where the IPA doesn’t match the audio (because the audio contains more text for example).
SPELLCASTING WORKS! The main mechanic of the mod is working! YOU CAN CAST SPELLS WITH VOICE! Finally! It took soo long… After over two months of development, I finally have a proof, that my crazy idea actually works, and was worth trying out. As you can see (and hear) in the video I implemented a simple wind leap spell, as the first one in the mod. Note: There are no visuals or sounds yet, but they will be added, and this is just a proof of concept. The spell comes in three variants ʔalɪˈvɑn vɛɾtɛɾ ɛvi ˈonːdˌoː - wind launches you forward ʔalɪˈvɑn vɛɾtɛɾ ɛvi ãntikɔ - wind launches you backward ʔalɪˈvɑn vɛɾtɛɾ ɛvi fɒksɑm - wind launches you up (no matter where you are looking), not shown in the video Additionaly, it can be cast as just ʔalɪˈvɑn vɛɾtɛɾ ɛvi , which is a shortcut for the first variant. This can seen in the third attempt, where the system didin’t catch onːdˌoː , but the spell worked anyway. This flexibility is easily possible, thanks to Mojang’s brigadier library. Brigadier powers the / commands in vanilla, and now the spell syntax and execution in my mod. I settled on it after trying two alternative approaches and failing to make them work. After all, my spells are just sentences, with the only difference, is that you speak them instead of writing.
Wind spells have sound now Using LMMS and ZynAddSubFx I made two wind sound effects, which now play when casting a wind spell. You can hear them in the attached video. Cross-Compiling is fun The speech recognition system is written in Rust, which compiles down to native code. This means that it needs to be compiled separately for each operating system, and processor architecture. Rust is more friendly to it, then C or C++ for example, but as always, compilation finds it own weird ways to break. I took the setup used by Sable as a base, with two Docker containers, one for Linux and Mac, and one for Windows. BUT: The Rust version installed in the docker image was not new enough for one of my dependencies - I had to update the rust toolchain in the container image. Compiling for linux required ALSA headers for audio access - I had to figure out, how to install them in a way, that works for both x86_64 and arm64, without breaking each other. The latest version of the base image has Mac cross compilation broken - I had to use a previous one. The image ships a MacOS SDK from 5 years ago - too old, doesn’t work, so it also had to be replaced. - the container is kinda becoming a Ship of Theseus xD My code was pulling openssl as a dependency, which was failing to compile - I had to spent over an hour, figuring out how to get rid of it from the dependency tree, discovering I can do so by updating a dependency to an unreleased version. Gradle obviously required some tweaks, who doesn’t love Gradle right? In the end I managed to get it working, which brings the mod closer to being usable by the public, outside dev environment. Downloading the model The mod works by running an IPA speech recognition model locally. The model weights around 1.2G, making it too large to be embedded in the mod jar. So I added automatic download support - the model can now be downloaded automatically on the first time an user runs the mod. There is even progress tracking, though it’s not hooked up to Minecraft yet. A Toast is also shown when the loading fails, making the mod more user friendly.
The Stack Overflow For some reason my mod broke and started crashing during startup, and it did so in the worst possible way - without any error message! All I got in the Intellij Idea, was a message that the process exited with the signal code 11. WHAT? That signal corresponds to SIGSEGV signal on Linux, which generally means you did something wrong with the memory. But this is Rust! There shouldn’t be any memory issues! I started searching, and I learned there is a tool called coredumpctl, which lets me access a special dump file generated in such cases, and analyze it in a debugger like GDB. So I did that, and what I found was even more bizzare! The debugger was pointing to a start of a function, before the first line. I added some debug prints, and to my disbelief, the print before calling that function ran, and the the second one, which was the first line inside the function didn’t! Fast forward a bit I managed to figure out the problem, with some help from a friend. It turned out I encountered an stack overflow! When the function was called, Rust tried to expand the stack, and crashed because the stack ran out! Why? Because the code was loaded in Java, and Java by default allocates less memory for the stack ! The solution was manually requesting a bigger stack size during thread creation in Java. I also discovered, why the problem appeared - in the Rust file download code I had allocated an array buffer of 1MB. It landed on the stack, and that was too much! The solution was using a Vec, which lives on the heap instead. Stupid problem, but took 3 hours of my time 😩 Mod init progress reporting Sephyr requires the IPA speech recognition model to work, which needs to be downloaded on the first run, and subsequently loaded from the disk. The logic was overhauled providing more corectness, and hooked up to a series of toasts. File download progress bar is shown, and the intialization state (or failure) is coummunicated to the user! See it in the video
Visualizing the keyword detection pipeline I’m not happy with the accuracy of the magic words detection system. It work half of the time, sometimes better, sometimes worse depending on the word. This make casting longer spells quite troublesome. Debugging why a specific word wasn’t detected is hard, debug prints can only get you so far. So I decided to go on a crazy sidequest and build a gui tool, that will help me debug this. I spent over 2 hours designing the concept, and over 10 implementing it, and it’s around 40% ready. The tool will display 8 strips / plots, and each plot will display some data, all on a shared timeline on the bottom, that will update live as the audio is processed. Strips 1, 2, and 4 will display waveforms of the audio at different processing stages. Strip 3 will show Voice Activity Detection score (which is used to filter out non-speech). Strips 5, 6 and 7 will display detected IPA tokens, accumulated text buffer, and detected words respectively. Strip 8 will display latency stats, which will help in optimizing it. This way I will be able to easily see, “oh, this phoneme wasn’t detected” or “oh, VAD cut out this word” or “oh, some mess accumulated in the buffer” and tweak my algorithms. AI - it’s bad, or is it? Despite looking quite simple on the surface, the app is still quite an undertaking. And it’s just a debugging tool! A thing to help me get the main goal done! I don’t want to spend too much time on it. So I considered using AI as a tool ( NOT vibecoding ). I hate vibecod(ing, ers), and I’ve always steered off AI, because very often I wasn’t satisfied with the output quality. I take pride in writing good code. But recently I’ve been trying out OpenCode here and there (on free models), and was quite surprised with it’s capabilities. Sure, it’s still often slop, but a one you can quite quickly correct, and sometimes be more effective if used correctly. AI - is it helpful? So I decided to do an experiment - can carefully planned AI usage help me write the debugging tool quickly? I started off by designing the functionality of the tool - I described the idea in detail to MiMo-V2.6-Flash, and asked it to interrogate me about as many details as possible and needed. I had to answer 35 questions, some of which were quite observant, picking me on nooks and crannies. After that a markdown file describing the design was written, and then went through few corrections. Next up, in a new session I asked MiMo to create a bullet point outline of steps needed to be done to implement the tool specified in the design file. Then one by one I went over each bullet point, asking the just released LongCat 2.5 (which has a bigger ctx window) to ask me questions, and formulate an implementation plan of it, present it to me, I gave corrections, and the point in file was replaced. This way I ended up with a second markdown file - an implementation plan. This took way too long, and was really boring. So, finally coding time. I do it like this: Ask opencode to implement a step of the plan Review the diff in vscode Remove fluff and slop manually, make sure all new code is good quality. Give feedback if I something doesn’t work like expected, or also fix it manually. After it’s good - commit Repeat for the next step It’s still not super fun, but at least I’m touching the code now, so much better already. And it is efficient! I believe it definitely would take me longer, if I wasn’t using AI. So the morale is: If you want fun, or doing something important - do it manually. If you want to do something quickly and get it out of the way less important. Here is a screen of how it is looking now: the general shape is in place, but there is no plots yet.
Keyword detection UI is done Look as this! It’s so pretty! Seeing all the data visualised is quite mesmerizing. I know the image will probably attract more views, so lemme explain what you are looking at. I’m making a minecraft mod where you cast spells by saying custom made up words, and this is a tool for debugging the keyword detection system. It’s meant for me, to help me make the detection more accurate, and reliable. I’ve been building it for the last ~20 hours, and in the last two I built the rendering of all the 8 strips. Check previous devlog if you want to know what exactly they display. It was pretty smooth sailing. As said before, since this is just a debugging tool for me, that I want to have finished quickly for it I’m using AI assistence, by letting it do stuff in small, pre-planned steps, and unsloppifying all the code between them. It’s working well. What helps, is that entire app is built on the egui / eframe crates, which I used before, and are somewhat familiar with. I gotta give credit, where is due, their api is really intuitive for the most part, and simple to use. The entire chart is also zoomable, and scrollable, and making this work was a bit of pain. I wanted to limit the accesible range to only around the data (so you can’t scroll away to far from it), and egui_plot doesn’t really provide a way to do it, so some manual calculations had to be done. I wanted to have some breathing space by allowing 0.25x of the zoom after last audio sample to be visible. This was the worst part, as it’s kind of a recursive problem - the zoom value affects how much zoom is allowed. But after around two hours I manged to figure it out, but keeping the original zoom value independantly of the limit calculated from it. Worth noting - what you see is just a mockup data, and the gui isn’t actually hooked up to the detection system, as that’s what I’m going to do next. After that I can hopefully improve the detection, and the finally go back to minecraft coding.
Debugging gui is (almost) done What is going on, why already 10 hours passed? This was menat to be a quick sidequest, where I built this gui tool for debugging how well detecting magic keywords is working BUUT given it is the third devlog about it That means it took over 30 hours! Well, happens. So, all of this devlog was spent building all the plumbing needed to capture all the data from the detection pipeline and sending it in realtime to the app. All of it is using done using channels. They are injected into the detection pipeline either as Tap<T> ‘s - a new pipeline element that clones data it sees, sends to channel, and passes it on, or using wrapper types around existing processors. The app then receives the data and displays in on the plot. I also encountered and fixed few bugs, that I didn’t expect. For example originally the zoom went to crazy values, because a timestamp used to determine where the data ends wasn’t converted to be relative to the timeline start. I also found an quite an issue introduced 3 months ago, where the timestamps attached to audio weren’t calculated properly, making entire audio chunks have identical stamps. It was minor enough that I never noticed till now, when the data landed on the plot and resulted in this funny thing you can see on the attached screenshot. Finally I added a simple scrolling animation, to amortize the jitter caused by bigger chunks of audio coming, so the plot doesn’t jump that much when going live, but it’s still not as smooth as I would like it to be. As mentioned before I was using AI assistance in strictly controlled manner (I carefully planned, revieved, cleaned up and adjusted to my liking all the code generated by it) to build this debugging tool faster, and by now I’m very tired of it. At the end of the work it started doing stupid things (possibly because some context was lost?), which made me question if it was making me faster or slower. Luckily the work is mostly over, and I can finally get to other, more interesting stuff, that will be fun to do, with no AI. Next I want to use the tool to improve the detection a bit, and spend more time working on the actual mod.
Multiloader modding is pain Can’t NeoForge and Fabric just have one common api, for all the boring stuff like registration, networking and events? I’ve had enough, so I spent 2 hours porting my mod to Balm , which is a library providing exactly that. The result is beautiful - ~150 lines are gone, and the loader specific subprojects fit under 10 lines of code, as I was able to move everything to common. Now for the worst irony: I spent my time doing all of that and the next thing I’m gonna do is… disable fabric support 😭 Why, you may ask? I was forced into it by reality read on First VFX I made my first VFX, for the leap spell. You can see it in the attached video. It’s going to spawn under player’s legs. For now it’s a really simple one, as I’m rushing to add a bit more of content, than just a single spell, before Stardance ends. It is made using Photon Editor , which is a VFX editor for Minecraft. It has a lot of good stuff, like emitters, timeline and animation curves, which will be crucial in making more advanced effects. Only downside: It doesn’t support Fabric, which is why support for it is going to be disabled for now, until I manage to hopefully make a port it in the future. Reworking spell internals (again) After making the effect, I realized I have no way to run it from the spell code, because spell logic runs server side only, and VFX needs to be played on the client. So I wen’t back to the drawing board, and I’m going to change how spells run. They are going be entities now, but more on that next devlog, because it’s not done yet, as I ran into friction in the code, which triggered me to do the Balm refactor, and in the meantime the time counter hit 9,5h. Do NOT hardcode stuff please I had to do some work on my laptop today, which has NixOS. So I update my Sephyr clone, try to run it, and bada bing bada bum, it doesn’t work! What’s going on? After a hour of debugging, it turned out that NeoForge devs hardcoded their Gradle plugin to run one specific task using Java 21. The rest runs on Java 25 (the one used by Minecraft 26.1). So, be default, a NeoForge setup for Mc 26.1+ requires two java version. Normally the second one is autodownloaded, but that doesn’t work on NixOS, and that’s also bloat. I don’t want that! So I made a bug report . Fortunetely it isn’t really hardcoded, just dumb, and I was able to fix it with this line in build.gradle Update to Burn 0.22 Burn 0.22 was recently released, removing the Backend generic from most of it’s traits. I updated Sepple to work with that. I also had to regenerate the model code for the multipa model. I was hoping the update would provide some speedup to speech processing, but I wasn’t able to measure any difference. Replacing Multipa with Zipa I found a new speech-to-IPA model. It’s called Zipa , and it looks very promising. It’s around 4x smaller then multipa, which means faster processing and less to download for end users. Furthermore, according to it’s paper, and my few tests it has noticeable better accuracy! So I implemnted it. It was a little more trouble then multipa, because the model has a much richer pre-processing. The audio waveform is turned into a mel spectogram, Fourier Transform is done, and other stuff happens. Buuut there is a problem. It turns out the model is great at doing recognition on longer audio sequences, and doesn’t really work that well on short ones. For them it performed worse then multipa! That means it’s not suitable for doing recognition in realtime, at least when plugged in the same way multipa was. However I have a couple ideas to try, which might, hopefully, solve the issue. Until I do that, it is set aside on a separate branch....
|
1792641292.6978648
|
1793246092.6978648
|
|
41332
|
Personal site by @potionj | Stardance
|
potionj
|
2
|
32.0
|
168
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-22T00:44:09Z", "hours": 18.0, "multiplier": 14.43, "payout": 132, "blessing": "neutral", "text": "Changes -Added animations for clicking inside and outside of the black hole -Redid the profile -Minor bug fixes -A lot of performance improvements -Added pre loading for the background in the star map to minimize transition time -Bound the edges of the starmap -Improved rendering speeds at the cost of slight decrease in quality -Rebound some keybinds -Added layered esc Some notes The amount of time i spent on the zoom in animation is way too long and i spent wayyyy too much time on it Had issues changing values with the profile bc of the weird header i made long time ago Had issues loading things? Now it basically just moves the lag to sometime else To justify the questionable hr count: Writing custom rendering is very painful and i do not recommend it at all (just use a library it actually makes it so much easier), this has taken so much effort to complete so please be nice while grading :) Actually helpful info for people rating I entered the site and theres nothing to do? -Click either inside or outside the blackhole (inside leads you to my profile, outside leads you to a starmap i made) Can i use my keyboard for the starmap? -Of course, move around with w/a/s/d, zoom in/out with +/-, turn the info card opque with o Why should i give you 9 stars for all of the parts? -Because i worked rly hard on this project :) -More specifically… -Originality: I dont think you’ve seen anyone with a similar personal site have you? (if you have send it to me on slack username:29mtye) -Technicality: This uses nasa api to load in images, CUSTOM rendering, a fully functional starmap, there is performance built in, there are backups incase the site can’t find anything -Usability: Its built to not break, there might be minor bugs but it accomplishes what it should do right? -Storytelling: This ship message is split into sections so that you can find info easily, i have almost 150 commits…", "repo": "https://github.com/minye065/my-website-templated", "demo": "https://minye065.github.io/my-website-templated/"}, {"ship_num": 2, "ts": "2026-08-23T16:30:05Z", "hours": 14.0, "multiplier": 5.5, "payout": 36, "blessing": "neutral", "text": "The site is done :D Had quite some issues with getting images from the nasa database but the site has turned out quite well. Please be nice while rating as this is my first css/html project. :) Try if you can find the hidden thing.", "repo": "https://github.com/minye065/my-website-templated", "demo": "https://minye065.github.io/my-website-templated/"}]...
|
[{"post_id": 81662, "ts": "202 [{"post_id": 81662, "ts": "2026-10-21T23:12:50Z", "hours": 0.2933, "text": "Fixed minor loading issues Changed how the loading for the star map works Bound the edges of the starmap Made starmap nonscrolling"}, {"post_id": 81413, "ts": "2026-10-21T05:50:52Z", "hours": 2.9125, "text": "Added a zoom in and out animation, zoom out is far superior tho… Zoom in animation needs a lot of fixing."}, {"post_id": 80290, "ts": "2026-10-17T04:06:02Z", "hours": 2.135, "text": "Added an animation for zooming out, fixed some issues with internal stuff. (Picture is mid animation)"}, {"post_id": 79665, "ts": "2026-10-15T00:15:27Z", "hours": 1.8697, "text": "Fixed the render and tuned some more values :) Swapped the render mask for a different method. Next is adding an animation, fixing the writting and maybe more hidden things? View at: https://minye065.github.io/my-website-templated/"}, {"post_id": 74336, "ts": "2026-09-27T06:05:23Z", "hours": 2.8025, "text": "IT WORKS!!!! Never thought that it would work so easily but it does. The blackhole has been split into 2 parts, outside and inside. The outside leads to the old site (soon to be changed) and the inside to the projects and what not. The loading is very jagged and will be overlayed with something :D. The old site is now accessible after however long it was just commented out. Going to do: add loading screens (or smth) add “back” button (revolutionary i know) split the old site into starmap and portfolio"}, {"post_id": 63816, "ts": "2026-09-07T19:45:11Z", "hours": 8.275, "text": "Remade the website again? Yea i had another idea but you’ll see at the end. Currently it’s just a blackhole renderer + mask maker. The mask will go over the blackhole to map out clicks and stuff. Had some issues with centering and omega. Using the math formulas from before caused the rings of the blackhole to do weird things because of a difference in rotation speeds. This was just removed to make it smooth. The blackhole is not as accurate anymore but i dont understand it enough to fix it soooo."}, {"post_id": 53155, "ts": "2026-08-23T16:27:35Z", "hours": 10.9436, "text": "Redid basically the entire website, now has a slightly hidden feature."}, {"post_id": 38017, "ts": "2026-07-31T04:54:36Z", "hours": 2.9147, "text": "added the background"}]...
|
Title: Personal site by @potionj | Stardance
Devl Title: Personal site by @potionj | Stardance
Devlogs:
added the background
Redid basically the entire website, now has a slightly hidden feature.
Remade the website again? Yea i had another idea but you’ll see at the end. Currently it’s just a blackhole renderer + mask maker. The mask will go over the blackhole to map out clicks and stuff. Had some issues with centering and omega. Using the math formulas from before caused the rings of the blackhole to do weird things because of a difference in rotation speeds. This was just removed to make it smooth. The blackhole is not as accurate anymore but i dont understand it enough to fix it soooo.
IT WORKS!!!! Never thought that it would work so easily but it does. The blackhole has been split into 2 parts, outside and inside. The outside leads to the old site (soon to be changed) and the inside to the projects and what not. The loading is very jagged and will be overlayed with something :D. The old site is now accessible after however long it was just commented out. Going to do: add loading screens (or smth) add “back” button (revolutionary i know) split the old site into starmap and portfolio
Fixed the render and tuned some more values :) Swapped the render mask for a different method. Next is adding an animation, fixing the writting and maybe more hidden things? View at: https://minye065.github.io/my-website-templated/
Added an animation for zooming out, fixed some issues with internal stuff. (Picture is mid animation)
Added a zoom in and out animation, zoom out is far superior tho… Zoom in animation needs a lot of fixing.
Fixed minor loading issues Changed how the loading for the star map works Bound the edges of the starmap Made starmap nonscrolling
Ships:
The site is done :D Had quite some issues with getting images from the nasa database but the site has turned out quite well. Please be nice while rating as this is my first css/html project. :) Try if you can find the hidden thing.
Changes -Added animations for clicking inside and outside of the black hole -Redid the profile -Minor bug fixes -A lot of performance improvements -Added pre loading for the background in the star map to minimize transition time -Bound the edges of the starmap -Improved rendering speeds at the cost of slight decrease in quality -Rebound some keybinds -Added layered esc Some notes The amount of time i spent on the zoom in animation is way too long and i spent wayyyy too much time on it Had issues changing values with the profile bc of the weird header i made long time ago Had issues loading things? Now it basically just moves the lag to sometime else To justify the questionable hr count: Writing custom rendering is very painful and i do not recommend it at all (just use a library it actually makes it so much easier), this has taken so much effort to complete so please be nice while grading :) Actually helpful info for people rating I entered the site and theres nothing to do? -Click either inside or outside the blackhole (inside leads you to my profile, outside leads you to a starmap i made) Can i use my keyboard for the starmap? -Of course, move around with w/a/s/d, zoom in/out with +/-, turn the info card opque with o Why should i give you 9 stars for all of the parts? -Because i worked rly hard on this project :) -More specifically… -Originality: I dont think you’ve seen anyone with a similar personal site have you? (if you have send it to me on slack username:29mtye) -Technicality: This uses nasa api to load in images, CUSTOM rendering, a fully functional starmap, there is performance built in, there are backups incase the site can’t find anything -Usability: Its built to not break, there might be minor bugs but it accomplishes what it should do right? -Storytelling: This ship message is split into sections so that you can find info easily, i have almost 150 commits…...
|
1792810432.3733099
|
1792896832.3733099
|