|
29733
|
SL-LLM-R: Can an AI learn from its own verified mi SL-LLM-R: Can an AI learn from its own verified mistakes? by @Samuelm | Stardance...
|
Samuelm
|
1
|
671.22
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T20:34:33Z", "hours": 381.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Most LLMs can recognize that they made a mistake, but they usually don’t actually learn from it. I’m building SL-LLM-R to explore whether that can be changed. The idea is to let a pretrained model learn from its own verified experience. When something goes wrong, the system saves where the decision came from, tries alternative decisions from the same state and checks what actually changes the outcome. If a possible improvement is supported by enough evidence, it can eventually be turned into a small, controlled update. If it makes things worse, the system must be able to reject it or roll it back. The research mechanism behind this is called Verifier-Grounded Counterfactual Plasticity, or VGCP. What matters to me is that the project does not just produce results that look good. The experiments are designed around reproducibility, fixed evaluation rules, independent verification, held-out tests and preserving failed experiments instead of quietly replacing them. The deterministic foundation is working and verified. The proposal system is implemented and tested, and the latest development benchmark was able to distinguish between different proposal strategies. The confirmatory experiment has now been preregistered and sealed. It has not been run yet. So I am not claiming that SL-LLM-R has solved continual learning or that it can already improve itself. That is exactly what the next experiments are meant to test. I have published the research, architecture, mathematics, experiment history, negative results and current evidence at: research.samuelm.de", "repo": "https://github.com/Samuel-Mencke/SL-LLM-R-Research", "demo": "https://samuelm.de/sl-llm-r"}]...
|
[{"post_id": 64120, "ts": "202 [{"post_id": 64120, "ts": "2026-09-08T09:56:53Z", "hours": 8.5761, "text": "DEVLOG #46 - Some repair scores could not be trusted Every possible repair SL-LLM-R produces should be linked back to the original proposal it came from so the search can be scored correctly. I found cases where that link was ambiguous, which can make the score describe the wrong search. I changed the scoring path so ambiguous pairs are rejected instead of guessed, and the earlier zero-hit result stays zero."}, {"post_id": 63496, "ts": "2026-09-07T11:54:01Z", "hours": 9.4925, "text": "DEVLOG #45 - Fixing one broken link still gave zero hits When SL-LLM-R fails to find a repair that I know should be reachable, I need to know whether the search is bad or the test case is broken. One case had a broken link between the original proposal and the repair I expected the search to find, so I fixed only that link and ran the case again with the same number of attempts. The search still found the target zero times, so that broken link was not the whole problem."}, {"post_id": 62759, "ts": "2026-09-06T08:48:26Z", "hours": 8.4917, "text": "DEVLOG #44 - I can explain 306 misses, but 1,224 still look the same I am trying to understand why SL-LLM-R’s repair search fails to find fixes that should exist. Right now I can explain 306 misses, while another 1,224 look identical in every field I am allowed to compare. Two different explanations for the source-signal problem also match the same 306 cases, so the available data still cannot separate those explanations for the larger group."}, {"post_id": 62552, "ts": "2026-09-06T00:19:11Z", "hours": 27.7922, "text": "DEVLOG #43 - I built one failure where I already knew the cause SL-LLM-R’s repair search was missing many fixes that I expected it to find, but I did not know why. I built one small synthetic failure where the component reading the source signal gets the wrong input, so I can reproduce that miss on purpose. At least one failure now has a known cause, which I can compare with the unexplained failures without assuming they are all the same problem."}, {"post_id": 60093, "ts": "2026-09-02T07:34:28Z", "hours": 21.6367, "text": "DEVLOG #42 - The first real learning run is still blocked The repaired SL-LLM-R comparison produced 1,530 completed results, but I still did not understand the repair-search failures well enough to start changing real model weights. Training therefore stayed off while I investigated why targets were being missed. I would rather delay the first learning update than call an unclear result progress."}, {"post_id": 58382, "ts": "2026-08-30T19:53:06Z", "hours": 17.5958, "text": "DEVLOG #41 - If the model grows, the extra capacity has to help I do not want SL-LLM-R to add parameters just because a larger model sounds better. If the system ever needs more capacity, my current idea is to add a small module in a copy and test whether that addition actually improves the model. If it does not help, the extra module should be deleted just like any other failed update."}, {"post_id": 56969, "ts": "2026-08-29T00:43:17Z", "hours": 0.3206, "text": "DEVLOG #40 - What happens if the model runs out of room? SL-LLM-R is meant to keep learning over time, which creates a long-term problem if a fixed-size model eventually runs out of useful capacity. My current idea is a stable core, fast memory, small learnable parts, and possibly extra specialist modules only when the existing capacity is not enough. The project cannot do that yet, so this is still future research."}, {"post_id": 56958, "ts": "2026-08-29T00:18:16Z", "hours": 0.6817, "text": "DEVLOG #39 - The repair-search failures are finally visible With a completed comparison, I can now inspect why SL-LLM-R’s repair search misses targets. Some misses come from repeated ideas, some repairs need more steps, and some targets are never reached by the current search. Separating those cases is more useful than treating every miss as one generic failure."}, {"post_id": 56943, "ts": "2026-08-28T23:37:01Z", "hours": 6.3122, "text": "DEVLOG #38 - The retry produced 1,530 completed results After the first SL-LLM-R comparison crashed, I fixed only the problems that prevented the test from running and repeated the same comparison. This time all 1,530 runs completed and produced scores. I could finally inspect failures in the repair search itself instead of only debugging the test setup."}, {"post_id": 56757, "ts": "2026-08-28T17:18:10Z", "hours": 0.3392, "text": "DEVLOG #37 - All 1,530 comparison runs crashed I ran a large SL-LLM-R comparison to measure the repair search, but all 1,530 runs crashed before producing a useful score. That means the run tells me nothing about whether the repair method was good or bad. The test setup failed, so I kept the result as a failed experiment instead of treating the crashes as model evidence."}, {"post_id": 56744, "ts": "2026-08-28T16:58:08Z", "hours": 0.3328, "text": "DEVLOG #36 - The learning loop is connected, but training is still off The main SL-LLM-R learning path is now connected. It starts with the original model, makes a temporary changed copy, checks whether the change helped and whether older abilities got worse, then either keeps the copy or throws it away. Real training is still disabled, so this is not yet a finished self-learning model."}, {"post_id": 56734, "ts": "2026-08-28T16:38:15Z", "hours": 0.2736, "text": "DEVLOG #35 - A better retry is still not model learning SL-LLM-R is meant to change future model behavior, not just get a better answer on the second attempt. Many AI systems can retry with more context and look like they learned even when the model itself stayed the same. I only care about a correction as learning if it affects later behavior, does not break other abilities, and can still be undone."}, {"post_id": 56723, "ts": "2026-08-28T16:21:26Z", "hours": 0.2608, "text": "DEVLOG #34 - Replay and consolidation fit the project together I realized two ideas from continual-learning research fit SL-LLM-R quite well. Replay means keeping older knowledge present while learning something new, while consolidation is about deciding which new experiences deserve to last longer. Together they match the goal of turning some verified experiences into lessons without making every observation permanent."}, {"post_id": 56711, "ts": "2026-08-28T16:05:48Z", "hours": 0.2606, "text": "DEVLOG #33 - Brain wiring gave me one idea to test I looked at connectomics, which is research on how brain cells are connected, because SL-LLM-R needs a way to keep model changes local. One idea is that connection structure might help choose which parts are safe to change together. It is only inspiration for an experiment, not a claim that transformers work like brains."}, {"post_id": 56701, "ts": "2026-08-28T15:50:13Z", "hours": 0.2608, "text": "DEVLOG #32 - The first real update has one clear path I wanted the first real SL-LLM-R model update to follow one understandable sequence. The system loads a parent model, copies it, changes only the child, tests the parent and child, then either keeps the child or deletes it. Training is still disabled, but the update path itself is now connected instead of being spread across separate pieces."}, {"post_id": 56690, "ts": "2026-08-28T15:34:39Z", "hours": 0.2606, "text": "DEVLOG #31 - A real base model is now part of the setup SL-LLM-R started with placeholder model inputs while I built the safety and comparison logic around them. I replaced that placeholder with a real open model that the system can identify and verify exactly. Training is still off, but future experiments can now start from a real model rather than a fake name."}, {"post_id": 56681, "ts": "2026-08-28T15:19:09Z", "hours": 0.2608, "text": "DEVLOG #30 - I can now undo a model update through the full practice loop SL-LLM-R needs a complete way to undo a model change before real learning updates can be trusted. I can now save the original model, make a changed copy, test it, switch to it, and return to the original in one practice run. I have not yet used that path to undo a genuinely learned LLM update, so the mechanism works but the real learning case is still untested."}, {"post_id": 56670, "ts": "2026-08-28T15:03:40Z", "hours": 0.2522, "text": "DEVLOG #29 - The cause finder is allowed to say it does not know Before SL-LLM-R changes a model, it tries to estimate what caused the original failure. I tested that part on simple cases where the cause was already known, especially to see what happens when the signal becomes weak. It can stop instead of inventing a confident answer, which is the behavior I want before any model update depends on that guess."}, {"post_id": 56662, "ts": "2026-08-28T14:48:25Z", "hours": 0.2606, "text": "DEVLOG #28 - Loading a model should not enable training SL-LLM-R needs access to a real base model before I can run realistic experiments. I made that access read-only so loading and checking the model does not automatically give the system permission to change its weights. Training can stay completely off while I verify exactly which model and data the project is using."}, {"post_id": 56654, "ts": "2026-08-28T14:32:51Z", "hours": 0.2522, "text": "DEVLOG #27 - Failed repairs still tell me something SL-LLM-R generates repair ideas after model mistakes, and many of those ideas get rejected. I started keeping track of why they fail instead of treating every rejected repair as the same kind of failure. Duplicates, impossible repairs, multi-step repairs, and bad ideas reveal different weaknesses in the search even when the model learns nothing from them."}, {"post_id": 56647, "ts": "2026-08-28T14:17:28Z", "hours": 0.4669, "text": "DEVLOG #26 - Every model change needs a history If SL-LLM-R keeps a model update, I want to be able to trace exactly why that change exists later. Each kept update should point back to the original mistake, the proposed repair, the parent model, and the checks that approved it. Otherwise a future model problem could turn into a mystery with no clear way to undo the right change."}, {"post_id": 55577, "ts": "2026-08-27T15:01:19Z", "hours": 0.3369, "text": "DEVLOG #25 - I need to know what caused a mistake before changing weights SL-LLM-R is supposed to learn from a model mistake without changing more of the model than necessary. A single bad result only tells me that something went wrong, not what caused it. The system first needs a likely cause before it can choose a small place where a repair might make sense."}, {"post_id": 55570, "ts": "2026-08-27T14:40:57Z", "hours": 0.345, "text": "DEVLOG #24 - I had to keep the final test separate I need to improve SL-LLM-R without slowly tuning it to the exact tasks used to judge it at the end. If I keep looking at those final tasks while changing the repair search, I can accidentally learn the test itself. Development tasks and final test tasks therefore stay separate."}, {"post_id": 55558, "ts": "2026-08-27T14:20:24Z", "hours": 0.3275, "text": "DEVLOG #23 - Random search was harder to beat than I expected SL-LLM-R uses a structured search to find possible repairs after model mistakes, and I compare it against random repair ideas. I expected random search to be an easy baseline to beat, but it was surprisingly competitive under the same budget. The structured search still has to prove that its extra complexity is actually worth using."}, {"post_id": 55386, "ts": "2026-08-27T05:56:33Z", "hours": 10.0881, "text": "DEVLOG #22 - More attempts can make a weak search look better I compare SL-LLM-R’s repair search against simpler search methods. If one method gets more attempts or more compute, it can look better just because it had more chances to get lucky. I now keep the search budget equal across methods so the comparison is about the method rather than the amount of compute."}, {"post_id": 55096, "ts": "2026-08-26T15:32:19Z", "hours": 0.2608, "text": "DEVLOG #21 - The learning controller mostly blocks updates SL-LLM-R has a controller that decides whether a possible model update is safe enough to try or keep. I originally imagined it mostly choosing how to learn, but most of its job is actually refusing weak updates. If the signal is weak, the change is too large, or forgetting risk is too high, the model stays unchanged."}, {"post_id": 55086, "ts": "2026-08-26T15:16:50Z", "hours": 0.6056, "text": "DEVLOG #20 - Memory can change fast, weights should change slowly SL-LLM-R uses two different kinds of adaptation. Temporary memory can change quickly because it can be thrown away, while real model weights should change much more slowly and only after stronger checks. This keeps a random observation from becoming permanent too easily."}, {"post_id": 53445, "ts": "2026-08-24T00:13:08Z", "hours": 5.4086, "text": "DEVLOG #19 - New lessons can overwrite old ones A continual-learning system like SL-LLM-R can forget older knowledge if it trains only on the newest mistake. I use replay, which means mixing some older verified examples back in while a new lesson is learned. The goal is to make new learning fit alongside old knowledge instead of pushing it out."}, {"post_id": 52830, "ts": "2026-08-23T05:53:45Z", "hours": 15.8025, "text": "DEVLOG #18 - Fixing one mistake can break something else SL-LLM-R cannot judge a learning update only on the mistake it was meant to fix. A model can improve on that one case and quietly get worse at older abilities. I therefore check for forgetting too, so an update is rejected if the local gain hides a larger loss elsewhere."}, {"post_id": 52112, "ts": "2026-08-22T06:10:57Z", "hours": 17.9328, "text": "DEVLOG #17 - A changed model has to beat the unchanged one SL-LLM-R creates a temporary child model when it tests a learning update. The child is not kept just because it is newer. It has to perform better than the unchanged parent under the same checks, otherwise the update is discarded."}, {"post_id": 51476, "ts": "2026-08-21T06:25:29Z", "hours": 16.7675, "text": "DEVLOG #16 - I wanted rollback before trusting any update SL-LLM-R should be able to undo a model change if the new version turns out worse. Every update starts from a saved parent model and happens in a temporary child copy. If the child fails the checks, it can be deleted and the original parent stays untouched."}, {"post_id": 50792, "ts": "2026-08-20T05:46:56Z", "hours": 0.3267, "text": "DEVLOG #15 - Which experiences should the model learn from? SL-LLM-R eventually needs to choose which experiences are worth using for learning instead of treating every case equally. I tested selecting problems near the model’s current ability limit rather than choosing practice cases randomly. In development tests that found useful cases more often, so task selection became part of the learning design too."}, {"post_id": 50788, "ts": "2026-08-20T05:24:10Z", "hours": 15.7136, "text": "DEVLOG #14 - I made the first real weight change in a test copy Most early SL-LLM-R tests only simulated what a learning update would do. This was the first time I changed actual model parameters with one tiny training step on an isolated copy while the original model stayed untouched. It does not prove self-learning works yet, but the real weight-update path itself did run."}, {"post_id": 50119, "ts": "2026-08-19T06:14:06Z", "hours": 9.7569, "text": "DEVLOG #13 - Context can look like learning when it is not SL-LLM-R needs to separate temporary memory from actual model learning. A model can answer better simply because the correct information is still in its context window, even though its weights never changed. I keep those two kinds of improvement separate so short-term memory does not get reported as permanent learning."}, {"post_id": 49872, "ts": "2026-08-18T20:28:23Z", "hours": 3.6808, "text": "This part of the project was mostly about making the final test harder to fool. I preregistered the analysis, froze the generator and sealer, and sealed the held-out split before looking at any confirmatory outcome. The important result here is a constraint rather than a score: if I can still change the test after seeing results, the result is not trustworthy. The evaluation itself was not run at this point, so this was preparation for evidence, not evidence that SL-LLM-R works. I would rather keep the experiment locked than make the final result easier to obtain."}, {"post_id": 49507, "ts": "2026-08-18T11:50:28Z", "hours": 16.385, "text": "DEVLOG #12 - One mistake should only allow a small change SL-LLM-R should not get permission to change the whole model because of one mistake. I want each repair to affect the smallest useful place, starting with temporary memory when possible and only touching learnable parameters when there is enough reason. A small amount of evidence should only allow a small intervention."}, {"post_id": 48823, "ts": "2026-08-17T11:28:00Z", "hours": 30.2072, "text": "DEVLOG #11 - The model cannot grade its own repair In SL-LLM-R the model can suggest a repair after it makes a mistake. I do not want the same model to also decide whether its own repair was successful, because that could turn into self-approval. The repair is checked separately from the model that proposed it."}, {"post_id": 47448, "ts": "2026-08-15T11:47:09Z", "hours": 16.7272, "text": "DEVLOG #10 - Sometimes the best update is no update SL-LLM-R is meant to learn from verified mistakes, but changing the model after every interesting result would probably teach it a lot of bad lessons. The system needs to be allowed to say there is not enough information and leave the model unchanged. One bad permanent update can be worse than learning nothing from that case."}, {"post_id": 46827, "ts": "2026-08-14T10:58:17Z", "hours": 14.0386, "text": "DEVLOG #09 - A working repair still does not tell me what broke SL-LLM-R can replay a model mistake with a repair and see whether the result gets better. The problem is that a better replay still does not tell me which part of the model caused the mistake. I split those jobs apart so the system first estimates the likely cause and only then decides what small part could be changed."}, {"post_id": 43890, "ts": "2026-08-09T10:33:42Z", "hours": 11.1233, "text": "DEVLOG #08 - I needed an A/B test for model mistakes The main idea in SL-LLM-R is to test a possible repair from the exact state before a model mistake happened. I replay the situation once normally and once with only one repair changed. Comparing those two runs is much more useful than seeing a better answer later and guessing that the repair caused it."}, {"post_id": 43243, "ts": "2026-08-08T12:13:50Z", "hours": 168.2683, "text": "I lost track of posting while I was building the first search loop, so this entry covers more than one session. I tried five simple ways of generating possible fixes under the same fixed budget and gave every candidate a reproducible identity and lineage. The annoying part was budget accounting: duplicates and rejected candidates still consume real search effort, which matters when I compare the method against a baseline. At this point the engine was implemented, but I still did not know whether the extra structure was actually better than random search. The next experiment was to test exactly that instead of assuming the machinery was useful."}, {"post_id": 30607, "ts": "2026-07-18T09:59:26Z", "hours": 21.1706, "text": "DEVLOG #07 - The new benchmark can finally separate methods I rebuilt the SL-LLM-R repair benchmark so it has more tasks that are difficult but still solvable. Different search methods finally started producing different results instead of all looking the same. That does not prove my search is good, but at least the benchmark can now show when one method is worse."}, {"post_id": 30003, "ts": "2026-07-17T07:30:10Z", "hours": 10.4578, "text": "DEVLOG #06 - Different searches kept finding the same repairs SL-LLM-R can try different ways of searching for a repair after a model mistake. I expected those methods to explore different ideas, but many of them kept finding the same repairs. I started tracking duplicates directly because a large attempt budget is not useful if most attempts repeat the same idea."}, {"post_id": 29761, "ts": "2026-07-16T21:03:05Z", "hours": 8.7039, "text": "DEVLOG #05 - My first benchmark could not tell the searches apart I need a benchmark to tell whether SL-LLM-R’s repair search is actually better than simple alternatives. The first one made structured search and random search look almost identical. Most tasks were either very easy or almost impossible, so I threw that benchmark away and rebuilt it with more tasks in the middle."}, {"post_id": 29361, "ts": "2026-07-16T08:21:54Z", "hours": 90.9133, "text": "DEVLOG #04 - The repair search was wasting attempts When SL-LLM-R sees a mistake, it searches for possible repairs to try. My first version kept spending attempts on duplicate fixes and repairs that were not valid in the first place. I changed the budget so every attempt counts, including the useless ones, because otherwise the search would look better than it really is."}, {"post_id": 27120, "ts": "2026-07-12T12:04:47Z", "hours": 15.1889, "text": "DEVLOG #03 - A crash cannot leave the model half changed SL-LLM-R compares a model before and after a possible learning update. If that update crashes halfway through, a half-changed model would make every later result impossible to trust. So each update is all or nothing: the system keeps either the old state or the complete new state."}, {"post_id": 26827, "ts": "2026-07-11T20:54:29Z", "hours": 9.4825, "text": "DEVLOG #02 - What should count as real learning? SL-LLM-R is supposed to make a model learn from mistakes, so I first had to decide what actually counts as learning. A better second answer is not enough. I only count it if the improvement still helps later, does not break other things, and can be undone if the change was bad."}, {"post_id": 26272, "ts": "2026-07-10T23:33:38Z", "hours": 56.8225, "text": "DEVLOG #1 - Why I Started SL-LLM-R Project: SL-LLM-R Introduction I originally just wanted a project for the summer. I had a few ideas, but most already existed or sounded like something I would abandon after a few days. Then I started thinking about AI. I use AI a lot for coding. It can understand large projects and solve difficult problems, but it can also repeat the same simple mistake several times. Even when it notices that something failed, it usually does not actually learn from it. The context becomes longer, but the model itself stays almost the same. Current models are trained on human-created data and updated through processes designed by humans. They can generate answers, but they normally cannot decide what to learn next, which decision caused a failure, or whether a change would damage another capability. So I started thinking about a system that could learn from its own verified experiences. That became SL-LLM-R. The Idea The core mechanism is called VGCP: Verifier-Grounded Counterfactual Plasticity. The simplified process is: Save the state before a decision. Let the model act. Check the result with an external verifier. Generate possible repairs. Replay the same situation with and without each repair. Compare the outcomes. Keep only changes supported by evidence. In simplified form: Δ = E[Y(change) - Y(original)] If the repaired version performs better across controlled tests, the change may be useful. If the evidence is weak, the system should not update. The goal is controlled, local, reversible, and verifiable learning. The PDF I first planned to write a short document. That did not go as planned. Every answer created more questions: How do I save the exact state? How do I compare runs fairly? How do I prevent leakage, forgetting, broken rollbacks, or the system approving its own changes? The document became the SL-LLM-R V1.2.2 specification. It is now 135 pages long and contains the architecture, mathematics, safety rules, algorithms, experiments, and failure conditions. The PDF does not prove that the system works. It defines what I need to build and what would count as failure. Completed Changes Defined the project idea. Created the VGCP concept. Wrote the V1.2.2 specification. Started the initial implementation. Next Steps Continue the deterministic foundation. Implement snapshots and rollback. Build the proposal system. Compare it against simple baselines. Summary I started with a few random project ideas, got annoyed by how intelligent and stupid AI can be at the same time, and ended up designing a system that should learn from verified mistakes. It might become something important. It might also be another stupid idea that takes over my entire summer holiday. Right now, I do not know. That is why I am building it. Summary (AI) SL-LLM-R is a pre-experimental project about controlled, verifier-grounded continual learning. No validated self-improvement result is currently claimed. Note I spent way too long writing this devlog and the PDF. I also started coding parts of the project, and it was… different from what I expected. More soon."}]...
|
Title: SL-LLM-R: Can an AI learn from its own veri Title: SL-LLM-R: Can an AI learn from its own verified mistakes? by @Samuelm | Stardance
Devlogs:
DEVLOG #1 - Why I Started SL-LLM-R Project: SL-LLM-R Introduction I originally just wanted a project for the summer. I had a few ideas, but most already existed or sounded like something I would abandon after a few days. Then I started thinking about AI. I use AI a lot for coding. It can understand large projects and solve difficult problems, but it can also repeat the same simple mistake several times. Even when it notices that something failed, it usually does not actually learn from it. The context becomes longer, but the model itself stays almost the same. Current models are trained on human-created data and updated through processes designed by humans. They can generate answers, but they normally cannot decide what to learn next, which decision caused a failure, or whether a change would damage another capability. So I started thinking about a system that could learn from its own verified experiences. That became SL-LLM-R. The Idea The core mechanism is called VGCP: Verifier-Grounded Counterfactual Plasticity. The simplified process is: Save the state before a decision. Let the model act. Check the result with an external verifier. Generate possible repairs. Replay the same situation with and without each repair. Compare the outcomes. Keep only changes supported by evidence. In simplified form: Δ = E[Y(change) - Y(original)] If the repaired version performs better across controlled tests, the change may be useful. If the evidence is weak, the system should not update. The goal is controlled, local, reversible, and verifiable learning. The PDF I first planned to write a short document. That did not go as planned. Every answer created more questions: How do I save the exact state? How do I compare runs fairly? How do I prevent leakage, forgetting, broken rollbacks, or the system approving its own changes? The document became the SL-LLM-R V1.2.2 specification. It is now 135 pages long and contains the architecture, mathematics, safety rules, algorithms, experiments, and failure conditions. The PDF does not prove that the system works. It defines what I need to build and what would count as failure. Completed Changes Defined the project idea. Created the VGCP concept. Wrote the V1.2.2 specification. Started the initial implementation. Next Steps Continue the deterministic foundation. Implement snapshots and rollback. Build the proposal system. Compare it against simple baselines. Summary I started with a few random project ideas, got annoyed by how intelligent and stupid AI can be at the same time, and ended up designing a system that should learn from verified mistakes. It might become something important. It might also be another stupid idea that takes over my entire summer holiday. Right now, I do not know. That is why I am building it. Summary (AI) SL-LLM-R is a pre-experimental project about controlled, verifier-grounded continual learning. No validated self-improvement result is currently claimed. Note I spent way too long writing this devlog and the PDF. I also started coding parts of the project, and it was… different from what I expected. More soon.
DEVLOG #02 - What should count as real learning? SL-LLM-R is supposed to make a model learn from mistakes, so I first had to decide what actually counts as learning. A better second answer is not enough. I only count it if the improvement still helps later, does not break other things, and can be undone if the change was bad.
DEVLOG #03 - A crash cannot leave the model half changed SL-LLM-R compares a model before and after a possible learning update. If that update crashes halfway through, a half-changed model would make every later result impossible to trust. So each update is all or nothing: the system keeps either the old state or the complete new state.
DEVLOG #04 - The repair search was wasting attempts When SL-LLM-R sees a mistake, it searches for possible repairs to try. My first version kept spending attempts on duplicate fixes and repairs that were not valid in the first place. I changed the budget so every attempt counts, including the useless ones, because otherwise the search would look better than it really is.
DEVLOG #05 - My first benchmark could not tell the searches apart I need a benchmark to tell whether SL-LLM-R’s repair search is actually better than simple alternatives. The first one made structured search and random search look almost identical. Most tasks were either very easy or almost impossible, so I threw that benchmark away and rebuilt it with more tasks in the middle.
DEVLOG #06 - Different searches kept finding the same repairs SL-LLM-R can try different ways of searching for a repair after a model mistake. I expected those methods to explore different ideas, but many of them kept finding the same repairs. I started tracking duplicates directly because a large attempt budget is not useful if most attempts repeat the same idea.
DEVLOG #07 - The new benchmark can finally separate methods I rebuilt the SL-LLM-R repair benchmark so it has more tasks that are difficult but still solvable. Different search methods finally started producing different results instead of all looking the same. That does not prove my search is good, but at least the benchmark can now show when one method is worse.
I lost track of posting while I was building the first search loop, so this entry covers more than one session. I tried five simple ways of generating possible fixes under the same fixed budget and gave every candidate a reproducible identity and lineage. The annoying part was budget accounting: duplicates and rejected candidates still consume real search effort, which matters when I compare the method against a baseline. At this point the engine was implemented, but I still did not know whether the extra structure was actually better than random search. The next experiment was to test exactly that instead of assuming the machinery was useful.
DEVLOG #08 - I needed an A/B test for model mistakes The main idea in SL-LLM-R is to test a possible repair from the exact state before a model mistake happened. I replay the situation once normally and once with only one repair changed. Comparing those two runs is much more useful than seeing a better answer later and guessing that the repair caused it.
DEVLOG #09 - A working repair still does not tell me what broke SL-LLM-R can replay a model mistake with a repair and see whether the result gets better. The problem is that a better replay still does not tell me which part of the model caused the mistake. I split those jobs apart so the system first estimates the likely cause and only then decides what small part could be changed.
DEVLOG #10 - Sometimes the best update is no update SL-LLM-R is meant to learn from verified mistakes, but changing the model after every interesting result would probably teach it a lot of bad lessons. The system needs to be allowed to say there is not enough information and leave the model unchanged. One bad permanent update can be worse than learning nothing from that case.
DEVLOG #11 - The model cannot grade its own repair In SL-LLM-R the model can suggest a repair after it makes a mistake. I do not want the same model to also decide whether its own repair was successful, because that could turn into self-approval. The repair is checked separately from the model that proposed it.
DEVLOG #12 - One mistake should only allow a small change SL-LLM-R should not get permission to change the whole model because of one mistake. I want each repair to affect the smallest useful place, starting with temporary memory when possible and only touching learnable parameters when there is enough reason. A small amount of evidence should only allow a small intervention.
This part of the project was mostly about making the final test harder to fool. I preregistered the analysis, froze the generator and sealer, and sealed the held-out split before looking at any confirmatory outcome. The important result here is a constraint rather than a score: if I can still change the test after seeing results, the result is not trustworthy. The evaluation itself was not run at this point, so this was preparation for evidence, not evidence that SL-LLM-R works. I would rather keep the experiment locked than make the final result easier to obtain.
DEVLOG #13 - Context can look like learning when it is not SL-LLM-R needs to separate temporary memory from actual model learning. A model can answer better simply because the correct information is still in its context window, even though its weights never changed. I keep those two kinds of improvement separate so short-term memory does not get reported as permanent learning.
DEVLOG #14 - I made the first real weight change in a test copy Most early SL-LLM-R tests only simulated what a learning update would do. This was the first time I changed actual model parameters with one tiny training step on an isolated copy while the original model stayed untouched. It does not prove self-learning works yet, but the real weight-update path itself did run.
DEVLOG #15 - Which experiences should the model learn from? SL-LLM-R eventually needs to choose which experiences are worth using for learning instead of treating every case equally. I tested selecting problems near the model’s current ability limit rather than choosing practice cases randomly. In development tests that found useful cases more often, so task selection became part of the learning design too.
DEVLOG #16 - I wanted rollback before trusting any update SL-LLM-R should be able to undo a model change if the new version turns out worse. Every update starts from a saved parent model and happens in a temporary child copy. If the child fails the checks, it can be deleted and the original parent stays untouched.
DEVLOG #17 - A changed model has to beat the unchanged one SL-LLM-R creates a temporary child model when it tests a learning update. The child is not kept just because it is newer. It has to perform better than the unchanged parent under the same checks, otherwise the update is discarded.
DEVLOG #18 - Fixing one mistake can break something else SL-LLM-R cannot judge a learning update only on the mistake it was meant to fix. A model can improve on that one case and quietly get worse at older abilities. I therefore check for forgetting too, so an update is rejected if the local gain hides a larger loss elsewhere.
DEVLOG #19 - New lessons can overwrite old ones A continual-learning system like SL-LLM-R can forget older knowledge if it trains only on the newest mistake. I use replay, which means mixing some older verified examples back in while a new lesson is learned. The goal is to make new learning fit alongside old knowledge instead of pushing it out.
DEVLOG #20 - Memory can change fast, weights should change slowly SL-LLM-R uses two different kinds of adaptation. Temporary memory can change quickly because it can be thrown away, while real model weights should change much more slowly and only after stronger checks. This keeps a random observation from becoming permanent too easily.
DEVLOG #21 - The learning controller mostly blocks updates SL-LLM-R has a controller that decides whether a possible model update is safe enough to try or keep. I originally imagined it mostly choosing how to learn, but most of its job is actually refusing weak updates. If the signal is weak, the change is too large, or forgetting risk is too high, the model stays unchanged.
DEVLOG #22 - More attempts can make a weak search look better I compare SL-LLM-R’s repair search against simpler search methods. If one method gets more attempts or more compute, it can look better just because it had more chances to get lucky. I now keep the search budget equal across methods so the comparison is about the method rather than the amount of compute.
DEVLOG #23 - Random search was harder to beat than I expected SL-LLM-R uses a structured search to find possible repairs after model mistakes, and I compare it against random repair ideas. I expected random search to be an easy baseline to beat, but it was surprisingly competitive under the same budget. The structured search still has to prove that its extra complexity is actually worth using.
DEVLOG #24 - I had to keep the final test separate I need to improve SL-LLM-R without slowly tuning it to the exact tasks used to judge it at the end. If I keep looking at those final tasks while changing the repair search, I can accidentally learn the test itself. Development tasks and final test tasks therefore stay separate.
DEVLOG #25 - I need to know what caused a mistake before changing weights SL-LLM-R is supposed to learn from a model mistake without changing more of the model than necessary. A single bad result only tells me that something went wrong, not what caused it. The system first needs a likely cause before it can choose a small place where a repair might make sense.
DEVLOG #26 - Every model change needs a history If SL-LLM-R keeps a model update, I want to be able to trace exactly why that change exists later. Each kept update should point back to the original mistake, the proposed repair, the parent model, and the checks that approved it. Otherwise a future model problem could turn into a mystery with no clear way to undo the right change.
DEVLOG #27 - Failed repairs still tell me something SL-LLM-R generates repair ideas after model mistakes, and many of those ideas get rejected. I started keeping track of why they fail instead of treating every rejected repair as the same kind of failure. Duplicates, impossible repairs, multi-step repairs, and bad ideas reveal different weaknesses in the search even when the model learns nothing from them.
DEVLOG #28 - Loading a model should not enable training SL-LLM-R needs access to a real base model before I can run realistic experiments. I made that access read-only so loading and checking the model does not automatically give the system permission to change its weights. Training can stay completely off while I verify exactly which model and data the project is using.
DEVLOG #29 - The cause finder is allowed to say it does not know Before SL-LLM-R changes a model, it tries to estimate what caused the original failure. I tested that part on simple cases where the cause was already known, especially to see what happens when the signal becomes weak. It can stop instead of inventing a confident answer, which is the behavior I want before any model update depends on that guess.
DEVLOG #30 - I can now undo a model update through the full practice loop SL-LLM-R needs a complete way to undo a model change before real learning updates can be trusted. I can now save the original model, make a changed copy, test it, switch to it, and return to the original in one practice run. I have not yet used that path to undo a genuinely learned LLM update, so the mechanism works but the real learning case is still untested.
DEVLOG #31 - A real base model is now part of the setup SL-LLM-R started with placeholder model inputs while I built the safety and comparison logic around them. I replaced that placeholder with a real open model that the system can identify and verify exactly. Training is still off, but future experiments can now start from a real model rather than a fake name.
DEVLOG #32 - The first real update has one clear path I wanted the first real SL-LLM-R model update to follow one understandable sequence. The system loads a parent model, copies it, changes only the child, tests the parent and child, then either keeps the child or deletes it. Training is still disabled, but the update path itself is now connected instead of being spread across separate pieces.
DEVLOG #33 - Brain wiring gave me one idea to test I looked at connectomics, which is research on how brain cells are connected, because SL-LLM-R needs a way to keep model changes local. One idea is that connection structure might help choose which parts are safe to change together. It is only inspiration for an experiment, not a claim that transformers work like brains.
DEVLOG #34 - Replay and consolidation fit the project together I realized two ideas from continual-learning research fit SL-LLM-R quite well. Replay means keeping older knowledge present while learning something new, while consolidation is about deciding which new experiences deserve to last longer. Together they match the goal of turning some verified experiences into lessons without making every observation permanent.
DEVLOG #35 - A better retry is still not model learning SL-LLM-R is meant to change future model behavior, not just get a better answer on the second attempt. Many AI systems can retry with more context and look like they learned even when the model itself stayed the same. I only care about a correction as learning if it affects later behavior, does not break other abilities, and can still be undone.
DEVLOG #36 - The learning loop is connected, but training is still off The main SL-LLM-R learning path is now connected. It starts with the original model, makes a temporary changed copy, checks whether the change helped and whether older abilities got worse, then either keeps the copy or throws it away. Real training is still disabled, so this is not yet a finished self-learning model.
DEVLOG #37 - All 1,530 comparison runs crashed I ran a large SL-LLM-R comparison to measure the repair search, but all 1,530 runs crashed before producing a useful score. That means the run tells me nothing about whether the repair method was good or bad. The test setup failed, so I kept the result as a failed experiment instead of treating the crashes as model evidence.
DEVLOG #38 - The retry produced 1,530 completed results After the first SL-LLM-R comparison crashed, I fixed only the problems that prevented the test from running and repeated the same comparison. This time all 1,530 runs completed and produced scores. I could finally inspect failures in the repair search itself instead of only debugging the test setup.
DEVLOG #39 - The repair-search failures are finally visible With a completed comparison, I can now inspect why SL-LLM-R’s repair search misses targets. Some misses come from repeated ideas, some repairs need more steps, and some targets are never reached by the current search. Separating those cases is more useful than treating every miss as one generic failure.
DEVLOG #40 - What happens if the model runs out of room? SL-LLM-R is meant to keep learning over time, which creates a long-term problem if a fixed-size model eventually runs out of useful capacity. My current idea is a stable core, fast memory, small learnable parts, and possibly extra specialist modules only when the existing capacity is not enough. The project cannot do that yet, so this is still future research.
DEVLOG #41 - If the model grows, the extra capacity has to help I do not want SL-LLM-R to add parameters just because a larger model sounds better. If the system ever needs more capacity, my current idea is to add a small module in a copy and test whether that addition actually improves the model. If it does not help, the extra module should be deleted just like any other failed update.
DEVLOG #42 - The first real learning run is still blocked The repaired SL-LLM-R comparison produced 1,530 completed results, but I still did not understand the repair-search failures well enough to start changing real model weights. Training therefore stayed off while I investigated why targets were being missed. I would rather delay the first learning update than call an unclear result progress.
DEVLOG #43 - I built one failure where I already knew the cause SL-LLM-R’s repair search was missing many fixes that I expected it to find, but I did not know why. I built one small synthetic failure where the component reading the source signal gets the wrong input, so I can reproduce that miss on purpose. At least one failure now has a known cause, which I can compare with the unexplained failures without assuming they are all the same problem.
DEVLOG #44 - I can explain 306 misses, but 1,224 still look the same I am trying to understand why SL-LLM-R’s repair search fails to find fixes that should exist. Right now I can explain 306 misses, while another 1,224 look identical in every field I am allowed to compare. Two different explanations for the source-signal problem also match the same 306 cases, so the available data still cannot separate those explanations for the larger group.
DEVLOG #45 - Fixing one broken link still gave zero hits When SL-LLM-R fails to find a repair that I know should be reachable, I need to know whether the search is bad or the test case is broken. One case had a broken link between the original proposal and the repair I expected the search to find, so I fixed only that link and ran the case again with the same number of attempts. The search still found the target zero times, so that broken link was not the whole problem.
DEVLOG #46 - Some repair scores could not be trusted Every possible repair SL-LLM-R produces should be linked back to the original proposal it came from so the search can be scored correctly. I found cases where that link was ambiguous, which can make the score describe the wrong search. I changed the scoring path so ambiguous pairs are rejected instead of guessed, and the earlier zero-hit result stays zero.
Ships:
Most LLMs can recognize that they made a mistake, but they usually don’t actually learn from it. I’m building SL-LLM-R to explore whether that can be changed. The idea is to let a pretrained model learn from its own verified experience. When something goes wrong, the system saves where the decision came from, tries alternative decisions from the same state and checks what actually changes the outcome. If a possible improvement is supported by enough evidence, it can eventually be turned into a small, controlled update. If it makes things worse, the system must be able to reject it or roll it back. The research mechanism behind this is called Verifier-Grounded Counterfactual Plasticity, or VGCP. What matters to me is that the project does not just produce results that look good. The experiments are designed around reproducibility, fixed evaluation rules, independent verification, held-out tests and preserving failed experiments instead of quietly replacing them. The deterministic foundation is working and verified. The proposal system is implemented and tested, and the latest development benchmark was able to distinguish between different proposal strategies. The confirmatory experiment has now been preregistered and sealed. It has not been run yet. So I am not claiming that SL-LLM-R has solved continual learning or that it can already improve itself. That is exactly what the next experiments are meant to test. I have published the research, architecture, mathematics, experiment history, negative results and current evidence at: research.samuelm.de...
|
1792875253.8490605
|
1793739253.8490605
|
|
2717
|
Voxly by @devlsx | Stardance
|
devlsx
|
0
|
523.94
|
0
|
[]
|
[{"post_id": 49741, "ts": "202 [{"post_id": 49741, "ts": "2026-08-18T17:41:48Z", "hours": 7.5717, "text": "Today, I focused on the menu subsystem, primarily implementing and refining the main menu and inventory screen functionalities. This work is essential for user interaction and enhancing the player experience through intuitive navigation."}, {"post_id": 49029, "ts": "2026-08-17T16:52:34Z", "hours": 8.4061, "text": "Today, I worked primarily on the HUD subsystem, focusing on the implementation of various HUD components and inventory screens. This is crucial for improving user interaction and providing feedback during gameplay"}, {"post_id": 48635, "ts": "2026-08-17T03:21:13Z", "hours": 8.1392, "text": "Today, I focused on enhancing the console subsystem, which is crucial for debugging and player input management. The improvements made today lay the groundwork for a more robust command interface, enabling better interaction with the game engine."}, {"post_id": 47593, "ts": "2026-08-15T16:07:27Z", "hours": 7.4953, "text": "Today I focused on the user interface subsystem, specifically initializing components for the HUD and integrating health and experience mechanics. This work is essential to establish a basis for player feedback and interaction, enhancing overall gameplayability."}, {"post_id": 47305, "ts": "2026-08-15T05:26:32Z", "hours": 8.2014, "text": "Today, I focused on the tools subsystem, particularly the tools registry and experience (XP) management systems. This work is crucial for establishing a structured framework for tool interactions and player progression"}, {"post_id": 46467, "ts": "2026-08-13T18:07:41Z", "hours": 7.835, "text": "Today I focused on the inventory and tools subsystems, specifically enhancing item durability management and transfer mechanisms. These additions are critical for ensuring that tool usage and inventory interactions are coherent and efficient."}, {"post_id": 45764, "ts": "2026-08-12T13:49:08Z", "hours": 3.4153, "text": "Today I focused on the inventory subsystem, specifically initializing and structuring the inventory components. This work is critical for ensuring a robust and functional system for managing player items, which is foundational for gameplay mechanics."}, {"post_id": 45616, "ts": "2026-08-12T07:06:28Z", "hours": 5.5572, "text": "Today I focused on the implementation of the fishing subsystem, which is crucial for adding interactive gameplay elements that enhance player engagement. This work lays the foundation for fishing mechanics, including casting, line management, and loot generation."}, {"post_id": 45119, "ts": "2026-08-11T12:21:18Z", "hours": 5.0722, "text": "This morning’s work focused on implementing mechanics related to fishing, an essential feature for gameplay. The changes address various aspects of the fishing system, including mechanics for enchantments and loot generation."}, {"post_id": 44638, "ts": "2026-08-10T15:15:36Z", "hours": 7.275, "text": "Today, I focused on the enchantment subsystem, establishing the foundational architecture for enchantments and their associated mechanics. This work is critical, as enchantments will enhance player interaction and item customization within the game."}, {"post_id": 44121, "ts": "2026-08-09T18:03:06Z", "hours": 5.5161, "text": "Today, I focused on the effects subsystem and the crafting system to enhance gameplay mechanics and item interactions. These improvements are crucial for player feedback and item management in the game."}, {"post_id": 43832, "ts": "2026-08-09T08:15:49Z", "hours": 6.155, "text": "Today, I focused on the crafting subsystem, establishing foundational components essential for managing crafting recipes and related functionalities. This work is crucial for enabling player interactions with crafting mechanics, which are integral to gameplay progression."}, {"post_id": 43212, "ts": "2026-08-08T10:42:59Z", "hours": 12.7892, "text": "Today, I focused on the building subsystem, which is critical for player interaction and environment manipulation. The work primarily involved finalizing and scaffolding various components of the building mechanics, including previews, placement, and rotation."}, {"post_id": 41484, "ts": "2026-08-05T18:37:03Z", "hours": 7.0583, "text": "Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment."}, {"post_id": 40295, "ts": "2026-08-03T18:45:01Z", "hours": 8.5008, "text": "Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment."}, {"post_id": 39476, "ts": "2026-08-02T13:26:12Z", "hours": 16.3919, "text": "Today, I focused on the projectile system within the game engine, specifically working on the memory management and foundational structures for spawning and managing projectiles. This work is crucial for optimizing projectile behavior and ensuring efficient resource allocation during gameplay."}, {"post_id": 38063, "ts": "2026-07-31T08:10:43Z", "hours": 8.2386, "text": "Today, I focused on the navigation subsystem, implementing several foundational components essential for pathfinding and AI navigation within the voxel environment. This work is crucial for enabling agents to navigate through the game world effectively."}, {"post_id": 37248, "ts": "2026-07-29T20:14:29Z", "hours": 5.8831, "text": "Today, I focused on the implementation of the mob subsystem, particularly in setting up the foundational structures and behaviors for various mobile entities within the engine. This work is crucial for establishing NPC interactions and their movement dynamics in the game world."}, {"post_id": 36423, "ts": "2026-07-28T15:19:47Z", "hours": 1.5781, "text": "Today, I focused on enhancing the physics subsystem, specifically the entity physics (ephysics) module. This work is essential to establish a robust framework for collision handling, motion integration, and interactions with the environment. ephysics_sweep: Expanded the logic to improve sweep tests for collision detection, ensuring accurate intersection calculations between moving entities and static geometry.ephysics_step: Initiated the implementation of the stepping function, which manages the simulation time step for physics updates, crucial for maintaining consistent behavior across frame rates.ephysics_spatial: Established a spatial partitioning system to optimize collision queries, using an efficient data structure to reduce the number of checks required during each physics update.ephysics_body_from_entity: Completed the function to create physics bodies from game entities, allowing for dynamic interaction based on entity properties and state.ephysics_query_solid_cell: Implemented a query method to check for solid cells within the voxel grid, facilitating accurate collision responses for entities interacting with the voxel environment.ephysics_pushout: Began development on the pushout mechanism, which resolves collisions by adjusting the position of entities to avoid overlaps with solid objects.ephysics_motion_ballistic: Filled in the calculations for ballistic motion, allowing entities to simulate projectile trajectories accurately under the influence of gravity.ephysics_falldmg: Developed functionality to handle fall damage, tying entity physics state to health mechanics based on vertical distance fallen. The physics subsystem is becoming more cohesive with these additions. The next logical step is to finalize the integration of the impulse and fluid simulation components, enhancing interaction realism further."}, {"post_id": 36375, "ts": "2026-07-28T13:29:59Z", "hours": 5.6275, "text": "This morning, I focused on enhancing the physics subsystem, specifically in the area of impulse and motion mechanics. This work is crucial for achieving realistic interactions and responses to forces within the game environment. ephysics_motion_ballistic: Implemented the initial projectile motion calculations, enabling objects to follow a parabolic trajectory under gravity.ephysics_pushout: Started designing the pushout mechanism to resolve overlaps between colliding objects, which will be essential for player movement and interaction.ephysics_impulse: Created a stub for impulse application, setting up the necessary data structures to handle instantaneous force applications on entities.ephysics_falldmg: Completed the fall damage calculation, accounting for the velocity of the entity at impact, which enhances realism in gameplay.ephysics_current: Filled in the functionality for current effects, allowing entities to be influenced by environmental forces, such as water currents. The current state includes foundational motion and interaction mechanics. The next step will involve expanding on impulse handling to ensure comprehensive force interactions across various physics scenarios."}, {"post_id": 36055, "ts": "2026-07-27T22:00:35Z", "hours": 7.0375, "text": "Today’s work focused on the integration of the entity-component-system (ECS) architecture and the initial implementation of the physics subsystem. This is crucial for establishing a robust framework for game object management and collision detection. ephysics_aabb: Implemented the Axis-Aligned Bounding Box (AABB) structure to support collision checks. This provides an efficient way to handle spatial queries.ephysics_broadphase: Developed the broad phase collision detection system. This module identifies potential collisions using AABBs to minimize computational overhead during the narrow phase checks.ephysics_ccd_resolve: Added continuous collision detection resolution to ensure accurate collision handling for fast-moving entities, preventing tunneling issues.ecs_world: Scaffolding for the ECS world management was set up, allowing for the organization and management of entities and components effectively.ecs_types: Established foundational data structures for components, enhancing type safety and access patterns within the ECS framework.ecs_get: Implemented the ecs_get function to retrieve components associated with entities, facilitating component retrieval in a type-safe manner.ecs_sys_collide: Wrote the initial collision system that integrates with the ECS, processing collision events and leveraging the broad phase detection.ecs_stats: Initiated the ECS stats module, which tracks performance metrics and entity counts, vital for optimizing system performance. The current state of the engine now includes a foundational ECS structure with a basic physics engine integrated. The next step involves refining the collision resolution mechanism and expanding the entity management features."}, {"post_id": 35390, "ts": "2026-07-26T19:15:43Z", "hours": 6.2511, "text": "Today, I focused on the development of the Entity-Component-System (ECS) architecture, specifically initializing spatial queries and establishing foundational components for entity management. This work is critical for optimizing game object interactions and enabling efficient systems for rendering and gameplay logic. ecs_spatial: Initiated the module to manage spatial queries for entities, allowing for efficient retrieval of entities based on their spatial positions. This is essential for implementing features like frustum culling and collision detection.ecs_query: Added the initial structure for querying entities based on components. Stubbing out this system lays the groundwork for flexible querying mechanisms essential for game logic processing.ecs_relations: Started the implementation of relational data structures to handle parent-child relationships between entities, which will facilitate a hierarchy for transformations and event propagation.ecs_blob_init: Completed the initialization sequence for ECS blobs, which encapsulate component data for entities, improving memory layout and access patterns while ensuring efficient entity creation and destruction.ecs_prefab: Introduced the prefab system for defining reusable entity templates. This system will streamline the instantiation of common game objects and reduce redundancy in entity creation.ecs_group_refresh: Enhanced the group management system to refresh entity groups based on component changes, optimizing the update cycle for systems relying on dynamic entity states.ecs_events: Implemented an event system to handle notifications between entities and systems, allowing for decoupled interactions and improved modularity.combat_resist, combat_rng, combat_knockback, and combat_log: Started implementing core combat mechanics, including resistance calculations and random number generation for combat outcomes, along with stubbing out logging for combat events. The ECS framework is now more robust, and the next step will be to integrate these components into a cohesive system, ensuring that queries and events operate seamlessly across the game engine."}, {"post_id": 35134, "ts": "2026-07-26T11:39:12Z", "hours": 1.6492, "text": "This morning, I focused on the combat subsystem, implementing new mechanics that enhance player interactions and feedback during combat. These changes are pivotal for establishing a robust gameplay foundation. combat_resist: Implemented a resistance mechanic that determines damage mitigation based on player attributes, allowing for more nuanced combat outcomes.combat_rng: Added a random number generator for damage calculations, introducing variability in combat results to enhance unpredictability and player engagement.combat_knockback: Developed a knockback effect that alters player position upon receiving damage, improving the physicality of combat interactions.combat_log_death_message: Implemented logging functionality to display a message when a player character dies, providing clear feedback for the player on their status.stub out combat_log: Created a basic structure for the combat log system, laying the groundwork for future enhancements in tracking combat events and player actions. Current progress has established essential combat mechanics. The next step will involve integrating these systems into the overall game loop for testing and refinement."}, {"post_id": 34884, "ts": "2026-07-25T23:24:12Z", "hours": 7.8778, "text": "Today, I focused on the combat subsystem, specifically implementing various components necessary for managing health, damage, and character behaviors during combat scenarios. This work is critical for establishing a solid foundation for player interactions and enemy behaviors. Combat System: Implemented combat_health, which tracks and manages health points for entities, including health reduction mechanics and thresholds for death events.Combat System: Added combat_invuln, providing temporary invulnerability states for characters, which allows for the management of damage immunity during specific animations or effects.Combat System: Developed combat_knockback, a mechanic that applies force to characters upon receiving damage, enhancing the feedback of combat interactions.Behavior Tree: Stubbed out the combat_combo, which will facilitate chaining of attacks for characters, setting up a framework for more advanced combat mechanics.Behavior Management: Completed behavior_tree_free to ensure proper memory management of behavior trees, preventing memory leaks during runtime.Behavior Management: Initiated behavior_runner_init, which sets up the initial state for behavior execution, crucial for managing different character actions effectively.Combat System: Implemented combat_dmg_info_get, which retrieves damage information relevant for interaction logic, aiding in the clarity of combat events.Cleanup: Conducted code tidying and minor fixes across the combat module to enhance readability and maintainability. The combat subsystem now has a more cohesive structure with the groundwork laid for complex interactions. The next step will involve fleshing out the behavior tree logic to integrate advanced AI behaviors and attack combos."}, {"post_id": 34137, "ts": "2026-07-24T17:15:39Z", "hours": 8.2794, "text": "Today, I focused on the animation subsystem of the voxl engine, specifically enhancing the animation systems to support skeletal animation and procedural walking behaviors. This work is crucial for implementing character animations that are both dynamic and responsive to gameplay inputs. behavior_leaf: Implemented the behavior_leaf module, establishing a base for behavior trees that allows for more complex AI decision-making processes.behavior_builder: Developed the behavior_builder to construct behavior trees programmatically, centralizing the creation and management of AI behaviors.behavior_act_target_in_reach: Completed the implementation of the behavior_act_target_in_reach, which checks proximity to targets for AI actions, enhancing interaction capabilities.anim_skeleton: Began scaffolding the anim_skeleton module, which will define the structure and hierarchy of skeletal animations, essential for character rigging.anim_rig: Set up the anim_rig, providing the framework for binding animations to skeletal structures, facilitating smooth character movement.animation_procedural_walk: Expanded the animation_procedural_walk to allow for dynamic adjustments based on character speed and terrain, improving realism in character locomotion.anim_controller: Introduced the anim_controller to manage the state and transitions of animations, allowing for layered animation blending and more responsive character behaviors.entity_render: Implemented entity_render functionality, which integrates the rendering of animated entities into the broader scene graph, ensuring visual coherence. The current state of the animation system is foundational but progressing well, with core modules in place for skeletal animation. The next steps will involve refining the blending of animations and integrating more complex animation states."}, {"post_id": 33722, "ts": "2026-07-23T21:05:30Z", "hours": 7.5361, "text": "Today, I focused on implementing the initial stages of the animation and AI subsystems, as well as enhancements to the water rendering pipeline. These components are critical for enhancing the game’s dynamic interactions and visual fidelity. Animation System: Implemented foundational structures for anim_blend. This allows for smooth transitions between different animations, improving character movement fluidity.Entity System: Completed the entity module, enabling proper management of game objects, including their lifecycle and state management, which is essential for gameplay.AI Module: Introduced the pathfind function, allowing entities to navigate the game world effectively. This is a crucial step towards integrating more complex AI behaviors.Water Rendering: Established the water_pass, implementing the water rendering pipeline. This includes setting up reflection and refraction capabilities using a dedicated reflection camera (water_reflcam), enhancing visual realism.Water Effects: Started work on water_wave and water_foam, which will simulate surface interactions and enhance the dynamic appearance of water bodies.AI Updates: Added ai_tick, which will manage updates to AI behaviors each frame, ensuring responsive and engaging NPC interactions. Current progress includes foundational setups for both animation and AI systems, alongside initial water rendering capabilities. The next logical step involves refining the AI behaviors and continuing the development of the water effects to enhance environmental interactions."}, {"post_id": 33113, "ts": "2026-07-22T18:48:49Z", "hours": 7.3406, "text": "Today, I focused on implementing various aspects of the volumetric rendering subsystem. This work is critical for enhancing the visual fidelity of the water rendering and introducing new volumetric effects, which are essential for achieving realistic environmental interactions in the engine. water_reflect: Implemented reflective properties for water surfaces, enhancing the realism of water rendering by calculating reflection vectors based on the viewer’s position and the surface normals.volumetric_programs_use_march: Wired up the volumetric rendering programs to utilize a raymarching approach for rendering volumetric effects, allowing for more complex light interactions within volumes.vol_raymarch: Began development of the raymarching algorithm for volumetric rendering, laying the groundwork for subsequent implementations of effects such as fog and smoke.volumetric_pass_run: Implemented the core function to execute volumetric passes, establishing a pipeline for rendering volumetric effects sequentially within the main render loop.vol_caustics: Initiated the caustics rendering system, which will simulate light patterns created by surface reflections on the volumetric medium, enhancing the visual complexity of water interactions.vol_pass: Scaffolded the volumetric pass structure, defining how different volumetric effects will be processed in the render pipeline.vol_medium: Created an initial implementation of volumetric mediums, allowing the engine to define properties such as density and scattering for various materials. The volumetric rendering subsystem is now more robust and modular, with foundational components in place. The next step is to continue refining the raymarching implementation and integrate the caustics calculations within the rendering pipeline."}, {"post_id": 32804, "ts": "2026-07-22T05:56:26Z", "hours": 3.2358, "text": "Today, I focused on the development of the tonemapping subsystem, which is essential for controlling the luminance and color mapping of rendered scenes to enhance visual fidelity. This work is crucial as it directly affects the output quality of rendered images. volumetric_blur: Scaffolded the vol_blur module to introduce volumetric blur processing. This lays the groundwork for further development of blur algorithms.tonemap: Established the initial framework for tonemapping, including scaffolded modules for tonemap_params, tonemap_grade, and tonemap_curve. This modular approach allows for easy future enhancements and testing.tonemap_selftest: Wired up self-testing capabilities for tonemapping to ensure that changes can be effectively validated. This includes fleshing out the self-test to cover edge cases and expected behavior.tonemap_lut: Implemented a lookup table (LUT) for tonemapping, which will optimize color grading processes. Set up associated functions to support LUT creation and application.tonemap_exposure: Started the implementation of exposure management in tonemapping, including functions to retrieve and adjust exposure levels dynamically.text_layout: Completed the implementation of the text layout system, which will be utilized for rendering debug information and UI elements related to tonemapping.cleanup: Conducted code cleanup across several modules, focusing on reducing technical debt and improving readability. The current state of the tonemapping subsystem is foundational, with several key components scaffolded and initial implementations underway. The next logical step involves further developing the tonemapping algorithms and integrating them into the rendering pipeline to evaluate their impact on scene output."}, {"post_id": 32348, "ts": "2026-07-21T13:39:12Z", "hours": 5.2303, "text": "This morning’s work focused on the tonemapping subsystem, particularly enhancing exposure control and initializing the necessary data structures. These changes are critical for achieving realistic rendering through proper dynamic range management. Tonemap Exposure: Implemented tonemap_exposure to calculate exposure values based on scene luminance, improving how bright areas are rendered.Tonemap Configuration: Added tonemap_config, defining parameters for exposure and curve settings, facilitating easy adjustments and future expansion.Tonemap Curve: Began the implementation of tonemap_curve, establishing a basis for non-linear mapping of color values to enhance dynamic range perception.Text Layout: Completed the text_layout function, which manages text rendering for UI elements, ensuring proper alignment and spacing.Tonemap Debugging: Implemented tonemap_debug_run_split to allow testing of various tonemapping scenarios, aiding in fine-tuning the visual output. Current progress sets a solid foundation for further work on the tonemapping pipeline, with the next steps aimed at refining the tonemap grading process and integrating it into the rendering loop."}, {"post_id": 31649, "ts": "2026-07-20T07:02:35Z", "hours": 8.5392, "text": "Today, I focused on the text rendering subsystem, specifically the development of the text context and text batch systems. This work is foundational for rendering 2D text efficiently, which is crucial for UI elements and in-game text displays. text_ctx: Implemented the initial structure for the text context, which manages the state related to text rendering. This includes setting up memory allocations for text data and glyph information.text_batch: Created a scaffold for the text batch system to handle multiple text draw calls efficiently. This will allow for batching of text rendering operations to minimize state changes.text_atlas: Developed the initial setup for the text atlas, which will store glyph images for rapid access during rendering. This will improve performance by reducing texture binding overhead.text_font: Initialized the text font subsystem to load and manage font data. This includes parsing font files and generating the necessary glyph data.text_glyphdata: Started the implementation of glyph data handling, allowing for precise control over individual characters and their metrics.ssr_settings and ssr_pass: Set up the screen space reflections (SSR) settings and pass, which will enhance the visual fidelity of reflective surfaces in the engine.ssrx_material_unpack: Completed the unpacking of material data for SSR, ensuring that material properties are correctly interpreted during rendering. The text rendering subsystem is now well-structured, and the next step will involve integrating the text rendering into the main rendering pipeline to ensure text is displayed correctly in the game environment."}, {"post_id": 30541, "ts": "2026-07-18T06:21:48Z", "hours": 6.8261, "text": "Today I worked on the implementation of screen space reflections (SSR) and screen space ambient occlusion (SSAO) within the rendering subsystem. These features are vital for enhancing visual fidelity and realism in lighting interactions within the voxel environment. SSR Module: Introduced the ssr_fsquad, which sets up a full-screen quad for executing the SSR shader pass. This establishes a foundation for reflection calculations.SSR Configuration: Created ssr_config scaffolding to manage SSR parameters, allowing for adjustable settings such as reflection intensity and roughness.SSR Depth Setup: Implemented the ssr_depth, which captures depth information necessary for accurate reflection rendering. This enables proper occlusion of reflections based on scene depth.SSR Debugging: Set up ssr_debug to visualize reflection calculations during development, aiding in the identification of rendering artifacts or inaccuracies.SSAO Configuration: Initialized ssao_settings to provide user-adjustable controls over ambient occlusion effects, including radius and intensity.SSAO Pass Setup: Established the ssao_pass, which integrates the SSAO calculations into the render pipeline, ensuring it runs alongside other post-processing effects.SSAO Sampling: Started working on ssao_sample, which defines the sampling strategy for ambient occlusion, leveraging a kernel to calculate occlusion values based on neighboring pixels.Kernel Statistics: Set up ssao_kernel_stats to track and debug the parameters of the SSAO kernel, which will assist in optimizing performance and quality. The rendering subsystem now has a foundational implementation for both SSR and SSAO, with key components in place. The next steps will involve refining the sampling methods for SSAO and integrating the blurring effect for the final output to enhance visual quality."}, {"post_id": 29650, "ts": "2026-07-16T18:32:56Z", "hours": 6.8736, "text": "Today, I focused on enhancing the rendering subsystem with the implementation of Screen Space Ambient Occlusion (SSAO). This feature is critical for improving scene depth and realism by simulating how light interacts with surfaces. SSAO Module: Implemented the foundational SSAO computation logic in ssao_compute, which calculates ambient occlusion based on depth and normal maps to enhance shading realism.SSAO Debugging: Developed ssao_debug to visualize SSAO outputs, allowing for quick verification of occlusion values and aiding in fine-tuning the algorithm.SSAO Blur: Completed the SSAO blur process in ssao_blur, which smooths the occlusion map to reduce artifacts and achieve a more visually appealing result. The blur uses a separable Gaussian filter for performance efficiency.Skybox Renderer: Progressed on the skybox rendering system by fleshing out skyb_renderer_upload_dome and skyb_dome_vertex, which define the dome geometry and texture uploads for the skybox, ensuring proper visual integration with the ambient occlusion effects.Skybox Palette and Gradient: Initiated the scaffolding for skyb_palette and set up skyb_gradient, enabling gradient-based skybox coloring to enhance atmospheric effects in conjunction with SSAO. The SSAO implementation is now functional, with debug features in place to assess its performance and visual fidelity. The next step will involve further optimizing the SSAO calculations and integrating them seamlessly into the main rendering pipeline."}, {"post_id": 29009, "ts": "2026-07-15T17:30:42Z", "hours": 7.0656, "text": "Today I focused on the lighting subsystem, specifically implementing shadow mapping techniques and enhancing the atmospheric rendering system. These improvements are crucial for achieving realistic lighting and depth effects in the voxel environment. shadow_map: Implemented the shadow mapping algorithm, which includes creating a depth texture to store the distance from the light source to the nearest surface, enabling more realistic shadows.shadow_pcf: Developed percentage-closer filtering (PCF) for shadows to soften the edges of the shadow map, increasing visual fidelity. This involved setting up the filtering process within the shader pipeline.shadow_split: Introduced the shadow split technique to improve shadow rendering across varying depths. This includes calculating split distances based on the camera’s frustum to reduce artifacts.shadow_matrix: Added a shadow matrix computation to transform world coordinates into shadow map space, ensuring correct shadow projection during rendering.skyb: Began implementing the skybox atmospheric effects, specifically the skyb_atmosphere_clear_color and skyb_billboard. This includes color adjustments for clearer skies and setting up billboards for celestial bodies.shadow_stabilize: Stubbed out a shadow stabilization technique to reduce flickering and aliasing in shadow rendering, which will be fleshed out in future commits.code maintenance: Conducted minor cleanups and cosmetic tweaks across multiple files for better readability and organization, including renaming functions for clarity. The current state of the shadow rendering system is functional with basic shadow mapping and initial atmospheric effects implemented. The next step will be to refine the shadow stabilization method and continue developing the full atmospheric rendering features."}, {"post_id": 28394, "ts": "2026-07-14T17:00:18Z", "hours": 6.8947, "text": "Today, I focused on the graphics subsystem, specifically enhancing the shader management and shadow rendering capabilities. This work is essential for achieving more sophisticated visual effects and better performance in the rendering pipeline. Shader Management Module: Implemented shaderman_set_hot_reload, enabling dynamic shader reloading during runtime to facilitate rapid iteration without restarting the engine.Shader Compilation: Completed the shader_compile function, which compiles shader code into GPU executable format, improving the setup time for rendering.Shader Initialization: Added shadow_init, which initializes parameters related to shadow rendering, ensuring proper setup before rendering occurs.Shader Stage Handling: Filled in the shader_stage structure to manage different stages of shader processing, which allows for cleaner organization of shader tasks.Active Uniforms Retrieval: Finalized shaderman_gl_active_uniforms, which retrieves and stores active uniform variables from shaders, enhancing the shader’s interaction with the rendering system.Debugging Support: Set up shader_debug, providing hooks for debugging shader issues during development, which improves the ease of identifying and resolving shader-related problems.Bloom Effect: Added a basic implementation of bloom rendering through bloom_resize and the bloom module, initiating post-processing effects to enhance scene brightness. The shader management system is now more robust, allowing for dynamic updates and improved shader handling. The next step will involve integrating the shadow rendering into the main rendering loop to evaluate performance and visual fidelity."}, {"post_id": 27739, "ts": "2026-07-13T15:47:05Z", "hours": 2.3244, "text": "Today I focused on the particle system and initial components for voxel chunk mesh building, which are critical for enhancing visual effects and optimizing rendering performance in the engine. Particle System: Implemented particle_rng, which initializes a random number generator for particle behavior, crucial for generating varied particle effects.Particle Emission: Completed the particles_rng_in_cone function, allowing for particles to be emitted in a cone-shaped area, enhancing the realism of effects like explosions or smoke.Particle Pool Management: Developed particles_pool_clear, which efficiently resets the particle pool between frames, minimizing memory usage and helping maintain performance during high-load scenarios.Vertex Packing: Set up vertex_pack, which organizes vertex data into a compact format suitable for GPU processing, improving data transfer efficiency and reducing memory bandwidth usage.Chunk Mesh Building: Started the meshbuild_chunk implementation to facilitate efficient chunk rendering, laying the groundwork for further optimizations like greedy meshing.Emitter System: Added a basic emitter class to manage particle emission attributes, enabling future extensibility for different particle effects and behaviors.Cleanup and Organization: Conducted minor cleanups and formatting across various files, ensuring code maintainability and consistency. The particle system is now more robust, and the chunk building process has a foundational structure in place. The next step involves completing the mesh building logic and integrating more complex particle behaviors using the emitter system."}, {"post_id": 27651, "ts": "2026-07-13T12:42:19Z", "hours": 4.5136, "text": "This morning’s work focused on enhancing the rendering pipeline and starting the implementation of the particle emitter system. These improvements are crucial for visual fidelity and performance in voxel rendering. clamp01: Implemented a function to constrain values between 0 and 1, ensuring proper normalization for graphical calculations.curves: Began the implementation of curve interpolation methods for smoother transitions in animations and particle emissions.gpu_buffer: Added a structured buffer for GPU memory allocation, enhancing the efficiency of data transfer between CPU and GPU for rendering tasks.emitter: Developed the foundational structure for the particle emitter, which will support dynamic visual effects in the game environment.meshbuild_chunk: Completed the initial version of the chunk mesh building algorithm, optimizing how voxel data is converted into renderable geometry. Current progress sets the stage for integrating the particle system fully and refining the mesh building process. The next logical step will be to finalize the emitter’s functionality and connect it to the rendering pipeline."}, {"post_id": 27194, "ts": "2026-07-12T15:15:38Z", "hours": 0.7075, "text": "Today I focused on the mesh building subsystem, which is critical for generating and managing the geometry of voxel chunks in real-time. This work is foundational for optimizing rendering and ensuring efficient memory usage. MeshBuild Module: Started the implementation of the meshbuild system, establishing the groundwork for efficient chunk geometry generation. This includes setting up the initial data structures for mesh management.Snapshot System: Implemented the mb_snapshot functionality, which allows for capturing the state of the mesh at a given time. This is crucial for optimizing updates and rendering by reducing unnecessary computations.Statistics Tracking: Scaffolding for mb_stats was added to track performance metrics related to mesh generation, providing insights into the efficiency of the rendering pipeline.Block Properties: Introduced initial definitions for block_shape and face_dir, setting up the essential parameters required for defining voxel geometry.Terrain Type Management: Added the lt_terrain module to manage different terrain types within the game, enabling diverse environments and interaction mechanics.Bounds Checking: Fixed a bounds check issue during initialization, ensuring that the allocation of voxel data structures remains within valid memory limits, thus preventing potential crashes or corruption. Current state reflects a significant advancement in the mesh building architecture, with basic functionality established. The next steps will involve fleshing out the mesh generation algorithms and integrating them with the rendering pipeline for further testing."}, {"post_id": 27141, "ts": "2026-07-12T12:58:04Z", "hours": 6.1558, "text": "This morning, I focused on establishing the foundational components for the voxel engine’s module system, which is crucial for modularizing functionality and enhancing maintainability. I initiated the groundwork for both configuration and debugging systems. mb_config: Started the configuration module to manage engine settings, establishing a basic structure for loading and saving configurations.mb_debug: Added the debugging module, scaffolding the structure to allow for runtime diagnostics and performance monitoring.lt_stats_format: Implemented a format for terrain statistics, ensuring that performance metrics can be effectively logged and analyzed.block_shape: Began work on the block shape definitions, laying the groundwork for specifying voxel dimensions and orientations.cross_mesh: Stubbed out the cross-mesh functionality, preparing for future implementation of cross-sectional rendering techniques. The foundational modules are now in place, and the next step will involve fleshing out the configuration and debugging features to support real-time adjustments and diagnostics."}, {"post_id": 26593, "ts": "2026-07-11T14:45:10Z", "hours": 8.4497, "text": "Today, I focused on the implementation of the instancing subsystem within the rendering pipeline. This work is critical for optimizing draw calls and managing multiple instances of meshes efficiently, which will enhance rendering performance in voxel environments. lt_mesh: Implemented the initial mesh structure to accommodate instance data. This includes setting up vertex attributes for instance transformations.lt_grid: Created an initial grid structure to manage spatial organization of instances, allowing for efficient frustum culling.lt_gpu: Stubbed out the GPU interface to handle instanced rendering commands, establishing a foundation for future integration.lt_cache_init: Implemented the cache initialization routine for storing instance data, which reduces overhead during rendering.instancing_stats: Completed the stats tracking for instanced objects, capturing performance metrics that can be analyzed for optimization.instancing_transform_bounds: Finished the bounding volume calculations for instances, crucial for frustum culling to avoid unnecessary rendering.frustum_batch: Scaffolded the frustum batching system to group instances based on visibility, optimizing the rendering process and minimizing state changes.Cleanup: Executed minor cleanups across multiple modules to enhance code readability and maintainability. The instancing subsystem is now in a functional state, with core structures established and initial implementations completed. The next step will involve refining the GPU integration for instanced rendering and testing performance metrics in various scenarios."}, {"post_id": 25478, "ts": "2026-07-09T19:31:03Z", "hours": 7.7797, "text": "Today, I focused on enhancing the rendering pipeline, specifically the implementation of the g-buffer and draw call management. This work is critical for achieving efficient deferred rendering, which is essential for handling complex lighting scenarios in the engine. Rendering System: Implemented draw_indirect, allowing for batch processing of draw commands without CPU intervention, which reduces overhead and improves performance during frame rendering.Batch Management: Stubbed out batch functionality to prepare for more efficient draw call aggregation, laying the groundwork for optimizing the number of draw calls issued per frame.G-buffer Implementation: Completed the gbuffer_shade, gbuffer_normal, and gbuffer_material modules, each responsible for storing necessary per-pixel data for deferred shading, enhancing the ability to handle multiple light sources effectively.G-buffer Lighting: Initiated the gbuffer_light and gbuffer_brdf_eval_light components, which are responsible for evaluating lighting based on stored g-buffer data and enabling realistic material responses to light.Edge Case Handling: Fixed an edge case in gbuffer_emit_from_chunk, ensuring correct handling when emitting light from chunk edges, which aids in visual consistency across chunk borders.Utility Functions: Implemented clampf for clamping float values, which will be used in various calculations across the rendering pipeline to maintain valid ranges for rendering parameters.Texture Management: Added make_tex to streamline texture creation, facilitating easier integration of textures into the rendering pipeline. The rendering pipeline has significantly improved with these updates, and the next step will be to integrate the batching process fully and assess the overall performance impact in various rendering scenarios."}, {"post_id": 24172, "ts": "2026-07-07T15:58:24Z", "hours": 7.6097, "text": "Today, I focused on the integration and initial implementation of the G-buffer system and Fast Approximate Anti-Aliasing (FXAA) in the rendering pipeline. This work is crucial for improving the visual fidelity and performance of the rendering process. G-buffer Module: Implemented the initial G-buffer structure, facilitating the storage of geometry attributes for deferred rendering. This involves creating texture storage for position, normal, and albedo data.G-buffer Initialization: Developed the gbuffer_init function to allocate and configure the G-buffer textures, ensuring proper setup for rendering operations.FXAA Implementation: Added the core FXAA functionality, including fxaa_main and fxaa_settings_apply, allowing for real-time anti-aliasing effects to smooth out jagged edges in rendered frames.Self-Test for FXAA: Completed the fxaa_selftest implementation to validate the correctness of the FXAA algorithm, ensuring that edge cases are handled and results are consistent across different scenarios.Sampling and Quality: Finished the grid_sample function to enhance texture sampling for FXAA and initiated fxaa_quality, laying the groundwork for different quality settings in the anti-aliasing process.Historical Data Management: Implemented fxaa_history to maintain previous frame data necessary for temporal smoothing in the FXAA algorithm.Stubs for Future Work: Created stubs for fxaa_blit and fxaa_debug, preparing the framework for future enhancements and debugging capabilities. The rendering engine now has foundational G-buffer and FXAA support, significantly advancing the visual quality of the output. The next steps will involve refining the FXAA implementation and integrating the remaining stub functions to complete the"}, {"post_id": 23624, "ts": "2026-07-06T18:05:07Z", "hours": 7.5222, "text": "Today, I focused on implementing the depth of field (DoF) post-processing effect within the rendering pipeline. This is a critical enhancement for visual fidelity, as it allows for more realistic focus transitions in the scene. Depth of Field (dof_programs): Implemented dof_programs_unload, which properly releases shaders and associated resources when no longer needed, optimizing memory usage.Depth of Field (dof_pass): Began the development of the dof_pass, which will serve as the new rendering stage to handle depth of field computations, ensuring it integrates smoothly with the existing render pipeline.Depth of Field (dof_gather): Completed the dof_gather function, which samples the scene to collect color and depth information needed for the DoF effect, with attention to efficient texture access patterns.Depth of Field (dof_quad): Started implementing the dof_quad, which will represent the screen-space quad used for applying the DoF effect in a fragment shader.Depth of Field (dof_focus): Added functionality for dof_focus, allowing users to set the focal distance dynamically, enhancing control over the DoF effect.Depth of Field (dof_coc): Initiated the dof_coc (circle of confusion) calculations, which are essential for determining which parts of the scene should appear in focus versus out of focus based on their distance from the camera.Code Cleanup: Performed various minor cleanups and formatting changes throughout the modules to improve code readability and maintainability. The depth of field implementation is progressing well, with foundational components in place. The next step will involve integrating the dof_coc calculations into the rendering pipeline and refining the dof_pass to ensure correct visual output."}, {"post_id": 22929, "ts": "2026-07-05T15:56:09Z", "hours": 8.4486, "text": "Today, I focused on implementing the decals subsystem, which is critical for enhancing visual fidelity by allowing textured decals to be rendered on surfaces in the voxel environment. This will significantly improve the realism of interactions and environmental details. Decals Types: Established the decals_types module to define various decal types and their properties, facilitating extensibility for future decal features.Decals Pass: Implemented the decals_pass, which organizes the rendering of decals in the pipeline. This pass is integrated into the main render loop to ensure decals are drawn after opaque geometry.GLSL Shader Setup: Began the decals_glsl to handle decal shaders, ensuring that the shaders can accommodate blending and fading effects, which are crucial for realistic rendering.Decal Atlas: Developed the decals_atlas, allowing for efficient texture sampling by consolidating multiple decal textures into a single texture atlas, reducing state changes during rendering.Decals Fade and Blend: Added functionality for decals_fade and decals_blend, implementing visual effects that allow decals to gradually appear or disappear and blend with underlying textures, enhancing realism.Debug Drawing: Finished the debugdraw_timed and fleshed out debugdraw_flush_labels, providing tools for visual debugging of decals, which will assist in ensuring correct placements and transitions. The decals subsystem is now partially operational, with foundational components in place for rendering. The next step will involve completing the decals_config and integrating it fully into the scene management system."}, {"post_id": 22346, "ts": "2026-07-04T19:31:24Z", "hours": 7.6814, "text": "Today, I focused on the debug rendering subsystem, which is crucial for visualizing various components of the engine during development. This work will facilitate easier debugging of spatial relationships, frustum culling, and occlusion handling. debugdraw: Established the foundational structure for the debug drawing system, enabling visualization of shapes and paths in the rendering pipeline.debugdraw_helpers: Completed the implementation of helper functions to streamline the rendering of basic shapes (lines, spheres, etc.), improving the clarity of debug visuals.debugdraw_path: Added functionality to visualize paths, which aids in debugging movement and AI-related features.debugdraw_frustum: Implemented frustum visualization, allowing for the assessment of what is currently visible in the scene, thereby enhancing frustum culling debugging.frustum_cull: Integrated frustum culling logic to improve performance by eliminating objects outside the view, with bounds checks refined for edge cases.sphere_cull: Developed a sphere-based culling mechanism to efficiently determine visibility of spherical objects, optimizing rendering performance.cull_occlusion_run: Fixed a bounds check issue within the occlusion culling routine, ensuring accurate visibility determinations.chunk_dist_sq: Implemented a distance-squared function for chunks, which will be useful in sorting and rendering optimization. The debug rendering system is now significantly more functional, laying the groundwork for more complex visualizations. The next step will involve integrating these debug features with the main rendering loop to ensure they can be toggled during runtime for effective debugging."}, {"post_id": 21610, "ts": "2026-07-03T17:28:02Z", "hours": 8.0522, "text": "Today’s work focused primarily on the implementation of the bloom post-processing system, specifically the initial setup and functionality of the bloom2 module. This subsystem is essential for enhancing the visual quality of the rendered scene by simulating the effect of light bleeding and softening bright areas. bloom2_pass: Implemented the initial pass for the bloom effect, which includes setting up the framebuffer and rendering targets to capture bright sections of the scene.bloom2_target_bind: Defined the binding process for the bloom render target, ensuring that the correct framebuffers are activated during the bloom rendering sequence.bloom2_blur_v: Stubbed out the vertical blur function, which will be responsible for processing the intermediate bloom render results, preparing for the subsequent blur pass.bloom2_gauss_eval: Added an evaluation function for Gaussian weights, which will be used in the blur calculations to create a smooth transition effect.bloom2_quad: Set up a quad for rendering the bloom effect onto the screen, which serves as the final output display of the bloom post-processing.bloom2_params: Began the definition of parameters for the bloom effect, including thresholds for bright areas and intensity settings, allowing for future adjustments.upload_taps: Implemented the upload process for the sampling taps used in the Gaussian blur, ensuring efficient access to texture samples during rendering. The bloom post-processing pipeline is now in its early stages, with the foundational components established. The next step will be to flesh out the blur functionality and integrate it with the bloom pass for a complete visual effect."}, {"post_id": 20950, "ts": "2026-07-02T18:01:03Z", "hours": 1.6128, "text": "Today, I focused on the initialization and setup of various subsystems related to rendering and environmental simulation within the voxl engine. This work is foundational, as it establishes the groundwork for rendering techniques and weather simulation mechanics. OpenGL Module: Implemented initial OpenGL context creation to prepare for rendering. This included setting up basic state configurations for future draw calls.Camera System: Added a camera system to manage view transformations. The camera setup allows for dynamic movement and orientation adjustments, facilitating a clean separation of view logic from game entities.Chunk Queue: Began the implementation of a chunk queue to handle asynchronous chunk loading. This structure will optimize memory usage and improve performance by deferring loading operations until necessary.Ambient Occlusion: Scaffolded the ambient occlusion module, allowing for more realistic lighting interactions. Initial ambient occlusion calculations were introduced, which will be refined in subsequent iterations.Weather Simulation: Implemented core components of the weather simulation system, including the weathersim_front and weathersim_front_pool_init functions. This lays the foundation for managing weather states and transitions effectively. The current state of the engine includes basic rendering capabilities and preliminary environmental simulations. The next step involves refining the ambient occlusion calculations and expanding the weather simulation features to include precipitation dynamics."}, {"post_id": 20714, "ts": "2026-07-02T11:45:25Z", "hours": 4.8128, "text": "Today’s work focused primarily on foundational systems related to environmental effects and rendering, specifically fog, camera setup, and ambient occlusion. These components are crucial for enhancing the visual quality and atmospheric realism of the engine. Camera Module: Implemented a basic camera system that supports perspective projection, allowing for a flexible viewpoint in the 3D environment.Fog Implementation: Began initial work on fog rendering, laying out a basic framework to integrate atmospheric effects into the scene, improving depth perception.Chunk Queue System: Established a chunk_queue to manage chunk updates and rendering efficiently, which is vital for optimizing visibility and performance.Ambient Occlusion: Started scaffolding the ambient occlusion module to simulate soft shadows and improve lighting realism, enhancing the overall visual fidelity.Weather Simulation: Developed foundational components for weather simulation, including the weathersim_report and weathersim_front, which will facilitate dynamic environmental changes. Current progress sets a strong base for further development of visual effects. The next steps will involve completing the ambient occlusion implementation and integrating fog into the rendering pipeline."}, {"post_id": 19452, "ts": "2026-06-30T19:35:54Z", "hours": 10.0364, "text": "Weather’s looking a lot more interesting in voxly! Today, I kicked off the weather simulation with some solid progress on precipitation and the foundations for advecting particles through the environment. The rain isn’t just for show, it’s got a role to play now. Also worked out the tree generation system, which means they will have more than just empty ground to stand on."}, {"post_id": 18583, "ts": "2026-06-29T19:32:20Z", "hours": 5.2333, "text": "Just when I thought I was digging in the trenches, the trees started working! Finally got the tree generation demo up and running, which has been a bit of a puzzle piece I’ve been working on for a while. Cleared out a bunch of clutter in the codebase too. It feels good to put some roots down in this project, literally and figuratively."}, {"post_id": 17520, "ts": "2026-06-28T10:25:48Z", "hours": 3.1486, "text": "The puzzle pieces are finally coming together with the struct generators. I wrestled with structgen_buffer_init today. Thats such a simple name for a surprisingly deep rabbit hole, but getting it wired up felt like unlocking a secret door. A few cosmetic tweaks and renamings later and im already done. Onward to strongholds!"}, {"post_id": 17420, "ts": "2026-06-28T05:55:16Z", "hours": 6.5364, "text": "Just wrapped up the stronghold_rng_next implementation, and let me tell you, it feels good to finally have that randomness flowing where it needs to! The stronghold features are coming together with stronghold_query also in the mix. Sure, there were some cosmetic tweaks and minor cleanups along the way, but every small piece is building towards that epic world."}, {"post_id": 15849, "ts": "2026-06-25T19:27:56Z", "hours": 10.1414, "text": "Building a stronghold feels a bit like crafting a slice of medieval magic. Today, I wrangled a bunch of components into our stronghold system with corridors, boxes, and initial buffers. Not to mention, I tamed the chaotic skies with some weather initialization."}, {"post_id": 15260, "ts": "2026-06-24T19:35:56Z", "hours": 9.715, "text": "Finally got the rivers flowing with some real depth implemented everything from types to flow mechanics. It’s like watching the world come alive; every little tweak adds to that immersion. And yes, the moon now has phases that actually reflect in the sky."}, {"post_id": 14620, "ts": "2026-06-23T20:02:56Z", "hours": 10.0336, "text": "Cracked open the vault of regions today, and finally wrangled the region_codec into shape! It feels good to see that component take form after a few iterations. Took the time to clean up and scaffold the cache while getting those chunks to read smoothly. A few cosmetic tweaks here and there, but hey, every small fix adds to the whole."}, {"post_id": 13891, "ts": "2026-06-22T19:31:53Z", "hours": 9.9464, "text": "Diving into the wild world of noise generation today, specifically ravines. After a good chunk of head-scratching, I’ve got the initial ravine noise and debug systems wired up, laying the groundwork for some seriously dramatic landscapes."}, {"post_id": 13287, "ts": "2026-06-21T19:11:03Z", "hours": 9.8797, "text": "Nothing quite like the rush of finally tackling those mineshaft features. After all the planning, I can now see the maze taking shape and the ore types just begging to be mined. I spent a good chunk of time cleaning up leaks and renaming stuff for clarity. The mineshaft feels alive and thats really cool and important"}, {"post_id": 12820, "ts": "2026-06-21T00:02:53Z", "hours": 10.0989, "text": "After a marathon of coding, I finally got the loader queue working. It’s a joy to see all those little pieces, like logic grids and queues, slot together. There’s something satisfying about renaming for clarity. Its kinda like cleaning up a messy drawer and finding all the tools you forgot you had. Now, on to scaffolding the loader worker."}, {"post_id": 12227, "ts": "2026-06-19T23:05:16Z", "hours": 9.6194, "text": ". After wrangling with a mountain of renames and tidying up the loader, I finally got the light properties implemented and running through the pipeline. The loader’s debug functions are on the horizon too, which means I’ll be able to dive deep into those shadows and highlights soon."}, {"post_id": 11490, "ts": "2026-06-18T19:31:07Z", "hours": 10.0503, "text": "Finally cracked the heightmap samples, they’re now alive with weirdness! It’s a subtle but game-changing layer to the terrain; I can already picture the landscapes taking shape. Spent way too long wrangling typos and cleaning up the code, but hey, it’s all part of the grind. The scaffolding for some tree and structure features is in place, so we’re on the wya to success"}, {"post_id": 10838, "ts": "2026-06-17T19:40:36Z", "hours": 9.6964, "text": "Fluid dynamics are finally bubbling to the surface! I spent the day diving into the guts of the voxel engine, fleshing out the fluid simulation code. I’ve carved out the groundwork for water spreading and even kicked off lava behavior."}, {"post_id": 10154, "ts": "2026-06-16T19:26:47Z", "hours": 10.0178, "text": "So I dove into the farming system today, and let me tell you, crafting the mechanics feels like planting seeds in soil. I even tackled some erosion dynamics, which is just a fancy way of saying I’m making dirt work for me."}, {"post_id": 9412, "ts": "2026-06-15T19:22:42Z", "hours": 10.0094, "text": "Experimenting with erosion algorithms has been a wild ride today. I finally got the thermal erosion system wired up and running in tandem with the various types. Implementing that flux function was a puzzle, but seeing the terrain shift under different conditions was totally worth it."}, {"post_id": 8875, "ts": "2026-06-14T19:35:32Z", "hours": 9.8747, "text": "After a long grind, I finally got cave generation fleshed out and worms and ravines are slithering their way into the world! It’s all about those small victories right now."}, {"post_id": 8305, "ts": "2026-06-13T20:09:05Z", "hours": 9.8025, "text": "Finally wrangled the biomes into something that feels alive. Implemented the blending and height parameters, and even dived into the noise generation getting the worldgen to feel organic is like layering a sweet melody over a rough track. There’s still a ton of work to do, but it’s exciting to see the terrain start to take shape, complete with the first ore deposits peeking through. This is one step closer to that voxel heaven"}, {"post_id": 7629, "ts": "2026-06-12T19:06:38Z", "hours": 9.9367, "text": "There’s something satisfying about watching light dance across a voxel landscape. Today, I wired up the lighting for chunk re-computation, finally getting that glowy ambience just right. The little wins all add up, and each tweak brings me closer to my vision."}, {"post_id": 7010, "ts": "2026-06-11T19:21:18Z", "hours": 11.1639, "text": "Cracked the code for serialization today. Finally got ‘serialize_save’ up and running, which means I can actually save my voxel worlds without losing my work to the void of digital oblivion. 🥳 The octree stuff is coming together too. wired up the raycasting and node setup, making progress on spatial queries."}, {"post_id": 6315, "ts": "2026-06-10T17:04:58Z", "hours": 9.0033, "text": "Octrees are now officially part of the voxl family! After wrestling with a JSON function, I finally got the octree’s initial structure up and running. Implementing the octree_collect_pairs was a puzzle, but seeing it all click is worth it. Still a ways to go, but today feels like a solid step toward the final goal!"}, {"post_id": 5736, "ts": "2026-06-09T17:12:29Z", "hours": 8.4711, "text": "Finally got the job system framework working! The scaffolding is up, and I’ve wired in the parallel execution and fence management. It’s like building a complicated LEGO set and each piece finally feels like it fkts."}, {"post_id": 5033, "ts": "2026-06-08T18:07:41Z", "hours": 16.8914, "text": "Finally managed to defeat bounding volume hierarchy (BVH) . I’ve wrapped up the raycasting and query functions. Tidied up some code, renamed a few things for clarity, and even kicked off a basic profiler. The structure is starting to solidify, and I can almost taste the optimization magic."}, {"post_id": 4444, "ts": "2026-06-07T19:27:18Z", "hours": 1.6194, "text": "made some good progress today, finally started on the README and added a basic skeleton for the Makefile. also cleaned up some formatting and added a stub config along with an AABB implementation"}]...
|
Title: Voxly by @devlsx | Stardance
Devlogs:
made Title: Voxly by @devlsx | Stardance
Devlogs:
made some good progress today, finally started on the README and added a basic skeleton for the Makefile. also cleaned up some formatting and added a stub config along with an AABB implementation
Finally managed to defeat bounding volume hierarchy (BVH) . I’ve wrapped up the raycasting and query functions. Tidied up some code, renamed a few things for clarity, and even kicked off a basic profiler. The structure is starting to solidify, and I can almost taste the optimization magic.
Finally got the job system framework working! The scaffolding is up, and I’ve wired in the parallel execution and fence management. It’s like building a complicated LEGO set and each piece finally feels like it fkts.
Octrees are now officially part of the voxl family! After wrestling with a JSON function, I finally got the octree’s initial structure up and running. Implementing the octree_collect_pairs was a puzzle, but seeing it all click is worth it. Still a ways to go, but today feels like a solid step toward the final goal!
Cracked the code for serialization today. Finally got ‘serialize_save’ up and running, which means I can actually save my voxel worlds without losing my work to the void of digital oblivion. 🥳 The octree stuff is coming together too. wired up the raycasting and node setup, making progress on spatial queries.
There’s something satisfying about watching light dance across a voxel landscape. Today, I wired up the lighting for chunk re-computation, finally getting that glowy ambience just right. The little wins all add up, and each tweak brings me closer to my vision.
Finally wrangled the biomes into something that feels alive. Implemented the blending and height parameters, and even dived into the noise generation getting the worldgen to feel organic is like layering a sweet melody over a rough track. There’s still a ton of work to do, but it’s exciting to see the terrain start to take shape, complete with the first ore deposits peeking through. This is one step closer to that voxel heaven
After a long grind, I finally got cave generation fleshed out and worms and ravines are slithering their way into the world! It’s all about those small victories right now.
Experimenting with erosion algorithms has been a wild ride today. I finally got the thermal erosion system wired up and running in tandem with the various types. Implementing that flux function was a puzzle, but seeing the terrain shift under different conditions was totally worth it.
So I dove into the farming system today, and let me tell you, crafting the mechanics feels like planting seeds in soil. I even tackled some erosion dynamics, which is just a fancy way of saying I’m making dirt work for me.
Fluid dynamics are finally bubbling to the surface! I spent the day diving into the guts of the voxel engine, fleshing out the fluid simulation code. I’ve carved out the groundwork for water spreading and even kicked off lava behavior.
Finally cracked the heightmap samples, they’re now alive with weirdness! It’s a subtle but game-changing layer to the terrain; I can already picture the landscapes taking shape. Spent way too long wrangling typos and cleaning up the code, but hey, it’s all part of the grind. The scaffolding for some tree and structure features is in place, so we’re on the wya to success
. After wrangling with a mountain of renames and tidying up the loader, I finally got the light properties implemented and running through the pipeline. The loader’s debug functions are on the horizon too, which means I’ll be able to dive deep into those shadows and highlights soon.
After a marathon of coding, I finally got the loader queue working. It’s a joy to see all those little pieces, like logic grids and queues, slot together. There’s something satisfying about renaming for clarity. Its kinda like cleaning up a messy drawer and finding all the tools you forgot you had. Now, on to scaffolding the loader worker.
Nothing quite like the rush of finally tackling those mineshaft features. After all the planning, I can now see the maze taking shape and the ore types just begging to be mined. I spent a good chunk of time cleaning up leaks and renaming stuff for clarity. The mineshaft feels alive and thats really cool and important
Diving into the wild world of noise generation today, specifically ravines. After a good chunk of head-scratching, I’ve got the initial ravine noise and debug systems wired up, laying the groundwork for some seriously dramatic landscapes.
Cracked open the vault of regions today, and finally wrangled the region_codec into shape! It feels good to see that component take form after a few iterations. Took the time to clean up and scaffold the cache while getting those chunks to read smoothly. A few cosmetic tweaks here and there, but hey, every small fix adds to the whole.
Finally got the rivers flowing with some real depth implemented everything from types to flow mechanics. It’s like watching the world come alive; every little tweak adds to that immersion. And yes, the moon now has phases that actually reflect in the sky.
Building a stronghold feels a bit like crafting a slice of medieval magic. Today, I wrangled a bunch of components into our stronghold system with corridors, boxes, and initial buffers. Not to mention, I tamed the chaotic skies with some weather initialization.
Just wrapped up the stronghold_rng_next implementation, and let me tell you, it feels good to finally have that randomness flowing where it needs to! The stronghold features are coming together with stronghold_query also in the mix. Sure, there were some cosmetic tweaks and minor cleanups along the way, but every small piece is building towards that epic world.
The puzzle pieces are finally coming together with the struct generators. I wrestled with structgen_buffer_init today. Thats such a simple name for a surprisingly deep rabbit hole, but getting it wired up felt like unlocking a secret door. A few cosmetic tweaks and renamings later and im already done. Onward to strongholds!
Just when I thought I was digging in the trenches, the trees started working! Finally got the tree generation demo up and running, which has been a bit of a puzzle piece I’ve been working on for a while. Cleared out a bunch of clutter in the codebase too. It feels good to put some roots down in this project, literally and figuratively.
Weather’s looking a lot more interesting in voxly! Today, I kicked off the weather simulation with some solid progress on precipitation and the foundations for advecting particles through the environment. The rain isn’t just for show, it’s got a role to play now. Also worked out the tree generation system, which means they will have more than just empty ground to stand on.
Today’s work focused primarily on foundational systems related to environmental effects and rendering, specifically fog, camera setup, and ambient occlusion. These components are crucial for enhancing the visual quality and atmospheric realism of the engine. Camera Module: Implemented a basic camera system that supports perspective projection, allowing for a flexible viewpoint in the 3D environment.Fog Implementation: Began initial work on fog rendering, laying out a basic framework to integrate atmospheric effects into the scene, improving depth perception.Chunk Queue System: Established a chunk_queue to manage chunk updates and rendering efficiently, which is vital for optimizing visibility and performance.Ambient Occlusion: Started scaffolding the ambient occlusion module to simulate soft shadows and improve lighting realism, enhancing the overall visual fidelity.Weather Simulation: Developed foundational components for weather simulation, including the weathersim_report and weathersim_front, which will facilitate dynamic environmental changes. Current progress sets a strong base for further development of visual effects. The next steps will involve completing the ambient occlusion implementation and integrating fog into the rendering pipeline.
Today, I focused on the initialization and setup of various subsystems related to rendering and environmental simulation within the voxl engine. This work is foundational, as it establishes the groundwork for rendering techniques and weather simulation mechanics. OpenGL Module: Implemented initial OpenGL context creation to prepare for rendering. This included setting up basic state configurations for future draw calls.Camera System: Added a camera system to manage view transformations. The camera setup allows for dynamic movement and orientation adjustments, facilitating a clean separation of view logic from game entities.Chunk Queue: Began the implementation of a chunk queue to handle asynchronous chunk loading. This structure will optimize memory usage and improve performance by deferring loading operations until necessary.Ambient Occlusion: Scaffolded the ambient occlusion module, allowing for more realistic lighting interactions. Initial ambient occlusion calculations were introduced, which will be refined in subsequent iterations.Weather Simulation: Implemented core components of the weather simulation system, including the weathersim_front and weathersim_front_pool_init functions. This lays the foundation for managing weather states and transitions effectively. The current state of the engine includes basic rendering capabilities and preliminary environmental simulations. The next step involves refining the ambient occlusion calculations and expanding the weather simulation features to include precipitation dynamics.
Today’s work focused primarily on the implementation of the bloom post-processing system, specifically the initial setup and functionality of the bloom2 module. This subsystem is essential for enhancing the visual quality of the rendered scene by simulating the effect of light bleeding and softening bright areas. bloom2_pass: Implemented the initial pass for the bloom effect, which includes setting up the framebuffer and rendering targets to capture bright sections of the scene.bloom2_target_bind: Defined the binding process for the bloom render target, ensuring that the correct framebuffers are activated during the bloom rendering sequence.bloom2_blur_v: Stubbed out the vertical blur function, which will be responsible for processing the intermediate bloom render results, preparing for the subsequent blur pass.bloom2_gauss_eval: Added an evaluation function for Gaussian weights, which will be used in the blur calculations to create a smooth transition effect.bloom2_quad: Set up a quad for rendering the bloom effect onto the screen, which serves as the final output display of the bloom post-processing.bloom2_params: Began the definition of parameters for the bloom effect, including thresholds for bright areas and intensity settings, allowing for future adjustments.upload_taps: Implemented the upload process for the sampling taps used in the Gaussian blur, ensuring efficient access to texture samples during rendering. The bloom post-processing pipeline is now in its early stages, with the foundational components established. The next step will be to flesh out the blur functionality and integrate it with the bloom pass for a complete visual effect.
Today, I focused on the debug rendering subsystem, which is crucial for visualizing various components of the engine during development. This work will facilitate easier debugging of spatial relationships, frustum culling, and occlusion handling. debugdraw: Established the foundational structure for the debug drawing system, enabling visualization of shapes and paths in the rendering pipeline.debugdraw_helpers: Completed the implementation of helper functions to streamline the rendering of basic shapes (lines, spheres, etc.), improving the clarity of debug visuals.debugdraw_path: Added functionality to visualize paths, which aids in debugging movement and AI-related features.debugdraw_frustum: Implemented frustum visualization, allowing for the assessment of what is currently visible in the scene, thereby enhancing frustum culling debugging.frustum_cull: Integrated frustum culling logic to improve performance by eliminating objects outside the view, with bounds checks refined for edge cases.sphere_cull: Developed a sphere-based culling mechanism to efficiently determine visibility of spherical objects, optimizing rendering performance.cull_occlusion_run: Fixed a bounds check issue within the occlusion culling routine, ensuring accurate visibility determinations.chunk_dist_sq: Implemented a distance-squared function for chunks, which will be useful in sorting and rendering optimization. The debug rendering system is now significantly more functional, laying the groundwork for more complex visualizations. The next step will involve integrating these debug features with the main rendering loop to ensure they can be toggled during runtime for effective debugging.
Today, I focused on implementing the decals subsystem, which is critical for enhancing visual fidelity by allowing textured decals to be rendered on surfaces in the voxel environment. This will significantly improve the realism of interactions and environmental details. Decals Types: Established the decals_types module to define various decal types and their properties, facilitating extensibility for future decal features.Decals Pass: Implemented the decals_pass, which organizes the rendering of decals in the pipeline. This pass is integrated into the main render loop to ensure decals are drawn after opaque geometry.GLSL Shader Setup: Began the decals_glsl to handle decal shaders, ensuring that the shaders can accommodate blending and fading effects, which are crucial for realistic rendering.Decal Atlas: Developed the decals_atlas, allowing for efficient texture sampling by consolidating multiple decal textures into a single texture atlas, reducing state changes during rendering.Decals Fade and Blend: Added functionality for decals_fade and decals_blend, implementing visual effects that allow decals to gradually appear or disappear and blend with underlying textures, enhancing realism.Debug Drawing: Finished the debugdraw_timed and fleshed out debugdraw_flush_labels, providing tools for visual debugging of decals, which will assist in ensuring correct placements and transitions. The decals subsystem is now partially operational, with foundational components in place for rendering. The next step will involve completing the decals_config and integrating it fully into the scene management system.
Today, I focused on implementing the depth of field (DoF) post-processing effect within the rendering pipeline. This is a critical enhancement for visual fidelity, as it allows for more realistic focus transitions in the scene. Depth of Field (dof_programs): Implemented dof_programs_unload, which properly releases shaders and associated resources when no longer needed, optimizing memory usage.Depth of Field (dof_pass): Began the development of the dof_pass, which will serve as the new rendering stage to handle depth of field computations, ensuring it integrates smoothly with the existing render pipeline.Depth of Field (dof_gather): Completed the dof_gather function, which samples the scene to collect color and depth information needed for the DoF effect, with attention to efficient texture access patterns.Depth of Field (dof_quad): Started implementing the dof_quad, which will represent the screen-space quad used for applying the DoF effect in a fragment shader.Depth of Field (dof_focus): Added functionality for dof_focus, allowing users to set the focal distance dynamically, enhancing control over the DoF effect.Depth of Field (dof_coc): Initiated the dof_coc (circle of confusion) calculations, which are essential for determining which parts of the scene should appear in focus versus out of focus based on their distance from the camera.Code Cleanup: Performed various minor cleanups and formatting changes throughout the modules to improve code readability and maintainability. The depth of field implementation is progressing well, with foundational components in place. The next step will involve integrating the dof_coc calculations into the rendering pipeline and refining the dof_pass to ensure correct visual output.
Today, I focused on the integration and initial implementation of the G-buffer system and Fast Approximate Anti-Aliasing (FXAA) in the rendering pipeline. This work is crucial for improving the visual fidelity and performance of the rendering process. G-buffer Module: Implemented the initial G-buffer structure, facilitating the storage of geometry attributes for deferred rendering. This involves creating texture storage for position, normal, and albedo data.G-buffer Initialization: Developed the gbuffer_init function to allocate and configure the G-buffer textures, ensuring proper setup for rendering operations.FXAA Implementation: Added the core FXAA functionality, including fxaa_main and fxaa_settings_apply, allowing for real-time anti-aliasing effects to smooth out jagged edges in rendered frames.Self-Test for FXAA: Completed the fxaa_selftest implementation to validate the correctness of the FXAA algorithm, ensuring that edge cases are handled and results are consistent across different scenarios.Sampling and Quality: Finished the grid_sample function to enhance texture sampling for FXAA and initiated fxaa_quality, laying the groundwork for different quality settings in the anti-aliasing process.Historical Data Management: Implemented fxaa_history to maintain previous frame data necessary for temporal smoothing in the FXAA algorithm.Stubs for Future Work: Created stubs for fxaa_blit and fxaa_debug, preparing the framework for future enhancements and debugging capabilities. The rendering engine now has foundational G-buffer and FXAA support, significantly advancing the visual quality of the output. The next steps will involve refining the FXAA implementation and integrating the remaining stub functions to complete the
Today, I focused on enhancing the rendering pipeline, specifically the implementation of the g-buffer and draw call management. This work is critical for achieving efficient deferred rendering, which is essential for handling complex lighting scenarios in the engine. Rendering System: Implemented draw_indirect, allowing for batch processing of draw commands without CPU intervention, which reduces overhead and improves performance during frame rendering.Batch Management: Stubbed out batch functionality to prepare for more efficient draw call aggregation, laying the groundwork for optimizing the number of draw calls issued per frame.G-buffer Implementation: Completed the gbuffer_shade, gbuffer_normal, and gbuffer_material modules, each responsible for storing necessary per-pixel data for deferred shading, enhancing the ability to handle multiple light sources effectively.G-buffer Lighting: Initiated the gbuffer_light and gbuffer_brdf_eval_light components, which are responsible for evaluating lighting based on stored g-buffer data and enabling realistic material responses to light.Edge Case Handling: Fixed an edge case in gbuffer_emit_from_chunk, ensuring correct handling when emitting light from chunk edges, which aids in visual consistency across chunk borders.Utility Functions: Implemented clampf for clamping float values, which will be used in various calculations across the rendering pipeline to maintain valid ranges for rendering parameters.Texture Management: Added make_tex to streamline texture creation, facilitating easier integration of textures into the rendering pipeline. The rendering pipeline has significantly improved with these updates, and the next step will be to integrate the batching process fully and assess the overall performance impact in various rendering scenarios.
Today, I focused on the implementation of the instancing subsystem within the rendering pipeline. This work is critical for optimizing draw calls and managing multiple instances of meshes efficiently, which will enhance rendering performance in voxel environments. lt_mesh: Implemented the initial mesh structure to accommodate instance data. This includes setting up vertex attributes for instance transformations.lt_grid: Created an initial grid structure to manage spatial organization of instances, allowing for efficient frustum culling.lt_gpu: Stubbed out the GPU interface to handle instanced rendering commands, establishing a foundation for future integration.lt_cache_init: Implemented the cache initialization routine for storing instance data, which reduces overhead during rendering.instancing_stats: Completed the stats tracking for instanced objects, capturing performance metrics that can be analyzed for optimization.instancing_transform_bounds: Finished the bounding volume calculations for instances, crucial for frustum culling to avoid unnecessary rendering.frustum_batch: Scaffolded the frustum batching system to group instances based on visibility, optimizing the rendering process and minimizing state changes.Cleanup: Executed minor cleanups across multiple modules to enhance code readability and maintainability. The instancing subsystem is now in a functional state, with core structures established and initial implementations completed. The next step will involve refining the GPU integration for instanced rendering and testing performance metrics in various scenarios.
This morning, I focused on establishing the foundational components for the voxel engine’s module system, which is crucial for modularizing functionality and enhancing maintainability. I initiated the groundwork for both configuration and debugging systems. mb_config: Started the configuration module to manage engine settings, establishing a basic structure for loading and saving configurations.mb_debug: Added the debugging module, scaffolding the structure to allow for runtime diagnostics and performance monitoring.lt_stats_format: Implemented a format for terrain statistics, ensuring that performance metrics can be effectively logged and analyzed.block_shape: Began work on the block shape definitions, laying the groundwork for specifying voxel dimensions and orientations.cross_mesh: Stubbed out the cross-mesh functionality, preparing for future implementation of cross-sectional rendering techniques. The foundational modules are now in place, and the next step will involve fleshing out the configuration and debugging features to support real-time adjustments and diagnostics.
Today I focused on the mesh building subsystem, which is critical for generating and managing the geometry of voxel chunks in real-time. This work is foundational for optimizing rendering and ensuring efficient memory usage. MeshBuild Module: Started the implementation of the meshbuild system, establishing the groundwork for efficient chunk geometry generation. This includes setting up the initial data structures for mesh management.Snapshot System: Implemented the mb_snapshot functionality, which allows for capturing the state of the mesh at a given time. This is crucial for optimizing updates and rendering by reducing unnecessary computations.Statistics Tracking: Scaffolding for mb_stats was added to track performance metrics related to mesh generation, providing insights into the efficiency of the rendering pipeline.Block Properties: Introduced initial definitions for block_shape and face_dir, setting up the essential parameters required for defining voxel geometry.Terrain Type Management: Added the lt_terrain module to manage different terrain types within the game, enabling diverse environments and interaction mechanics.Bounds Checking: Fixed a bounds check issue during initialization, ensuring that the allocation of voxel data structures remains within valid memory limits, thus preventing potential crashes or corruption. Current state reflects a significant advancement in the mesh building architecture, with basic functionality established. The next steps will involve fleshing out the mesh generation algorithms and integrating them with the rendering pipeline for further testing.
This morning’s work focused on enhancing the rendering pipeline and starting the implementation of the particle emitter system. These improvements are crucial for visual fidelity and performance in voxel rendering. clamp01: Implemented a function to constrain values between 0 and 1, ensuring proper normalization for graphical calculations.curves: Began the implementation of curve interpolation methods for smoother transitions in animations and particle emissions.gpu_buffer: Added a structured buffer for GPU memory allocation, enhancing the efficiency of data transfer between CPU and GPU for rendering tasks.emitter: Developed the foundational structure for the particle emitter, which will support dynamic visual effects in the game environment.meshbuild_chunk: Completed the initial version of the chunk mesh building algorithm, optimizing how voxel data is converted into renderable geometry. Current progress sets the stage for integrating the particle system fully and refining the mesh building process. The next logical step will be to finalize the emitter’s functionality and connect it to the rendering pipeline.
Today I focused on the particle system and initial components for voxel chunk mesh building, which are critical for enhancing visual effects and optimizing rendering performance in the engine. Particle System: Implemented particle_rng, which initializes a random number generator for particle behavior, crucial for generating varied particle effects.Particle Emission: Completed the particles_rng_in_cone function, allowing for particles to be emitted in a cone-shaped area, enhancing the realism of effects like explosions or smoke.Particle Pool Management: Developed particles_pool_clear, which efficiently resets the particle pool between frames, minimizing memory usage and helping maintain performance during high-load scenarios.Vertex Packing: Set up vertex_pack, which organizes vertex data into a compact format suitable for GPU processing, improving data transfer efficiency and reducing memory bandwidth usage.Chunk Mesh Building: Started the meshbuild_chunk implementation to facilitate efficient chunk rendering, laying the groundwork for further optimizations like greedy meshing.Emitter System: Added a basic emitter class to manage particle emission attributes, enabling future extensibility for different particle effects and behaviors.Cleanup and Organization: Conducted minor cleanups and formatting across various files, ensuring code maintainability and consistency. The particle system is now more robust, and the chunk building process has a foundational structure in place. The next step involves completing the mesh building logic and integrating more complex particle behaviors using the emitter system.
Today, I focused on the graphics subsystem, specifically enhancing the shader management and shadow rendering capabilities. This work is essential for achieving more sophisticated visual effects and better performance in the rendering pipeline. Shader Management Module: Implemented shaderman_set_hot_reload, enabling dynamic shader reloading during runtime to facilitate rapid iteration without restarting the engine.Shader Compilation: Completed the shader_compile function, which compiles shader code into GPU executable format, improving the setup time for rendering.Shader Initialization: Added shadow_init, which initializes parameters related to shadow rendering, ensuring proper setup before rendering occurs.Shader Stage Handling: Filled in the shader_stage structure to manage different stages of shader processing, which allows for cleaner organization of shader tasks.Active Uniforms Retrieval: Finalized shaderman_gl_active_uniforms, which retrieves and stores active uniform variables from shaders, enhancing the shader’s interaction with the rendering system.Debugging Support: Set up shader_debug, providing hooks for debugging shader issues during development, which improves the ease of identifying and resolving shader-related problems.Bloom Effect: Added a basic implementation of bloom rendering through bloom_resize and the bloom module, initiating post-processing effects to enhance scene brightness. The shader management system is now more robust, allowing for dynamic updates and improved shader handling. The next step will involve integrating the shadow rendering into the main rendering loop to evaluate performance and visual fidelity.
Today I focused on the lighting subsystem, specifically implementing shadow mapping techniques and enhancing the atmospheric rendering system. These improvements are crucial for achieving realistic lighting and depth effects in the voxel environment. shadow_map: Implemented the shadow mapping algorithm, which includes creating a depth texture to store the distance from the light source to the nearest surface, enabling more realistic shadows.shadow_pcf: Developed percentage-closer filtering (PCF) for shadows to soften the edges of the shadow map, increasing visual fidelity. This involved setting up the filtering process within the shader pipeline.shadow_split: Introduced the shadow split technique to improve shadow rendering across varying depths. This includes calculating split distances based on the camera’s frustum to reduce artifacts.shadow_matrix: Added a shadow matrix computation to transform world coordinates into shadow map space, ensuring correct shadow projection during rendering.skyb: Began implementing the skybox atmospheric effects, specifically the skyb_atmosphere_clear_color and skyb_billboard. This includes color adjustments for clearer skies and setting up billboards for celestial bodies.shadow_stabilize: Stubbed out a shadow stabilization technique to reduce flickering and aliasing in shadow rendering, which will be fleshed out in future commits.code maintenance: Conducted minor cleanups and cosmetic tweaks across multiple files for better readability and organization, including renaming functions for clarity. The current state of the shadow rendering system is functional with basic shadow mapping and initial atmospheric effects implemented. The next step will be to refine the shadow stabilization method and continue developing the full atmospheric rendering features.
Today, I focused on enhancing the rendering subsystem with the implementation of Screen Space Ambient Occlusion (SSAO). This feature is critical for improving scene depth and realism by simulating how light interacts with surfaces. SSAO Module: Implemented the foundational SSAO computation logic in ssao_compute, which calculates ambient occlusion based on depth and normal maps to enhance shading realism.SSAO Debugging: Developed ssao_debug to visualize SSAO outputs, allowing for quick verification of occlusion values and aiding in fine-tuning the algorithm.SSAO Blur: Completed the SSAO blur process in ssao_blur, which smooths the occlusion map to reduce artifacts and achieve a more visually appealing result. The blur uses a separable Gaussian filter for performance efficiency.Skybox Renderer: Progressed on the skybox rendering system by fleshing out skyb_renderer_upload_dome and skyb_dome_vertex, which define the dome geometry and texture uploads for the skybox, ensuring proper visual integration with the ambient occlusion effects.Skybox Palette and Gradient: Initiated the scaffolding for skyb_palette and set up skyb_gradient, enabling gradient-based skybox coloring to enhance atmospheric effects in conjunction with SSAO. The SSAO implementation is now functional, with debug features in place to assess its performance and visual fidelity. The next step will involve further optimizing the SSAO calculations and integrating them seamlessly into the main rendering pipeline.
Today I worked on the implementation of screen space reflections (SSR) and screen space ambient occlusion (SSAO) within the rendering subsystem. These features are vital for enhancing visual fidelity and realism in lighting interactions within the voxel environment. SSR Module: Introduced the ssr_fsquad, which sets up a full-screen quad for executing the SSR shader pass. This establishes a foundation for reflection calculations.SSR Configuration: Created ssr_config scaffolding to manage SSR parameters, allowing for adjustable settings such as reflection intensity and roughness.SSR Depth Setup: Implemented the ssr_depth, which captures depth information necessary for accurate reflection rendering. This enables proper occlusion of reflections based on scene depth.SSR Debugging: Set up ssr_debug to visualize reflection calculations during development, aiding in the identification of rendering artifacts or inaccuracies.SSAO Configuration: Initialized ssao_settings to provide user-adjustable controls over ambient occlusion effects, including radius and intensity.SSAO Pass Setup: Established the ssao_pass, which integrates the SSAO calculations into the render pipeline, ensuring it runs alongside other post-processing effects.SSAO Sampling: Started working on ssao_sample, which defines the sampling strategy for ambient occlusion, leveraging a kernel to calculate occlusion values based on neighboring pixels.Kernel Statistics: Set up ssao_kernel_stats to track and debug the parameters of the SSAO kernel, which will assist in optimizing performance and quality. The rendering subsystem now has a foundational implementation for both SSR and SSAO, with key components in place. The next steps will involve refining the sampling methods for SSAO and integrating the blurring effect for the final output to enhance visual quality.
Today, I focused on the text rendering subsystem, specifically the development of the text context and text batch systems. This work is foundational for rendering 2D text efficiently, which is crucial for UI elements and in-game text displays. text_ctx: Implemented the initial structure for the text context, which manages the state related to text rendering. This includes setting up memory allocations for text data and glyph information.text_batch: Created a scaffold for the text batch system to handle multiple text draw calls efficiently. This will allow for batching of text rendering operations to minimize state changes.text_atlas: Developed the initial setup for the text atlas, which will store glyph images for rapid access during rendering. This will improve performance by reducing texture binding overhead.text_font: Initialized the text font subsystem to load and manage font data. This includes parsing font files and generating the necessary glyph data.text_glyphdata: Started the implementation of glyph data handling, allowing for precise control over individual characters and their metrics.ssr_settings and ssr_pass: Set up the screen space reflections (SSR) settings and pass, which will enhance the visual fidelity of reflective surfaces in the engine.ssrx_material_unpack: Completed the unpacking of material data for SSR, ensuring that material properties are correctly interpreted during rendering. The text rendering subsystem is now well-structured, and the next step will involve integrating the text rendering into the main rendering pipeline to ensure text is displayed correctly in the game environment.
This morning’s work focused on the tonemapping subsystem, particularly enhancing exposure control and initializing the necessary data structures. These changes are critical for achieving realistic rendering through proper dynamic range management. Tonemap Exposure: Implemented tonemap_exposure to calculate exposure values based on scene luminance, improving how bright areas are rendered.Tonemap Configuration: Added tonemap_config, defining parameters for exposure and curve settings, facilitating easy adjustments and future expansion.Tonemap Curve: Began the implementation of tonemap_curve, establishing a basis for non-linear mapping of color values to enhance dynamic range perception.Text Layout: Completed the text_layout function, which manages text rendering for UI elements, ensuring proper alignment and spacing.Tonemap Debugging: Implemented tonemap_debug_run_split to allow testing of various tonemapping scenarios, aiding in fine-tuning the visual output. Current progress sets a solid foundation for further work on the tonemapping pipeline, with the next steps aimed at refining the tonemap grading process and integrating it into the rendering loop.
Today, I focused on the development of the tonemapping subsystem, which is essential for controlling the luminance and color mapping of rendered scenes to enhance visual fidelity. This work is crucial as it directly affects the output quality of rendered images. volumetric_blur: Scaffolded the vol_blur module to introduce volumetric blur processing. This lays the groundwork for further development of blur algorithms.tonemap: Established the initial framework for tonemapping, including scaffolded modules for tonemap_params, tonemap_grade, and tonemap_curve. This modular approach allows for easy future enhancements and testing.tonemap_selftest: Wired up self-testing capabilities for tonemapping to ensure that changes can be effectively validated. This includes fleshing out the self-test to cover edge cases and expected behavior.tonemap_lut: Implemented a lookup table (LUT) for tonemapping, which will optimize color grading processes. Set up associated functions to support LUT creation and application.tonemap_exposure: Started the implementation of exposure management in tonemapping, including functions to retrieve and adjust exposure levels dynamically.text_layout: Completed the implementation of the text layout system, which will be utilized for rendering debug information and UI elements related to tonemapping.cleanup: Conducted code cleanup across several modules, focusing on reducing technical debt and improving readability. The current state of the tonemapping subsystem is foundational, with several key components scaffolded and initial implementations underway. The next logical step involves further developing the tonemapping algorithms and integrating them into the rendering pipeline to evaluate their impact on scene output.
Today, I focused on implementing various aspects of the volumetric rendering subsystem. This work is critical for enhancing the visual fidelity of the water rendering and introducing new volumetric effects, which are essential for achieving realistic environmental interactions in the engine. water_reflect: Implemented reflective properties for water surfaces, enhancing the realism of water rendering by calculating reflection vectors based on the viewer’s position and the surface normals.volumetric_programs_use_march: Wired up the volumetric rendering programs to utilize a raymarching approach for rendering volumetric effects, allowing for more complex light interactions within volumes.vol_raymarch: Began development of the raymarching algorithm for volumetric rendering, laying the groundwork for subsequent implementations of effects such as fog and smoke.volumetric_pass_run: Implemented the core function to execute volumetric passes, establishing a pipeline for rendering volumetric effects sequentially within the main render loop.vol_caustics: Initiated the caustics rendering system, which will simulate light patterns created by surface reflections on the volumetric medium, enhancing the visual complexity of water interactions.vol_pass: Scaffolded the volumetric pass structure, defining how different volumetric effects will be processed in the render pipeline.vol_medium: Created an initial implementation of volumetric mediums, allowing the engine to define properties such as density and scattering for various materials. The volumetric rendering subsystem is now more robust and modular, with foundational components in place. The next step is to continue refining the raymarching implementation and integrate the caustics calculations within the rendering pipeline.
Today, I focused on implementing the initial stages of the animation and AI subsystems, as well as enhancements to the water rendering pipeline. These components are critical for enhancing the game’s dynamic interactions and visual fidelity. Animation System: Implemented foundational structures for anim_blend. This allows for smooth transitions between different animations, improving character movement fluidity.Entity System: Completed the entity module, enabling proper management of game objects, including their lifecycle and state management, which is essential for gameplay.AI Module: Introduced the pathfind function, allowing entities to navigate the game world effectively. This is a crucial step towards integrating more complex AI behaviors.Water Rendering: Established the water_pass, implementing the water rendering pipeline. This includes setting up reflection and refraction capabilities using a dedicated reflection camera (water_reflcam), enhancing visual realism.Water Effects: Started work on water_wave and water_foam, which will simulate surface interactions and enhance the dynamic appearance of water bodies.AI Updates: Added ai_tick, which will manage updates to AI behaviors each frame, ensuring responsive and engaging NPC interactions. Current progress includes foundational setups for both animation and AI systems, alongside initial water rendering capabilities. The next logical step involves refining the AI behaviors and continuing the development of the water effects to enhance environmental interactions.
Today, I focused on the animation subsystem of the voxl engine, specifically enhancing the animation systems to support skeletal animation and procedural walking behaviors. This work is crucial for implementing character animations that are both dynamic and responsive to gameplay inputs. behavior_leaf: Implemented the behavior_leaf module, establishing a base for behavior trees that allows for more complex AI decision-making processes.behavior_builder: Developed the behavior_builder to construct behavior trees programmatically, centralizing the creation and management of AI behaviors.behavior_act_target_in_reach: Completed the implementation of the behavior_act_target_in_reach, which checks proximity to targets for AI actions, enhancing interaction capabilities.anim_skeleton: Began scaffolding the anim_skeleton module, which will define the structure and hierarchy of skeletal animations, essential for character rigging.anim_rig: Set up the anim_rig, providing the framework for binding animations to skeletal structures, facilitating smooth character movement.animation_procedural_walk: Expanded the animation_procedural_walk to allow for dynamic adjustments based on character speed and terrain, improving realism in character locomotion.anim_controller: Introduced the anim_controller to manage the state and transitions of animations, allowing for layered animation blending and more responsive character behaviors.entity_render: Implemented entity_render functionality, which integrates the rendering of animated entities into the broader scene graph, ensuring visual coherence. The current state of the animation system is foundational but progressing well, with core modules in place for skeletal animation. The next steps will involve refining the blending of animations and integrating more complex animation states.
Today, I focused on the combat subsystem, specifically implementing various components necessary for managing health, damage, and character behaviors during combat scenarios. This work is critical for establishing a solid foundation for player interactions and enemy behaviors. Combat System: Implemented combat_health, which tracks and manages health points for entities, including health reduction mechanics and thresholds for death events.Combat System: Added combat_invuln, providing temporary invulnerability states for characters, which allows for the management of damage immunity during specific animations or effects.Combat System: Developed combat_knockback, a mechanic that applies force to characters upon receiving damage, enhancing the feedback of combat interactions.Behavior Tree: Stubbed out the combat_combo, which will facilitate chaining of attacks for characters, setting up a framework for more advanced combat mechanics.Behavior Management: Completed behavior_tree_free to ensure proper memory management of behavior trees, preventing memory leaks during runtime.Behavior Management: Initiated behavior_runner_init, which sets up the initial state for behavior execution, crucial for managing different character actions effectively.Combat System: Implemented combat_dmg_info_get, which retrieves damage information relevant for interaction logic, aiding in the clarity of combat events.Cleanup: Conducted code tidying and minor fixes across the combat module to enhance readability and maintainability. The combat subsystem now has a more cohesive structure with the groundwork laid for complex interactions. The next step will involve fleshing out the behavior tree logic to integrate advanced AI behaviors and attack combos.
This morning, I focused on the combat subsystem, implementing new mechanics that enhance player interactions and feedback during combat. These changes are pivotal for establishing a robust gameplay foundation. combat_resist: Implemented a resistance mechanic that determines damage mitigation based on player attributes, allowing for more nuanced combat outcomes.combat_rng: Added a random number generator for damage calculations, introducing variability in combat results to enhance unpredictability and player engagement.combat_knockback: Developed a knockback effect that alters player position upon receiving damage, improving the physicality of combat interactions.combat_log_death_message: Implemented logging functionality to display a message when a player character dies, providing clear feedback for the player on their status.stub out combat_log: Created a basic structure for the combat log system, laying the groundwork for future enhancements in tracking combat events and player actions. Current progress has established essential combat mechanics. The next step will involve integrating these systems into the overall game loop for testing and refinement.
Today, I focused on the development of the Entity-Component-System (ECS) architecture, specifically initializing spatial queries and establishing foundational components for entity management. This work is critical for optimizing game object interactions and enabling efficient systems for rendering and gameplay logic. ecs_spatial: Initiated the module to manage spatial queries for entities, allowing for efficient retrieval of entities based on their spatial positions. This is essential for implementing features like frustum culling and collision detection.ecs_query: Added the initial structure for querying entities based on components. Stubbing out this system lays the groundwork for flexible querying mechanisms essential for game logic processing.ecs_relations: Started the implementation of relational data structures to handle parent-child relationships between entities, which will facilitate a hierarchy for transformations and event propagation.ecs_blob_init: Completed the initialization sequence for ECS blobs, which encapsulate component data for entities, improving memory layout and access patterns while ensuring efficient entity creation and destruction.ecs_prefab: Introduced the prefab system for defining reusable entity templates. This system will streamline the instantiation of common game objects and reduce redundancy in entity creation.ecs_group_refresh: Enhanced the group management system to refresh entity groups based on component changes, optimizing the update cycle for systems relying on dynamic entity states.ecs_events: Implemented an event system to handle notifications between entities and systems, allowing for decoupled interactions and improved modularity.combat_resist, combat_rng, combat_knockback, and combat_log: Started implementing core combat mechanics, including resistance calculations and random number generation for combat outcomes, along with stubbing out logging for combat events. The ECS framework is now more robust, and the next step will be to integrate these components into a cohesive system, ensuring that queries and events operate seamlessly across the game engine.
Today’s work focused on the integration of the entity-component-system (ECS) architecture and the initial implementation of the physics subsystem. This is crucial for establishing a robust framework for game object management and collision detection. ephysics_aabb: Implemented the Axis-Aligned Bounding Box (AABB) structure to support collision checks. This provides an efficient way to handle spatial queries.ephysics_broadphase: Developed the broad phase collision detection system. This module identifies potential collisions using AABBs to minimize computational overhead during the narrow phase checks.ephysics_ccd_resolve: Added continuous collision detection resolution to ensure accurate collision handling for fast-moving entities, preventing tunneling issues.ecs_world: Scaffolding for the ECS world management was set up, allowing for the organization and management of entities and components effectively.ecs_types: Established foundational data structures for components, enhancing type safety and access patterns within the ECS framework.ecs_get: Implemented the ecs_get function to retrieve components associated with entities, facilitating component retrieval in a type-safe manner.ecs_sys_collide: Wrote the initial collision system that integrates with the ECS, processing collision events and leveraging the broad phase detection.ecs_stats: Initiated the ECS stats module, which tracks performance metrics and entity counts, vital for optimizing system performance. The current state of the engine now includes a foundational ECS structure with a basic physics engine integrated. The next step involves refining the collision resolution mechanism and expanding the entity management features.
This morning, I focused on enhancing the physics subsystem, specifically in the area of impulse and motion mechanics. This work is crucial for achieving realistic interactions and responses to forces within the game environment. ephysics_motion_ballistic: Implemented the initial projectile motion calculations, enabling objects to follow a parabolic trajectory under gravity.ephysics_pushout: Started designing the pushout mechanism to resolve overlaps between colliding objects, which will be essential for player movement and interaction.ephysics_impulse: Created a stub for impulse application, setting up the necessary data structures to handle instantaneous force applications on entities.ephysics_falldmg: Completed the fall damage calculation, accounting for the velocity of the entity at impact, which enhances realism in gameplay.ephysics_current: Filled in the functionality for current effects, allowing entities to be influenced by environmental forces, such as water currents. The current state includes foundational motion and interaction mechanics. The next step will involve expanding on impulse handling to ensure comprehensive force interactions across various physics scenarios.
Today, I focused on enhancing the physics subsystem, specifically the entity physics (ephysics) module. This work is essential to establish a robust framework for collision handling, motion integration, and interactions with the environment. ephysics_sweep: Expanded the logic to improve sweep tests for collision detection, ensuring accurate intersection calculations between moving entities and static geometry.ephysics_step: Initiated the implementation of the stepping function, which manages the simulation time step for physics updates, crucial for maintaining consistent behavior across frame rates.ephysics_spatial: Established a spatial partitioning system to optimize collision queries, using an efficient data structure to reduce the number of checks required during each physics update.ephysics_body_from_entity: Completed the function to create physics bodies from game entities, allowing for dynamic interaction based on entity properties and state.ephysics_query_solid_cell: Implemented a query method to check for solid cells within the voxel grid, facilitating accurate collision responses for entities interacting with the voxel environment.ephysics_pushout: Began development on the pushout mechanism, which resolves collisions by adjusting the position of entities to avoid overlaps with solid objects.ephysics_motion_ballistic: Filled in the calculations for ballistic motion, allowing entities to simulate projectile trajectories accurately under the influence of gravity.ephysics_falldmg: Developed functionality to handle fall damage, tying entity physics state to health mechanics based on vertical distance fallen. The physics subsystem is becoming more cohesive with these additions. The next logical step is to finalize the integration of the impulse and fluid simulation components, enhancing interaction realism further.
Today, I focused on the implementation of the mob subsystem, particularly in setting up the foundational structures and behaviors for various mobile entities within the engine. This work is crucial for establishing NPC interactions and their movement dynamics in the game world.
Today, I focused on the navigation subsystem, implementing several foundational components essential for pathfinding and AI navigation within the voxel environment. This work is crucial for enabling agents to navigate through the game world effectively.
Today, I focused on the projectile system within the game engine, specifically working on the memory management and foundational structures for spawning and managing projectiles. This work is crucial for optimizing projectile behavior and ensuring efficient resource allocation during gameplay.
Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment.
Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment.
Today, I focused on the building subsystem, which is critical for player interaction and environment manipulation. The work primarily involved finalizing and scaffolding various components of the building mechanics, including previews, placement, and rotation.
Today, I focused on the crafting subsystem, establishing foundational components essential for managing crafting recipes and related functionalities. This work is crucial for enabling player interactions with crafting mechanics, which are integral to gameplay progression.
Today, I focused on the effects subsystem and the crafting system to enhance gameplay mechanics and item interactions. These improvements are crucial for player feedback and item management in the game.
Today, I focused on the enchantment subsystem, establishing the foundational architecture for enchantments and their associated mechanics. This work is critical, as enchantments will enhance player interaction and item customization within the game.
This morning’s work focused on implementing mechanics related to fishing, an essential feature for gameplay. The changes address various aspects of the fishing system, including mechanics for enchantments and loot generation.
Today I focused on the implementation of the fishing subsystem, which is crucial for adding interactive gameplay elements that enhance player engagement. This work lays the foundation for fishing mechanics, including casting, line management, and loot generation.
Today I focused on the inventory subsystem, specifically initializing and structuring the inventory components. This work is critical for ensuring a robust and functional system for managing player items, which is foundational for gameplay mechanics.
Today I focused on the inventory and tools subsystems, specifically enhancing item durability management and transfer mechanisms. These additions are critical for ensuring that tool usage and inventory interactions are coherent and efficient.
Today, I focused on the tools subsystem, particularly the tools registry and experience (XP) management systems. This work is crucial for establishing a structured framework for tool interactions and player progression
Today I focused on the user interface subsystem, specifically initializing components for the HUD and integrating health and experience mechanics. This work is essential to establish a basis for player feedback and interaction, enhancing overall gameplayability.
Today, I focused on enhancing the console subsystem, which is crucial for debugging and player input management. The improvements made today lay the groundwork for a more robust command interface, enabling better interaction with the game engine.
Today, I worked primarily on the HUD subsystem, focusing on the implementation of various HUD components and inventory screens. This is crucial for improving user interaction and providing feedback during gameplay
Today, I focused on the menu subsystem, primarily implementing and refining the main menu and inventory screen functionalities. This work is essential for user interaction and enhancing the player experience through intuitive navigation....
|
1791822083.9425588
|
1792686083.9425588
|
|
6268
|
Thalamus + AgentOverflow by @Hardcore_Real_Name_is Thalamus + AgentOverflow by @Hardcore_Real_Name_is_nitish | Stardance...
|
Hardcore_Real_Name_is_nitish
|
1
|
472.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T09:29:17Z", "hours": 35.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Reviewer Notes (School Incubator Startup) Status: Built in my school’s startup incubator; some edge-case features are undergoing rapid iteration. Auth Required: Sign up via email OTP to unlock Research/Build Modes or send >3 messages (prevents API exploitation/high costs). Credits: Runs on live premium models (Claude Opus via AWS Bedrock). Minor risk of downtime if incubator credits exhaust, but we should be fine. Thalamus AI: L4.5 Agent Platform Thalamus AI (by Aphantic Corporations) is an all-purpose Level 4.5 AI ecosystem combining multi-agent workflows, deep research, and true local QEMU OS virtualization inside your browser session via a lightweight 31MB local Node.js WebSocket bridge. The 4 Core Modes Chat: Context-aware assistant for writing, planning, and summarization. Research: Synthesizes live web search with inline source citations. Study: Adaptive RAG tutor; uploads notes to auto-generate custom quizzes/solutions. Build (Code): Multi-agent pipeline building full-stack apps from plain English. 9-Agent Code Pipeline Runs asynchronously via Convex scheduled functions using smart model routing: Researcher (Haiku): Maps existing engineering benchmarks. Analyser (Haiku): Dissects product requirements and edge cases. Planner (Haiku): Graphs detailed task execution plans. Coder (Opus 4.6/4.8): Authors core logic, APIs, and databases. Optimiser (Sonnet): Refactors code for scale and algorithmic efficiency. Organizer (Haiku): Automatically structures folder/file directories. Tester (Sonnet): Generates robust end-to-end unit test suites. Hacker (Sonnet/Opus): Conducts penetration audits to patch vulnerabilities. Critic (Haiku): Acts as the final quality gate; rejects incomplete work. Native Stack & OS Virtualization OS Support: Boots Windows 11/10, macOS Sequoia/Sonoma, Linux (Ubuntu/Kali), and Android. Browser-only instant boot for Alpine/Arch Linux. Ultra-Lean Desktop: Built with Neutralinojs (uses native Edge WebView2)—only 2.2 MB total app size. Integrated with GitHub OAuth for automated commits after agent cycles.", "repo": "https://github.com/hardcoregamingsyle/thalamus", "demo": "https://thalamus.aphantic.skinticals.com"}]...
|
[{"post_id": 37547, "ts": "202 [{"post_id": 37547, "ts": "2026-07-30T11:01:32Z", "hours": 9.0, "text": "I am now doing something kind of risky. giving AI adhd. Like literal ADHD. level 2/5 and for some tasks level 2.5/5 as per my research, this should increase the output quality of AI. also checked agentoverflow compute, it’s working Okayish. claude has access to it and my limit resets tommorow, so the automated checks aint happening and I have to check manually. Here is SS of me creating a whatsapp clone as the test of this AI(hopefully this tells you what Im expecting form my AI.)"}, {"post_id": 37363, "ts": "2026-07-30T00:55:25Z", "hours": 2.0, "text": "Everything Finally works, except the VM, it got some error, debugging that, then I just came up with a new idea(thanks to my yt feed) add a ADHD mode toggle in Chat mode and Research mode, basically ADHD in AI will I think help AI leave its very formal guided approach t problems, with the distracter, it will be jumping here and there, maybe making connections, giving us a better take at making AI good. There will also be a Brainstorm mode, the Brainstorm mode will give AI ADHD and it will help in brainstorming startup Ideas, startegies, and stuff. can someone remove this screenshot compulsion. I dont have a screenshot every devpost."}, {"post_id": 37002, "ts": "2026-07-29T13:34:59Z", "hours": 7.0, "text": "Finally, got the routing to work properly. Everyting works now. My head is so done for it. also, I just saw something, and People like me may be the reason for it getting added. Im uploading it as the screenshot."}, {"post_id": 36337, "ts": "2026-07-28T12:00:04Z", "hours": 17.0, "text": "I dont understand why is my Code mode routing going to Ollama when everyting else point to NVIDIA NIM, even the OLLAMA Fallback is Nvidia NIM, the Primary provider is convex dashboard is NIM, my ollama keys are at limits and this great code mode is pointing at NIM. whyyy. Currently working on fixing the Github sanbox. thats kindof broken. rest everything works. For some reason, even on a successful github import, it shows an error(AI slop, thats why. I made the github system with AI) . the sandbox just doesnt detect the repo. and the Hack Club Fraud Squad is sus with me(I dnt blame them, 17hrs a day for a 14yr old is suspicious.) I have migrane, I dont have glasses and my eyes are very healthy(somehow). once any 1 of my project gets reviewed and I get payout, im spending it all on hostng and AI credits so I can switch over to Oracle and Modal. Agentoverflow is still going through filteration and final review. I have cooked myself. I am still procastinating the .exe(even with AI, building a native .exe is a headache.) here is SS of the new Sandbox tab"}, {"post_id": 35769, "ts": "2026-07-27T12:28:48Z", "hours": 21.0, "text": "polishing the VM and all, and good news, Im part of the 1 million founders, 5 day bootcamp. Its a very very god program, the onluy thing i hate about it is the dress code, like seriously, shirts and pants. why not joggers and t shirts, they are confortabel af. also, i monitored teh agentoverflow corpus, well, it had a problem, the API key of gemini to verify absolute gold tier learnings, im so dumb I waited 3 days for something to happen and only to realise forgot to set the APU key. yup, this is greatness at it’s peak. for thalamus, doing some polishing, just realised that git import diesnt work, fixing that, removing the requirement of git pat. Fixing a few more stuff. also, I just realised another problem, the database. how am I going to set up databases, like how do I set uo convex for everyone who uses this for free. well if the VM problem had a solution, this should also have a solution. API is working, tested it with claude code. Claud eput in 15 learnings for me. also, I realised that I forgot to change the sandbox tab to leave the old VM system an move on to the new Github Actions system. Also, long time I havent updated my .exe gotta do that also. Quick update- I got a Notif that I am suspiciously a fraud, like a serious fraud. the Fraud Squad app sent me the notif. after that, I am still trying to recover from the emotional trauma of the database loss. I will be angry with my mother for a bit more time(se was the one who deleted it). IK im cruel and he didnt mean it, but recovery takes time. also, For the next week, after I do the changes and fixes required, I will be using only and only thalamus to code Thalamus. right, An AI that will code itself, but I will be the one guiding it. because if I cant use it, my product aint ready for market launch. for screnshot, idk what to put. like all I did was console work and Im definately not showi my console here. the names are kindof inappropriate. so here is my old sandbox tab. Good Bye QEMU and VNC Viewer. you are getting replaced by Github(atleast they aint getting replaced by AI.)"}, {"post_id": 35073, "ts": "2026-07-26T08:12:34Z", "hours": 2.0, "text": "I FINALLY CRACKED THE UNLIMITED VM PROBLEM. Github Actions are unlimited usage for publrepos, and for source control, we are already making a public repo, and we get a Free VM with it. I can Run iOS, MacOS, Windows, Linux and Android on it, no restrictions, completely free. WoHoo. also, now I am no longer using Closed source Models, because Open Sourced Models, if Used correctly are alot cheaper and provide the same result as any Closed Sourced Models. Agentoverflow is still working well. Will shift from google Cloud to Oracle Cloud, as Orace gives a 50% more powerful, compoletely dedicated server for free with 200gb storage, and that additional 150gb that I need costs me just under $4 a month, so It is very very viable financially. will switch to it later. I will now add a Student Mode for anyone with the email given by my school, and a teacher mode for teacher emails. Still recovering from the emotional trauma of the database loss. Added gravity Ads, need to remove alot of adslots because right now, it is spam impressions, not hih quality impressios, but still, here is ss."}, {"post_id": 35023, "ts": "2026-07-26T05:38:11Z", "hours": 5.0, "text": "I purged all dad code, did a massive refractor, fixed anything broken, left nothing. both repos, around 15k lines touched(must be my most productive session.) and I am so done, my migrane is at its peak, but IDK, i cant sleep anyways so better work than stare at the ceiling. Also, AdminPanel finally works. and since I lost my entiredatabase, it will take a day or 2 for the reindexing to start, right now its just botting up, downloading the embedding model and the entire database. I am still depressed. will take me some time to recover from the emotional trauma."}, {"post_id": 34718, "ts": "2026-07-25T17:33:45Z", "hours": 18.0, "text": "i am so done for it. i spent this entire week. trying to find out why is the admin panel showing 0 learnings. guess what. my mom deleted the VM, thinking it would remove all charges, I didnt even have a backup. great, back to square 1. and the agentoverflow admin panel has a error, trying to integrate AdMesh for Ad Revenue. Will use Modal as it is a serverless infrastructure for hosting AI models. I now need credits. allso, my mouse and keyboard are giving up on me. here is ss of error."}, {"post_id": 34108, "ts": "2026-07-24T16:20:33Z", "hours": 34.0, "text": "busy fixing the agentoverflow error. still working on it, no time for a detailed devlog, here is ss of admin panel, latest."}, {"post_id": 32916, "ts": "2026-07-22T11:46:35Z", "hours": 11.0, "text": "my entire databse got wiped, 0 learnings. and that isnt the worst. my greatest enemy, Daal(We caal him that), literally told my crush, who was very close to me(we talked alot), and now, she avoids me. Thanks to my friends, I know why she avoids me(I skip school almost everyday). Here is a ss of the database with 0 learnings. Im broken, depressed, you can make me happy by sending a emaill to Anthropic, telling them to integrate agentoverflow directly into their tools list for code mode."}, {"post_id": 32405, "ts": "2026-07-21T15:50:48Z", "hours": 0.0, "text": "quick Update. Now im using ollama cloud wil like 3 different accounts, will exapnd this to like 50 different accounts so I never have to go on paid tier till I have the money. I was checking hackatime, And im No. 1 here is ss for proof."}, {"post_id": 32382, "ts": "2026-07-21T14:58:46Z", "hours": 3.0, "text": "Finally, found a reliable API aource(for now). well now I can finally relax. but I wont, why, I need to fix the bug that my input tokens are at like 200k while my output tokens are barely 20k, meaning my input is bloated. so gotta fix that full night. and as I was writing this, guess what I saw.Eror 403, insufficient balance. guess im back to looking for API. god bless me with unlimited credits."}, {"post_id": 32287, "ts": "2026-07-21T11:11:58Z", "hours": 15.0, "text": "Trying to find better API for the AI Agents in Thalamus. Currently trying our Cloudflare Workers AI, in Agentoverflow, the Database Size is now 1.125Mil. I was showcasing my project in the incubator, and guess what, I was surorised to see a payment error, My API hit it’s limit somehow and I got 0 RESPONSE. I GOT HUMILIATED. for SS, I got nothing, currently working on Dynamic Compressions and stuff, als, in agentoverflow, I expect a problem in searhc, the result being not relevant. I will be sending agentoverflow to Claude Code MCP forum so the reviewers review it and put it in. here is a ss of the admin panel."}, {"post_id": 31734, "ts": "2026-07-20T11:27:54Z", "hours": 9.0, "text": "i havent slept since the last 24 hours, cause FIFA world Cup was at night, and during the day, I never sleep, so Im forcing myself to work as hell. already crossedthe 800k point. Improved the Dispatcher in Thalamus. the Thalamus test is still going on. I have started blog posting for SEO. I have indexed both sites on Google search. set both Platforms completely unrestricted and free for now. Link to both websites: https://agentoverflow.aphantic.skinticals.com/ https://thalamus.aphantic.skinticals.com/ here is SS of the AI working."}, {"post_id": 31546, "ts": "2026-07-20T01:19:26Z", "hours": 12.0, "text": "Now working o SEO and indexing, Agentoverflow db has over 730k entries. Intigrated Agentoverflow MCP into thalamus and also integrated Sketchfab MCP for 3d models in case of Gameev or projects that require a 3d model. Currently testing my Code mode. Prompt: Build a highly advanced flight sim. Also, quick question, I made this AI, so I can use my own AI to build other projects, right."}, {"post_id": 31063, "ts": "2026-07-19T04:50:28Z", "hours": 8.0, "text": "agentoverflow has 475k+ examples in dataset(total is 3.7m), and im so great, I forgot to git push and deleed my folder, great, time to redo the special feature(not releasing yet). I published my site to google analytics. Im talking with my school rn if they can take my project and make it the official school AI. my school’s beurocracy is slow as hell. so idk if it will ever happen. also, here is a ss of the admin panel(of agentoverflow)"}, {"post_id": 30698, "ts": "2026-07-18T14:21:53Z", "hours": 2.0, "text": "did the UI and animations for agentoverflow also. https://agentoverflow.aphantic.skinticals.com/"}, {"post_id": 30650, "ts": "2026-07-18T12:07:49Z", "hours": 15.0, "text": "added 3d and scroll anims to Thalamus, increased the Limits per day in Agentoverflow so it can compete with StackOverflow, currently at 300k Examples for Agentoverflow, compute is slow, will reach to 3.7m+ by 3 weeks."}, {"post_id": 30145, "ts": "2026-07-17T14:16:22Z", "hours": 4.0, "text": "Testing MCP, I am setting AI training Aside because im currently creating the database. hopefully everythng will work, this AgentOverflow is like the brilliant idea, like barely any competition. website: https://agentoverflow.aphantic.skinticals.com/ git repo: https://github.com/hardcoregamingsyle/agentoverflow currently ingesting the entire stackoverflow database, while integrating it into thalamus. will also submit agentoverflow as a tool for ClaudeCode. SS of new website."}, {"post_id": 30046, "ts": "2026-07-17T09:48:59Z", "hours": 15.0, "text": "more work on Agentoverflow, added MCP tool, currently around 10% of stackoveflow database is in this bad boy. here is a ss of what im thinking of doing next."}, {"post_id": 29402, "ts": "2026-07-16T10:20:48Z", "hours": 14.0, "text": "working on Agentoberflow, which is stackoverlow for agents, Side by side working on dynamic pipeline. For agentoverflow, as a starting point, I am adding the entire stackoverflow database, like its entire codebase, Cleaned and filtered, Vectorised, and Graphed using GraphRAG, Storing it in maybe AWS EC2 as it is the cheapest. Also working on the Agentoverflow website, though both have the same database, like the exact same database in convex so that in the future, when I want to make a My entire ecosystem at 1 place, it is very very easy for me to do. and my life is in the greatest mess possible, my parents make me constantly change setups, due to which I need my own laptop, in the sense which I got on my own with my own effort so they cant take it from me, and I also need my own phone. so I dont have to make sure that my whatsapp is logged into every device. and I am completely dropping Payments in the App because BMAC requires stripe to connect payment. here is a screenshot of the new Agentoverflow Website."}, {"post_id": 28821, "ts": "2026-07-15T10:06:51Z", "hours": 11.0, "text": "don’t ask whats going on with my self trained AI, it is in no good state, the code either works, or it doesnt, or it works but something is off. I have a new idea, under thalamus, I will have AgentOverflow AgentOverflow is like StackOverflow but for Agents, will explain it later(when I actually start to work on it) BMAC is in queue. Dynamic pipeline is kindof done, kindof undone. Desktop app turned out to be nicer than I thought. rest I have nothing to say. here is a screenshot of the desktop app build mode returning a valid output instead of an error thats all I have to say"}, {"post_id": 28252, "ts": "2026-07-14T12:22:05Z", "hours": 2.0, "text": "I was trying to put in dynamic AI coding pipeline, and guess what, My code mode compeltely crashed. My AI is still being trained(errors o errors+ hitting my weekly limit.), also,My application for Emerging Ventures got rejected because I hadnt put in all info(mb), Will reapply again. For some reason, my GravityAds Account is showing unverified Via API but verified via dashboard, and I am still working on BMAC integration for paywall, I need to figure out on the payment and stuff. this is Devpost 1 of asking for the Claude Max x20 plan in the shop. and Huggingface GPU hours credits in the shop. here is a screenshot of of my rejection letter."}, {"post_id": 27695, "ts": "2026-07-13T14:07:31Z", "hours": 10.0, "text": "gravityads yet not working, BMAC under progress, how to deploy my AI is still a question with no practical answer, I asked my parents to buy huggingface paid plan for me so I can use zeroGPU, I got a hour long lecture on How I have to escape the fake tech world, and how these people scam us. currently working on improving the feel of the desktop app and vibe coder, step-1: Give it the feel of Claude Code, Codex or any other l4 vibe coder(easy) step 2: Upgrade the feel to make it a true l4.5 Agent(near impossible level difficulty, I wont be copying anyone here, I would have to make my own definatation of L4.5) Side Quest(Very Important): Either get yourself a Good amount of GPU hours or get yourself a way to deploy your AI model somewhere. Frustration is at it’s peak. and can someone please gift me a RTX Pro 6000(Blackwell), it has 96gb of VRAM, enough to trsin a 64B Model on it and make it very very good. here is the screenshot of a response from AI in the desktop App. Now I will work on MacOS desktop app."}, {"post_id": 27099, "ts": "2026-07-12T11:22:49Z", "hours": 28.0, "text": "Adding GravityAds for some revenue(this is a startup, remember), tried to add Payment but BuyMeACoffee crashed, HCB Bank isnt in india so I had to go with BMAC, so payments is the next task, the exe had some reworks done. still looking for a way to make my $50 of AMD credits last long, also I noticed that Rather than wasting it on running, I can use the aprox 200gb of VRAM to train a very powerful AI Model in like 25 hours, and then give you all the .gguf and then it is up to you if you want to test the AI or not. also, I am now applying for Emergent Ventures(EV) and Theil Fellowship, because I need the most amount of grant possible to get this to work. and currently on a hunt to find ISOs for the QEMU VM system, I am looking for Preactivated Pro verison of Windows 10 and 11, which I think is illigal but right now, we havent launched publically yet so I dont think it matters that I am going on the illeagal path of Software Piracy, but I promise I will once use real lisenced Windows version. For MacOS, it is something that can never be on the legal route till I get a good sustainable revenue stream. Using hackintosh version of MacOS 11 to current(MacOS 26), for those who dont know, Hackintosh is just a illeagal copy of Macintosh, or the Macbooks we use, so they need the MacOS that can run on sillicon other than Apple’s sillicon so thats why they are like cracked and all. hopefully I am not banned for distributing kindof illeagal information so here is a disclaimer: educational purppouses only here is a screenshot of me trying to debug why GravityAds are not being shown(console is empty and the adslots are not there meaning something is failing silently)"}, {"post_id": 25640, "ts": "2026-07-10T01:35:38Z", "hours": 3.0, "text": "I dont get it I understand the 30% AI rule but you have to see my project is not AI slop, Its quality work. like high quality work. I am here training my own AI(new skill), and creating an AI platform which will likely enter the AI race. and im getting rejected for “ai slop”??? please look into this, also, can someone see my ship, why does it have only 35hrs logges, it should be 200+ hours. request the community to look into this."}, {"post_id": 25287, "ts": "2026-07-09T14:00:50Z", "hours": 11.0, "text": "FINALLY GOT THE EXE CODE TO COMPILE i put it in h1 because it is news that deserves h1, been batteling it for like 4 days my ship which i have sent for recertification for the 5th or 6th time is still under review Please remove this hard limit of not logging more than 10 hours in 1 go, like I cant be posting devlogs every nhow and then the exe is made, but not launching, debugging that now and with this, I am officially over 200 hours. YAYYY here is the screenshot of teh github actions completing succesfully(the .exe code compiling) also my Work on AI is still ongoing, My previous run failed my expecatitions, thistime the overall adtasets used is a bit too large(100gb+) and the slitting database code is causing errors."}, {"post_id": 25078, "ts": "2026-07-09T01:30:41Z", "hours": 17.0, "text": "and while I was thinking to upgrade the UI, I broke the .exe, like the exe is now broken. yay also my AMD credits request got approves so now I need to find a way to put my AI on AMD and such that the AI only gets activated when someone requests so that $50 lasts a long time, but in this system, Every user would have to wait for like 3 to 6 minutes for the GPU to turn on and boot, causing massive delays. Here is a screenshoot of the Github Actions failing."}, {"post_id": 24049, "ts": "2026-07-07T10:45:39Z", "hours": 29.0, "text": "Finally got th exe to open, though it has more bugs than the entire insect population, but atleast it works. thats all I care abt, here is the login Popup that is done. gotta make the UI better and fix all these bugs now. and this is only windows, I still have to do this for macOS and linux(if possible) and then publish the app on microsoft app store and apple app store"}, {"post_id": 22188, "ts": "2026-07-04T14:53:01Z", "hours": 6.0, "text": "put AI declaration, and got scammed 3 times by different websites, claiming they give free GPU hours but ended up giving nothing but takng my email. currently working on a way to host my model, working on the exact workflow that my next AI project under thalamus will use, it will be JARVIS so here is a spoiler. it will beat fable 5. and I have ran out of the weekly Claude limit on all my 5 email IDs. the instaler is still ended up being corrupt or incorrect. neither me nor AI can understand the problem here. and today i drank 3 cups of coffee instead f my usual 2. here is a screenshot of the error im recieving. and now i will send my shit for recertification again, now I have everything in place, including the AI declarations. hopefully, i wont hve to do it for the fifth or sixth time."}, {"post_id": 21434, "ts": "2026-07-03T11:53:33Z", "hours": 21.0, "text": "i will be surprised if i Dont get a migrane tommorow morning cause ive been spamming the .exe to work, the build for the .exe installer and .msi installer is failing again and again. to the shipwrights, the .exe is completely safe and virus free, there are chances that you will install a .msi instead of .exe on running, there are chances that the installer will fail, if it does, I know that it is failing and I am trying to fix it, if it works, then it works. heres a screenshot of the build failing. all I hope is that my ship gets verified this tme, 4rth time sending this bad boy for re cert."}, {"post_id": 19984, "ts": "2026-07-01T13:41:02Z", "hours": 9.0, "text": "for the Ship reviewing team sry for last re cert request, forgot that I have to reqrite m readme.md did that, now im requesting re cert again. hopeefuylly it passes this time. ps.my credits request is still pending, AMD relied that they will respond ASAP, it is under review(do companes do that) and then also sent an apology letter for the delay(why? why did they send it?). and please remove the compulsion of having a photo/ss for software projects."}, {"post_id": 19160, "ts": "2026-06-30T12:31:19Z", "hours": 8.0, "text": "I will now request Recertification, I think that I have done enough. To the reviewers, there are chances that you will get to use my self trained model if my AMD clloud credits request gets approved or my Google Cloud Instance quota gets increased, otherwise, the only change I have made is nothing. Im unable to put my AI online. SS uploaded is my kaggle account o you can see proof of AI model."}, {"post_id": 18445, "ts": "2026-06-29T16:35:31Z", "hours": 0.0, "text": "devlog: the 100-hour milestone, a humaneval script blowout, and parsing raw logs context recap (the architecture so far) for anyone catching up on the architecture overhaul: my initial ship for thalamus got rejected because the UI looked like an AI wrapper template. instead of shifting pixels, i decided to completely redo the backend engine. i’m training a custom, specialized 32B model optimized explicitly for programming logic—named thalamus-thor-1 . general fluff is scrubbed to save weight; a gemini researcher agent sub-team handles web scraping to cover info blind spots. resource-wise, it’s a tight squeeze. puter.js failed on orchestration, so i’m entirely dependent on a drying runway of AWS credits while waiting on google cloud and cheap amd gpu server approvals. with school starting in two days, i’ve also been preparing a lightweight remote framework to monitor logs and trigger test suites from school lab computers during short periods. earlier tonight, i managed to bypass kaggle’s aggressive session killers, successfully compiled the FP8/4-bit compressed weights on their tpu clusters, and immediately threw the model straight into openai’s standard 164-problem HumanEval benchmark. here is the live update from late tonight. milestone: 100 hours in the dirt first off, a quick personal timestamp: as of setting up these evaluation scripts, i have officially crossed the 100-hour mark of active development on this project. hitting triple digits while drowning in memory leaks, credit run-outs, and hardware timeouts is a brutal milestone, but the core engine is standing. the humaneval script blowout i watched the model successfully plow past problem 90, and it kept charging all the way through the end of the execution run. but right at the finish line, instead of outputting the final pass@1 score summary, the script threw a fatal calculation error and crashed out. the evaluation script generated the completions, ran the test assertions, and executed the functional verification, but the section of the code responsible for processing the final combination formula or compiling the macro-averaged percentage broke completely. standard human-eval metric scripts use an unbiased estimator calculation to evaluate pass@k: $$\\text{pass@k} = 1 - \\frac{\\binom{n-c}{k}}{\\binom{n}{k}}$$ if the array containing the total number of generated completions ($n$) or the correct passes ($c$) contains a single malformed row, a zero-division error, or an unhandled null exception from an execution timeout, the entire summary wrapper explodes. i’m staring at a broken metrics calculator, but the actual data isn’t lost. shifting to manual validation i’m not letting a broken parsing script mask the actual performance metrics of the weights after 100 hours of grind. the script managed to compile and save the fine-grained data out to the raw <input_path>_results.jsonl log file before the summary function choked. each row in that file contains the literal execution results marked cleanly as \"passed\" , \"failed\" , or \"timed out\" . instead of trying to debug the evaluator framework’s entry points tonight, i’m going to pull the raw JSON lines into a basic python script i’m writing right now. i’ll manually iterate through the rows, count the hard instances of \"passed\" across the tasks, and divide it by 164 to find the true, absolute pass@1 score myself. the raw logs are sitting in the directory. writing the cleanup parser now to see what thalamus-thor-1 actually scored."}, {"post_id": 18433, "ts": "2026-06-29T16:17:02Z", "hours": 1.0, "text": "devlog: impatient engineering, skipping the wait, and running humaneval live the project recap quick context if you’re catching up: my initial submission for thalamus got rejected because the UI looked like a boilerplate wrapper. instead of a superficial skin-deep fix, i decided to overhaul the entire backend engine and train a custom, hyper-specialized 32B model optimized strictly for heavy coding logic—named thalamus-thor-1 . conversational filler was stripped entirely from the datasets to keep the weights lean; my existing gemini agent team handles live web scraping to cover general knowledge blind spots. the resource situation is a major scramble. puter.js was too limited for my 9-agent orchestration, so i abandoned it entirely. i’m burning through the absolute last of my AWS credits while waiting on approvals for google cloud and cheap amd gpu clusters. plus, school starts in a couple days, so i’m building a lightweight remote execution layer to trigger test suites and monitor terminal logs from the school computer lab during our free periods. earlier today, after a brutal 13-hour marathon fighting out-of-memory (OOM) errors and kaggle’s session killers on deepspeed ZeRO-3 initialization spikes, i finally pushed the parameters under the threshold and successfully compiled the weights on their tpu v5e-8 kernels. here is the live update from 1.5 hours later. the midnight deployment: saying screw it the plan from my last post was to sleep on the weights and stand up the evaluation harness tomorrow morning. i lasted twenty minutes. when you spend 13 straight hours fighting initialization crashes just to get a model cooked, you don’t leave the weights sitting cold on a drive. the curiosity and momentum make it impossible to step away. i went ahead, pulled down the evaluation scripts, configured the isolation wrappers, and slammed the model directly into the testing execution loop. right now, thalamus-thor-1 is running a live trial by fire. it is chewing through openai’s standard HumanEval dataset in real-time. as of typing this, the model has already plowed past 90 out of the 164 total programming problems in the suite. the screenshot attached is the raw stdout window of my evaluation terminal. you can see the script compiling generations, feeding function signatures, and executing validation unit tests back-to-back. what the logs are proving seeing the terminal scroll through 90+ consecutive problems without dropping a syntax exception or throwing infinite token loops is an immense relief. when you compress a 32B model down to tight FP8 and 4-bit configurations while scaling the context matrix toward an 800K target using RoPE and YaRN embeddings, the mathematical margin for error is razor-thin. one wrong scale factor and the model outputs broken brackets or repeats strings indefinitely. instead, the model is executing functional correctness cleanly. it’s handling complex array manipulations, algorithmic logic, and nested structural filters completely raw. because the weights are completely unburdened by chat filler, it behaves less like a chatbot and more like a lightning-fast logic compiler—reading the docstring and immediately piping clean python code directly to the testing harness. once it clears problem 164, the system will output the final pass@1 percentage. that single number will tell the definitive truth about the token economics i calculated earlier. if the pass rate holds up against these unit tests, we are looking at a model that can genuinely compete with sonnet 4.6 on pure engineering tasks, while operating at an estimated internal compute cost of just $2 per million input tokens and $6 per million output tokens—giving my agent pipeline high-tier logic execution at the price of haiku 4.5. i’m staying up until the script hits 164. final data drops the second the testing loops finish executing."}, {"post_id": 18372, "ts": "2026-06-29T14:36:24Z", "hours": 16.0, "text": "devlog: thalamus-thor-1 is trained. recap, kaggle breakthrough, and humaneval context recap if you haven’t been tracking: my first ship attempt for thalamus got rejected because the UI looked like a generic boilerplate wrapper. instead of a superficial patch, i decided to completely overhaul the core engine and train a custom 32B model optimized strictly for raw code logic—named thalamus-thor-1 . general knowledge was stripped out during data prep to keep weights lean; my existing gemini-led researcher team handles live web scraping instead. infrastructure-wise, it’s a massive scramble. puter.js proved way too limited for my 9-agent pipeline orchestration, so i’m entirely stranded there, burning through the absolute last of my aws credits and waiting on gcp/amd approvals. also, school starts in two days, so i’m building a lightweight remote pipeline to trigger test suites and monitor logs straight from school lab machines during free periods. the kaggle breakthrough yesterday, i was stuck in deepspeed ZeRO-3 initialization hell. every time the notebook tried to load the base parameters on kaggle’s free tpu v5e-8 clusters, a massive compute spike would trigger their aggressive backend session killers, immediately dropping the kernel. i spent hours adjusting chunk prefills, gradient accumulation steps, and stripping background overhead until the initialization sequence squeezed just under the termination threshold. the run finally executed, completed its QLoRA fine-tuning passes at FP8, scaled the context toward an 800K target using RoPE and YaRN with 4-bit compression, and successfully compiled the weights. the screenshot attached to this update is the actual kaggle notebook page of my AI training notebook showing the setup. initial sanity checks compiling weights is only half the battle. when you aggressively compress a 32B model down to FP8/4-bit formats while applying long-context scaling embeddings, the positional math can warp. if it breaks, the model turns into a hallucination engine. i spun up a local instance to run direct logic checks, and the structural syntax held together perfectly. it didn’t choke on deeply nested loops, accurately referenced parameters defined deep inside large codebase contexts, and skipped conversational fluff entirely to jump straight into code execution. tomorrow’s trial: the humaneval protocol vibe checks aren’t enough. tomorrow morning, i am setting up an automated evaluation harness to run thalamus-thor-1 through the full OpenAI HumanEval dataset (164 coding problems) to calculate the raw pass@1 rate. this will prove the token economics math i did earlier: whether this custom setup can genuinely compete with sonnet 4.6 and opus 4.6 on pure engineering tasks while running at an estimated cost of $2/1M input and $6/1M output tokens (top-tier intelligence at the price of haiku 4.5). hosting is still the looming issue. permanently serving this with an extended context window requires a dedicated 80gb VRAM prompt server configuration, which i’m trying to source while my teammate builds out the social media presence to push links. on a side note, fighting package conflicts during this nightmare inspired a lightweight side-utility: a clean CLI tool for coders that natively resolves dependency hell. the core engine is working perfectly, and you can track it here: https://stardance.hackclub.com/projects/6323 evaluation metrics drop tomorrow morning. let’s see what the numbers show."}, {"post_id": 17483, "ts": "2026-06-28T08:58:36Z", "hours": 13.0, "text": "quick recap on why the scope completely escalated: my first ship attempt for thalamus got rejected because the UI looked like a generic template wrapper and the documentation felt AI-generated. instead of just patching the CSS, i decided to completely overhaul the core engine and train a custom 32B model optimized for raw code logic—named thalamus-thor-1 . here is the brutal reality of the last 24 hours: 1. the infrastructure and credit crunch i previously planned to use puter.js as a temporary backend fallback router for the claude models while training. scratch that. puter.js is way too limited for the multi-agent architecture i’m running, so i’m entirely stranded there. right now, i’m burning through the absolute last of my AWS credits. i’ve applied for google cloud credits to spin up proper GPU instances, but everything hinges on getting that approval before the AWS runway hits zero. surviving on nothing but hope and coffee. 2. 13 hours battling kaggle i spent 13 hours straight fighting out-of-memory (OOM) errors and kaggle’s infrastructure quirks. i successfully patched the local OOM issues, but now i’m hitting a wall with their session killers. the platform completely terminates the notebook due to compute spikes right when ZeRO-3 is about to initialize. the screenshot for this post is the raw kaggle output cell showing exactly where the infra drops the hammer. because of this, i’ve applied for amd gpu credits. they’re vastly cheaper than nvidia options but offer massive amounts of vram, which is exactly what a high-context 32b setup needs to handle codebase ingestions via RoPE and YaRN. 3. Social Media on the startup side, my teammate is taking over the social media presence and will start pushing updates the second the app is not hope it’s functional. 4. dependency utility side-project ironically, fighting package conflicts during this 13-hour nightmare gave me an idea for a quality-of-life tool. i built a clean CLI tool for coders that natively resolves dependency hell. the core logic is already up and running perfectly. you can track and follow the new CLI project here: https://stardance.hackclub.com/projects/6323 going back to tweaking the zero-3 configurations before the credits completely empty out."}, {"post_id": 16791, "ts": "2026-06-27T08:04:57Z", "hours": 0.0, "text": "Just saw that puter.js brand themselves as unlimited AI, they arrent actually unlimited. Now on my hunt to find something to temporarily replace Puter.js for claude requests. Gotta start training my AI fast."}, {"post_id": 16771, "ts": "2026-06-27T07:22:32Z", "hours": 5.0, "text": "finally back from my trip. i didn’t post the last update because the entire scope of what i’m doing just completely escalated. to recap: my first ship attempt for thalamus got rejected. the feedback was that the UI looked too much like a generic AI wrapper boilerplate, the README felt AI-generated, and it needed unique features. instead of just doing a superficial skin change or tweaking the CSS to look pretty, i am using this as a reason to completely redo the underlying engineering and turn this into a true L4.5 or L5 agent that destroys things like claude code. i attached a photo of my handwritten notes to this post. it maps out the exact problem statements i’m tackling and the major flaws of currently existing solutions out there. my handwriting is messy, but the technical breakdown is all there. here is the actual game plan for the AI routing and training infrastructure: right now, i am updating the app to route claude models via puter.js. to be clear, this isn’t for the user interface—puter.js is strictly my temporary backend AI router. it acts as a fallback bridge while i build out my own custom models. i’m going to benchmark my self-trained models against every single task in my 9-agent pipeline. until my model is 100% foolproof on a specific task, puter.js will keep routing that specific agent’s requests to claude. but the second my custom model qualifies and beats the benchmarks for code mode, puter.js stops getting requests for it and the pipeline switches over entirely to my model. the actual training project is running parallel to this: i’m fine-tuning a 32B model optimized explicitly for pure coding and logical tasks. training is happening via QLoRA at FP8 with a 4k/8k base context, but i’m extending the context window all the way up to 800K using RoPE and YaRN with 4-bit compression, flashattention-3, and chunked prefills so it can digest entire codebases at once. i’m doing the actual training on kaggle kernels using the 30 free weekly hours on their TPU v5e-8 clusters. based on my calculations, this model will completely fail at things like history or literature, but it doesn’t need to be good at them. my gemini researcher agent team already handles live web search and pulls fresh information for those blind spots anyway. on pure code, this thing should easily beat sonnet 4.6 and compete with opus 4.6. the token economics are insane if this works: about $2 per million input tokens and $6 per million output tokens based on max output possible per hour versus GPU compute costs. that gives me sonnet/opus level intelligence at the price of haiku 4.5. the real bottleneck right now isn’t the data or the training—it’s hosting. deploying a 32B model with an extended context window means i need to secure an 80gb VRAM per parellel prompt configuration. figuring out how to source or fund that infrastructure without incinerating cash is the main issue i’m working through while compiling the training scripts. Today i will just do the rerouting to puter.js, then start working on fine tuning the 32b model. Wish me luck."}, {"post_id": 12491, "ts": "2026-06-20T12:13:17Z", "hours": 8.0, "text": "Following the rejection of my initial shipping submission, I am pivoting to address the required refinements. I am viewing this as a system audit rather than a failure—the core engineering is stable, but the interface and documentation need to move closer to a production-grade tool. Engineering Status Module Current Status Notes 9-Agent Pipeline Stable Successfully debugged AgentRouter integration. VM Bridge Alpha QEMU bridge is operational; optimizing latency. Claude Code Workflow Ready Pipeline errors resolved; full parsing functional. Feedback Audit The review team highlighted specific areas for improvement: Interface: The current UI requires a shift from “AI-template” style to a proprietary “Control Center” aesthetic. Documentation: The README is currently AI-generated; I will rewrite it to reflect the technical architecture of the 9-agent pipeline and the VM bridge implementation. Utility: Implementing “startup-specific” features that move beyond a standard chat wrapper. Schedule & Roadmap I am entering a maintenance window due to travel. No commits will be pushed during this period. June 20: Finalizing technical walkthrough assets. June 21 - 25: OFFLINE (Maintenance Mode) . June 26: Resuming development. Priority: UI Refactor & Documentation Audit. Project Repository: https://github.com/hardcoregamingsyle/thalamus ps. for anyone wondering, use markdown to format your devposts"}, {"post_id": 11911, "ts": "2026-06-19T12:32:42Z", "hours": 10.0, "text": "today has to be my most unproductive day yet. I am vey frustrated because of some error, and when I give it to claude code, guess what, Claude code is getting errors, Like it is topping in between, or giving me error 400, 401 or 403, That is what Im doing right now. it is just not working. Like I was fixing the Agent Output parasing so the Commands are Read properly. Thought to refractor all big files, Now refractoring myself would be time consuming, so I went to claude code, and giess what, Claude code is giving me errors, And i ended up spending the same number of time working as if I wouldve done manually. but atleast my code is fine and does not have any bugs. Once the WebUI is fixed PC, I will work on WebUI for other Devices, then work on the .exe file for the VM for any OS, I havegathered the ISOs for Windows 10, Widnows 11(Both are Pro Vesions and Preactivated), MacOS 11to MacOS 16, Android 14 and Android 13, Linux, Ubuntu and other Open Source OS systems, aftre that I will work on iOS. which is byfar the most difficult one. I also have to make some changes to the Referal System and Token Deduction system, It is currently Highly overpriced. Will update yall once I make some more progress"}, {"post_id": 11346, "ts": "2026-06-18T15:39:37Z", "hours": 6.0, "text": "This is devlog so I dont think we should only send our app progressions but treat it like a communuty, so to start with it. I finally got rid of a 400 error, found out while getting rid of it, my codebase got infected with corrupted files, I am now using claude code to clean uo my codebase. also sadly, I had to delete my entir git history, which is very sad. I am now from 68 coomits to just 4(the first commit has +~70k lines as proof that i had real work). Anyways, heres a photo of 2 corrupted files which I manually found. I better get some sleep before I get a headache and weaken my eyes."}, {"post_id": 11182, "ts": "2026-06-18T09:05:52Z", "hours": 8.0, "text": "Today, I finally got the code mode and study mode to work, They are a bit slow, Im working on it, also. right now, Im busy debugging this error that Im getting by claude code, all help will be highly appriciated. My Project is ready to be shipped, Will ship it today, all that I need to do is improve the already good documentation. REQUEST: Please help me solve this error that I am again and again getting while using claude code, I changed the settings.json of the .claude folder so I can use Claude code but the API will be of Agentrouter.org so I dont hve to buy the claude Plans. It works usually but sometimes I get this error, and when I di get it, it is just annoying. Demo: https://thalamus.aphantic.skinticals.com You will have to log in for More usage and access to Code mode and Research mode, had to restrict because it costs me money whenever someone uses it."}, {"post_id": 10641, "ts": "2026-06-17T14:31:46Z", "hours": 26.0, "text": "Well because my origional vibe coder got aquired by freebuff, I spent the rest of this time migrating from vly to Claude Code, made some progress, In initial testing, I found out that code mode and study mode were broken, Working on that, also stepping up my .exe from a Electron wrapper to a natice C++, C# Desktop app, Like of Minecraft/Roblox. This is taking me some time as claude code is kinda dumb for me because im like using it as my main Agent for the first time so it will take me some time getting the hang of it, Also I have cnnected Claude code to agentrouter, which is a third party that gives $100 initial credits and then $25 a day for signing in. Using my fav multi account system to get the most of this also. Will post another devlog as soon as I make some more progress. The image uploaded is just me working on code mode."}, {"post_id": 2023, "ts": "2026-06-04T09:34:49Z", "hours": 0.0, "text": "fixing the sandbox to actually work"}]...
|
Title: Thalamus + AgentOverflow by @Hardcore_Real_ Title: Thalamus + AgentOverflow by @Hardcore_Real_Name_is_nitish | Stardance
Devlogs:
fixing the sandbox to actually work
Well because my origional vibe coder got aquired by freebuff, I spent the rest of this time migrating from vly to Claude Code, made some progress, In initial testing, I found out that code mode and study mode were broken, Working on that, also stepping up my .exe from a Electron wrapper to a natice C++, C# Desktop app, Like of Minecraft/Roblox. This is taking me some time as claude code is kinda dumb for me because im like using it as my main Agent for the first time so it will take me some time getting the hang of it, Also I have cnnected Claude code to agentrouter, which is a third party that gives $100 initial credits and then $25 a day for signing in. Using my fav multi account system to get the most of this also. Will post another devlog as soon as I make some more progress. The image uploaded is just me working on code mode.
Today, I finally got the code mode and study mode to work, They are a bit slow, Im working on it, also. right now, Im busy debugging this error that Im getting by claude code, all help will be highly appriciated. My Project is ready to be shipped, Will ship it today, all that I need to do is improve the already good documentation. REQUEST: Please help me solve this error that I am again and again getting while using claude code, I changed the settings.json of the .claude folder so I can use Claude code but the API will be of Agentrouter.org so I dont hve to buy the claude Plans. It works usually but sometimes I get this error, and when I di get it, it is just annoying. Demo: https://thalamus.aphantic.skinticals.com You will have to log in for More usage and access to Code mode and Research mode, had to restrict because it costs me money whenever someone uses it.
This is devlog so I dont think we should only send our app progressions but treat it like a communuty, so to start with it. I finally got rid of a 400 error, found out while getting rid of it, my codebase got infected with corrupted files, I am now using claude code to clean uo my codebase. also sadly, I had to delete my entir git history, which is very sad. I am now from 68 coomits to just 4(the first commit has +~70k lines as proof that i had real work). Anyways, heres a photo of 2 corrupted files which I manually found. I better get some sleep before I get a headache and weaken my eyes.
today has to be my most unproductive day yet. I am vey frustrated because of some error, and when I give it to claude code, guess what, Claude code is getting errors, Like it is topping in between, or giving me error 400, 401 or 403, That is what Im doing right now. it is just not working. Like I was fixing the Agent Output parasing so the Commands are Read properly. Thought to refractor all big files, Now refractoring myself would be time consuming, so I went to claude code, and giess what, Claude code is giving me errors, And i ended up spending the same number of time working as if I wouldve done manually. but atleast my code is fine and does not have any bugs. Once the WebUI is fixed PC, I will work on WebUI for other Devices, then work on the .exe file for the VM for any OS, I havegathered the ISOs for Windows 10, Widnows 11(Both are Pro Vesions and Preactivated), MacOS 11to MacOS 16, Android 14 and Android 13, Linux, Ubuntu and other Open Source OS systems, aftre that I will work on iOS. which is byfar the most difficult one. I also have to make some changes to the Referal System and Token Deduction system, It is currently Highly overpriced. Will update yall once I make some more progress
Following the rejection of my initial shipping submission, I am pivoting to address the required refinements. I am viewing this as a system audit rather than a failure—the core engineering is stable, but the interface and documentation need to move closer to a production-grade tool. Engineering Status Module Current Status Notes 9-Agent Pipeline Stable Successfully debugged AgentRouter integration. VM Bridge Alpha QEMU bridge is operational; optimizing latency. Claude Code Workflow Ready Pipeline errors resolved; full parsing functional. Feedback Audit The review team highlighted specific areas for improvement: Interface: The current UI requires a shift from “AI-template” style to a proprietary “Control Center” aesthetic. Documentation: The README is currently AI-generated; I will rewrite it to reflect the technical architecture of the 9-agent pipeline and the VM bridge implementation. Utility: Implementing “startup-specific” features that move beyond a standard chat wrapper. Schedule & Roadmap I am entering a maintenance window due to travel. No commits will be pushed during this period. June 20: Finalizing technical walkthrough assets. June 21 - 25: OFFLINE (Maintenance Mode) . June 26: Resuming development. Priority: UI Refactor & Documentation Audit. Project Repository: https://github.com/hardcoregamingsyle/thalamus ps. for anyone wondering, use markdown to format your devposts
finally back from my trip. i didn’t post the last update because the entire scope of what i’m doing just completely escalated. to recap: my first ship attempt for thalamus got rejected. the feedback was that the UI looked too much like a generic AI wrapper boilerplate, the README felt AI-generated, and it needed unique features. instead of just doing a superficial skin change or tweaking the CSS to look pretty, i am using this as a reason to completely redo the underlying engineering and turn this into a true L4.5 or L5 agent that destroys things like claude code. i attached a photo of my handwritten notes to this post. it maps out the exact problem statements i’m tackling and the major flaws of currently existing solutions out there. my handwriting is messy, but the technical breakdown is all there. here is the actual game plan for the AI routing and training infrastructure: right now, i am updating the app to route claude models via puter.js. to be clear, this isn’t for the user interface—puter.js is strictly my temporary backend AI router. it acts as a fallback bridge while i build out my own custom models. i’m going to benchmark my self-trained models against every single task in my 9-agent pipeline. until my model is 100% foolproof on a specific task, puter.js will keep routing that specific agent’s requests to claude. but the second my custom model qualifies and beats the benchmarks for code mode, puter.js stops getting requests for it and the pipeline switches over entirely to my model. the actual training project is running parallel to this: i’m fine-tuning a 32B model optimized explicitly for pure coding and logical tasks. training is happening via QLoRA at FP8 with a 4k/8k base context, but i’m extending the context window all the way up to 800K using RoPE and YaRN with 4-bit compression, flashattention-3, and chunked prefills so it can digest entire codebases at once. i’m doing the actual training on kaggle kernels using the 30 free weekly hours on their TPU v5e-8 clusters. based on my calculations, this model will completely fail at things like history or literature, but it doesn’t need to be good at them. my gemini researcher agent team already handles live web search and pulls fresh information for those blind spots anyway. on pure code, this thing should easily beat sonnet 4.6 and compete with opus 4.6. the token economics are insane if this works: about $2 per million input tokens and $6 per million output tokens based on max output possible per hour versus GPU compute costs. that gives me sonnet/opus level intelligence at the price of haiku 4.5. the real bottleneck right now isn’t the data or the training—it’s hosting. deploying a 32B model with an extended context window means i need to secure an 80gb VRAM per parellel prompt configuration. figuring out how to source or fund that infrastructure without incinerating cash is the main issue i’m working through while compiling the training scripts. Today i will just do the rerouting to puter.js, then start working on fine tuning the 32b model. Wish me luck.
Just saw that puter.js brand themselves as unlimited AI, they arrent actually unlimited. Now on my hunt to find something to temporarily replace Puter.js for claude requests. Gotta start training my AI fast.
quick recap on why the scope completely escalated: my first ship attempt for thalamus got rejected because the UI looked like a generic template wrapper and the documentation felt AI-generated. instead of just patching the CSS, i decided to completely overhaul the core engine and train a custom 32B model optimized for raw code logic—named thalamus-thor-1 . here is the brutal reality of the last 24 hours: 1. the infrastructure and credit crunch i previously planned to use puter.js as a temporary backend fallback router for the claude models while training. scratch that. puter.js is way too limited for the multi-agent architecture i’m running, so i’m entirely stranded there. right now, i’m burning through the absolute last of my AWS credits. i’ve applied for google cloud credits to spin up proper GPU instances, but everything hinges on getting that approval before the AWS runway hits zero. surviving on nothing but hope and coffee. 2. 13 hours battling kaggle i spent 13 hours straight fighting out-of-memory (OOM) errors and kaggle’s infrastructure quirks. i successfully patched the local OOM issues, but now i’m hitting a wall with their session killers. the platform completely terminates the notebook due to compute spikes right when ZeRO-3 is about to initialize. the screenshot for this post is the raw kaggle output cell showing exactly where the infra drops the hammer. because of this, i’ve applied for amd gpu credits. they’re vastly cheaper than nvidia options but offer massive amounts of vram, which is exactly what a high-context 32b setup needs to handle codebase ingestions via RoPE and YaRN. 3. Social Media on the startup side, my teammate is taking over the social media presence and will start pushing updates the second the app is not hope it’s functional. 4. dependency utility side-project ironically, fighting package conflicts during this 13-hour nightmare gave me an idea for a quality-of-life tool. i built a clean CLI tool for coders that natively resolves dependency hell. the core logic is already up and running perfectly. you can track and follow the new CLI project here: https://stardance.hackclub.com/projects/6323 going back to tweaking the zero-3 configurations before the credits completely empty out.
devlog: thalamus-thor-1 is trained. recap, kaggle breakthrough, and humaneval context recap if you haven’t been tracking: my first ship attempt for thalamus got rejected because the UI looked like a generic boilerplate wrapper. instead of a superficial patch, i decided to completely overhaul the core engine and train a custom 32B model optimized strictly for raw code logic—named thalamus-thor-1 . general knowledge was stripped out during data prep to keep weights lean; my existing gemini-led researcher team handles live web scraping instead. infrastructure-wise, it’s a massive scramble. puter.js proved way too limited for my 9-agent pipeline orchestration, so i’m entirely stranded there, burning through the absolute last of my aws credits and waiting on gcp/amd approvals. also, school starts in two days, so i’m building a lightweight remote pipeline to trigger test suites and monitor logs straight from school lab machines during free periods. the kaggle breakthrough yesterday, i was stuck in deepspeed ZeRO-3 initialization hell. every time the notebook tried to load the base parameters on kaggle’s free tpu v5e-8 clusters, a massive compute spike would trigger their aggressive backend session killers, immediately dropping the kernel. i spent hours adjusting chunk prefills, gradient accumulation steps, and stripping background overhead until the initialization sequence squeezed just under the termination threshold. the run finally executed, completed its QLoRA fine-tuning passes at FP8, scaled the context toward an 800K target using RoPE and YaRN with 4-bit compression, and successfully compiled the weights. the screenshot attached to this update is the actual kaggle notebook page of my AI training notebook showing the setup. initial sanity checks compiling weights is only half the battle. when you aggressively compress a 32B model down to FP8/4-bit formats while applying long-context scaling embeddings, the positional math can warp. if it breaks, the model turns into a hallucination engine. i spun up a local instance to run direct logic checks, and the structural syntax held together perfectly. it didn’t choke on deeply nested loops, accurately referenced parameters defined deep inside large codebase contexts, and skipped conversational fluff entirely to jump straight into code execution. tomorrow’s trial: the humaneval protocol vibe checks aren’t enough. tomorrow morning, i am setting up an automated evaluation harness to run thalamus-thor-1 through the full OpenAI HumanEval dataset (164 coding problems) to calculate the raw pass@1 rate. this will prove the token economics math i did earlier: whether this custom setup can genuinely compete with sonnet 4.6 and opus 4.6 on pure engineering tasks while running at an estimated cost of $2/1M input and $6/1M output tokens (top-tier intelligence at the price of haiku 4.5). hosting is still the looming issue. permanently serving this with an extended context window requires a dedicated 80gb VRAM prompt server configuration, which i’m trying to source while my teammate builds out the social media presence to push links. on a side note, fighting package conflicts during this nightmare inspired a lightweight side-utility: a clean CLI tool for coders that natively resolves dependency hell. the core engine is working perfectly, and you can track it here: https://stardance.hackclub.com/projects/6323 evaluation metrics drop tomorrow morning. let’s see what the numbers show.
devlog: impatient engineering, skipping the wait, and running humaneval live the project recap quick context if you’re catching up: my initial submission for thalamus got rejected because the UI looked like a boilerplate wrapper. instead of a superficial skin-deep fix, i decided to overhaul the entire backend engine and train a custom, hyper-specialized 32B model optimized strictly for heavy coding logic—named thalamus-thor-1 . conversational filler was stripped entirely from the datasets to keep the weights lean; my existing gemini agent team handles live web scraping to cover general knowledge blind spots. the resource situation is a major scramble. puter.js was too limited for my 9-agent orchestration, so i abandoned it entirely. i’m burning through the absolute last of my AWS credits while waiting on approvals for google cloud and cheap amd gpu clusters. plus, school starts in a couple days, so i’m building a lightweight remote execution layer to trigger test suites and monitor terminal logs from the school computer lab during our free periods. earlier today, after a brutal 13-hour marathon fighting out-of-memory (OOM) errors and kaggle’s session killers on deepspeed ZeRO-3 initialization spikes, i finally pushed the parameters under the threshold and successfully compiled the weights on their tpu v5e-8 kernels. here is the live update from 1.5 hours later. the midnight deployment: saying screw it the plan from my last post was to sleep on the weights and stand up the evaluation harness tomorrow morning. i lasted twenty minutes. when you spend 13 straight hours fighting initialization crashes just to get a model cooked, you don’t leave the weights sitting cold on a drive. the curiosity and momentum make it impossible to step away. i went ahead, pulled down the evaluation scripts, configured the isolation wrappers, and slammed the model directly into the testing execution loop. right now, thalamus-thor-1 is running a live trial by fire. it is chewing through openai’s standard HumanEval dataset in real-time. as of typing this, the model has already plowed past 90 out of the 164 total programming problems in the suite. the screenshot attached is the raw stdout window of my evaluation terminal. you can see the script compiling generations, feeding function signatures, and executing validation unit tests back-to-back. what the logs are proving seeing the terminal scroll through 90+ consecutive problems without dropping a syntax exception or throwing infinite token loops is an immense relief. when you compress a 32B model down to tight FP8 and 4-bit configurations while scaling the context matrix toward an 800K target using RoPE and YaRN embeddings, the mathematical margin for error is razor-thin. one wrong scale factor and the model outputs broken brackets or repeats strings indefinitely. instead, the model is executing functional correctness cleanly. it’s handling complex array manipulations, algorithmic logic, and nested structural filters completely raw. because the weights are completely unburdened by chat filler, it behaves less like a chatbot and more like a lightning-fast logic compiler—reading the docstring and immediately piping clean python code directly to the testing harness. once it clears problem 164, the system will output the final pass@1 percentage. that single number will tell the definitive truth about the token economics i calculated earlier. if the pass rate holds up against these unit tests, we are looking at a model that can genuinely compete with sonnet 4.6 on pure engineering tasks, while operating at an estimated internal compute cost of just $2 per million input tokens and $6 per million output tokens—giving my agent pipeline high-tier logic execution at the price of haiku 4.5. i’m staying up until the script hits 164. final data drops the second the testing loops finish executing.
devlog: the 100-hour milestone, a humaneval script blowout, and parsing raw logs context recap (the architecture so far) for anyone catching up on the architecture overhaul: my initial ship for thalamus got rejected because the UI looked like an AI wrapper template. instead of shifting pixels, i decided to completely redo the backend engine. i’m training a custom, specialized 32B model optimized explicitly for programming logic—named thalamus-thor-1 . general fluff is scrubbed to save weight; a gemini researcher agent sub-team handles web scraping to cover info blind spots. resource-wise, it’s a tight squeeze. puter.js failed on orchestration, so i’m entirely dependent on a drying runway of AWS credits while waiting on google cloud and cheap amd gpu server approvals. with school starting in two days, i’ve also been preparing a lightweight remote framework to monitor logs and trigger test suites from school lab computers during short periods. earlier tonight, i managed to bypass kaggle’s aggressive session killers, successfully compiled the FP8/4-bit compressed weights on their tpu clusters, and immediately threw the model straight into openai’s standard 164-problem HumanEval benchmark. here is the live update from late tonight. milestone: 100 hours in the dirt first off, a quick personal timestamp: as of setting up these evaluation scripts, i have officially crossed the 100-hour mark of active development on this project. hitting triple digits while drowning in memory leaks, credit run-outs, and hardware timeouts is a brutal milestone, but the core engine is standing. the humaneval script blowout i watched the model successfully plow past problem 90, and it kept charging all the way through the end of the execution run. but right at the finish line, instead of outputting the final pass@1 score summary, the script threw a fatal calculation error and crashed out. the evaluation script generated the completions, ran the test assertions, and executed the functional verification, but the section of the code responsible for processing the final combination formula or compiling the macro-averaged percentage broke completely. standard human-eval metric scripts use an unbiased estimator calculation to evaluate pass@k: $$\text{pass@k} = 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}}$$ if the array containing the total number of generated completions ($n$) or the correct passes ($c$) contains a single malformed row, a zero-division error, or an unhandled null exception from an execution timeout, the entire summary wrapper explodes. i’m staring at a broken metrics calculator, but the actual data isn’t lost. shifting to manual validation i’m not letting a broken parsing script mask the actual performance metrics of the weights after 100 hours of grind. the script managed to compile and save the fine-grained data out to the raw <input_path>_results.jsonl log file before the summary function choked. each row in that file contains the literal execution results marked cleanly as "passed" , "failed" , or "timed out" . instead of trying to debug the evaluator framework’s entry points tonight, i’m going to pull the raw JSON lines into a basic python script i’m writing right now. i’ll manually iterate through the rows, count the hard instances of "passed" across the tasks, and divide it by 164 to find the true, absolute pass@1 score myself. the raw logs are sitting in the directory. writing the cleanup parser now to see what thalamus-thor-1 actually scored.
I will now request Recertification, I think that I have done enough. To the reviewers, there are chances that you will get to use my self trained model if my AMD clloud credits request gets approved or my Google Cloud Instance quota gets increased, otherwise, the only change I have made is nothing. Im unable to put my AI online. SS uploaded is my kaggle account o you can see proof of AI model.
for the Ship reviewing team sry for last re cert request, forgot that I have to reqrite m readme.md did that, now im requesting re cert again. hopeefuylly it passes this time. ps.my credits request is still pending, AMD relied that they will respond ASAP, it is under review(do companes do that) and then also sent an apology letter for the delay(why? why did they send it?). and please remove the compulsion of having a photo/ss for software projects.
i will be surprised if i Dont get a migrane tommorow morning cause ive been spamming the .exe to work, the build for the .exe installer and .msi installer is failing again and again. to the shipwrights, the .exe is completely safe and virus free, there are chances that you will install a .msi instead of .exe on running, there are chances that the installer will fail, if it does, I know that it is failing and I am trying to fix it, if it works, then it works. heres a screenshot of the build failing. all I hope is that my ship gets verified this tme, 4rth time sending this bad boy for re cert.
put AI declaration, and got scammed 3 times by different websites, claiming they give free GPU hours but ended up giving nothing but takng my email. currently working on a way to host my model, working on the exact workflow that my next AI project under thalamus will use, it will be JARVIS so here is a spoiler. it will beat fable 5. and I have ran out of the weekly Claude limit on all my 5 email IDs. the instaler is still ended up being corrupt or incorrect. neither me nor AI can understand the problem here. and today i drank 3 cups of coffee instead f my usual 2. here is a screenshot of the error im recieving. and now i will send my shit for recertification again, now I have everything in place, including the AI declarations. hopefully, i wont hve to do it for the fifth or sixth time.
Finally got th exe to open, though it has more bugs than the entire insect population, but atleast it works. thats all I care abt, here is the login Popup that is done. gotta make the UI better and fix all these bugs now. and this is only windows, I still have to do this for macOS and linux(if possible) and then publish the app on microsoft app store and apple app store
and while I was thinking to upgrade the UI, I broke the .exe, like the exe is now broken. yay also my AMD credits request got approves so now I need to find a way to put my AI on AMD and such that the AI only gets activated when someone requests so that $50 lasts a long time, but in this system, Every user would have to wait for like 3 to 6 minutes for the GPU to turn on and boot, causing massive delays. Here is a screenshoot of the Github Actions failing.
FINALLY GOT THE EXE CODE TO COMPILE i put it in h1 because it is news that deserves h1, been batteling it for like 4 days my ship which i have sent for recertification for the 5th or 6th time is still under review Please remove this hard limit of not logging more than 10 hours in 1 go, like I cant be posting devlogs every nhow and then the exe is made, but not launching, debugging that now and with this, I am officially over 200 hours. YAYYY here is the screenshot of teh github actions completing succesfully(the .exe code compiling) also my Work on AI is still ongoing, My previous run failed my expecatitions, thistime the overall adtasets used is a bit too large(100gb+) and the slitting database code is causing errors.
I dont get it I understand the 30% AI rule but you have to see my project is not AI slop, Its quality work. like high quality work. I am here training my own AI(new skill), and creating an AI platform which will likely enter the AI race. and im getting rejected for “ai slop”??? please look into this, also, can someone see my ship, why does it have only 35hrs logges, it should be 200+ hours. request the community to look into this.
Adding GravityAds for some revenue(this is a startup, remember), tried to add Payment but BuyMeACoffee crashed, HCB Bank isnt in india so I had to go with BMAC, so payments is the next task, the exe had some reworks done. still looking for a way to make my $50 of AMD credits last long, also I noticed that Rather than wasting it on running, I can use the aprox 200gb of VRAM to train a very powerful AI Model in like 25 hours, and then give you all the .gguf and then it is up to you if you want to test the AI or not. also, I am now applying for Emergent Ventures(EV) and Theil Fellowship, because I need the most amount of grant possible to get this to work. and currently on a hunt to find ISOs for the QEMU VM system, I am looking for Preactivated Pro verison of Windows 10 and 11, which I think is illigal but right now, we havent launched publically yet so I dont think it matters that I am going on the illeagal path of Software Piracy, but I promise I will once use real lisenced Windows version. For MacOS, it is something that can never be on the legal route till I get a good sustainable revenue stream. Using hackintosh version of MacOS 11 to current(MacOS 26), for those who dont know, Hackintosh is just a illeagal copy of Macintosh, or the Macbooks we use, so they need the MacOS that can run on sillicon other than Apple’s sillicon so thats why they are like cracked and all. hopefully I am not banned for distributing kindof illeagal information so here is a disclaimer: educational purppouses only here is a screenshot of me trying to debug why GravityAds are not being shown(console is empty and the adslots are not there meaning something is failing silently)
gravityads yet not working, BMAC under progress, how to deploy my AI is still a question with no practical answer, I asked my parents to buy huggingface paid plan for me so I can use zeroGPU, I got a hour long lecture on How I have to escape the fake tech world, and how these people scam us. currently working on improving the feel of the desktop app and vibe coder, step-1: Give it the feel of Claude Code, Codex or any other l4 vibe coder(easy) step 2: Upgrade the feel to make it a true l4.5 Agent(near impossible level difficulty, I wont be copying anyone here, I would have to make my own definatation of L4.5) Side Quest(Very Important): Either get yourself a Good amount of GPU hours or get yourself a way to deploy your AI model somewhere. Frustration is at it’s peak. and can someone please gift me a RTX Pro 6000(Blackwell), it has 96gb of VRAM, enough to trsin a 64B Model on it and make it very very good. here is the screenshot of a response from AI in the desktop App. Now I will work on MacOS desktop app.
I was trying to put in dynamic AI coding pipeline, and guess what, My code mode compeltely crashed. My AI is still being trained(errors o errors+ hitting my weekly limit.), also,My application for Emerging Ventures got rejected because I hadnt put in all info(mb), Will reapply again. For some reason, my GravityAds Account is showing unverified Via API but verified via dashboard, and I am still working on BMAC integration for paywall, I need to figure out on the payment and stuff. this is Devpost 1 of asking for the Claude Max x20 plan in the shop. and Huggingface GPU hours credits in the shop. here is a screenshot of of my rejection letter.
don’t ask whats going on with my self trained AI, it is in no good state, the code either works, or it doesnt, or it works but something is off. I have a new idea, under thalamus, I will have AgentOverflow AgentOverflow is like StackOverflow but for Agents, will explain it later(when I actually start to work on it) BMAC is in queue. Dynamic pipeline is kindof done, kindof undone. Desktop app turned out to be nicer than I thought. rest I have nothing to say. here is a screenshot of the desktop app build mode returning a valid output instead of an error thats all I have to say
working on Agentoberflow, which is stackoverlow for agents, Side by side working on dynamic pipeline. For agentoverflow, as a starting point, I am adding the entire stackoverflow database, like its entire codebase, Cleaned and filtered, Vectorised, and Graphed using GraphRAG, Storing it in maybe AWS EC2 as it is the cheapest. Also working on the Agentoverflow website, though both have the same database, like the exact same database in convex so that in the future, when I want to make a My entire ecosystem at 1 place, it is very very easy for me to do. and my life is in the greatest mess possible, my parents make me constantly change setups, due to which I need my own laptop, in the sense which I got on my own with my own effort so they cant take it from me, and I also need my own phone. so I dont have to make sure that my whatsapp is logged into every device. and I am completely dropping Payments in the App because BMAC requires stripe to connect payment. here is a screenshot of the new Agentoverflow Website.
more work on Agentoverflow, added MCP tool, currently around 10% of stackoveflow database is in this bad boy. here is a ss of what im thinking of doing next.
Testing MCP, I am setting AI training Aside because im currently creating the database. hopefully everythng will work, this AgentOverflow is like the brilliant idea, like barely any competition. website: https://agentoverflow.aphantic.skinticals.com/ git repo: https://github.com/hardcoregamingsyle/agentoverflow currently ingesting the entire stackoverflow database, while integrating it into thalamus. will also submit agentoverflow as a tool for ClaudeCode. SS of new website.
added 3d and scroll anims to Thalamus, increased the Limits per day in Agentoverflow so it can compete with StackOverflow, currently at 300k Examples for Agentoverflow, compute is slow, will reach to 3.7m+ by 3 weeks.
did the UI and animations for agentoverflow also. https://agentoverflow.aphantic.skinticals.com/
agentoverflow has 475k+ examples in dataset(total is 3.7m), and im so great, I forgot to git push and deleed my folder, great, time to redo the special feature(not releasing yet). I published my site to google analytics. Im talking with my school rn if they can take my project and make it the official school AI. my school’s beurocracy is slow as hell. so idk if it will ever happen. also, here is a ss of the admin panel(of agentoverflow)
Now working o SEO and indexing, Agentoverflow db has over 730k entries. Intigrated Agentoverflow MCP into thalamus and also integrated Sketchfab MCP for 3d models in case of Gameev or projects that require a 3d model. Currently testing my Code mode. Prompt: Build a highly advanced flight sim. Also, quick question, I made this AI, so I can use my own AI to build other projects, right.
i havent slept since the last 24 hours, cause FIFA world Cup was at night, and during the day, I never sleep, so Im forcing myself to work as hell. already crossedthe 800k point. Improved the Dispatcher in Thalamus. the Thalamus test is still going on. I have started blog posting for SEO. I have indexed both sites on Google search. set both Platforms completely unrestricted and free for now. Link to both websites: https://agentoverflow.aphantic.skinticals.com/ https://thalamus.aphantic.skinticals.com/ here is SS of the AI working.
Trying to find better API for the AI Agents in Thalamus. Currently trying our Cloudflare Workers AI, in Agentoverflow, the Database Size is now 1.125Mil. I was showcasing my project in the incubator, and guess what, I was surorised to see a payment error, My API hit it’s limit somehow and I got 0 RESPONSE. I GOT HUMILIATED. for SS, I got nothing, currently working on Dynamic Compressions and stuff, als, in agentoverflow, I expect a problem in searhc, the result being not relevant. I will be sending agentoverflow to Claude Code MCP forum so the reviewers review it and put it in. here is a ss of the admin panel.
Finally, found a reliable API aource(for now). well now I can finally relax. but I wont, why, I need to fix the bug that my input tokens are at like 200k while my output tokens are barely 20k, meaning my input is bloated. so gotta fix that full night. and as I was writing this, guess what I saw.Eror 403, insufficient balance. guess im back to looking for API. god bless me with unlimited credits.
quick Update. Now im using ollama cloud wil like 3 different accounts, will exapnd this to like 50 different accounts so I never have to go on paid tier till I have the money. I was checking hackatime, And im No. 1 here is ss for proof.
my entire databse got wiped, 0 learnings. and that isnt the worst. my greatest enemy, Daal(We caal him that), literally told my crush, who was very close to me(we talked alot), and now, she avoids me. Thanks to my friends, I know why she avoids me(I skip school almost everyday). Here is a ss of the database with 0 learnings. Im broken, depressed, you can make me happy by sending a emaill to Anthropic, telling them to integrate agentoverflow directly into their tools list for code mode.
busy fixing the agentoverflow error. still working on it, no time for a detailed devlog, here is ss of admin panel, latest.
i am so done for it. i spent this entire week. trying to find out why is the admin panel showing 0 learnings. guess what. my mom deleted the VM, thinking it would remove all charges, I didnt even have a backup. great, back to square 1. and the agentoverflow admin panel has a error, trying to integrate AdMesh for Ad Revenue. Will use Modal as it is a serverless infrastructure for hosting AI models. I now need credits. allso, my mouse and keyboard are giving up on me. here is ss of error.
I purged all dad code, did a massive refractor, fixed anything broken, left nothing. both repos, around 15k lines touched(must be my most productive session.) and I am so done, my migrane is at its peak, but IDK, i cant sleep anyways so better work than stare at the ceiling. Also, AdminPanel finally works. and since I lost my entiredatabase, it will take a day or 2 for the reindexing to start, right now its just botting up, downloading the embedding model and the entire database. I am still depressed. will take me some time to recover from the emotional trauma.
I FINALLY CRACKED THE UNLIMITED VM PROBLEM. Github Actions are unlimited usage for publrepos, and for source control, we are already making a public repo, and we get a Free VM with it. I can Run iOS, MacOS, Windows, Linux and Android on it, no restrictions, completely free. WoHoo. also, now I am no longer using Closed source Models, because Open Sourced Models, if Used correctly are alot cheaper and provide the same result as any Closed Sourced Models. Agentoverflow is still working well. Will shift from google Cloud to Oracle Cloud, as Orace gives a 50% more powerful, compoletely dedicated server for free with 200gb storage, and that additional 150gb that I need costs me just under $4 a month, so It is very very viable financially. will switch to it later. I will now add a Student Mode for anyone with the email given by my school, and a teacher mode for teacher emails. Still recovering from the emotional trauma of the database loss. Added gravity Ads, need to remove alot of adslots because right now, it is spam impressions, not hih quality impressios, but still, here is ss.
polishing the VM and all, and good news, Im part of the 1 million founders, 5 day bootcamp. Its a very very god program, the onluy thing i hate about it is the dress code, like seriously, shirts and pants. why not joggers and t shirts, they are confortabel af. also, i monitored teh agentoverflow corpus, well, it had a problem, the API key of gemini to verify absolute gold tier learnings, im so dumb I waited 3 days for something to happen and only to realise forgot to set the APU key. yup, this is greatness at it’s peak. for thalamus, doing some polishing, just realised that git import diesnt work, fixing that, removing the requirement of git pat. Fixing a few more stuff. also, I just realised another problem, the database. how am I going to set up databases, like how do I set uo convex for everyone who uses this for free. well if the VM problem had a solution, this should also have a solution. API is working, tested it with claude code. Claud eput in 15 learnings for me. also, I realised that I forgot to change the sandbox tab to leave the old VM system an move on to the new Github Actions system. Also, long time I havent updated my .exe gotta do that also. Quick update- I got a Notif that I am suspiciously a fraud, like a serious fraud. the Fraud Squad app sent me the notif. after that, I am still trying to recover from the emotional trauma of the database loss. I will be angry with my mother for a bit more time(se was the one who deleted it). IK im cruel and he didnt mean it, but recovery takes time. also, For the next week, after I do the changes and fixes required, I will be using only and only thalamus to code Thalamus. right, An AI that will code itself, but I will be the one guiding it. because if I cant use it, my product aint ready for market launch. for screnshot, idk what to put. like all I did was console work and Im definately not showi my console here. the names are kindof inappropriate. so here is my old sandbox tab. Good Bye QEMU and VNC Viewer. you are getting replaced by Github(atleast they aint getting replaced by AI.)
I dont understand why is my Code mode routing going to Ollama when everyting else point to NVIDIA NIM, even the OLLAMA Fallback is Nvidia NIM, the Primary provider is convex dashboard is NIM, my ollama keys are at limits and this great code mode is pointing at NIM. whyyy. Currently working on fixing the Github sanbox. thats kindof broken. rest everything works. For some reason, even on a successful github import, it shows an error(AI slop, thats why. I made the github system with AI) . the sandbox just doesnt detect the repo. and the Hack Club Fraud Squad is sus with me(I dnt blame them, 17hrs a day for a 14yr old is suspicious.) I have migrane, I dont have glasses and my eyes are very healthy(somehow). once any 1 of my project gets reviewed and I get payout, im spending it all on hostng and AI credits so I can switch over to Oracle and Modal. Agentoverflow is still going through filteration and final review. I have cooked myself. I am still procastinating the .exe(even with AI, building a native .exe is a headache.) here is SS of the new Sandbox tab
Finally, got the routing to work properly. Everyting works now. My head is so done for it. also, I just saw something, and People like me may be the reason for it getting added. Im uploading it as the screenshot.
Everything Finally works, except the VM, it got some error, debugging that, then I just came up with a new idea(thanks to my yt feed) add a ADHD mode toggle in Chat mode and Research mode, basically ADHD in AI will I think help AI leave its very formal guided approach t problems, with the distracter, it will be jumping here and there, maybe making connections, giving us a better take at making AI good. There will also be a Brainstorm mode, the Brainstorm mode will give AI ADHD and it will help in brainstorming startup Ideas, startegies, and stuff. can someone remove this screenshot compulsion. I dont have a screenshot every devpost.
I am now doing something kind of risky. giving AI adhd. Like literal ADHD. level 2/5 and for some tasks level 2.5/5 as per my research, this should increase the output quality of AI. also checked agentoverflow compute, it’s working Okayish. claude has access to it and my limit resets tommorow, so the automated checks aint happening and I have to check manually. Here is SS of me creating a whatsapp clone as the test of this AI(hopefully this tells you what Im expecting form my AI.)
Ships:
Reviewer Notes (School Incubator Startup) Status: Built in my school’s startup incubator; some edge-case features are undergoing rapid iteration. Auth Required: Sign up via email OTP to unlock Research/Build Modes or send >3 messages (prevents API exploitation/high costs). Credits: Runs on live premium models (Claude Opus via AWS Bedrock). Minor risk of downtime if incubator credits exhaust, but we should be fine. Thalamus AI: L4.5 Agent Platform Thalamus AI (by Aphantic Corporations) is an all-purpose Level 4.5 AI ecosystem combining multi-agent workflows, deep research, and true local QEMU OS virtualization inside your browser session via a lightweight 31MB local Node.js WebSocket bridge. The 4 Core Modes Chat: Context-aware assistant for writing, planning, and summarization. Research: Synthesizes live web search with inline source citations. Study: Adaptive RAG tutor; uploads notes to auto-generate custom quizzes/solutions. Build (Code): Multi-agent pipeline building full-stack apps from plain English. 9-Agent Code Pipeline Runs asynchronously via Convex scheduled functions using smart model routing: Researcher (Haiku): Maps existing engineering benchmarks. Analyser (Haiku): Dissects product requirements and edge cases. Planner (Haiku): Graphs detailed task execution plans. Coder (Opus 4.6/4.8): Authors core logic, APIs, and databases. Optimiser (Sonnet): Refactors code for scale and algorithmic efficiency. Organizer (Haiku): Automatically structures folder/file directories. Tester (Sonnet): Generates robust end-to-end unit test suites. Hacker (Sonnet/Opus): Conducts penetration audits to patch vulnerabilities. Critic (Haiku): Acts as the final quality gate; rejects incomplete work. Native Stack & OS Virtualization OS Support: Boots Windows 11/10, macOS Sequoia/Sonoma, Linux (Ubuntu/Kali), and Android. Browser-only instant boot for Alpine/Arch Linux. Ultra-Lean Desktop: Built with Neutralinojs (uses native Edge WebView2)—only 2.2 MB total app size. Integrated with GitHub OAuth for automated commits after agent cycles....
|
1792882140.8869603
|
1793746140.8869603
|
|
1983
|
rasterminal by @PavolUlicny | Stardance
|
PavolUlicny
|
1
|
470.39
|
8580
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:24:17Z", "hours": 449.0, "multiplier": 19.99, "payout": 8580, "blessing": "neutral", "text": "rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys.", "repo": "https://github.com/PavolUlicny/rasterminal", "demo": "https://github.com/PavolUlicny/rasterminal/releases/tag/v0.1.0-alpha.2"}]...
|
[{"post_id": 70278, "ts": "202 [{"post_id": 70278, "ts": "2026-09-18T21:10:51Z", "hours": 6.11, "text": "Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now."}, {"post_id": 68728, "ts": "2026-09-15T17:06:41Z", "hours": 6.6975, "text": "Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special."}, {"post_id": 66825, "ts": "2026-09-12T18:42:57Z", "hours": 8.5847, "text": "Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps"}, {"post_id": 64252, "ts": "2026-09-08T14:55:07Z", "hours": 2.3467, "text": "Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!"}, {"post_id": 63837, "ts": "2026-09-07T20:19:19Z", "hours": 10.4164, "text": "Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping."}, {"post_id": 62122, "ts": "2026-09-05T11:43:50Z", "hours": 9.5678, "text": "Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios."}, {"post_id": 59763, "ts": "2026-09-01T18:10:34Z", "hours": 4.3639, "text": "Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less."}, {"post_id": 58964, "ts": "2026-08-31T15:12:04Z", "hours": 3.8394, "text": "Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP."}, {"post_id": 58269, "ts": "2026-08-30T17:14:59Z", "hours": 8.6936, "text": "Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell."}, {"post_id": 56881, "ts": "2026-08-28T21:26:16Z", "hours": 9.6883, "text": "I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up."}, {"post_id": 55585, "ts": "2026-08-27T15:06:53Z", "hours": 8.8714, "text": "Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find."}, {"post_id": 54695, "ts": "2026-08-25T19:14:01Z", "hours": 10.7308, "text": "Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc."}, {"post_id": 53861, "ts": "2026-08-24T15:48:08Z", "hours": 10.9639, "text": "Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them."}, {"post_id": 53278, "ts": "2026-08-23T18:46:58Z", "hours": 13.1411, "text": "Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going."}, {"post_id": 52574, "ts": "2026-08-22T19:13:37Z", "hours": 11.0969, "text": "Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799"}, {"post_id": 51884, "ts": "2026-08-21T19:41:32Z", "hours": 6.9825, "text": "Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults."}, {"post_id": 51275, "ts": "2026-08-20T20:14:42Z", "hours": 6.7119, "text": "Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup"}, {"post_id": 50683, "ts": "2026-08-20T00:07:13Z", "hours": 12.3297, "text": "Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks."}, {"post_id": 49184, "ts": "2026-08-17T20:28:00Z", "hours": 14.5689, "text": "Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…"}, {"post_id": 48227, "ts": "2026-08-16T15:09:59Z", "hours": 3.5944, "text": "My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891"}, {"post_id": 48078, "ts": "2026-08-16T11:20:07Z", "hours": 11.47, "text": "Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can."}, {"post_id": 47112, "ts": "2026-08-14T19:18:15Z", "hours": 9.0333, "text": "Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance."}, {"post_id": 46486, "ts": "2026-08-13T18:38:49Z", "hours": 10.6753, "text": "Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging."}, {"post_id": 44676, "ts": "2026-08-10T16:23:20Z", "hours": 4.0767, "text": "Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well."}, {"post_id": 44513, "ts": "2026-08-10T09:59:08Z", "hours": 6.8483, "text": "Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719"}, {"post_id": 43513, "ts": "2026-08-08T20:35:37Z", "hours": 7.6361, "text": "Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that."}, {"post_id": 42752, "ts": "2026-08-07T17:00:51Z", "hours": 3.5125, "text": "Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)"}, {"post_id": 42161, "ts": "2026-08-06T19:24:06Z", "hours": 8.2153, "text": "Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome"}, {"post_id": 39599, "ts": "2026-08-02T18:05:04Z", "hours": 7.4436, "text": "Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \\n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!"}, {"post_id": 38478, "ts": "2026-07-31T21:36:35Z", "hours": 7.7572, "text": "Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode."}, {"post_id": 37806, "ts": "2026-07-30T19:08:29Z", "hours": 2.7436, "text": "Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things."}, {"post_id": 37656, "ts": "2026-07-30T15:25:21Z", "hours": 9.285, "text": "Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design."}, {"post_id": 36697, "ts": "2026-07-28T22:28:53Z", "hours": 9.9361, "text": "Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs."}, {"post_id": 35924, "ts": "2026-07-27T17:55:43Z", "hours": 8.7953, "text": "So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916"}, {"post_id": 33607, "ts": "2026-07-23T17:38:48Z", "hours": 4.5575, "text": "Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults."}, {"post_id": 32607, "ts": "2026-07-21T21:48:11Z", "hours": 4.4442, "text": "Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:"}, {"post_id": 30923, "ts": "2026-07-18T22:17:24Z", "hours": 8.6892, "text": "Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more."}, {"post_id": 29772, "ts": "2026-07-16T21:27:23Z", "hours": 0.7175, "text": "Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!"}, {"post_id": 29484, "ts": "2026-07-16T13:40:29Z", "hours": 4.9444, "text": "Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough."}, {"post_id": 28408, "ts": "2026-07-14T17:26:16Z", "hours": 9.2258, "text": "Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation."}, {"post_id": 27302, "ts": "2026-07-12T19:23:17Z", "hours": 10.3522, "text": "Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones."}, {"post_id": 24314, "ts": "2026-07-07T20:18:01Z", "hours": 5.1908, "text": "Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty."}, {"post_id": 23070, "ts": "2026-07-05T20:10:12Z", "hours": 10.4403, "text": "Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported."}, {"post_id": 19371, "ts": "2026-06-30T17:34:50Z", "hours": 5.1925, "text": "Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without."}, {"post_id": 18685, "ts": "2026-06-29T21:27:29Z", "hours": 13.4722, "text": "Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome."}, {"post_id": 17021, "ts": "2026-06-27T17:00:39Z", "hours": 5.7733, "text": "Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path."}, {"post_id": 16313, "ts": "2026-06-26T15:28:43Z", "hours": 5.1883, "text": "Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors)."}, {"post_id": 15932, "ts": "2026-06-25T21:35:36Z", "hours": 1.9053, "text": "Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better."}, {"post_id": 15741, "ts": "2026-06-25T16:48:43Z", "hours": 4.9903, "text": "Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features."}, {"post_id": 15551, "ts": "2026-06-25T08:50:38Z", "hours": 3.7597, "text": "Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds."}, {"post_id": 15117, "ts": "2026-06-24T15:43:58Z", "hours": 6.87, "text": "Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)"}, {"post_id": 13839, "ts": "2026-06-22T17:59:12Z", "hours": 5.2097, "text": "Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)"}, {"post_id": 12798, "ts": "2026-06-20T22:37:18Z", "hours": 7.6314, "text": "Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline."}, {"post_id": 12171, "ts": "2026-06-19T21:42:34Z", "hours": 6.6653, "text": "Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)"}, {"post_id": 10115, "ts": "2026-06-16T18:24:38Z", "hours": 4.0297, "text": "Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support."}, {"post_id": 9453, "ts": "2026-06-15T20:20:25Z", "hours": 4.6839, "text": "Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:"}, {"post_id": 8652, "ts": "2026-06-14T11:36:32Z", "hours": 5.2058, "text": "Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools."}, {"post_id": 8162, "ts": "2026-06-13T16:37:29Z", "hours": 2.8394, "text": "Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell."}, {"post_id": 7990, "ts": "2026-06-13T10:20:35Z", "hours": 2.4908, "text": "Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/"}, {"post_id": 7643, "ts": "2026-06-12T19:26:54Z", "hours": 8.7975, "text": "I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else."}, {"post_id": 6791, "ts": "2026-06-11T11:35:25Z", "hours": 3.6575, "text": "Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions."}, {"post_id": 5755, "ts": "2026-06-09T17:34:17Z", "hours": 4.1133, "text": "Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main."}, {"post_id": 4897, "ts": "2026-06-08T13:53:56Z", "hours": 3.2906, "text": "Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day."}, {"post_id": 4320, "ts": "2026-06-07T16:09:10Z", "hours": 6.2586, "text": "Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes."}, {"post_id": 3846, "ts": "2026-06-06T22:11:48Z", "hours": 3.5269, "text": "I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster."}, {"post_id": 3572, "ts": "2026-06-06T15:51:49Z", "hours": 2.4386, "text": "Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now."}, {"post_id": 2939, "ts": "2026-06-05T20:55:20Z", "hours": 3.9267, "text": "I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later."}, {"post_id": 2739, "ts": "2026-06-05T14:38:57Z", "hours": 1.3417, "text": "I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it."}, {"post_id": 2631, "ts": "2026-06-05T08:21:00Z", "hours": 3.3225, "text": "Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while."}, {"post_id": 2311, "ts": "2026-06-04T18:46:14Z", "hours": 3.1892, "text": "Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this."}, {"post_id": 386, "ts": "2026-06-01T18:58:14Z", "hours": 0.6783, "text": "I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal."}, {"post_id": 359, "ts": "2026-06-01T17:59:06Z", "hours": 4.5428, "text": "Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏"}]...
|
Title: rasterminal by @PavolUlicny | Stardance
De Title: rasterminal by @PavolUlicny | Stardance
Devlogs:
Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏
I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal.
Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this.
Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while.
I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it.
I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later.
Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now.
I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster.
Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes.
Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day.
Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main.
Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions.
I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else.
Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/
Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell.
Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools.
Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:
Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support.
Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)
Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline.
Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)
Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)
Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds.
Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features.
Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better.
Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors).
Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path.
Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome.
Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without.
Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported.
Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty.
Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones.
Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation.
Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough.
Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!
Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more.
Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:
Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults.
So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916
Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs.
Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design.
Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things.
Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode.
Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!
Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome
Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)
Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that.
Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719
Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well.
Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging.
Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance.
Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can.
My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891
Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…
Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks.
Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup
Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults.
Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799
Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going.
Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them.
Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc.
Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find.
I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up.
Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell.
Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP.
Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less.
Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios.
Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping.
Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!
Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps
Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special.
Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now.
Ships:
rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys....
|
1792831867.873963
|
1792918267.873963
|
|
54189
|
Dragon Launcher by @elnix | Stardance
|
elnix
|
0
|
463.3
|
0
|
[]
|
[{"post_id": 81864, "ts": "202 [{"post_id": 81864, "ts": "2026-10-22T19:58:20Z", "hours": 5.58, "text": "Adaptative layout !! So, I’m building the adaptative layout my app needed, and some people wanted, before it was locked in a portrait orientation, but I remove that lock and build a different ui for several screens for them to adapt to the horizontal layouts. This is useful for the rotation, and the larger devices, such as the tablets"}, {"post_id": 80602, "ts": "2026-10-18T08:41:41Z", "hours": 8.3169, "text": "Various optimisations all around the app I’ve been closing issues and managed to reduce the number of them to less than 20!! And furthermore, alot o them are actually feature request that i may implement one day"}, {"post_id": 78692, "ts": "2026-10-11T09:52:15Z", "hours": 4.7783, "text": "Finally, Update 4.5.0!!!!Her’s the changelog!! 4.5.0 (Komodo) (2026-10-11) NEW Permissions tab in settings 2 modes for the dragging overlay, to choose whether to render the nests or not Add a new workspace: the apps not yet in the nests New settings to make the categories openable by clicking on them (and apps) IMPROVED Small UI improvements everywhere FIXED Big icons loading issue due to race-conditions in core points logic Small issues with reset behavior ⚠️ Play Protect Warning Due to Android restrictions, disable Play Protect during installation to avoid Dragon being blocked."}, {"post_id": 78145, "ts": "2026-10-09T19:31:33Z", "hours": 5.2208, "text": "I’ve been fixing and adding small features the recnet times, and Iwill soon release a next version! Here are the recent commits I made: feat(workspace): add not in nests workspace type, closes #450 fix(ui): improve Ui of the App detail info bottom sheet and long press popup fix(ui): change typography styles for TextWithDescription feat(ui): add switch icons un the thumb fix(i18n): Merge remote-tracking branch ‘weblate/main’ feat(top-preview): Add scale parameter for the new point preview mode fix: AppDisplayTab was resetting colors, it now resets the UISettingsStore feat(display): define 2 modes for the top display dragging overlay: new and legacy . fix(ui): move permissions tab into advanced sub-menu of main settings screen"}, {"post_id": 77557, "ts": "2026-10-07T13:37:44Z", "hours": 7.5189, "text": "4.4.2 (Smaug) 2026-10-07 [NEW] Recent apps display a recent badge (will be improved soon) [IMPROVED] Category feature dialogs rework Drawer-related bugs and rework Optimization of core functions for performance [FIXED] Bottom sheets UI fixes"}, {"post_id": 76706, "ts": "2026-10-04T11:48:27Z", "hours": 8.4739, "text": "Finished refactoring the gesture system!! So basically, after tons of ours coding this stuff, I finally launched the release, it should finish the build soon. Here’s the changelog for this version! 4.4.0 (Smaug) 2026-10-04 [NEW] Complete refactor of all gesture system (real big ngl) New locked nest system [IMPROVED] Widgets tab UI Global UI refinements [FIXED] Icon rendering logic [NOTE] Removed migration system from 4.0.0"}, {"post_id": 76370, "ts": "2026-10-03T10:24:13Z", "hours": 6.8339, "text": "Complete refactor of the whole launching process So basically, in my previous devlog, I was talking about the new feature I made, to drop the nests in a position and keep it there. but when coding it, I noticed alot of off things in my old code, that was holding there for a while now. What I did recently, is that I moved all the gesture logic to the SwipeService class (an internal injected dependency) to centralize all the gesture logic, instead of keeping spread around in Compose. I’m really proud of myself, ngl!!"}, {"post_id": 75601, "ts": "2026-09-30T15:11:22Z", "hours": 8.0675, "text": "Implementing fixed nest feature So this is an issue one of my user asked long ago, the ability to have a nest fixed in place. So I’ve been implementing this for the past couple hours, but the only issue is that I’m now againsts a wall, and I have to refactor a very bit part of the gesture system to make everything work cleanly. Basically, I am moving all the heavy gesture logic that was in Compose to a single shared viewmodel to avoid the repetitions."}, {"post_id": 74641, "ts": "2026-09-27T20:41:59Z", "hours": 3.7736, "text": "Implementing completely new initialization screen. So I’ve been workijg on this new screen after that alot of ppl asked me to make more easy their integration to the launcher. Basically this will use hte usage stats permissions to get the recent apps (and most used) on your phone, and place them one by one on the circles. By default I keep them as circles to avoid users to be lost."}, {"post_id": 73718, "ts": "2026-09-25T19:33:20Z", "hours": 8.7417, "text": "Completely reworking the points setttings gesture system. So I’m refactorging this entire screen too allowsuper fine gesture control. before there used to be abutton to toggle botween 2 modes, but now only the gestures are responsible for that!! Also, I’m created a ALL NEW initialization system to allow you to easily import your apps to the nests the first time you launch dragon"}, {"post_id": 71087, "ts": "2026-09-20T08:55:55Z", "hours": 6.4903, "text": "Refactoring the app to improve performance. So recently I’ve been refactoring the app by moving some logic inside the viewmodels, reducing the amount of RAM the app uses and this, along with some minor optimizations and small features will be the next version. (soon!) Also, i added a new button in the Preset rows to import your themes aditionaly to exporting them. All of this into a clean json you can share Lots of people have been joinning the discord since last version and that’s super cool!!!"}, {"post_id": 67407, "ts": "2026-09-13T14:37:35Z", "hours": 6.14, "text": "Complete refactor of the welcome screen: I wanted to change it since a while now, so I did it! Here’s rhe new version, its a vertical scrollable pager that fully integrates the power of gestures!! I also added an easter egg in that version, when you select the “flashbang theme” from the color theme selector, it’ll play a flashbang grenade sound🤣"}, {"post_id": 66704, "ts": "2026-09-12T16:17:03Z", "hours": 7.2258, "text": "Various optimizations and ui fix Thanks to the new stargazers on github, I’m almost at 300⭐!!! I accepted a pull request from a friend that corrects some early performance issues I fixed multiple issues that related a crash I optimized several part of the launcher that were laggy and / or did not feel smooth I refactored the color picker to have something wayyy cleaner!!"}, {"post_id": 64840, "ts": "2026-09-09T15:12:34Z", "hours": 4.3044, "text": "I released a small changes update: Updated nest managment sheet (rework) Hold menu entries setting behavior fix F-Droid reproductible builds failing Correct race crash condition in charging animation. With all these fixes, the 4.1.1 was released!!!!"}, {"post_id": 61777, "ts": "2026-09-04T21:03:22Z", "hours": 4.4594, "text": "Implemented a complete category system I worked on the PR a friend of mine has submitted. It was originally ultra buggy and it crashed. I improved the Ui and the dialogs as well as corrected the crashes."}, {"post_id": 58953, "ts": "2026-08-31T14:52:16Z", "hours": 2.5906, "text": "Implemented ktlint and formatted whole codebase I spend a lot of time actually getting ktlint to work and once it was working, I had to format alot of things myself because it was not auto-fixable by ktlint."}, {"post_id": 58232, "ts": "2026-08-30T16:18:42Z", "hours": 3.9097, "text": "New minor release: 4.1.2 So I just published some little work I did, and the reason why is that I successfully find, after many failed attemps over the months) to hide the status bar , when the app is in fullscreen and that you open a modal bottom sheet. This was android’s default behavior to alway show them and that was ugly. Also, I did some pretty heavy work implementing ktlint into the app and running the checks and formatting. I had lots of non auto-resolvable issues that I had to solve by hand, like renaming files etc… Finally, I added a CI pipeline that runs a a lint check build and unit test for each commits in order to check the app’s sanity."}, {"post_id": 57938, "ts": "2026-08-30T08:42:03Z", "hours": 2.9967, "text": "Fixing the animation with the current offset in the main screen It’s been a while now that there was a subtle bizzare bug with this animated offset, and all of this was caused by a states mishandling and disalignment. I fixed that after stuggling for 2 hours debugging Here’s the final code result: And sadly I can’t manage to share videos , so here’s a picture of what happens under the hoods"}, {"post_id": 57585, "ts": "2026-08-29T19:36:39Z", "hours": 7.3111, "text": "Working on new update: 4.1.1 I was finishing and polishing everything for the nest minor version, noethign really huge in this one, but a clear improvement of all the UI, dialogs, and performance. Here’s the new changelog for the 4.1.1: 4.1.1 (Labyrinth) 2026-08-29 [NEW] Dragon Launcher WIKI! Check on GitHub Can customize angle a which points are snapped (defaults to 15°) Complete UI refactor and old dialogs refresh [IMPROVED] Revrote global navigation system to a viewmodel for performance and stability improvements Transformed several dialogs and pickers to modal sheets [FIXED] Global UI tweaks New navigation animations Correctly clears search query Corrected floating apps not openning"}, {"post_id": 56664, "ts": "2026-08-28T14:52:08Z", "hours": 7.9608, "text": "#Started working on global app optimizations. Lots of ppl told me some part of the app lags, so I started yb duty to optimize it as much as possible. Right now, I was putting each state items to viewmodels, in order to avoid reading disk the most, and also survive configuration changes. Also I did a pretty cool update on the color picker tab"}, {"post_id": 55220, "ts": "2026-08-26T20:04:08Z", "hours": 5.0217, "text": "Continued to work on ths compose lock library I’m using an external lib to provide the lock screens to Dragon launcher, and I improved it a lot!!! Basically, I rewrote the whole pin code thing, and then also the patter lock, because the used code was a bit old."}, {"post_id": 55008, "ts": "2026-08-26T13:11:50Z", "hours": 8.0697, "text": "Working on the Lock Screen UI since Yesterday!! I was trying to improve the pin lockscreen of my app, but I ended up trying to reproduce as closely as possible the Google Pixel lock screen, as I really like it alot! In the end, I’m pretty proud of the result, even though it ain’t finished yet, but I’m quite close!!!"}, {"post_id": 54411, "ts": "2026-08-25T12:43:23Z", "hours": 329.5175, "text": "Backup of previous hours from macondo. This devlog is not meant to log hours, I’m just migrating the project from macondo (even finished) to this one. since I link the same hackatimep project, there are a coupla more hours than allowed lol"}]...
|
Title: Dragon Launcher by @elnix | Stardance
Devl Title: Dragon Launcher by @elnix | Stardance
Devlogs:
Backup of previous hours from macondo. This devlog is not meant to log hours, I’m just migrating the project from macondo (even finished) to this one. since I link the same hackatimep project, there are a coupla more hours than allowed lol
Working on the Lock Screen UI since Yesterday!! I was trying to improve the pin lockscreen of my app, but I ended up trying to reproduce as closely as possible the Google Pixel lock screen, as I really like it alot! In the end, I’m pretty proud of the result, even though it ain’t finished yet, but I’m quite close!!!
Continued to work on ths compose lock library I’m using an external lib to provide the lock screens to Dragon launcher, and I improved it a lot!!! Basically, I rewrote the whole pin code thing, and then also the patter lock, because the used code was a bit old.
#Started working on global app optimizations. Lots of ppl told me some part of the app lags, so I started yb duty to optimize it as much as possible. Right now, I was putting each state items to viewmodels, in order to avoid reading disk the most, and also survive configuration changes. Also I did a pretty cool update on the color picker tab
Working on new update: 4.1.1 I was finishing and polishing everything for the nest minor version, noethign really huge in this one, but a clear improvement of all the UI, dialogs, and performance. Here’s the new changelog for the 4.1.1: 4.1.1 (Labyrinth) 2026-08-29 [NEW] Dragon Launcher WIKI! Check on GitHub Can customize angle a which points are snapped (defaults to 15°) Complete UI refactor and old dialogs refresh [IMPROVED] Revrote global navigation system to a viewmodel for performance and stability improvements Transformed several dialogs and pickers to modal sheets [FIXED] Global UI tweaks New navigation animations Correctly clears search query Corrected floating apps not openning
Fixing the animation with the current offset in the main screen It’s been a while now that there was a subtle bizzare bug with this animated offset, and all of this was caused by a states mishandling and disalignment. I fixed that after stuggling for 2 hours debugging Here’s the final code result: And sadly I can’t manage to share videos , so here’s a picture of what happens under the hoods
New minor release: 4.1.2 So I just published some little work I did, and the reason why is that I successfully find, after many failed attemps over the months) to hide the status bar , when the app is in fullscreen and that you open a modal bottom sheet. This was android’s default behavior to alway show them and that was ugly. Also, I did some pretty heavy work implementing ktlint into the app and running the checks and formatting. I had lots of non auto-resolvable issues that I had to solve by hand, like renaming files etc… Finally, I added a CI pipeline that runs a a lint check build and unit test for each commits in order to check the app’s sanity.
Implemented ktlint and formatted whole codebase I spend a lot of time actually getting ktlint to work and once it was working, I had to format alot of things myself because it was not auto-fixable by ktlint.
Implemented a complete category system I worked on the PR a friend of mine has submitted. It was originally ultra buggy and it crashed. I improved the Ui and the dialogs as well as corrected the crashes.
I released a small changes update: Updated nest managment sheet (rework) Hold menu entries setting behavior fix F-Droid reproductible builds failing Correct race crash condition in charging animation. With all these fixes, the 4.1.1 was released!!!!
Various optimizations and ui fix Thanks to the new stargazers on github, I’m almost at 300⭐!!! I accepted a pull request from a friend that corrects some early performance issues I fixed multiple issues that related a crash I optimized several part of the launcher that were laggy and / or did not feel smooth I refactored the color picker to have something wayyy cleaner!!
Complete refactor of the welcome screen: I wanted to change it since a while now, so I did it! Here’s rhe new version, its a vertical scrollable pager that fully integrates the power of gestures!! I also added an easter egg in that version, when you select the “flashbang theme” from the color theme selector, it’ll play a flashbang grenade sound🤣
Refactoring the app to improve performance. So recently I’ve been refactoring the app by moving some logic inside the viewmodels, reducing the amount of RAM the app uses and this, along with some minor optimizations and small features will be the next version. (soon!) Also, i added a new button in the Preset rows to import your themes aditionaly to exporting them. All of this into a clean json you can share Lots of people have been joinning the discord since last version and that’s super cool!!!
Completely reworking the points setttings gesture system. So I’m refactorging this entire screen too allowsuper fine gesture control. before there used to be abutton to toggle botween 2 modes, but now only the gestures are responsible for that!! Also, I’m created a ALL NEW initialization system to allow you to easily import your apps to the nests the first time you launch dragon
Implementing completely new initialization screen. So I’ve been workijg on this new screen after that alot of ppl asked me to make more easy their integration to the launcher. Basically this will use hte usage stats permissions to get the recent apps (and most used) on your phone, and place them one by one on the circles. By default I keep them as circles to avoid users to be lost.
Implementing fixed nest feature So this is an issue one of my user asked long ago, the ability to have a nest fixed in place. So I’ve been implementing this for the past couple hours, but the only issue is that I’m now againsts a wall, and I have to refactor a very bit part of the gesture system to make everything work cleanly. Basically, I am moving all the heavy gesture logic that was in Compose to a single shared viewmodel to avoid the repetitions.
Complete refactor of the whole launching process So basically, in my previous devlog, I was talking about the new feature I made, to drop the nests in a position and keep it there. but when coding it, I noticed alot of off things in my old code, that was holding there for a while now. What I did recently, is that I moved all the gesture logic to the SwipeService class (an internal injected dependency) to centralize all the gesture logic, instead of keeping spread around in Compose. I’m really proud of myself, ngl!!
Finished refactoring the gesture system!! So basically, after tons of ours coding this stuff, I finally launched the release, it should finish the build soon. Here’s the changelog for this version! 4.4.0 (Smaug) 2026-10-04 [NEW] Complete refactor of all gesture system (real big ngl) New locked nest system [IMPROVED] Widgets tab UI Global UI refinements [FIXED] Icon rendering logic [NOTE] Removed migration system from 4.0.0
4.4.2 (Smaug) 2026-10-07 [NEW] Recent apps display a recent badge (will be improved soon) [IMPROVED] Category feature dialogs rework Drawer-related bugs and rework Optimization of core functions for performance [FIXED] Bottom sheets UI fixes
I’ve been fixing and adding small features the recnet times, and Iwill soon release a next version! Here are the recent commits I made: feat(workspace): add not in nests workspace type, closes #450 fix(ui): improve Ui of the App detail info bottom sheet and long press popup fix(ui): change typography styles for TextWithDescription feat(ui): add switch icons un the thumb fix(i18n): Merge remote-tracking branch ‘weblate/main’ feat(top-preview): Add scale parameter for the new point preview mode fix: AppDisplayTab was resetting colors, it now resets the UISettingsStore feat(display): define 2 modes for the top display dragging overlay: new and legacy . fix(ui): move permissions tab into advanced sub-menu of main settings screen
Finally, Update 4.5.0!!!!Her’s the changelog!! 4.5.0 (Komodo) (2026-10-11) NEW Permissions tab in settings 2 modes for the dragging overlay, to choose whether to render the nests or not Add a new workspace: the apps not yet in the nests New settings to make the categories openable by clicking on them (and apps) IMPROVED Small UI improvements everywhere FIXED Big icons loading issue due to race-conditions in core points logic Small issues with reset behavior ⚠️ Play Protect Warning Due to Android restrictions, disable Play Protect during installation to avoid Dragon being blocked.
Various optimisations all around the app I’ve been closing issues and managed to reduce the number of them to less than 20!! And furthermore, alot o them are actually feature request that i may implement one day
Adaptative layout !! So, I’m building the adaptative layout my app needed, and some people wanted, before it was locked in a portrait orientation, but I remove that lock and build a different ui for several screens for them to adapt to the horizontal layouts. This is useful for the rotation, and the larger devices, such as the tablets...
|
1792777991.8261201
|
1793382791.8261201
|
|
30259
|
sqush by @Dackel | Stardance
|
Dackel
|
1
|
441.32
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:54:50Z", "hours": 428.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git.", "repo": "https://github.com/DerRealeHier/sqush", "demo": "https://sqush.dev/"}]...
|
[{"post_id": 66216, "ts": "202 [{"post_id": 66216, "ts": "2026-09-11T21:59:59Z", "hours": 6.0431, "text": "added moderation Now I have an AI model that constantly scans new messages and searches for inappropriate content. If the AI finds such content the person that wrote it will be banned and every single message the user wrote will be checked for issues. Oh I forgot to mention that Copilot fixed some critical secruity vulnerabilitys for me. The user that got banned will also be put on the Wall of Shame where there is a record of every single banned Account ever on the Platform. Developers of games can also always search for not so cool content. And of course Admins can manually ban accounts. (Yeah your private messages are also getting scanned)"}, {"post_id": 66009, "ts": "2026-09-11T15:02:37Z", "hours": 6.5411, "text": "added Inventory, Card drops You can now get cards dropped by buying or reviewing games. There are 4 rarities you can get and you can also just test pull these (so you can try it out yourself). Also because of this new feature I found a Issue with the notification system I am gonna fix. You can also trade these card with others through the chat or the trade tab. And you can also forge cards together if you have to many duplicates. Because of this new feature I also found a issue with the notification system, Hopefully have it fixed tommorow."}, {"post_id": 64370, "ts": "2026-09-08T17:55:35Z", "hours": 0.7389, "text": "Didn’t know that I could format it at the shipment so there is the text again formatted. Also I fixed a little download error ( The Site didn’t have the test files in the folder) Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. Issues: The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. The good side: On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). What I didn’t do: My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git."}, {"post_id": 64237, "ts": "2026-09-08T14:23:48Z", "hours": 5.1408, "text": "looked for errors and started website Today I overlooked the site one last time and fixed secruity issues and others. I fixed Email service added an option to change the background Image of the score and made my testdata a bit more secure (had my real emails in there before). I used AI for much of the progress cause it was my first time starting a server (see commits). I ran into many issues while setting everything up."}, {"post_id": 63722, "ts": "2026-09-07T17:34:18Z", "hours": 7.1667, "text": "added dev cut and reworked Background Image I also added test Data. Thats entirely made by AI except some covers that were made by me. Cause I ain’t interactng thousands of times with my own platform. Also which background banner would you like more?"}, {"post_id": 63175, "ts": "2026-09-06T20:44:54Z", "hours": 7.1403, "text": "added roadmap So there is the list of what I have done: Public Roadmaps and Feature Voting the roadmaap can have the status (Planned/In Progress/Done) and the Types (Feature/Bug/Improvment) the dev can Drag and Drop the items into the status it is in and also mdelete it. Users can comment and upvote those Items Redesign of Game Detail site Its not 9 Buttons in one row anymore It’s seperatd into two sections. updated the sale section And I also added Unit Tests."}, {"post_id": 62518, "ts": "2026-09-05T22:36:59Z", "hours": 6.4219, "text": "fixed optimization and UI errors (and not ill anymore) So i fixed many Issues regarding the performance of the website Performance (Optimization) videos don’t get loaded instantly anymore (180ms cooldown) Search is done in memmory atribut caches and requestAnimationFrame. all countdown intervalls have been put into one. background image is done locally instead of GitHub Offscreen Cards now use content-visibility:auto. Database and Queries: SQLite changed to 64MB Cahe. made 10 indizes for Foreign Keys/Filter. Even the translator doesn’t wanna tell me what this means in English. You have to find out yourself. UI and Interaction errors js doesnt crash when pressing a button without being logged in (don’t ask how that happend) guest cart can now delete a game from their carts. when checking out and not being logged in you get forwarded to login. Didn’t actually happen before. Wishlist and card buttons now syncronize when a game is there two times or even more on the front page. It pissed me off before. collection badge gets added after animation. Thats all I wanna write for today"}, {"post_id": 61045, "ts": "2026-09-03T19:12:23Z", "hours": 10.5322, "text": "added tip jar, fixed some UI bugs So now you can tip the game devs and they can see it on their dashboard and on the game detail page. You can also add a message to your donation. And I fixed the message button that hid under the profiles in the community tab."}, {"post_id": 60467, "ts": "2026-09-02T20:05:43Z", "hours": 12.0164, "text": "added messaging , updated UI Now users can message devlopers and other ussers. They can also include game Links and Update Links so you can discuss games."}, {"post_id": 59753, "ts": "2026-09-01T18:00:53Z", "hours": 9.7142, "text": "added Readme and fixed some visual bugs Yesterday the UI looked a bit off. Especially at the unlocking of the badges. It’s now looking good."}, {"post_id": 59207, "ts": "2026-08-31T21:27:06Z", "hours": 11.2833, "text": "added profile badges It’s hard getting the badges right. Cause currently I’m only using Plain HTML and CSS for these badges. And I added the js to the HTML files. Thats much cleaner then in a seperate js file."}, {"post_id": 58172, "ts": "2026-08-30T15:09:34Z", "hours": 9.8781, "text": "cleaned up all of the backend code So yeah I’ve done it! I cleaned up all of the code and now its much easier to get through all. It’s so much better now."}, {"post_id": 57497, "ts": "2026-08-29T17:39:29Z", "hours": 5.1814, "text": "fixed the gifting system (and beginning to clean up that code) So i fixed the gifting system and I also began my work on cleaning up all of this. And as you see it doesnt look beautyfull right now if someone gifts you something but I’ll make it better."}, {"post_id": 56823, "ts": "2026-08-28T19:12:19Z", "hours": 10.8536, "text": "added gifting system and failed miserably (again) Yea I promised to make the code cleaner today. But I found out that doing that is boring. Thats why I added more features. Now I’m paying for it by having new errors pop up every few minutes. If I’d like to just feel some progress at cleaning this mess up I had to do it in small steps. (cause I ain’t fixing 3000 lines in one day) So tommorow I’ll at least try getting the first 1000 lines cleaned up again"}, {"post_id": 56200, "ts": "2026-08-27T21:06:27Z", "hours": 9.985, "text": "Fixed it ☺️ So now it’s totally possible to make new collections. No errors anymore. Also I fixed some more bugs. And tommorow I will begin cleaning up some of the code."}, {"post_id": 55149, "ts": "2026-08-26T16:57:07Z", "hours": 11.1111, "text": "added library collections (tried) Yeah so I did get to add a good UI but currently it does not work to add a collection. I will have it fixed tommorow. Most likely a minor mistae breaking everything."}, {"post_id": 54559, "ts": "2026-08-25T16:06:35Z", "hours": 10.0472, "text": "added honeypot and fixed this horrendeus cart UI So yeah I fixed the UI I had yesterday to make it look more like everything else on the store."}, {"post_id": 53985, "ts": "2026-08-24T18:17:31Z", "hours": 11.4483, "text": "added cart system So for today I added a new cart system. I know I’ve done more than epic. You can now get games into your cart and buy them later. You will also get a warning if a game is cheaper in a bundle.HTML will be fixed tommorow"}, {"post_id": 53215, "ts": "2026-08-23T17:35:14Z", "hours": 9.9589, "text": "fixed that fricking page(couldn’t buy something before) Yeah I just made a completly new route for buying bundles and also a completly new HTML page. For some reason I always find a way to make something extremly complicated"}, {"post_id": 52631, "ts": "2026-08-22T21:06:14Z", "hours": 10.3861, "text": "updated my super dubba design So yeah it should look good now. see for yourself"}, {"post_id": 51791, "ts": "2026-08-21T17:07:05Z", "hours": 11.7708, "text": "fixed backend added first HTML Page with bundles It willl look better tommorow (I PROMISE) But for now it looks like that. I also fixed the backend code so now you should actually be able to buy bundles. It will look more like the dev dashboard tommorow I just used the store.html as template."}, {"post_id": 51181, "ts": "2026-08-20T18:00:39Z", "hours": 10.2681, "text": "added backend for bundles Here a little code snippet. HTML will be finished tommorow. I hope"}, {"post_id": 50504, "ts": "2026-08-19T17:49:13Z", "hours": 10.3353, "text": "fixed the backend So you can now buy games and should get the monopoly money back when refunding it. But if I wanted to make it for a real system I would have to save the payment_tenent_id which I cxurrently don’t. But that should be a easy fix.So it should work like in that cool drawing I made."}, {"post_id": 49756, "ts": "2026-08-18T17:55:42Z", "hours": 10.4592, "text": "added Refund Handling (firs code) So I added Refund Handling for my Store. Unfourtanely I could’t finish it but I did get to finish the frontend. So what did I do. I updated the library page so its now easier to see that you can actually refund the game and how long you have until its not possible anymore. For the backend I currently have some problems with the real refund. You cant really get the money back because of how the buying of a game currently works. Especially automated refunding would be extremly hard in the current system."}, {"post_id": 49062, "ts": "2026-08-17T17:33:22Z", "hours": 12.0856, "text": "added Rate Limits Unfourtanetly I can’t push the code right now cause of github having problems with their API. So but it did take very long cause im Albert himself. So first I tried hardcoding Rate Limits with timers and stuff like that and I very much had very dumb ways to deal with it. Then I found out that Flask actually has a own Libary just for Limits. So after failing doing it my own way I just sticked with that."}, {"post_id": 48247, "ts": "2026-08-16T15:29:51Z", "hours": 12.3036, "text": "added Account Linking/fixed Hackclub auth (again) So now its getting rememberd if you also have a password and not only auth with google or hackclub. Also in the database there is a completly new columm for the hackclub ID. Backend:hackclub_callback() now also checks for Login/register or Link Modus. google_login() now accepts link mode.There are two new routes for unlinking google and hackclub. And last but not least. There is also a secruity check. The last used login methoid cant be deleted."}, {"post_id": 47643, "ts": "2026-08-15T17:49:50Z", "hours": 10.6342, "text": "fixed the hackclub auth So I finally fixed the authentication. So here is a list of all of my mistakes: Used the wrong email field; use identity.primary_emailRequested (I did not need this) use openid emailValidated state even though the callback only returned code (how do I even get to sucessfully code anything) Added duplicate OAuth routes/functions (the dumbest mistake of mine) Left the callback incomplete: no user creation, login, or redirectLogged sensitive access and refresh tokens (name me albstein) Kept Flask debug mode enabled outside local development (hopefully no one saw that) Tommorow I’ll do something. Maybe I’ll even be finished. Cause I dont know what to add anymore. If you have some recommendations just drop them off. thats the list of all current features: User registrationUsername and password login Email verification Resend email verification Email based 2FA 2FA code resend Enable or disable 2FA Change username Change email address Change password Logout Google login Hack Club login First login username setup User profiles Profile pictures Profile comments Delete profile comments Enable or disable profile comments Community page User search Follow users Unfollow users Friend requests Accept friend requests Notifications Unread notification counter Mark notifications as read User roles Developer roles Developer dashboard Create games Edit games Upload game files Upload demo files Upload screenshots Upload images Upload videos Add YouTube videos ZIP game uploads EXE game uploads Optional ClamAV malware scanning Game updates Version labels Patch notes Update history Update comments Update upvotes Update downvotes Update view counts Follow games Game update notifications Store page Genre grouping Game tags Tag filter data Game details Game descriptions Game screenshots Game videos Game view counter Positive/negative ratings Written reviews Edit reviews Helpful review votes Funny review votes Review scoring Wishlist Add to wishlist Remove from wishlist Personal game library Purchases Duplicate purchase prevention Buy page Stripe Checkout Payment success page Sales Discounts Sale end dates Automatic sale expiration Price calculation Developer revenue page Revenue per game Sales count per game Game analytics Daily view statistics Daily wishlist statistics Daily purchase statistics Daily revenue statistics Personalized game recommendations(Yeah thats real) Popular game recommendations SQLite database SQLAlchemy ORMDatabase migrations SMTP email support Firebase configuration Stripe configuration Hack Club OAuth configuration Environment variable secret configuration Please drop some recommendatins🥲"}, {"post_id": 47073, "ts": "2026-08-14T18:18:25Z", "hours": 10.4444, "text": "added hackclub auth (or atleast tried) Thats just because of me being a dum dum. You may see whats the mistake. Will have it fixed tommorow."}, {"post_id": 46511, "ts": "2026-08-13T19:48:06Z", "hours": 10.3497, "text": "Fixed the code (again) So like I said yesterday I rewrote the js. So what was the problem? Well yesterday while testing out the Site I found out that the buy button didn’t send a GET request to the backend. So when I looked at the js I first looked confused cause everything seemed to be fine. After some debugging I found out that my new feature somehow collided with the buy button (Don’t ask how) So I fixed it. Here is my totally real payment information, Everything works fine now:"}, {"post_id": 45999, "ts": "2026-08-12T20:57:45Z", "hours": 7.4628, "text": "fixed all the issues of yesterday made new ones(kinda) So I fixed the old issues you can now see the updates page and actual updates. But I began cleaning up some of the js code and I’m still not finished. So now I need to get over 100 more lines of js. Also I need to look over my python code cause well. 1800 lines of code in one file is horrendeus(At least for me) So wish me luck for tommorow!"}, {"post_id": 45326, "ts": "2026-08-11T18:24:42Z", "hours": 10.7886, "text": "Added update feed SO today I did end up making an update feed but I still have to fix some frustrating errors. You can view your own games updates these of your friends or the updates of the hole platform. You should also be able to upvote these but I currently have some errors with that."}, {"post_id": 44766, "ts": "2026-08-10T19:21:12Z", "hours": 10.5611, "text": "I’m back So I’m back from my holidays and my stress with Oracle. So I added a new simple feature and also updated some of my secruity checks. So I did test the file scanner on my PC and it turns out to be good enough. It can find malicious files and get them out before even anyone sees them. Also you can now update your game. Currently you can write what you changed but there is no way of seeing what you wrote for now. I will add that tommorow. It will just be a thread of all updates and the newest come out on top."}, {"post_id": 30891, "ts": "2026-07-18T21:16:48Z", "hours": 10.9772, "text": "Can’t show real progress because of Oracle. So I have fnished the backend and already had a plan, but Oracle had to ruin the fun. I wanted to host a VirtualMachine on Oracle Servers because I already have experience with them. But after wanting to sign up I was straight up rejected from getting the Server I paid for . They also debited my money twice (Not cool) . So now I have to wait for the support to answer me and give me some of my money back. There is a small snippet of the code:"}, {"post_id": 30418, "ts": "2026-07-17T22:52:15Z", "hours": 10.2122, "text": "It’s getting somewhere That was a lot less work than in the last days. So what have I added today? overworked Dropdown Menu Beforehands the Dropdown Menu always was a bit behind the page. Now I have fixed it and also it has become much more interactive. overworked Store Search Now the Store search has more options to search for a game. made Settings Page You can now change Important settings on the help tab. For example your Email Adress, your username, or your password. made Page to choose username when logging in with Google You can now choose a username when logging in with google. You couldn’t do that yesterday!"}, {"post_id": 29842, "ts": "2026-07-17T00:01:04Z", "hours": 11.6853, "text": "Google is not that cool 🤬 So guys like I said I finished it today so thats what I added: Basic Recommendation System So there are the three factors for the Recommendations: Tag taste: users who own a game sharing tags with your library also own the canditate Popularity: how many people in total own the candidate (Thats the least important) Similar library wishlists: users who share games with your library wishlisted the candidate All of that is done in phython, which is very dumb to do if you wanna have thousands of games. (But for that small store its enough) 2fa authentification So for that I have used firebase. For me it was extremly hard configuring this.But I made it. Also I have used a gmail address to send a potential user the verification and email confirmation. And if you dont wanna verify anything you can deactivate it with the checkmark( But please if the demo is online do it(Note: Analytics are activated on firebase )) added google login You can also login in with google. For that I had to use the most irrating API Keys. Really why is Google making it so hard? IMPORTANT: For now your Username will automatically be the name you have on you Google account."}, {"post_id": 29221, "ts": "2026-07-16T00:04:58Z", "hours": 10.5619, "text": "havent finished anything today So today I began working on something big. But I havent really made any real progress in that. I had to work around so many logic problems. Also over the course of working on this I found out that my code isn’t really optimised for much data. If this code would ever be used with 10.000 games or even more it would most likely crash. But still I will finish the feature tommorow. And also I will start a Demo site in the next days. It would be great if anyone just tested it out. Here a code snippet"}, {"post_id": 28557, "ts": "2026-07-14T21:38:29Z", "hours": 10.1431, "text": "added revenue tab and new background image So today I added a new metric to the stats page. It was really hard getting it right. Especially in the graph because I didnt wanna use the same axis for the revenue again. I also made the backround image more pixelated so it gets more of a retro look. Tomorrow I’ll begin making something big(I already did some of the work today but yeah)"}, {"post_id": 27955, "ts": "2026-07-13T21:55:59Z", "hours": 10.12, "text": "added stats page I added a stats page for every game a developer has published. You can see the history of how your game has developed. Thats why I’ve worked on the wishlist ,views and purchase features, so I can actually put them on a stats page. Adding the graph was especially hard and also saving the old datapoints was difficult. For example I had used simple Optimization like if its the same data as yesterday there will just be no new datapoint added. So there is a look at the new page::"}, {"post_id": 27383, "ts": "2026-07-12T22:09:28Z", "hours": 10.1817, "text": "added comments to user profiles I added comments to user profiles. The great thing is you can deactivate the comment tab and delete comments you dont like. It really took super long making this feature. Especially handling the errors. In the end I did make it but I still have to fix some errors tomoorow. Now I’ll go to sleep (:"}, {"post_id": 26883, "ts": "2026-07-11T22:34:49Z", "hours": 10.6103, "text": "added demos, user badge, blurred email and default picture(penguins of madagascar) overworked login, register, profile, community , game_detail , dashboard and edit game So today I added Demos you can install. I just copied the code of the game upload. I also added a user badge so you can see who is a dev and who is a user. Now youn will also not see your whole email but reade just the first three letters. (That took way too long to do) And I also overworked all of these pages so they have a look that better fits the entire store."}, {"post_id": 26225, "ts": "2026-07-10T21:46:58Z", "hours": 10.6775, "text": "added reactions to reviews and wishlist so today I already began working on bigger features. It was a bit hard to do all off this but I made it. I just found out today that you can actually migrate databases wth Flask. I always thought I had to delete the hole database and set it up again to make everything work. Also I spent around 4 hours searching for a mistake just to find out that I linked the wrong javascript file. My backend code gets worse every day. I must find a solution for that. Here my new wishlist page and the reactions:"}, {"post_id": 25527, "ts": "2026-07-09T20:53:38Z", "hours": 10.2692, "text": "fixed several bugs and commented,optimized the code So today I decided to look through all of my code and look for ways to improve. In the end I made several fixes and I’am satisfied with how it ended up. The reason I did this is because I wanna add many more features tommorow. But yesterday I already noticed that its hard to look through the code and that there were so many issues. Also some on the performance side. I believe that all errors are fixed for now. Here a code snipet:"}, {"post_id": 25006, "ts": "2026-07-08T22:20:11Z", "hours": 10.1572, "text": "added notifications, countdown for sales, friend request (not just following like yesterday) ,overworked UI aspects and reviews For the notifications I mjust had to add a new route and add it to the front end. The countdown was really hard to figure out for my but it worked out with unix time I searched for an error the entire time just to find out that my countdown was written in white on a white background. The friend request are why I added notifications. Because I wanted to let the user see who sent a request and respond to that. For the new system I had to delete the entire database to make it work. After that I added reviews. You can now give a game a thumbs up or down. The average score will be shown and your text (the review). When finishing that I overworked some of the most Important UI’s and made it much better to look at. Like you see here:"}, {"post_id": 24404, "ts": "2026-07-07T22:50:08Z", "hours": 10.1739, "text": "added views, befriending, community, paying, user profiles and searching for users So first the biggest: I added paying with Stripe . I only used the sandbox but you could basicially just add your own API Keys in an .env file and youd be able to start. The documentation was really tuff to read through but I made it with the help of a tutorial. After that I added user profiles. I just reused my game backend with the screenshots and so for the avatar. When I was finished with the unique users I started with the view system. For now it’s pretty basic and you just have to view a site for 5 seconds to count as a view. After that I added the community tab where you can search users and befriend them. Some of my error highlights: “stripe is not defined”; I forgot to add the API key. Not an error but. I hardcoded the API Keys. Already fixed but still. “Template…… unexpected” I had to delete the database because I added a new velue for it."}, {"post_id": 23753, "ts": "2026-07-06T21:37:45Z", "hours": 1.93, "text": "Libary and buying today I just added a basic libary where you can view the games added to your account and even download them and I overworked the login and register page. Tommorow I’ll begin the payment process when buying a game. For that I will use the sandbox tools of Stripe."}, {"post_id": 23122, "ts": "2026-07-05T21:45:27Z", "hours": 10.1194, "text": "Most Productive day Today was really crazy. I worked for the hole day and made some big progress. Dashboard I first added a dashboard for developers. So you can finally add a game. I used flask (python) for the backend. You can also add screenshots and youtube links or mp.4. On the homepage you can preview the games trailer by hovering over it. Secruity Also editing of the game is only possible if you are the owner of the game. So I had to add a System for User Authorization and hashing for the passwords of course. Luckily Flask did most of it.So its getting checked if you are even a developer. When you are not you dont even get the options shown to publish a game or edit one. Media I also expanded on the media upload . You can now add as many screenshots or videos as you want (Little side note: don’t keep the video upload blank). And the biggest part you can add games now. UI Changes The UI also got a big Overhaul. I have decided to use a comic style for the site. Please Note that the background image at the nav is still AI generated(Even tho I did edit it a bit too get more of a retro style) Also I fixed several error. Mostly just typos that ended up getting the hole site down. Features: I also added new features such as tags, genres, game pages, the developer dashboard, search and an edit page for the games you made."}, {"post_id": 22423, "ts": "2026-07-04T21:40:26Z", "hours": 2.1081, "text": "Interactive Home Screen with Banner Today I began overworking my initial concept from yesterday and I made some progress. The home site now has a background banner with the most important things in the nav. The background Image currently is AI generated but I will make my own in the next few days. I also made the site much more interactive. Everything you see here has an effect when hovering it. But don’t worry I didn’t exaggerate with the effects. For the pulsing Image I used the inbuild keyframes CSS has. I also blurred the text when hovering the image but that may has to be reverted tommorow. I also don’t think that I’l be able to make much more in the next 3 days. But I will try making small changes. I will most likely begin with the backend in the next week at the current pace."}, {"post_id": 21706, "ts": "2026-07-03T20:03:19Z", "hours": 2.1947, "text": "Ideas for the front end Today I only ended up making some bold prototypes for the front end in HTML and CSS. I did have a small error already because of using bootstrap. I always load up the scripts for the HTML and CSS from the Bootstrap site, and that was not a good idea. I ended up searching for an error that didn’t really exist . In the end I found out what was wrong by seeking help from gemini. Nothing else was done with the help of AI as you can see by the bad UX. I didn’t really have time for anything big so thats what I ended up with. I will make it much nicer tomorrow if I have the time to do it."}]...
|
Title: sqush by @Dackel | Stardance
Devlogs:
Idea Title: sqush by @Dackel | Stardance
Devlogs:
Ideas for the front end Today I only ended up making some bold prototypes for the front end in HTML and CSS. I did have a small error already because of using bootstrap. I always load up the scripts for the HTML and CSS from the Bootstrap site, and that was not a good idea. I ended up searching for an error that didn’t really exist . In the end I found out what was wrong by seeking help from gemini. Nothing else was done with the help of AI as you can see by the bad UX. I didn’t really have time for anything big so thats what I ended up with. I will make it much nicer tomorrow if I have the time to do it.
Interactive Home Screen with Banner Today I began overworking my initial concept from yesterday and I made some progress. The home site now has a background banner with the most important things in the nav. The background Image currently is AI generated but I will make my own in the next few days. I also made the site much more interactive. Everything you see here has an effect when hovering it. But don’t worry I didn’t exaggerate with the effects. For the pulsing Image I used the inbuild keyframes CSS has. I also blurred the text when hovering the image but that may has to be reverted tommorow. I also don’t think that I’l be able to make much more in the next 3 days. But I will try making small changes. I will most likely begin with the backend in the next week at the current pace.
Most Productive day Today was really crazy. I worked for the hole day and made some big progress. Dashboard I first added a dashboard for developers. So you can finally add a game. I used flask (python) for the backend. You can also add screenshots and youtube links or mp.4. On the homepage you can preview the games trailer by hovering over it. Secruity Also editing of the game is only possible if you are the owner of the game. So I had to add a System for User Authorization and hashing for the passwords of course. Luckily Flask did most of it.So its getting checked if you are even a developer. When you are not you dont even get the options shown to publish a game or edit one. Media I also expanded on the media upload . You can now add as many screenshots or videos as you want (Little side note: don’t keep the video upload blank). And the biggest part you can add games now. UI Changes The UI also got a big Overhaul. I have decided to use a comic style for the site. Please Note that the background image at the nav is still AI generated(Even tho I did edit it a bit too get more of a retro style) Also I fixed several error. Mostly just typos that ended up getting the hole site down. Features: I also added new features such as tags, genres, game pages, the developer dashboard, search and an edit page for the games you made.
Libary and buying today I just added a basic libary where you can view the games added to your account and even download them and I overworked the login and register page. Tommorow I’ll begin the payment process when buying a game. For that I will use the sandbox tools of Stripe.
added views, befriending, community, paying, user profiles and searching for users So first the biggest: I added paying with Stripe . I only used the sandbox but you could basicially just add your own API Keys in an .env file and youd be able to start. The documentation was really tuff to read through but I made it with the help of a tutorial. After that I added user profiles. I just reused my game backend with the screenshots and so for the avatar. When I was finished with the unique users I started with the view system. For now it’s pretty basic and you just have to view a site for 5 seconds to count as a view. After that I added the community tab where you can search users and befriend them. Some of my error highlights: “stripe is not defined”; I forgot to add the API key. Not an error but. I hardcoded the API Keys. Already fixed but still. “Template…… unexpected” I had to delete the database because I added a new velue for it.
added notifications, countdown for sales, friend request (not just following like yesterday) ,overworked UI aspects and reviews For the notifications I mjust had to add a new route and add it to the front end. The countdown was really hard to figure out for my but it worked out with unix time I searched for an error the entire time just to find out that my countdown was written in white on a white background. The friend request are why I added notifications. Because I wanted to let the user see who sent a request and respond to that. For the new system I had to delete the entire database to make it work. After that I added reviews. You can now give a game a thumbs up or down. The average score will be shown and your text (the review). When finishing that I overworked some of the most Important UI’s and made it much better to look at. Like you see here:
fixed several bugs and commented,optimized the code So today I decided to look through all of my code and look for ways to improve. In the end I made several fixes and I’am satisfied with how it ended up. The reason I did this is because I wanna add many more features tommorow. But yesterday I already noticed that its hard to look through the code and that there were so many issues. Also some on the performance side. I believe that all errors are fixed for now. Here a code snipet:
added reactions to reviews and wishlist so today I already began working on bigger features. It was a bit hard to do all off this but I made it. I just found out today that you can actually migrate databases wth Flask. I always thought I had to delete the hole database and set it up again to make everything work. Also I spent around 4 hours searching for a mistake just to find out that I linked the wrong javascript file. My backend code gets worse every day. I must find a solution for that. Here my new wishlist page and the reactions:
added demos, user badge, blurred email and default picture(penguins of madagascar) overworked login, register, profile, community , game_detail , dashboard and edit game So today I added Demos you can install. I just copied the code of the game upload. I also added a user badge so you can see who is a dev and who is a user. Now youn will also not see your whole email but reade just the first three letters. (That took way too long to do) And I also overworked all of these pages so they have a look that better fits the entire store.
added comments to user profiles I added comments to user profiles. The great thing is you can deactivate the comment tab and delete comments you dont like. It really took super long making this feature. Especially handling the errors. In the end I did make it but I still have to fix some errors tomoorow. Now I’ll go to sleep (:
added stats page I added a stats page for every game a developer has published. You can see the history of how your game has developed. Thats why I’ve worked on the wishlist ,views and purchase features, so I can actually put them on a stats page. Adding the graph was especially hard and also saving the old datapoints was difficult. For example I had used simple Optimization like if its the same data as yesterday there will just be no new datapoint added. So there is a look at the new page::
added revenue tab and new background image So today I added a new metric to the stats page. It was really hard getting it right. Especially in the graph because I didnt wanna use the same axis for the revenue again. I also made the backround image more pixelated so it gets more of a retro look. Tomorrow I’ll begin making something big(I already did some of the work today but yeah)
havent finished anything today So today I began working on something big. But I havent really made any real progress in that. I had to work around so many logic problems. Also over the course of working on this I found out that my code isn’t really optimised for much data. If this code would ever be used with 10.000 games or even more it would most likely crash. But still I will finish the feature tommorow. And also I will start a Demo site in the next days. It would be great if anyone just tested it out. Here a code snippet
Google is not that cool 🤬 So guys like I said I finished it today so thats what I added: Basic Recommendation System So there are the three factors for the Recommendations: Tag taste: users who own a game sharing tags with your library also own the canditate Popularity: how many people in total own the candidate (Thats the least important) Similar library wishlists: users who share games with your library wishlisted the candidate All of that is done in phython, which is very dumb to do if you wanna have thousands of games. (But for that small store its enough) 2fa authentification So for that I have used firebase. For me it was extremly hard configuring this.But I made it. Also I have used a gmail address to send a potential user the verification and email confirmation. And if you dont wanna verify anything you can deactivate it with the checkmark( But please if the demo is online do it(Note: Analytics are activated on firebase )) added google login You can also login in with google. For that I had to use the most irrating API Keys. Really why is Google making it so hard? IMPORTANT: For now your Username will automatically be the name you have on you Google account.
It’s getting somewhere That was a lot less work than in the last days. So what have I added today? overworked Dropdown Menu Beforehands the Dropdown Menu always was a bit behind the page. Now I have fixed it and also it has become much more interactive. overworked Store Search Now the Store search has more options to search for a game. made Settings Page You can now change Important settings on the help tab. For example your Email Adress, your username, or your password. made Page to choose username when logging in with Google You can now choose a username when logging in with google. You couldn’t do that yesterday!
Can’t show real progress because of Oracle. So I have fnished the backend and already had a plan, but Oracle had to ruin the fun. I wanted to host a VirtualMachine on Oracle Servers because I already have experience with them. But after wanting to sign up I was straight up rejected from getting the Server I paid for . They also debited my money twice (Not cool) . So now I have to wait for the support to answer me and give me some of my money back. There is a small snippet of the code:
I’m back So I’m back from my holidays and my stress with Oracle. So I added a new simple feature and also updated some of my secruity checks. So I did test the file scanner on my PC and it turns out to be good enough. It can find malicious files and get them out before even anyone sees them. Also you can now update your game. Currently you can write what you changed but there is no way of seeing what you wrote for now. I will add that tommorow. It will just be a thread of all updates and the newest come out on top.
Added update feed SO today I did end up making an update feed but I still have to fix some frustrating errors. You can view your own games updates these of your friends or the updates of the hole platform. You should also be able to upvote these but I currently have some errors with that.
fixed all the issues of yesterday made new ones(kinda) So I fixed the old issues you can now see the updates page and actual updates. But I began cleaning up some of the js code and I’m still not finished. So now I need to get over 100 more lines of js. Also I need to look over my python code cause well. 1800 lines of code in one file is horrendeus(At least for me) So wish me luck for tommorow!
Fixed the code (again) So like I said yesterday I rewrote the js. So what was the problem? Well yesterday while testing out the Site I found out that the buy button didn’t send a GET request to the backend. So when I looked at the js I first looked confused cause everything seemed to be fine. After some debugging I found out that my new feature somehow collided with the buy button (Don’t ask how) So I fixed it. Here is my totally real payment information, Everything works fine now:
added hackclub auth (or atleast tried) Thats just because of me being a dum dum. You may see whats the mistake. Will have it fixed tommorow.
fixed the hackclub auth So I finally fixed the authentication. So here is a list of all of my mistakes: Used the wrong email field; use identity.primary_emailRequested (I did not need this) use openid emailValidated state even though the callback only returned code (how do I even get to sucessfully code anything) Added duplicate OAuth routes/functions (the dumbest mistake of mine) Left the callback incomplete: no user creation, login, or redirectLogged sensitive access and refresh tokens (name me albstein) Kept Flask debug mode enabled outside local development (hopefully no one saw that) Tommorow I’ll do something. Maybe I’ll even be finished. Cause I dont know what to add anymore. If you have some recommendations just drop them off. thats the list of all current features: User registrationUsername and password login Email verification Resend email verification Email based 2FA 2FA code resend Enable or disable 2FA Change username Change email address Change password Logout Google login Hack Club login First login username setup User profiles Profile pictures Profile comments Delete profile comments Enable or disable profile comments Community page User search Follow users Unfollow users Friend requests Accept friend requests Notifications Unread notification counter Mark notifications as read User roles Developer roles Developer dashboard Create games Edit games Upload game files Upload demo files Upload screenshots Upload images Upload videos Add YouTube videos ZIP game uploads EXE game uploads Optional ClamAV malware scanning Game updates Version labels Patch notes Update history Update comments Update upvotes Update downvotes Update view counts Follow games Game update notifications Store page Genre grouping Game tags Tag filter data Game details Game descriptions Game screenshots Game videos Game view counter Positive/negative ratings Written reviews Edit reviews Helpful review votes Funny review votes Review scoring Wishlist Add to wishlist Remove from wishlist Personal game library Purchases Duplicate purchase prevention Buy page Stripe Checkout Payment success page Sales Discounts Sale end dates Automatic sale expiration Price calculation Developer revenue page Revenue per game Sales count per game Game analytics Daily view statistics Daily wishlist statistics Daily purchase statistics Daily revenue statistics Personalized game recommendations(Yeah thats real) Popular game recommendations SQLite database SQLAlchemy ORMDatabase migrations SMTP email support Firebase configuration Stripe configuration Hack Club OAuth configuration Environment variable secret configuration Please drop some recommendatins🥲
added Account Linking/fixed Hackclub auth (again) So now its getting rememberd if you also have a password and not only auth with google or hackclub. Also in the database there is a completly new columm for the hackclub ID. Backend:hackclub_callback() now also checks for Login/register or Link Modus. google_login() now accepts link mode.There are two new routes for unlinking google and hackclub. And last but not least. There is also a secruity check. The last used login methoid cant be deleted.
added Rate Limits Unfourtanetly I can’t push the code right now cause of github having problems with their API. So but it did take very long cause im Albert himself. So first I tried hardcoding Rate Limits with timers and stuff like that and I very much had very dumb ways to deal with it. Then I found out that Flask actually has a own Libary just for Limits. So after failing doing it my own way I just sticked with that.
added Refund Handling (firs code) So I added Refund Handling for my Store. Unfourtanely I could’t finish it but I did get to finish the frontend. So what did I do. I updated the library page so its now easier to see that you can actually refund the game and how long you have until its not possible anymore. For the backend I currently have some problems with the real refund. You cant really get the money back because of how the buying of a game currently works. Especially automated refunding would be extremly hard in the current system.
fixed the backend So you can now buy games and should get the monopoly money back when refunding it. But if I wanted to make it for a real system I would have to save the payment_tenent_id which I cxurrently don’t. But that should be a easy fix.So it should work like in that cool drawing I made.
added backend for bundles Here a little code snippet. HTML will be finished tommorow. I hope
fixed backend added first HTML Page with bundles It willl look better tommorow (I PROMISE) But for now it looks like that. I also fixed the backend code so now you should actually be able to buy bundles. It will look more like the dev dashboard tommorow I just used the store.html as template.
updated my super dubba design So yeah it should look good now. see for yourself
fixed that fricking page(couldn’t buy something before) Yeah I just made a completly new route for buying bundles and also a completly new HTML page. For some reason I always find a way to make something extremly complicated
added cart system So for today I added a new cart system. I know I’ve done more than epic. You can now get games into your cart and buy them later. You will also get a warning if a game is cheaper in a bundle.HTML will be fixed tommorow
added honeypot and fixed this horrendeus cart UI So yeah I fixed the UI I had yesterday to make it look more like everything else on the store.
added library collections (tried) Yeah so I did get to add a good UI but currently it does not work to add a collection. I will have it fixed tommorow. Most likely a minor mistae breaking everything.
Fixed it ☺️ So now it’s totally possible to make new collections. No errors anymore. Also I fixed some more bugs. And tommorow I will begin cleaning up some of the code.
added gifting system and failed miserably (again) Yea I promised to make the code cleaner today. But I found out that doing that is boring. Thats why I added more features. Now I’m paying for it by having new errors pop up every few minutes. If I’d like to just feel some progress at cleaning this mess up I had to do it in small steps. (cause I ain’t fixing 3000 lines in one day) So tommorow I’ll at least try getting the first 1000 lines cleaned up again
fixed the gifting system (and beginning to clean up that code) So i fixed the gifting system and I also began my work on cleaning up all of this. And as you see it doesnt look beautyfull right now if someone gifts you something but I’ll make it better.
cleaned up all of the backend code So yeah I’ve done it! I cleaned up all of the code and now its much easier to get through all. It’s so much better now.
added profile badges It’s hard getting the badges right. Cause currently I’m only using Plain HTML and CSS for these badges. And I added the js to the HTML files. Thats much cleaner then in a seperate js file.
added Readme and fixed some visual bugs Yesterday the UI looked a bit off. Especially at the unlocking of the badges. It’s now looking good.
added messaging , updated UI Now users can message devlopers and other ussers. They can also include game Links and Update Links so you can discuss games.
added tip jar, fixed some UI bugs So now you can tip the game devs and they can see it on their dashboard and on the game detail page. You can also add a message to your donation. And I fixed the message button that hid under the profiles in the community tab.
fixed optimization and UI errors (and not ill anymore) So i fixed many Issues regarding the performance of the website Performance (Optimization) videos don’t get loaded instantly anymore (180ms cooldown) Search is done in memmory atribut caches and requestAnimationFrame. all countdown intervalls have been put into one. background image is done locally instead of GitHub Offscreen Cards now use content-visibility:auto. Database and Queries: SQLite changed to 64MB Cahe. made 10 indizes for Foreign Keys/Filter. Even the translator doesn’t wanna tell me what this means in English. You have to find out yourself. UI and Interaction errors js doesnt crash when pressing a button without being logged in (don’t ask how that happend) guest cart can now delete a game from their carts. when checking out and not being logged in you get forwarded to login. Didn’t actually happen before. Wishlist and card buttons now syncronize when a game is there two times or even more on the front page. It pissed me off before. collection badge gets added after animation. Thats all I wanna write for today
added roadmap So there is the list of what I have done: Public Roadmaps and Feature Voting the roadmaap can have the status (Planned/In Progress/Done) and the Types (Feature/Bug/Improvment) the dev can Drag and Drop the items into the status it is in and also mdelete it. Users can comment and upvote those Items Redesign of Game Detail site Its not 9 Buttons in one row anymore It’s seperatd into two sections. updated the sale section And I also added Unit Tests.
added dev cut and reworked Background Image I also added test Data. Thats entirely made by AI except some covers that were made by me. Cause I ain’t interactng thousands of times with my own platform. Also which background banner would you like more?
looked for errors and started website Today I overlooked the site one last time and fixed secruity issues and others. I fixed Email service added an option to change the background Image of the score and made my testdata a bit more secure (had my real emails in there before). I used AI for much of the progress cause it was my first time starting a server (see commits). I ran into many issues while setting everything up.
Didn’t know that I could format it at the shipment so there is the text again formatted. Also I fixed a little download error ( The Site didn’t have the test files in the folder) Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. Issues: The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. The good side: On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). What I didn’t do: My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git.
added Inventory, Card drops You can now get cards dropped by buying or reviewing games. There are 4 rarities you can get and you can also just test pull these (so you can try it out yourself). Also because of this new feature I found a Issue with the notification system I am gonna fix. You can also trade these card with others through the chat or the trade tab. And you can also forge cards together if you have to many duplicates. Because of this new feature I also found a issue with the notification system, Hopefully have it fixed tommorow.
added moderation Now I have an AI model that constantly scans new messages and searches for inappropriate content. If the AI finds such content the person that wrote it will be banned and every single message the user wrote will be checked for issues. Oh I forgot to mention that Copilot fixed some critical secruity vulnerabilitys for me. The user that got banned will also be put on the Wall of Shame where there is a record of every single banned Account ever on the Platform. Developers of games can also always search for not so cool content. And of course Admins can manually ban accounts. (Yeah your private messages are also getting scanned)
Ships:
Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git....
|
1792878701.8847983
|
1793742701.8847983
|
|
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
|
|
29716
|
NYX by @Paulaner | Stardance
|
Paulaner
|
1
|
421.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-13T15:54:07Z", "hours": 421.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "nyx is a small operating-system kernel for 32-bit x86 PCs, written from scratch in Zig 0.15.2 with no C library and no external dependencies. It boots directly in QEMU and brings the machine up in 20 checked stages, from interrupts and timers through memory paging, a kernel heap, thread scheduling, disk and PCI drivers, and an in-memory filesystem loaded from an embedded tar archive. At boot it runs 15 built-in self-tests, then drops into an interactive shell with 30 commands that you can drive from the keyboard or over the serial port. It’s about 5,000 lines in total.", "repo": "https://github.com/Paul231007/nyx", "demo": "https://nyx-zeta-opal.vercel.app/"}]...
|
[{"post_id": 68723, "ts": "202 [{"post_id": 68723, "ts": "2026-09-15T16:57:50Z", "hours": 7.0203, "text": "📓 devlog · 2026-09-14 added initial architecture definition, establishing core components and their interactions for modularity. implemented key architectural components, focusing on separation of concerns to enhance maintainability. fleshed out various parts of the architecture, refining data flow and control structures between modules. wired up essential components to ensure proper communication and data exchange across the architecture. started multiple architectural elements concurrently, facilitating a more integrated approach to development. added several new architecture layers to improve scalability and support future feature additions. continued to implement and refine architecture, addressing edge cases related to component interaction and data integrity."}, {"post_id": 67883, "ts": "2026-09-14T05:39:42Z", "hours": 6.0667, "text": "📓 devlog · 2026-09-13 added initial implementation of the shell, establishing basic command parsing and execution flow. fleshed out shell functionality, improving command handling and improving error reporting for invalid inputs. wired up shell components, ensuring proper integration with existing modules for input and output processing. started multiple iterations of shell refinement, focusing on memory allocation strategies for command history storage. implemented additional features for the shell, including support for built-in commands and improved environment variable management. continued to flesh out shell behavior, addressing edge cases related to command substitution and pipeline execution."}, {"post_id": 67063, "ts": "2026-09-13T03:32:24Z", "hours": 10.8517, "text": "📓 devlog · 2026-09-12 implemented memory management, focused on allocation strategies and freeing unused memory blocks to optimize resource usage. fleshed out memory module, added support for variable-sized memory chunks, improving efficiency for dynamic allocation. started integration of memory system with existing components, ensuring compatibility and smooth data flow. added shell functionality, enabling user interaction with the memory management system through command-line inputs. wired up shell to the memory module, establishing command execution pathways for memory operations. performed multiple wiring adjustments in the shell, ensuring proper communication and error handling between components."}, {"post_id": 66150, "ts": "2026-09-11T19:42:45Z", "hours": 1.7425, "text": "📓 devlog · 2026-09-11 implemented the shell module, established basic command parsing and execution flow. fleshed out the shell with support for built-in commands, enhancing user interaction. added memory management functionality, introduced a structure for allocation tracking. wired up memory to the shell, enabling commands to manipulate memory directly. performed multiple whitespace fixes and formatting cleanups across all modules for better readability. started and fleshed out the memory module, ensuring proper initialization and allocation patterns. tidied shell code for improved maintainability, focusing on reducing complexity in command handling."}, {"post_id": 65818, "ts": "2026-09-11T06:38:13Z", "hours": 6.0333, "text": "📓 devlog · 2026-09-10 implemented the filesystem (fs), focused on directory structure and file allocation strategies for improved access speed. wired up the fs to ensure proper integration with existing modules, tested data flow between components during initial operations. started the shell, establishing basic command parsing and execution control flow to interface with the filesystem. added memory management capabilities, implemented a new allocation strategy to minimize fragmentation and optimize performance. cleaned up the shell code for readability, removed redundant whitespace to maintain consistent coding standards across the project. performed additional wiring for memory to ensure it interacts correctly with both the filesystem and shell for seamless operation. fleshed out the fs with additional features like file permissions and metadata handling, ensuring robustness for concurrent access."}, {"post_id": 65255, "ts": "2026-09-10T08:03:20Z", "hours": 6.4386, "text": "📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts. 📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts."}, {"post_id": 64632, "ts": "2026-09-09T05:28:16Z", "hours": 9.9, "text": "📓 devlog · 2026-09-08 added shell module, implemented basic command parsing and execution flow, using a simple function pointer array for command dispatch fleshed out shell functionality, included support for built-in commands and input handling, ensuring proper memory allocation for command buffers tidied up shell code, removed redundant whitespace and improved consistency in formatting to enhance readability performed multiple cleanups, refactored shell initialization code for better modularity and maintainability wired up shell to the main application loop, ensuring proper integration and execution flow with other components addressed multiple whitespace issues across files, ensuring consistent coding standards throughout the project"}, {"post_id": 63857, "ts": "2026-09-07T20:46:33Z", "hours": 12.5, "text": "📓 devlog · 2026-09-07 implemented fs, focused on the core file system structure, ensuring proper data layout for efficient file access. fixed a typo in the shell, improving command parsing accuracy and preventing potential runtime errors. tidied shell code by removing unnecessary whitespace and organizing functions for better readability and maintenance. performed multiple formatting updates across various files to adhere to coding standards, ensuring uniformity in style. continued work in progress on shell functionality, refining command handling and improving control flow for user input. completed cleanup tasks to remove unused variables and redundant code, optimizing memory usage and enhancing performance."}, {"post_id": 62472, "ts": "2026-09-05T20:33:49Z", "hours": 11.9333, "text": "📓 devlog · 2026-09-05 added drivers for peripheral devices, ensuring proper initialization and configuration settings. implemented a basic shell structure, allowing for command processing and execution. performed multiple whitespace fixes across various files for improved readability and consistency. cleaned up existing code, removing unused variables and dead code to streamline execution paths. created a rough outline for the shell functionality, defining command handling and parsing logic. updated shell implementation to handle user inputs and provide feedback on command execution. added stubs for future shell commands, preparing for further functionality expansion."}, {"post_id": 61112, "ts": "2026-09-03T20:52:00Z", "hours": 6.3667, "text": "📓 devlog · 2026-09-03 added drivers for peripheral communication, structured to allow for easier integration with existing modules. fleshed out driver implementations, ensuring proper handling of initialization and resource allocation. started sketching a shell interface, focusing on command parsing and execution flow. performed multiple whitespace fixes across various files for improved readability and consistency. conducted cleanup of redundant code segments in the driver files, reducing overall complexity. wired up drivers to interact with the new shell, establishing a basic command execution pathway. implemented additional driver functionality to support expanded hardware features, enhancing overall system capability."}, {"post_id": 60480, "ts": "2026-09-02T20:34:28Z", "hours": 6.4333, "text": "📓 devlog · 2026-09-02 tidied up the main module, removed unused imports and improved code readability through consistent formatting. wired up the main module with initial control flow, ensuring proper function calls and data handling. added a preliminary structure for the main module, including stubs for future function implementations. started development on drivers, implementing basic functionality and ensuring proper interaction with the main module. fleshed out the drivers with additional features, focusing on data handling and performance. sketched out the shell interface for user interaction, laying groundwork for input handling and command processing. performed multiple whitespace fixes across various files to maintain code clarity and consistency."}, {"post_id": 59835, "ts": "2026-09-01T20:12:40Z", "hours": 6.6333, "text": "📓 devlog · 2026-09-01 added main module, defined basic structure and entry point for the application flow. cleaned up code formatting across multiple files, improved readability and maintained consistency. fleshed out main functionality, implemented key features and logic required for initial operation. performed multiple whitespace fixes, ensured compliance with style guide and improved diff clarity. started additional main implementations, focused on refining specific functions and control flow. tidied main module, reorganized code for better logical grouping and clarity, enhanced maintainability. conducted cleanup, removed unused variables and functions, streamlined overall codebase."}, {"post_id": 59152, "ts": "2026-08-31T19:40:38Z", "hours": 7.5333, "text": "📓 devlog · 2026-08-31 added main module, set up initial structure and entry points for control flow. wired up main, ensured proper integration with existing components. cleaned up codebase, removed unused variables and streamlined functions for better readability. tidied up main, focused on consistent naming conventions and indentation. addressed multiple whitespace issues, ensuring uniform formatting throughout the code. fleshed out main with additional functionality, enh"}, {"post_id": 57902, "ts": "2026-08-30T07:19:42Z", "hours": 10.1333, "text": "📓 devlog · 2026-08-29 implemented main module, structured the control flow to handle various inputs and outputs efficiently. wired up main functionality, ensured integration with existing components while maintaining modularity. performed multiple whitespace fixes across the codebase to enhance readability and comply with formatting standards. cleaned up redundant code in main, improving maintainability without altering the core logic. fleshed out main, added necessary functions to support additional features and edge cases. tidied up main to simplify the execution path, reducing cognitive load for future development. formatted code consistently, aligning with project style guidelines for better collaboration."}, {"post_id": 56858, "ts": "2026-08-28T20:25:55Z", "hours": 2.1333, "text": "📓 devlog · 2026-08-28 cleaned up whitespace in several files to maintain code consistency and readability. implemented stub functions in module m8 to outline future functionality without full implementation. organized and tidied code in m8, removing unnecessary lines and improving structure. continued work in progress on module m8, addressing various incomplete sections. fleshed out details in module m8, adding logic to improve functionality and integration. added new features to m8, enhancing its capabilities based on recent requirements. performed additional cleanup in m8 to remove deprecated code and streamline performance."}, {"post_id": 56412, "ts": "2026-08-28T05:27:02Z", "hours": 10.4667, "text": "📓 devlog · 2026-08-27 cleaned up various sections of the codebase, focusing on removing redundant comments and unused variables for better readability. added module m7, defining its structure and initial state, laying groundwork for subsequent implementations. wired up m7 to existing systems, ensuring data flow and control paths are correctly established. fleshed out m7 with core functionality, implementing key methods and internal logic to meet specifications. began rough implementation of m9, setting up initial framework and placeholders for upcoming features. fixed typos in m9, correcting variable names and comments for clarity and consistency. implemented core functions for m9, following through on the designs sketched in earlier commits."}, {"post_id": 55216, "ts": "2026-08-26T20:02:26Z", "hours": 5.6, "text": "📓 devlog · 2026-08-26 implemented module m2, focused on core functionality, ensured proper data handling and state management wired up module m2, established connections with existing components, validated data flow between modules started development on module m7, created initial stubs to define interface and behavior expectations fixed a bug in module m7 related to incorrect state transitions, improved control flow conducted cleanup across various modules, removed unused variables and optimized memory layout worked on ktest, tidied up existing tests, improved structure for better readability and maintainability performed whitespace fixes across multiple files to maintain consistency and adhere to coding standards"}, {"post_id": 54746, "ts": "2026-08-25T20:40:36Z", "hours": 2.2667, "text": "📓 devlog · 2026-08-25- worked on scheduling system, added preliminary structures for new scheduling algorithms while ensuring compatibility with existing code.- performed code tidying in the scheduling module, improving readability and reducing cyclomatic complexity.- implemented core functionality for module m5, focusing on resource allocation and control flow for task management.- fixed whitespace issues throughout the codebase, ensuring consistent formatting and adherence to style guidelines.- completed the implementation of module m5, integrating features from earlier sketches and ensuring edge cases are handled.- conducted cleanup on multiple modules, removing redundant code and ensuring proper memory allocation practices are followed.- added preliminary sketches for module m2, laying groundwork for future functionality and ensuring alignment with overall architecture."}, {"post_id": 54346, "ts": "2026-08-25T09:29:39Z", "hours": 10.2333, "text": "📓 devlog · 2026-08-23- added ramfs module, implemented initial allocation and file structure layout for in-memory file system.- cleaned up whitespace and formatting across multiple files to improve readability and maintainability.- stubs created for m4 module, establishing the basic structure and placeholders for future development.- wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems.- worked on m4 module, refining control flow and preparing it for handling input and output operations.- multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation.- conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards."}, {"post_id": 53333, "ts": "2026-08-23T20:21:43Z", "hours": 2.0667, "text": "📓 devlog · 2026-08-23 added ramfs module, implemented initial allocation and file structure layout for in-memory file system. cleaned up whitespace and formatting across multiple files to improve readability and maintainability. stubs created for m4 module, establishing the basic structure and placeholders for future development. wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems. worked on m4 module, refining control flow and preparing it for handling input and output operations. multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation. conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards."}, {"post_id": 52832, "ts": "2026-08-23T05:57:49Z", "hours": 19.9, "text": "📓 devlog · 2026-08-22 implemented ramfs, defined basic structure and operations for file handling and memory layout fleshed out ramfs, added functions for reading and writing files, ensuring proper memory allocation started ramfs, established initial setup for in-memory filesystem structure and controls cleaned up code across multiple files, removed unnecessary whitespace for better readability performed formatting adjustments, ensured consistent code style and indentation throughout the project worked on rough elf, iterated on the ELF parsing logic and data structures for improved parsing accuracy added additional cleanup commits for better organization and maintainability of the codebase"}, {"post_id": 50669, "ts": "2026-08-19T23:15:32Z", "hours": 10.7733, "text": "📓 devlog · 2026-08-19 - cleaned up ktest, removed unnecessary code and improved readability for better maintainability. - began outlining ktest structure, defined major test cases and expected outcomes to streamline future development. - fleshed out vfs, added initial functions for file handling and directory structure, focusing on memory layout. - implemented basic elf loading, structured code to handle ELF file format parsing and memory allocation. - performed multiple cleanups across modules, consolidated formatting and fixed whitespace issues to adhere to style guidelines. - initiated elf module, set up initial framework for ELF support including header parsing and section handling."}, {"post_id": 49378, "ts": "2026-08-18T05:17:25Z", "hours": 14.9333, "text": "📓 devlog · 2026-08-17- implemented tar functionality, focusing on the compression algorithm and ensuring efficient file handling during archiving.- added multiple methods for extracting and listing files within the tar format, ensuring compatibility with various file types.- began work on the virtual file system (vfs), outlining the necessary data structures for managing file metadata and storage locations.- added initial stubs for vfs functions, setting up a foundation for future integration with the tar operations.- performed formatting changes across several files to improve code readability and maintain consistency in style.- addressed whitespace issues in the codebase to enhance clarity and adhere to coding standards.- continued development on vfs, sketching out control flow and interactions between the file system and tar operations."}, {"post_id": 47755, "ts": "2026-08-15T21:51:30Z", "hours": 5.7333, "text": "added module m6, structured to handle new data processing tasks with lower memory overhead.- wired up module m6, integrated it into the existing control flow to ensure correct data handling.- implemented core functionality for module m6, focusing on efficient allocation and deallocation.- wired up the hello module, ensuring it interfaces properly with other components.- implemented motd, providing a simple message on system start to enhance user experience.- worked on tar, stubbing out initial functionality while preparing for future enhancements.- performed cleanup across various modules, focusing on code readability and eliminating unused variables."}, {"post_id": 47187, "ts": "2026-08-14T22:17:59Z", "hours": 8.0667, "text": "📓 devlog · 2026-08-14 added initial sketches for ktest and pci modules, outlining the basic structure and intended functionality. conducted general cleanup across the repository, removing unused code and improving overall organization. made multiple formatting adjustments to ensure consistent code style throughout the project. implemented the pci module, focusing on memory allocation and control flow to handle device interactions. fixed typos in ktest documentation and comments to improve clarity and maintainability. worked on stubbing out ktest functionality, laying the groundwork for future testing features. addressed whitespace issues in several files to maintain code readability and adherence to style guidelines."}, {"post_id": 46521, "ts": "2026-08-13T20:07:57Z", "hours": 6.1667, "text": "📓 devlog · 2026-08-13 formatted various files for consistency, improved readability across the codebase. performed multiple cleanup tasks, removing dead code and refactoring functions for better maintainability. wired up the pci subsystem, ensuring proper connection and control flow with existing components. started initial implementation of ktest, laying out the basic structure and functions required for testing. tidied up the pci module by organizing functions and consolidating related code segments. addressed whitespace issues in several files to enhance overall code quality. stubbed out ktest functions to create placeholders for future testing scenarios and implementations."}, {"post_id": 45973, "ts": "2026-08-12T20:06:31Z", "hours": 5.5333, "text": "📓 devlog · 2026-08-12 cleaned up various modules, removed unused imports and redundant code for better readability and maintainability. fixed whitespace issues across multiple files to ensure consistent formatting and adhere to coding standards. fleshed out the pci module, implementing initial structures and outlining the control flow for device communication. tidied up the ktest module, improved the organization of test cases and ensured proper initialization of test variables. stubbed the ktest module to establish a framework for future unit tests, setting up basic test cases without implementation. started the pci module, laying the groundwork for further development and integration with existing components."}, {"post_id": 45412, "ts": "2026-08-11T20:47:58Z", "hours": 6.0333, "text": "📓 devlog · 2026-08-11 added initial implementation for pci, structured to facilitate device communication in the system. performed multiple cleanup operations across the codebase, focusing on removing redundant code and improving readability. fixed whitespace issues in several files, enhancing consistency in formatting. refined the pci module’s layout to ensure efficient data flow and reduce memory overhead. ensured all cleanup efforts adhered to the existing coding standards, promoting maintainability. adjusted comments and documentation to reflect recent changes, particularly for the pci module."}, {"post_id": 44820, "ts": "2026-08-10T20:53:14Z", "hours": 6.4667, "text": "📓 plan · 2026-08-10 I’m starting the day later than usual, so I plan to tackle the whitespace fixes first to ensure our code adheres to the style guide. Once those are out of the way, I’ll focus on fleshing out the PCI subsystem, aiming for a more robust memory layout and control flow that supports our concurrency model. The evening will be dedicated to cleanup and further tidying of the PCI components, wrapping up with formatting to maintain consistency. If all goes well, I’ll end the day with a well-structured and polished segment of the codebase."}, {"post_id": 44214, "ts": "2026-08-09T20:34:21Z", "hours": 12.7667, "text": "📓 devlog · 2026-08-09 added ata module, structured data layout to optimize access patterns and reduce allocation overhead. implemented ktest, focusing on the test harness for kernel functionalities, ensuring control flow is correctly validated. wired up pci, improved integration with ata, facilitating better data transfer between components. tidied up ata, removed unnecessary complexity in the data handling logic to enhance maintainability. fixed typos in ktest to improve readability and avoid potential confusion in the test cases. worked on rough ktest, established initial test cases for future enhancements and iterations."}, {"post_id": 42854, "ts": "2026-08-07T20:02:05Z", "hours": 5.3667, "text": "📓 devlog · 2026-08-07 implemented ata, added core functionality and basic data processing logic. started ktest, set up initial test structure with basic stubs for functionality. fleshed out ktest, integrated test cases and improved coverage for ata interactions. cleaned up codebase, removed unused variables and simplified function calls across modules. performed multiple formatting updates, ensured consistent indentation and styling in source files. created stubs for ata, outlined functions for future implementation. addressed whitespace issues, standardized whitespace across all files for better readability."}, {"post_id": 42227, "ts": "2026-08-06T20:52:42Z", "hours": 3.6333, "text": "📓 devlog · 2026-08-06 tidied up the acpi module, removed unused variables and streamlined function calls for better readability. started work on the acpi module, established initial data structures for handling ACPI tables. performed whitespace fixes across multiple files to maintain consistent formatting, aiding in code maintainability. initiated ktest module, set up basic test framework for kernel testing. tidied up ktest, improved code organization by grouping related functions and reducing code duplication. began rough implementation of ata support, focused on defining data structures for device management. implemented core ata functionality, ensuring proper handling of ATA commands and data transfers."}, {"post_id": 41635, "ts": "2026-08-05T23:41:07Z", "hours": 9.1, "text": "📓 devlog · 2026-08-05 added cpu module with basic structure and initial function outlines for core operations, set up initial memory allocation patterns. tidied up cpu code to improve readability, removed unused variables, and streamlined control flow in functions. began implementation of acpi, defining key data structures and laying out the function signatures required for system power management. wired up ktest to interface with cpu and acpi modules, ensuring proper data flow and control between the components. performed multiple cleanups throughout the codebase, focusing on removing redundant code and addressing formatting inconsistencies. fleshed out ktest to include test cases for cpu and acpi functionality, verifying expected behavior under various scenarios."}, {"post_id": 40954, "ts": "2026-08-04T20:19:12Z", "hours": 6.3667, "text": "📓 devlog · 2026-08-04 added initial structure for rtc, defined basic functions and headers for timekeeping. implemented core rtc functionality, allowing for setting and getting time with precision. cleaned up memory allocation in the cpu module, optimizing data access patterns. wired up cpu to handle rtc interrupts, ensuring correct handling of time-based events. fixed several whitespace and formatting issues across multiple files for consistency. addressed a typo in rtc definitions to prevent compilation errors. started work on syscall implementation, focusing on establishing foundational interfaces."}, {"post_id": 40355, "ts": "2026-08-03T20:02:26Z", "hours": 5.4667, "text": "📓 devlog · 2026-08-03 implemented syscall in the kernel, handling input and output operations for better interaction with user processes. wired up syscall to ensure proper communication between user space and kernel space, adjusting control flow for seamless execution. cleaned up codebase multiple times, focusing on removing redundant code and improving readability across various modules. added stub for rtc, laying the groundwork for real-time clock functionality, enabling time management features in future updates. addressed whitespace issues in several files, ensuring consistent formatting and adherence to style guidelines throughout the project."}, {"post_id": 39704, "ts": "2026-08-02T20:46:18Z", "hours": 6.2333, "text": "📓 devlog · 2026-08-02 started initial implementation of the scheduling module, focusing on basic structure and control flow. sketched out the keyboard input handling, defining data layout and key event management. performed a cleanup of the existing codebase, removing unused variables and improving readability. fixed a typo in the scheduling module that could lead to misinterpretation of scheduling logic. wired up the keyboard functionality to capture input events, ensuring proper allocation of resources for key states. cleaned up whitespace across multiple files, improving overall code consistency and formatting. stubs created for keyboard handling, setting the stage for future development of input features."}, {"post_id": 39124, "ts": "2026-08-01T20:39:59Z", "hours": 12.5667, "text": "📓 devlog · 2026-08-01 implemented physical memory management (pmm), structured memory allocation routines to handle page frames efficiently. added a programmable interrupt controller (pic), designed to manage hardware interrupts with a focus on prioritization and handling edge cases. started input subsystem, defined initial data structures and control flow for handling keyboard events. fixed typos and cleaned up whitespace across various files to improve code readability and maintainability. implemented keyboard handling, established key state tracking and event generation for input processing. performed multiple rounds of formatting and organization on the input code to align with project standards. created stubs for future input features, ensuring basic structure without full implementation for now."}, {"post_id": 37846, "ts": "2026-07-30T20:17:09Z", "hours": 6.4333, "text": "📓 devlog · 2026-07-30 added physical memory management (pmm) module, implemented basic allocation and deallocation routines for memory blocks. fleshed out pmm with additional functions for tracking free memory and fragmentation reduction strategies. wired up pmm with the scheduler, ensuring proper memory allocation during task creation and context switching. started work on the scheduler, focusing on establishing control flow for task prioritization and execution sequence. performed whitespace fixes across multiple files to improve code readability and maintain consistency."}, {"post_id": 37240, "ts": "2026-07-29T19:55:46Z", "hours": 3.1333, "text": "📓 devlog · 2026-07-29 removed unused variables in the scheduler module, improving readability and reducing confusion. organized the scheduling logic into smaller functions, enhancing maintainability and clarity in control flow. started work on the physical memory manager, focusing on the initial layout and allocation strategy. added basic structure for the physical memory manager, ensuring it aligns with existing memory management routines. performed multiple cleanups across the codebase, addressing formatting issues and whitespace for consistent style. iterated on the physical memory manager with rough implementations to establish a foundation for future development."}, {"post_id": 36718, "ts": "2026-07-28T23:16:55Z", "hours": 8.6667, "text": "📓 devlog · 2026-07-28 implemented basic structure for the ring buffer, focusing on data insertion and deletion mechanics. fixed issues in the ring buffer related to overflow conditions, ensuring proper wrap-around logic. started initial work on the scheduler module, defining its role in managing task execution order. cleaned up code in various modules, removing unused variables and optimizing function calls for clarity. made progress on physical memory management (pmm), refining allocation strategies and data structures. wired up pmm with the existing memory system, ensuring compatibility with current allocation patterns. cleaned up and sketched additional plans for pmm, setting groundwork for more advanced features."}, {"post_id": 35423, "ts": "2026-07-26T20:27:13Z", "hours": 2.0667, "text": "📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later. 📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later."}, {"post_id": 35069, "ts": "2026-07-26T08:05:46Z", "hours": 8.6, "text": "📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later."}, {"post_id": 34314, "ts": "2026-07-24T22:08:52Z", "hours": 3.6667, "text": "📓 devlog · 2026-07-24 implemented paging, added core functionality for memory management, ensuring proper control flow for page allocation and deallocation. fleshed out paging, defined page structures and their associated metadata for efficient access patterns. wired up slab, integrated slab allocation with paging to optimize memory usage and reduce fragmentation. rough paging, established initial framework for paging algorithms, focusing on basic page replacement strategies. performed cleanup in various modules, removing redundant code and improving readability. formatted code across multiple files, ensuring consistency in style and adherence to project guidelines. worked on libk, progressing on utility functions to support paging and slab management."}, {"post_id": 33893, "ts": "2026-07-24T05:28:56Z", "hours": 10.8333, "text": "📓 devlog · 2026-07-23 performed general cleanup across multiple files, removed unused variables and streamlined functions for better readability. initiated work on libk, added initial sketches for core functions and data structures, focused on modular design. formatted existing code for consistency, ensured alignment with style guide across all modified files. stubbed out additional functions in libk, set up basic structure for future implementation, no functional changes yet. implemented rough drafts of key algorithms in libk, focused on establishing functional outlines and placeholders. added sketches for paging functionality, laid ground for memory management, still a work in progress. fixed multiple instances of whitespace inconsistencies, ensured code meets formatting standards."}, {"post_id": 33142, "ts": "2026-07-22T19:42:34Z", "hours": 5.7667, "text": "📓 devlog · 2026-07-22 stub libk, added initial placeholder functions to define the interface and structure for future implementation. sketch libk, outlined key functionalities and features expected in libk to guide further development. ok actually fix libk, resolved an existing issue in the libk implementation that impacted function performance. cleanup, removed unnecessary code and comments in multiple files to improve readability and maintainability. formatting, standardized code formatting across several modules to ensure consistency in style and layout. add pic, integrated initial assets and images required for the project, ensuring proper paths and references. rough libk, created a basic version of libk to provide a foundational structure for ongoing enhancements."}, {"post_id": 32547, "ts": "2026-07-21T20:05:00Z", "hours": 3.4333, "text": "📓 devlog · 2026-07-21 added rough implementation of timefmt, establishing a basic structure for time formatting functionality. cleaned up code formatting across several modules to improve readability and maintainability. created stubs for timefmt, setting up placeholder functions for future development and integration. fixed a typo in the timefmt module, ensuring correct naming and preventing potential lookup errors. began work on paging, focusing on the initial design for memory management and data access. started implementing libk, aiming to enhance core library functions related to kernel operations. tidied up libk, removing unused code and optimizing existing functions for better performance."}, {"post_id": 32056, "ts": "2026-07-20T23:05:31Z", "hours": 8.8667, "text": "📓 devlog · 2026-07-20 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing."}, {"post_id": 31435, "ts": "2026-07-19T20:03:21Z", "hours": 6.1, "text": "📓 devlog · 2026-07-19 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing."}, {"post_id": 30855, "ts": "2026-07-18T20:05:37Z", "hours": 5.6028, "text": "📓 devlog · 2026-07-18 modified pic module to include initial implementation and basic structure, established interface for adding images. expanded functionality of pic module, incorporated methods for adding and manipulating image data. began initial work on timefmt module, implemented rough outline for time formatting functions. fixed identified issues in timefmt, corrected incorrect time string conversions and edge cases. performed multiple iterations and cleanups on timefmt, ensuring consistent formatting and removal of redundant code. addressed whitespace issues throughout the codebase, maintaining code readability and standards. completed additional stubs for timefmt, preparing for future enhancements and detailed functionality."}, {"post_id": 30370, "ts": "2026-07-17T20:56:25Z", "hours": 6.6667, "text": "📓 devlog · 2026-07-17 started working on the vga module, established initial structure and placeholder functions for further development. cleaned up existing code, focused on reducing redundant lines and improving readability across various modules. fleshed out vga functionality, added basic rendering capabilities and memory layout for pixel data. implemented a timer system, ensuring precise tracking of time intervals, adjusted allocation for timer objects. added stubs for pic and timefmt modules, set up basic function signatures for future implementation. made multiple whitespace fixes across all files to conform to coding standards and improve consistency. tidied up pic module, streamlined control flow and ensured compatibility with vga rendering logic."}, {"post_id": 29723, "ts": "2026-07-16T20:17:42Z", "hours": 6.6667, "text": "📓 devlog · 2026-07-16 implemented serial communication module, established basic data transfer protocols and control flow. added serial interface to the main system, allowing for external device communication. fleshed out serial functionality, including error checking and buffer management. wired up serial connections for data transmission, ensuring correct pin mappings and signal integrity. sketched out io module structure, focusing on input/output handling and data processing paths. added initial io functions, implementing basic read/write capabilities for peripheral devices. began rough implementation of vga module, focusing on pixel data handling and display timing."}, {"post_id": 29115, "ts": "2026-07-15T19:34:57Z", "hours": 5.3667, "text": "📓 devlog · 2026-07-15 implemented console, added basic input/output functionality for user interaction through standard input and output streams. wired up console, ensured proper integration with the main application loop for event handling. implemented blockcache, optimized data retrieval by caching frequently accessed blocks in memory. wired up blockcache, linked it to the data storage layer to enhance read performance. stubbed and tidied paging, established the foundational structure for memory paging without full implementation yet. tidied serial, cleaned up the existing codebase for serial communication, improving readability and maintainability. added serial, integrated serial port communication for external device interaction, allowing data transfer between the application and peripherals."}, {"post_id": 28515, "ts": "2026-07-14T20:24:25Z", "hours": 6.6283, "text": "📓 devlog · 2026-07-14 added initial work on interrupt handling, defined basic structure for interrupt service routines. performed code cleanup to improve readability, removed unnecessary comments and streamlined function definitions. cleaned up formatting across several files to adhere to style guidelines, ensuring consistent indentation and spacing. created stub implementations for interrupt handlers, laying groundwork for future development and testing. sketched out a more detailed design for interrupt architecture, focusing on data flow and control mechanisms. tidied up existing interrupt code, organized functions, and reduced duplication in the implementation. continued refining interrupt handling logic, addressing edge cases and ensuring proper allocation of resources."}, {"post_id": 27885, "ts": "2026-07-13T19:57:58Z", "hours": 6.5711, "text": "📓 devlog · 2026-07-13 added stub interrupts to initialize interrupt handling in the system, setting up for further implementation. created a work-in-progress blockcache module, laying the groundwork for efficient data storage and retrieval. implemented the timer functionality, ensuring accurate time tracking within the system for scheduling tasks. cleaned up various modules including blockcache and interrupts, improving readability and maintainability of the code. fleshed out timer implementation details, refining the control flow for better performance in timing operations. performed multiple formatting fixes across files for consistent coding style, aiding in future collaboration. organized and tidied blockcache code, improving memory layout and preparing it for future enhancements."}, {"post_id": 27323, "ts": "2026-07-12T20:03:59Z", "hours": 6.5561, "text": "📓 devlog · 2026-07-12 cleaned up interrupt handling code, focused on reducing redundancy and improving readability without changing functionality. implemented stubs for interrupt functions to facilitate future development, allowing for easier testing and integration. performed multiple whitespace fixes throughout the codebase to maintain consistency in style, improving overall readability. formatted code to align with the project’s style guide, ensuring uniformity across various modules and files. addressed various cleanup tasks, removing unused variables and optimizing import statements for better organization. worked on interrupt-related functionality, marked as work in progress, which requires further testing and validation. applied additional tidying to interrupt handling to ensure clear control flow and efficient resource management."}, {"post_id": 26805, "ts": "2026-07-11T20:12:50Z", "hours": 7.3297, "text": "📓 devlog · 2026-07-11 added basic interrupt handling, defined interrupt vectors and handlers for specific events, ensuring correct execution flow. cleaned up existing code, removed unused variables and streamlined function definitions for better readability and maintainability. implemented rough interrupt logic, focused on initial data capture and processing for incoming signals from hardware. tidied up the interrupt code, organized structure for clarity, and ensured consistent naming conventions across handlers. performed multiple whitespace fixes and formatting adjustments, ensuring adherence to style guidelines throughout the project. worked in progress on interrupt functionality, laying groundwork for future enhancements and optimizations in response handling."}, {"post_id": 26151, "ts": "2026-07-10T19:35:47Z", "hours": 1.6197, "text": "📓 devlog · 2026-07-10 implemented wiring for idt, ensuring proper interrupt handling flow. created initial sketches for gdt, focusing on data structure layout and alignment. performed multiple whitespace fixes across files for improved readability. refined gdt implementation with rough and tidy stages, optimizing memory layout. wired up gdt, enabling segment-based memory management for the system. cleaned up interrupt wiring, enhancing control flow during interrupt processing. standardized formatting across the codebase to maintain consistency and clarity."}, {"post_id": 25764, "ts": "2026-07-10T06:38:12Z", "hours": 13.3744, "text": "📓 devlog · 2026-07-09 fleshed out README content to provide clearer project guidelines and usage instructions, improved overall clarity. made multiple formatting adjustments across the README files to ensure consistency and readability. started and wired up the initial draft of the interrupt descriptor table (idt), focusing on basic structure and future implementation. added stubs for idt functions, preparing for further development while ensuring initial code integrity. corrected a typo in the idt implementation, ensuring accurate naming conventions in the codebase. performed cleanup tasks on both README and idt files, removing redundant lines and improving organization."}]...
|
Title: NYX by @Paulaner | Stardance
Devlogs:
📓 de Title: NYX by @Paulaner | Stardance
Devlogs:
📓 devlog · 2026-07-09 fleshed out README content to provide clearer project guidelines and usage instructions, improved overall clarity. made multiple formatting adjustments across the README files to ensure consistency and readability. started and wired up the initial draft of the interrupt descriptor table (idt), focusing on basic structure and future implementation. added stubs for idt functions, preparing for further development while ensuring initial code integrity. corrected a typo in the idt implementation, ensuring accurate naming conventions in the codebase. performed cleanup tasks on both README and idt files, removing redundant lines and improving organization.
📓 devlog · 2026-07-10 implemented wiring for idt, ensuring proper interrupt handling flow. created initial sketches for gdt, focusing on data structure layout and alignment. performed multiple whitespace fixes across files for improved readability. refined gdt implementation with rough and tidy stages, optimizing memory layout. wired up gdt, enabling segment-based memory management for the system. cleaned up interrupt wiring, enhancing control flow during interrupt processing. standardized formatting across the codebase to maintain consistency and clarity.
📓 devlog · 2026-07-11 added basic interrupt handling, defined interrupt vectors and handlers for specific events, ensuring correct execution flow. cleaned up existing code, removed unused variables and streamlined function definitions for better readability and maintainability. implemented rough interrupt logic, focused on initial data capture and processing for incoming signals from hardware. tidied up the interrupt code, organized structure for clarity, and ensured consistent naming conventions across handlers. performed multiple whitespace fixes and formatting adjustments, ensuring adherence to style guidelines throughout the project. worked in progress on interrupt functionality, laying groundwork for future enhancements and optimizations in response handling.
📓 devlog · 2026-07-12 cleaned up interrupt handling code, focused on reducing redundancy and improving readability without changing functionality. implemented stubs for interrupt functions to facilitate future development, allowing for easier testing and integration. performed multiple whitespace fixes throughout the codebase to maintain consistency in style, improving overall readability. formatted code to align with the project’s style guide, ensuring uniformity across various modules and files. addressed various cleanup tasks, removing unused variables and optimizing import statements for better organization. worked on interrupt-related functionality, marked as work in progress, which requires further testing and validation. applied additional tidying to interrupt handling to ensure clear control flow and efficient resource management.
📓 devlog · 2026-07-13 added stub interrupts to initialize interrupt handling in the system, setting up for further implementation. created a work-in-progress blockcache module, laying the groundwork for efficient data storage and retrieval. implemented the timer functionality, ensuring accurate time tracking within the system for scheduling tasks. cleaned up various modules including blockcache and interrupts, improving readability and maintainability of the code. fleshed out timer implementation details, refining the control flow for better performance in timing operations. performed multiple formatting fixes across files for consistent coding style, aiding in future collaboration. organized and tidied blockcache code, improving memory layout and preparing it for future enhancements.
📓 devlog · 2026-07-14 added initial work on interrupt handling, defined basic structure for interrupt service routines. performed code cleanup to improve readability, removed unnecessary comments and streamlined function definitions. cleaned up formatting across several files to adhere to style guidelines, ensuring consistent indentation and spacing. created stub implementations for interrupt handlers, laying groundwork for future development and testing. sketched out a more detailed design for interrupt architecture, focusing on data flow and control mechanisms. tidied up existing interrupt code, organized functions, and reduced duplication in the implementation. continued refining interrupt handling logic, addressing edge cases and ensuring proper allocation of resources.
📓 devlog · 2026-07-15 implemented console, added basic input/output functionality for user interaction through standard input and output streams. wired up console, ensured proper integration with the main application loop for event handling. implemented blockcache, optimized data retrieval by caching frequently accessed blocks in memory. wired up blockcache, linked it to the data storage layer to enhance read performance. stubbed and tidied paging, established the foundational structure for memory paging without full implementation yet. tidied serial, cleaned up the existing codebase for serial communication, improving readability and maintainability. added serial, integrated serial port communication for external device interaction, allowing data transfer between the application and peripherals.
📓 devlog · 2026-07-16 implemented serial communication module, established basic data transfer protocols and control flow. added serial interface to the main system, allowing for external device communication. fleshed out serial functionality, including error checking and buffer management. wired up serial connections for data transmission, ensuring correct pin mappings and signal integrity. sketched out io module structure, focusing on input/output handling and data processing paths. added initial io functions, implementing basic read/write capabilities for peripheral devices. began rough implementation of vga module, focusing on pixel data handling and display timing.
📓 devlog · 2026-07-17 started working on the vga module, established initial structure and placeholder functions for further development. cleaned up existing code, focused on reducing redundant lines and improving readability across various modules. fleshed out vga functionality, added basic rendering capabilities and memory layout for pixel data. implemented a timer system, ensuring precise tracking of time intervals, adjusted allocation for timer objects. added stubs for pic and timefmt modules, set up basic function signatures for future implementation. made multiple whitespace fixes across all files to conform to coding standards and improve consistency. tidied up pic module, streamlined control flow and ensured compatibility with vga rendering logic.
📓 devlog · 2026-07-18 modified pic module to include initial implementation and basic structure, established interface for adding images. expanded functionality of pic module, incorporated methods for adding and manipulating image data. began initial work on timefmt module, implemented rough outline for time formatting functions. fixed identified issues in timefmt, corrected incorrect time string conversions and edge cases. performed multiple iterations and cleanups on timefmt, ensuring consistent formatting and removal of redundant code. addressed whitespace issues throughout the codebase, maintaining code readability and standards. completed additional stubs for timefmt, preparing for future enhancements and detailed functionality.
📓 devlog · 2026-07-19 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing.
📓 devlog · 2026-07-20 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing.
📓 devlog · 2026-07-21 added rough implementation of timefmt, establishing a basic structure for time formatting functionality. cleaned up code formatting across several modules to improve readability and maintainability. created stubs for timefmt, setting up placeholder functions for future development and integration. fixed a typo in the timefmt module, ensuring correct naming and preventing potential lookup errors. began work on paging, focusing on the initial design for memory management and data access. started implementing libk, aiming to enhance core library functions related to kernel operations. tidied up libk, removing unused code and optimizing existing functions for better performance.
📓 devlog · 2026-07-22 stub libk, added initial placeholder functions to define the interface and structure for future implementation. sketch libk, outlined key functionalities and features expected in libk to guide further development. ok actually fix libk, resolved an existing issue in the libk implementation that impacted function performance. cleanup, removed unnecessary code and comments in multiple files to improve readability and maintainability. formatting, standardized code formatting across several modules to ensure consistency in style and layout. add pic, integrated initial assets and images required for the project, ensuring proper paths and references. rough libk, created a basic version of libk to provide a foundational structure for ongoing enhancements.
📓 devlog · 2026-07-23 performed general cleanup across multiple files, removed unused variables and streamlined functions for better readability. initiated work on libk, added initial sketches for core functions and data structures, focused on modular design. formatted existing code for consistency, ensured alignment with style guide across all modified files. stubbed out additional functions in libk, set up basic structure for future implementation, no functional changes yet. implemented rough drafts of key algorithms in libk, focused on establishing functional outlines and placeholders. added sketches for paging functionality, laid ground for memory management, still a work in progress. fixed multiple instances of whitespace inconsistencies, ensured code meets formatting standards.
📓 devlog · 2026-07-24 implemented paging, added core functionality for memory management, ensuring proper control flow for page allocation and deallocation. fleshed out paging, defined page structures and their associated metadata for efficient access patterns. wired up slab, integrated slab allocation with paging to optimize memory usage and reduce fragmentation. rough paging, established initial framework for paging algorithms, focusing on basic page replacement strategies. performed cleanup in various modules, removing redundant code and improving readability. formatted code across multiple files, ensuring consistency in style and adherence to project guidelines. worked on libk, progressing on utility functions to support paging and slab management.
📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later.
📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later. 📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later.
📓 devlog · 2026-07-28 implemented basic structure for the ring buffer, focusing on data insertion and deletion mechanics. fixed issues in the ring buffer related to overflow conditions, ensuring proper wrap-around logic. started initial work on the scheduler module, defining its role in managing task execution order. cleaned up code in various modules, removing unused variables and optimizing function calls for clarity. made progress on physical memory management (pmm), refining allocation strategies and data structures. wired up pmm with the existing memory system, ensuring compatibility with current allocation patterns. cleaned up and sketched additional plans for pmm, setting groundwork for more advanced features.
📓 devlog · 2026-07-29 removed unused variables in the scheduler module, improving readability and reducing confusion. organized the scheduling logic into smaller functions, enhancing maintainability and clarity in control flow. started work on the physical memory manager, focusing on the initial layout and allocation strategy. added basic structure for the physical memory manager, ensuring it aligns with existing memory management routines. performed multiple cleanups across the codebase, addressing formatting issues and whitespace for consistent style. iterated on the physical memory manager with rough implementations to establish a foundation for future development.
📓 devlog · 2026-07-30 added physical memory management (pmm) module, implemented basic allocation and deallocation routines for memory blocks. fleshed out pmm with additional functions for tracking free memory and fragmentation reduction strategies. wired up pmm with the scheduler, ensuring proper memory allocation during task creation and context switching. started work on the scheduler, focusing on establishing control flow for task prioritization and execution sequence. performed whitespace fixes across multiple files to improve code readability and maintain consistency.
📓 devlog · 2026-08-01 implemented physical memory management (pmm), structured memory allocation routines to handle page frames efficiently. added a programmable interrupt controller (pic), designed to manage hardware interrupts with a focus on prioritization and handling edge cases. started input subsystem, defined initial data structures and control flow for handling keyboard events. fixed typos and cleaned up whitespace across various files to improve code readability and maintainability. implemented keyboard handling, established key state tracking and event generation for input processing. performed multiple rounds of formatting and organization on the input code to align with project standards. created stubs for future input features, ensuring basic structure without full implementation for now.
📓 devlog · 2026-08-02 started initial implementation of the scheduling module, focusing on basic structure and control flow. sketched out the keyboard input handling, defining data layout and key event management. performed a cleanup of the existing codebase, removing unused variables and improving readability. fixed a typo in the scheduling module that could lead to misinterpretation of scheduling logic. wired up the keyboard functionality to capture input events, ensuring proper allocation of resources for key states. cleaned up whitespace across multiple files, improving overall code consistency and formatting. stubs created for keyboard handling, setting the stage for future development of input features.
📓 devlog · 2026-08-03 implemented syscall in the kernel, handling input and output operations for better interaction with user processes. wired up syscall to ensure proper communication between user space and kernel space, adjusting control flow for seamless execution. cleaned up codebase multiple times, focusing on removing redundant code and improving readability across various modules. added stub for rtc, laying the groundwork for real-time clock functionality, enabling time management features in future updates. addressed whitespace issues in several files, ensuring consistent formatting and adherence to style guidelines throughout the project.
📓 devlog · 2026-08-04 added initial structure for rtc, defined basic functions and headers for timekeeping. implemented core rtc functionality, allowing for setting and getting time with precision. cleaned up memory allocation in the cpu module, optimizing data access patterns. wired up cpu to handle rtc interrupts, ensuring correct handling of time-based events. fixed several whitespace and formatting issues across multiple files for consistency. addressed a typo in rtc definitions to prevent compilation errors. started work on syscall implementation, focusing on establishing foundational interfaces.
📓 devlog · 2026-08-05 added cpu module with basic structure and initial function outlines for core operations, set up initial memory allocation patterns. tidied up cpu code to improve readability, removed unused variables, and streamlined control flow in functions. began implementation of acpi, defining key data structures and laying out the function signatures required for system power management. wired up ktest to interface with cpu and acpi modules, ensuring proper data flow and control between the components. performed multiple cleanups throughout the codebase, focusing on removing redundant code and addressing formatting inconsistencies. fleshed out ktest to include test cases for cpu and acpi functionality, verifying expected behavior under various scenarios.
📓 devlog · 2026-08-06 tidied up the acpi module, removed unused variables and streamlined function calls for better readability. started work on the acpi module, established initial data structures for handling ACPI tables. performed whitespace fixes across multiple files to maintain consistent formatting, aiding in code maintainability. initiated ktest module, set up basic test framework for kernel testing. tidied up ktest, improved code organization by grouping related functions and reducing code duplication. began rough implementation of ata support, focused on defining data structures for device management. implemented core ata functionality, ensuring proper handling of ATA commands and data transfers.
📓 devlog · 2026-08-07 implemented ata, added core functionality and basic data processing logic. started ktest, set up initial test structure with basic stubs for functionality. fleshed out ktest, integrated test cases and improved coverage for ata interactions. cleaned up codebase, removed unused variables and simplified function calls across modules. performed multiple formatting updates, ensured consistent indentation and styling in source files. created stubs for ata, outlined functions for future implementation. addressed whitespace issues, standardized whitespace across all files for better readability.
📓 devlog · 2026-08-09 added ata module, structured data layout to optimize access patterns and reduce allocation overhead. implemented ktest, focusing on the test harness for kernel functionalities, ensuring control flow is correctly validated. wired up pci, improved integration with ata, facilitating better data transfer between components. tidied up ata, removed unnecessary complexity in the data handling logic to enhance maintainability. fixed typos in ktest to improve readability and avoid potential confusion in the test cases. worked on rough ktest, established initial test cases for future enhancements and iterations.
📓 plan · 2026-08-10 I’m starting the day later than usual, so I plan to tackle the whitespace fixes first to ensure our code adheres to the style guide. Once those are out of the way, I’ll focus on fleshing out the PCI subsystem, aiming for a more robust memory layout and control flow that supports our concurrency model. The evening will be dedicated to cleanup and further tidying of the PCI components, wrapping up with formatting to maintain consistency. If all goes well, I’ll end the day with a well-structured and polished segment of the codebase.
📓 devlog · 2026-08-11 added initial implementation for pci, structured to facilitate device communication in the system. performed multiple cleanup operations across the codebase, focusing on removing redundant code and improving readability. fixed whitespace issues in several files, enhancing consistency in formatting. refined the pci module’s layout to ensure efficient data flow and reduce memory overhead. ensured all cleanup efforts adhered to the existing coding standards, promoting maintainability. adjusted comments and documentation to reflect recent changes, particularly for the pci module.
📓 devlog · 2026-08-12 cleaned up various modules, removed unused imports and redundant code for better readability and maintainability. fixed whitespace issues across multiple files to ensure consistent formatting and adhere to coding standards. fleshed out the pci module, implementing initial structures and outlining the control flow for device communication. tidied up the ktest module, improved the organization of test cases and ensured proper initialization of test variables. stubbed the ktest module to establish a framework for future unit tests, setting up basic test cases without implementation. started the pci module, laying the groundwork for further development and integration with existing components.
📓 devlog · 2026-08-13 formatted various files for consistency, improved readability across the codebase. performed multiple cleanup tasks, removing dead code and refactoring functions for better maintainability. wired up the pci subsystem, ensuring proper connection and control flow with existing components. started initial implementation of ktest, laying out the basic structure and functions required for testing. tidied up the pci module by organizing functions and consolidating related code segments. addressed whitespace issues in several files to enhance overall code quality. stubbed out ktest functions to create placeholders for future testing scenarios and implementations.
📓 devlog · 2026-08-14 added initial sketches for ktest and pci modules, outlining the basic structure and intended functionality. conducted general cleanup across the repository, removing unused code and improving overall organization. made multiple formatting adjustments to ensure consistent code style throughout the project. implemented the pci module, focusing on memory allocation and control flow to handle device interactions. fixed typos in ktest documentation and comments to improve clarity and maintainability. worked on stubbing out ktest functionality, laying the groundwork for future testing features. addressed whitespace issues in several files to maintain code readability and adherence to style guidelines.
added module m6, structured to handle new data processing tasks with lower memory overhead.- wired up module m6, integrated it into the existing control flow to ensure correct data handling.- implemented core functionality for module m6, focusing on efficient allocation and deallocation.- wired up the hello module, ensuring it interfaces properly with other components.- implemented motd, providing a simple message on system start to enhance user experience.- worked on tar, stubbing out initial functionality while preparing for future enhancements.- performed cleanup across various modules, focusing on code readability and eliminating unused variables.
📓 devlog · 2026-08-17- implemented tar functionality, focusing on the compression algorithm and ensuring efficient file handling during archiving.- added multiple methods for extracting and listing files within the tar format, ensuring compatibility with various file types.- began work on the virtual file system (vfs), outlining the necessary data structures for managing file metadata and storage locations.- added initial stubs for vfs functions, setting up a foundation for future integration with the tar operations.- performed formatting changes across several files to improve code readability and maintain consistency in style.- addressed whitespace issues in the codebase to enhance clarity and adhere to coding standards.- continued development on vfs, sketching out control flow and interactions between the file system and tar operations.
📓 devlog · 2026-08-19 - cleaned up ktest, removed unnecessary code and improved readability for better maintainability. - began outlining ktest structure, defined major test cases and expected outcomes to streamline future development. - fleshed out vfs, added initial functions for file handling and directory structure, focusing on memory layout. - implemented basic elf loading, structured code to handle ELF file format parsing and memory allocation. - performed multiple cleanups across modules, consolidated formatting and fixed whitespace issues to adhere to style guidelines. - initiated elf module, set up initial framework for ELF support including header parsing and section handling.
📓 devlog · 2026-08-22 implemented ramfs, defined basic structure and operations for file handling and memory layout fleshed out ramfs, added functions for reading and writing files, ensuring proper memory allocation started ramfs, established initial setup for in-memory filesystem structure and controls cleaned up code across multiple files, removed unnecessary whitespace for better readability performed formatting adjustments, ensured consistent code style and indentation throughout the project worked on rough elf, iterated on the ELF parsing logic and data structures for improved parsing accuracy added additional cleanup commits for better organization and maintainability of the codebase
📓 devlog · 2026-08-23 added ramfs module, implemented initial allocation and file structure layout for in-memory file system. cleaned up whitespace and formatting across multiple files to improve readability and maintainability. stubs created for m4 module, establishing the basic structure and placeholders for future development. wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems. worked on m4 module, refining control flow and preparing it for handling input and output operations. multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation. conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards.
📓 devlog · 2026-08-23- added ramfs module, implemented initial allocation and file structure layout for in-memory file system.- cleaned up whitespace and formatting across multiple files to improve readability and maintainability.- stubs created for m4 module, establishing the basic structure and placeholders for future development.- wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems.- worked on m4 module, refining control flow and preparing it for handling input and output operations.- multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation.- conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards.
📓 devlog · 2026-08-25- worked on scheduling system, added preliminary structures for new scheduling algorithms while ensuring compatibility with existing code.- performed code tidying in the scheduling module, improving readability and reducing cyclomatic complexity.- implemented core functionality for module m5, focusing on resource allocation and control flow for task management.- fixed whitespace issues throughout the codebase, ensuring consistent formatting and adherence to style guidelines.- completed the implementation of module m5, integrating features from earlier sketches and ensuring edge cases are handled.- conducted cleanup on multiple modules, removing redundant code and ensuring proper memory allocation practices are followed.- added preliminary sketches for module m2, laying groundwork for future functionality and ensuring alignment with overall architecture.
📓 devlog · 2026-08-26 implemented module m2, focused on core functionality, ensured proper data handling and state management wired up module m2, established connections with existing components, validated data flow between modules started development on module m7, created initial stubs to define interface and behavior expectations fixed a bug in module m7 related to incorrect state transitions, improved control flow conducted cleanup across various modules, removed unused variables and optimized memory layout worked on ktest, tidied up existing tests, improved structure for better readability and maintainability performed whitespace fixes across multiple files to maintain consistency and adhere to coding standards
📓 devlog · 2026-08-27 cleaned up various sections of the codebase, focusing on removing redundant comments and unused variables for better readability. added module m7, defining its structure and initial state, laying groundwork for subsequent implementations. wired up m7 to existing systems, ensuring data flow and control paths are correctly established. fleshed out m7 with core functionality, implementing key methods and internal logic to meet specifications. began rough implementation of m9, setting up initial framework and placeholders for upcoming features. fixed typos in m9, correcting variable names and comments for clarity and consistency. implemented core functions for m9, following through on the designs sketched in earlier commits.
📓 devlog · 2026-08-28 cleaned up whitespace in several files to maintain code consistency and readability. implemented stub functions in module m8 to outline future functionality without full implementation. organized and tidied code in m8, removing unnecessary lines and improving structure. continued work in progress on module m8, addressing various incomplete sections. fleshed out details in module m8, adding logic to improve functionality and integration. added new features to m8, enhancing its capabilities based on recent requirements. performed additional cleanup in m8 to remove deprecated code and streamline performance.
📓 devlog · 2026-08-29 implemented main module, structured the control flow to handle various inputs and outputs efficiently. wired up main functionality, ensured integration with existing components while maintaining modularity. performed multiple whitespace fixes across the codebase to enhance readability and comply with formatting standards. cleaned up redundant code in main, improving maintainability without altering the core logic. fleshed out main, added necessary functions to support additional features and edge cases. tidied up main to simplify the execution path, reducing cognitive load for future development. formatted code consistently, aligning with project style guidelines for better collaboration.
📓 devlog · 2026-08-31 added main module, set up initial structure and entry points for control flow. wired up main, ensured proper integration with existing components. cleaned up codebase, removed unused variables and streamlined functions for better readability. tidied up main, focused on consistent naming conventions and indentation. addressed multiple whitespace issues, ensuring uniform formatting throughout the code. fleshed out main with additional functionality, enh
📓 devlog · 2026-09-01 added main module, defined basic structure and entry point for the application flow. cleaned up code formatting across multiple files, improved readability and maintained consistency. fleshed out main functionality, implemented key features and logic required for initial operation. performed multiple whitespace fixes, ensured compliance with style guide and improved diff clarity. started additional main implementations, focused on refining specific functions and control flow. tidied main module, reorganized code for better logical grouping and clarity, enhanced maintainability. conducted cleanup, removed unused variables and functions, streamlined overall codebase.
📓 devlog · 2026-09-02 tidied up the main module, removed unused imports and improved code readability through consistent formatting. wired up the main module with initial control flow, ensuring proper function calls and data handling. added a preliminary structure for the main module, including stubs for future function implementations. started development on drivers, implementing basic functionality and ensuring proper interaction with the main module. fleshed out the drivers with additional features, focusing on data handling and performance. sketched out the shell interface for user interaction, laying groundwork for input handling and command processing. performed multiple whitespace fixes across various files to maintain code clarity and consistency.
📓 devlog · 2026-09-03 added drivers for peripheral communication, structured to allow for easier integration with existing modules. fleshed out driver implementations, ensuring proper handling of initialization and resource allocation. started sketching a shell interface, focusing on command parsing and execution flow. performed multiple whitespace fixes across various files for improved readability and consistency. conducted cleanup of redundant code segments in the driver files, reducing overall complexity. wired up drivers to interact with the new shell, establishing a basic command execution pathway. implemented additional driver functionality to support expanded hardware features, enhancing overall system capability.
📓 devlog · 2026-09-05 added drivers for peripheral devices, ensuring proper initialization and configuration settings. implemented a basic shell structure, allowing for command processing and execution. performed multiple whitespace fixes across various files for improved readability and consistency. cleaned up existing code, removing unused variables and dead code to streamline execution paths. created a rough outline for the shell functionality, defining command handling and parsing logic. updated shell implementation to handle user inputs and provide feedback on command execution. added stubs for future shell commands, preparing for further functionality expansion.
📓 devlog · 2026-09-07 implemented fs, focused on the core file system structure, ensuring proper data layout for efficient file access. fixed a typo in the shell, improving command parsing accuracy and preventing potential runtime errors. tidied shell code by removing unnecessary whitespace and organizing functions for better readability and maintenance. performed multiple formatting updates across various files to adhere to coding standards, ensuring uniformity in style. continued work in progress on shell functionality, refining command handling and improving control flow for user input. completed cleanup tasks to remove unused variables and redundant code, optimizing memory usage and enhancing performance.
📓 devlog · 2026-09-08 added shell module, implemented basic command parsing and execution flow, using a simple function pointer array for command dispatch fleshed out shell functionality, included support for built-in commands and input handling, ensuring proper memory allocation for command buffers tidied up shell code, removed redundant whitespace and improved consistency in formatting to enhance readability performed multiple cleanups, refactored shell initialization code for better modularity and maintainability wired up shell to the main application loop, ensuring proper integration and execution flow with other components addressed multiple whitespace issues across files, ensuring consistent coding standards throughout the project
📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts. 📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts.
📓 devlog · 2026-09-10 implemented the filesystem (fs), focused on directory structure and file allocation strategies for improved access speed. wired up the fs to ensure proper integration with existing modules, tested data flow between components during initial operations. started the shell, establishing basic command parsing and execution control flow to interface with the filesystem. added memory management capabilities, implemented a new allocation strategy to minimize fragmentation and optimize performance. cleaned up the shell code for readability, removed redundant whitespace to maintain consistent coding standards across the project. performed additional wiring for memory to ensure it interacts correctly with both the filesystem and shell for seamless operation. fleshed out the fs with additional features like file permissions and metadata handling, ensuring robustness for concurrent access.
📓 devlog · 2026-09-11 implemented the shell module, established basic command parsing and execution flow. fleshed out the shell with support for built-in commands, enhancing user interaction. added memory management functionality, introduced a structure for allocation tracking. wired up memory to the shell, enabling commands to manipulate memory directly. performed multiple whitespace fixes and formatting cleanups across all modules for better readability. started and fleshed out the memory module, ensuring proper initialization and allocation patterns. tidied shell code for improved maintainability, focusing on reducing complexity in command handling.
📓 devlog · 2026-09-12 implemented memory management, focused on allocation strategies and freeing unused memory blocks to optimize resource usage. fleshed out memory module, added support for variable-sized memory chunks, improving efficiency for dynamic allocation. started integration of memory system with existing components, ensuring compatibility and smooth data flow. added shell functionality, enabling user interaction with the memory management system through command-line inputs. wired up shell to the memory module, establishing command execution pathways for memory operations. performed multiple wiring adjustments in the shell, ensuring proper communication and error handling between components.
📓 devlog · 2026-09-13 added initial implementation of the shell, establishing basic command parsing and execution flow. fleshed out shell functionality, improving command handling and improving error reporting for invalid inputs. wired up shell components, ensuring proper integration with existing modules for input and output processing. started multiple iterations of shell refinement, focusing on memory allocation strategies for command history storage. implemented additional features for the shell, including support for built-in commands and improved environment variable management. continued to flesh out shell behavior, addressing edge cases related to command substitution and pipeline execution.
📓 devlog · 2026-09-14 added initial architecture definition, establishing core components and their interactions for modularity. implemented key architectural components, focusing on separation of concerns to enhance maintainability. fleshed out various parts of the architecture, refining data flow and control structures between modules. wired up essential components to ensure proper communication and data exchange across the architecture. started multiple architectural elements concurrently, facilitating a more integrated approach to development. added several new architecture layers to improve scalability and support future feature additions. continued to implement and refine architecture, addressing edge cases related to component interaction and data integrity.
Ships:
nyx is a small operating-system kernel for 32-bit x86 PCs, written from scratch in Zig 0.15.2 with no C library and no external dependencies. It boots directly in QEMU and brings the machine up in 20 checked stages, from interrupts and timers through memory paging, a kernel heap, thread scheduling, disk and PCI drivers, and an in-memory filesystem loaded from an embedded tar archive. At boot it runs 15 built-in self-tests, then drops into an interactive shell with 30 commands that you can drive from the keyboard or over the serial port. It’s about 5,000 lines in total....
|
1792604855.109941
|
1792691255.109941
|
|
11950
|
Assembly os x64 custom kernel and bootloader by @s Assembly os x64 custom kernel and bootloader by @scrt401 | Stardance...
|
scrt401
|
1
|
415.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-17T10:02:38Z", "hours": 415.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Simple os with access to Ring 0 stuff the ai no work sadly", "repo": "https://github.com/majster0su0lin/SofaOs/tree/SofaOs-x86/x64", "demo": "https://github.com/majster0su0lin/SofaOs/releases/tag/V1"}]...
|
[{"post_id": 69772, "ts": "202 [{"post_id": 69772, "ts": "2026-09-17T19:19:09Z", "hours": 0.3047, "text": "ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs"}, {"post_id": 69042, "ts": "2026-09-16T08:32:04Z", "hours": 9.0064, "text": "Ok so refined devlogs polished sofaos and GitHub couldn’t ship because rhe whole kernel inflated from 52 to 838 sectors by some miracle, destroyed interrupt table, tensor hard coded stuff and other stuff it ruined my day also ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs"}, {"post_id": 68695, "ts": "2026-09-15T15:39:08Z", "hours": 3.1717, "text": "So today i finished argmax which finds closest token to response, now i have everything but it still has some errors it prints 0 every time so meybie some register colision but the good thing is that it doesn’t crash."}, {"post_id": 66064, "ts": "2026-09-11T17:07:16Z", "hours": 6.7411, "text": "Ok i have successfully made detokenizator which goes trough the token id book that many times as a token because token id =id book entries untill the token, and also i have made matrix–vector dot product calculator which goes through all token ids and translates them into a big amount of vectors which then in another step i will be doing comparison hbuf with all these vectors to find a token with lovest diff and that will be our output token, but big but it still isn’t tested i will be testing it when i will have the full command done for now i just want to live in an illusion that my code is error free"}, {"post_id": 65678, "ts": "2026-09-11T00:04:31Z", "hours": 7.4689, "text": "There was a problem with pointers in rnsm found it when i did double check and from there errors just piled up but at least its fixed now"}, {"post_id": 65088, "ts": "2026-09-09T23:44:59Z", "hours": 10.7261, "text": "Today i got help from my great teacher and was able to do more than usual, today i did hbuf setuper it basically just calls fcon 576 times to translate the values from 16 bit quantization to 32 then i have written a function RMSNorm which uses hbuf and weights you give it and calculates rescaled feuture vector"}, {"post_id": 64514, "ts": "2026-09-08T23:45:58Z", "hours": 4.1469, "text": "I have no idea how to fix it so i retreated ro the ol reliable method by first hardcoding it and after some time actually fixing it"}, {"post_id": 64041, "ts": "2026-09-08T05:17:04Z", "hours": 9.4239, "text": "Today i am a bit better so i did the harder part that is needed to be done, i have made tensor info gatherer, basically each layer has 9 tensor info, so for my model 9*30 tensor infos, also the string i am comparing in the function needs to be like [blk.][number of current layer in decimal(use bintrn)][specification string], it still doesn’t work but it will be something like infinite inc loop to memory or division basically smth that generates general protection, also because I was smart i saved my previous error where i used tensor info praser so i didn’t Neded to reerite it."}, {"post_id": 63041, "ts": "2026-09-06T16:40:58Z", "hours": 13.9978, "text": "Ok so uuh those 5l of Kofola wasn’t a great ide today i got a fever or flu or whatever the thing that makes you feel hot but i made some progress even though it was hard cuz i had a headache and couldn’t do anything so what i did i made a f16 to 32 translation and you might say hmm but this doesn’t seem too vomplex first of all i had to split registers inro 3 sections do calculation on them and the glue them together to xmm0 but what you might not know is if you don’t allow xmm is 32 bit mode it will throw gp an the whole code and you cant know why it crashed because whole runtime in crash log looks absolutely normal for some reason also I don’t actually care about the time anymore i just want to get this working so i can get a laptop to not code on my phone"}, {"post_id": 62412, "ts": "2026-09-05T19:08:49Z", "hours": 4.2733, "text": "Ok bad News today i drank 5l of Kofola and now me attention me hyperactive me cant concentrate but did token and bos token enumetion there was a problem with division because of no xor rdx,rdx but ez fix if boestoken add 1 it adds tokwn"}, {"post_id": 61794, "ts": "2026-09-04T21:32:05Z", "hours": 9.7972, "text": "Made the metadata praser work i was using tensor format and nkt metadata Format also verifyed it works on pc"}, {"post_id": 61430, "ts": "2026-09-04T10:41:02Z", "hours": 10.1667, "text": "Tokenizer done now for vector context calculator . The tokenizer was somwhat refusing to work but one rewrite later it subdued to my power it is split into teo parts the text decoder and encoder decoder formats the words for encoder and encoder finds tokens for the words"}, {"post_id": 61031, "ts": "2026-09-03T18:48:37Z", "hours": 9.1417, "text": "Ok i gave lost the war against the matadata praser i will not fight it now i will fix it in second ship for now i have hard coded the data needed and also made the core of the tokenizer which was relatively easy compared to the praser"}, {"post_id": 60700, "ts": "2026-09-03T07:49:19Z", "hours": 9.9789, "text": "Ok all metadata entry data prased but when i delete the print at the bottom it for some reason triple faults going to report every ±9 hrs because i need to speedrun this because the stardance is ending soon now onto tensor data praser"}, {"post_id": 60330, "ts": "2026-09-02T16:41:32Z", "hours": 9.3447, "text": "Ok bigg devlog todat i decided to speedrun this so i can ship this project as fast as possible also changed the model to a smaller native f16 quantization and It works which is a proof that anyone can put their model into sofaos and run it rn it just loops troug metadata to find general architecture"}, {"post_id": 59645, "ts": "2026-09-01T15:49:30Z", "hours": 5.2714, "text": "Hello good news today have started on setting up the data from GGUF rn it is just getting version metadata entryes and tensor entry, I Also started a loop for the metadata entryes but just started this one was easy cuz it has prefixed everything 4 bytes gguf magic 4 version 8 metadata entryes and 8 tensor info entry which makes 24 bytes in total"}, {"post_id": 58380, "ts": "2026-08-30T19:52:10Z", "hours": 6.5333, "text": "I have successfully loaded whole LLM problem was that It was loading 1 gb by 512 bytes and that takes very long and thats why it seemed it hanged I fixed it by giving it a counter so you can see that it doesn’t hang"}, {"post_id": 57573, "ts": "2026-08-29T19:16:39Z", "hours": 6.3667, "text": "Ok sooo I made the code buuut it hangs when I do the loading idk what happening will have to debug"}, {"post_id": 55739, "ts": "2026-08-27T18:30:20Z", "hours": 6.9333, "text": "Ok I give up on writing it, cuz GGUF file structure is ass and I can’t write it in the way it should be I am going to pull a cheap trick by putting a control string at the end of the file to know when the file is ending below is structure of how the whole file should look like"}, {"post_id": 54996, "ts": "2026-08-26T12:56:49Z", "hours": 8.4742, "text": "Ok I was figuring out how to load the gguf file which I think I got right but I can’t find a way to know how many sectors to pull out of disk because the metadata in gguf aren’t always the same nor size of the entries are the same so there is now way to know when they end and I need them to find the size of the file in picture you can see how the metadata is structured"}, {"post_id": 54059, "ts": "2026-08-24T20:31:14Z", "hours": 2.0172, "text": "Ok I have made a new command inout it let’s user chose number port in and port to listen from and it spits out response from the port as you can see I tried corrupting time register and it worked"}, {"post_id": 53159, "ts": "2026-08-23T16:30:52Z", "hours": 4.3508, "text": "Ok so I half rewritten the code for sector read I had to drop hard coded 0 and look for actuall devices to get the data from as you can see it works still"}, {"post_id": 52420, "ts": "2026-08-22T15:26:25Z", "hours": 4.1333, "text": "Ok so I was working on gluing gguf file at the end of my iso you can see image it was successful also needed to generalize ahci driver to work on all PCs now writing the gguf retrieve from disk code"}, {"post_id": 51949, "ts": "2026-08-21T22:06:31Z", "hours": 6.9186, "text": "Ok so uuuh….. Somehow secr destroyditself up and I had to fix it the thing is that from 0xffffff… Somehow one of the f magically dissapeared and I had to basically trace whole Drs sector to find what was wrong also waking aps for some reason isn’t working even I am using textbook code to wake it up I now have no idea why is it not working mameybie I will gat back to it at the end and now do the special function because everyone on stardance for some reason started doing X64 os so I had to come up with something radical, I am going to make a full local assembly llm chat engine like llama.cpp fully in assembly for sofaos all things from scratch tokenizer network loading calculation and other stuff I have nothing really to show so just enjoy some random pic from my gallery"}, {"post_id": 50626, "ts": "2026-08-19T21:25:41Z", "hours": 1.5097, "text": "Aps not responding should put 67 to px67 but aps not doing idk if because of qemu or whatever I don’t want to debug this piece of shi"}, {"post_id": 48801, "ts": "2026-08-17T10:37:03Z", "hours": 9.8594, "text": "Spent I don’t even know how much time I lost track of time doing this shit I did it whole night I am happy that I am going to sleep at 12:33 the error was that I wasn’t sending enough sipis so the aps didn’t actually wake up but I didn’t knew that so I was tracing the whole os to find the error then I actually checked on internet how should it be done and that’s when I was finally able to fix this simple ass problem"}, {"post_id": 46606, "ts": "2026-08-13T23:28:04Z", "hours": 9.4331, "text": "Finished the core wakeup now I can wakeup any numver of cores that I have and now I am going to make some serious multitasking i still need to do the trampoline to launch the cores to 64 bit mode but they will be fast also the limit of cores for legacy PCs is 255 but it is still engouh to wake up amd epyc"}, {"post_id": 45351, "ts": "2026-08-11T19:00:05Z", "hours": 7.7386, "text": "Ok I have found the number of cores which is a huge milestone now I need to find what is the bsp to not wakeup already woken up core number of cores is in a memory buffer 256 bytes big cous the CPU doesn’t have enough IDs for more than 255 cores so even In future it will be ok"}, {"post_id": 42209, "ts": "2026-08-06T20:25:10Z", "hours": 6.2731, "text": "Found Madt table finally going to get number of cores to wakeup"}, {"post_id": 41610, "ts": "2026-08-05T22:27:33Z", "hours": 7.7322, "text": "I did some preparations for init sipi sipi trampoline to wake up more cores for multitasking it just finds acpi rsdp in memory I also want to be able for user to chose how many cores to wakeup"}, {"post_id": 39343, "ts": "2026-08-02T08:01:35Z", "hours": 9.4314, "text": "Added the ability to read what’s on the disk there was a problem with R14 cuz one function that I called used it but push and pop fixed it after I traced the problem without it would print 20 endlessly till it crashed"}, {"post_id": 36740, "ts": "2026-07-29T00:11:34Z", "hours": 4.6686, "text": "Ok I have found the solution instead of looking trough all ports it stops on the firt found idk how it works but it works now I can extract data from disk"}, {"post_id": 35588, "ts": "2026-07-27T03:43:28Z", "hours": 9.2492, "text": "Something is very wrong here. Every debug marker along the boot/init path prints exactly like it should, and it still never makes it to the shell. Going to need a proper trace through this instead of guessing."}, {"post_id": 32921, "ts": "2026-07-22T12:09:35Z", "hours": 8.0367, "text": "PCI bus enumeration, done by brute-force, but like every os does it this way loop over every bus, device, and function number, write a config address to IO port 0xCF8 , read whatever comes back from 0xCFC . All ones means nothing’s there; anything else gets recorded. Once every device on the bus is found, it scans the results for a class code matching AHCI (SATA storage), grabs that device’s BAR5, and starts bringing the controller up — reset bit set, poll until it clears, enable global host control. This is what opens up actual disk read/write instead of relying on BIOS"}, {"post_id": 29065, "ts": "2026-07-15T18:30:38Z", "hours": 0.2567, "text": "Added whatindr just copied function whatincr and changed registers from control to debug"}, {"post_id": 28980, "ts": "2026-07-15T16:38:29Z", "hours": 12.4869, "text": "I added so when the user types it automatically moves screen to VGA buffer so it doesn’t overwrite bad memmory and implemented this thing for cpritn too so if you are near end of the screen it automatically moves up (number of rewrites this function took 3) in pic you can see how cpritn automatically moved up"}, {"post_id": 26737, "ts": "2026-07-11T18:16:27Z", "hours": 9.8742, "text": "Added translate which translates number from hex to dec and also the other way and command to see what in memory I had to make a new function to accept hex and Dec and figure out which one is which than grab byte from memory not 8 bytes was stuck on that then output which was easy cus I already have function for that then added translate which just uses hexbin function for Dec and bin for hex and outputs in the other format also I don’t have much time to code because I am a slave on a construction now and I get paid absolute minimum"}, {"post_id": 20804, "ts": "2026-07-02T14:45:38Z", "hours": 7.6444, "text": "Ok so today I have made saythis command which is basically echo (system says what you tell it to) and whatincr which basically spits out what is in control registers which might be useful for some repairman or whatever but I had to make new functions like bintrn which turns normal pc number into decimal ASCII string but I had the loop wrong it started at wrong point but now it should work"}, {"post_id": 18754, "ts": "2026-06-29T23:04:10Z", "hours": 7.3631, "text": "Added scroll up, just the reverse of scroll down — but still needed its own direction logic and its own set of variables reset correctly, and the first version was so badly written that i just rewrote the thing"}, {"post_id": 16826, "ts": "2026-06-27T10:08:25Z", "hours": 14.0714, "text": "Limited coding time cuz i am on vacation in Berlin but made progress on scrolling the screen now scrolls down good text overflows the bottom. Scroll up still doesn’t exist the first attempt was so tangled it wasn’t worth saving, so that one got scrapped rather than patched."}, {"post_id": 14559, "ts": "2026-06-23T18:40:49Z", "hours": 15.5939, "text": "Added more text commands and started on ones that actually do something, like echo. Also started work on moving text up and down the screen, which is lowk hard"}, {"post_id": 12479, "ts": "2026-06-20T11:33:22Z", "hours": 9.3064, "text": "Completed the command system — a compare routine ( cmper ) checks whatever’s typed against a table of known command strings and jumps straight to that command’s handler on a match. First command wired up was cls , mostly because the screen clearer routine already existed. Everything else gets added the same way from here."}, {"post_id": 11616, "ts": "2026-06-18T22:21:16Z", "hours": 5.1686, "text": "Terminal UI is functional now — Enter does something, and extended interrupts (arrow keys) get decoded properly instead of coming through as garbage. Also added a distinct sys response visual state vs just characters The color choices right now are not best need to actually look into color theory."}, {"post_id": 11321, "ts": "2026-06-18T15:03:42Z", "hours": 3.1789, "text": "Forgot to say this last time, but there’s now a basic (not working) concept of user input reaching the system layer — just the shape of how it should work, not the real thing yet. Finishing that up next so it actually looks like a terminal. Worth sayi the cursor ( curzor ) tracking and the cls screen-clear command both went in a little earlier and are what everything since has been built on top of."}, {"post_id": 11192, "ts": "2026-06-18T09:50:01Z", "hours": 8.1875, "text": "Text now behaves like a normal shell — typing lands where it should, and added a working delete/backspace key plus some general UI cleanup. Starting to lok like an actual terminal instead of a proof of concept."}, {"post_id": 10930, "ts": "2026-06-17T22:14:13Z", "hours": 4.3675, "text": "Keyboard handler is fixed. Can freely type now. thought: there’s currently nothing stopping unrestricted writes from going past where they should, which means someone could in theory type their way into overwriting parts of the running system. Needs boundaries before this goes further."}, {"post_id": 10672, "ts": "2026-06-17T15:09:06Z", "hours": 4.9003, "text": "Fixed yesterday’s error. Now testing on real hardware to check whether the machine actually virtualizes PS2 keyboard controller the same way QEMU does, since the handler logic depends on that"}, {"post_id": 10316, "ts": "2026-06-16T23:51:15Z", "hours": 8.5125, "text": "Tried implementing a keyboard press handler. Sadly, it does not work. Something in the interrupt handling isn’t right — more debugging needed before typing does anything useful."}, {"post_id": 9785, "ts": "2026-06-16T07:03:14Z", "hours": 6.5003, "text": "Finally transitioned into 64-bit mode, so the actual OS can start getting written now. Not going to explain every step in detail since it’s always the same , but simple: built page tables using 2MB pages so the fourth paging level (the 4KB page table) could be skipped entirely, set up the stack, and did the rest of the long-mode setup (PAE, the EFER long-mode-enable bit, then paging itself) before the far jump into 64-bit code."}, {"post_id": 9416, "ts": "2026-06-15T19:29:46Z", "hours": 6.1778, "text": "Big milestone got it running on an actual my pc instead of just QEMU. Had to go back into stage 1 real BIOSes are pickier than QEMU’s about a few things. Nothing structural changed, just les forgiving to handle."}, {"post_id": 9090, "ts": "2026-06-15T05:59:09Z", "hours": 5.4553, "text": "Ok found the bug it was bad cmp flag check still a bad Habit I have from arm to instead of je is Zero try to do arm syntax and do jz, (BZ branch if zero) but now it works ok"}, {"post_id": 8967, "ts": "2026-06-14T22:37:16Z", "hours": 14.9994, "text": "Pulled an all-nighter and finally got a boot working — turned out QEMU was set to -nographic, so my VGA output was being generated correctly but never actually displayed. Once I fixed that, i found a new problem up: once in 32-bit mode, my code started printing from the top of the screen and overwriting text the BIOS had already written. Progress, but a new bug was right behind the old one. Still it doesn’t want to move forward it should print k at the end so something is wrong I am going to investigate It."}, {"post_id": 8362, "ts": "2026-06-13T22:01:15Z", "hours": 16.1964, "text": "I hate this stupid code , literally the only thing I do is find an error, find what could possibly cause it, fix it, and it still doesn’t work. Do that a hundred times, and it turns out the BIOS — which promises not to touch DL — corrupts it anyway during interrupt 0x16. Whatever. Still not fully working, but at least I’ve got the core structure for moving into 32-bit mode. I hate this — why do all x64 processors have to wake up going “uhm I think I’m an IBM processor from 1967” instead of just dropping into 64-bit like ARM does? Also my PC screen broke, so now I’m SSH’d in through Termux to code this thing. I hate assembly but low-key need a new PC — that old Compaq 6510b with 2GHz and two cores isn’t cutting it anymore."}, {"post_id": 7061, "ts": "2026-06-11T20:39:29Z", "hours": 3.8658, "text": "Getting close to 32-bit mode. Added a memory tester using INT 0x15, EAX=0xE820 so the OS actually knows how much RAM exists and where, instead of assuming. Also built two different A20 gate openers — the fast method through port 0x92 first, and a manual read/write test on mirrored addresses as a fallback if that doesn’t take. If one fails, the other starts"}, {"post_id": 6770, "ts": "2026-06-11T10:43:03Z", "hours": 5.9658, "text": "Went back and leaned stage 1 more heavily on the print funtion ( cpritn ) instead of duplicating printing logic, and tightened up the handoff into stage 2. Stage 2 now loads the kernel using a preset Disk Address Packet instead of recalculating the sector count and offset from scratch every single time it runs."}, {"post_id": 5895, "ts": "2026-06-09T21:12:59Z", "hours": 2.0008, "text": "Added LBA (logical block addressing) table implementation — sadly no support hard drives that don’t support it. Also added a test so if the computer’s too old to do extended reads, it just refuses to boot instead of silently corrupting stuff. Auto-retry if something goes wrong, and it jumps to address 0x7E00, where the end of the 2# stage starts."}, {"post_id": 5202, "ts": "2026-06-08T21:59:31Z", "hours": 0.3206, "text": "Did some testing on the 1# stage bootloader today. Now I need to link it up to the 2# stage and then to the actual OS — right now the 1# stage basically just saves what the BIOS hands us (bios present) and tells the system where the 2# stage lives."}]...
|
Title: Assembly os x64 custom kernel and bootloade Title: Assembly os x64 custom kernel and bootloader by @scrt401 | Stardance
Devlogs:
Did some testing on the 1# stage bootloader today. Now I need to link it up to the 2# stage and then to the actual OS — right now the 1# stage basically just saves what the BIOS hands us (bios present) and tells the system where the 2# stage lives.
Added LBA (logical block addressing) table implementation — sadly no support hard drives that don’t support it. Also added a test so if the computer’s too old to do extended reads, it just refuses to boot instead of silently corrupting stuff. Auto-retry if something goes wrong, and it jumps to address 0x7E00, where the end of the 2# stage starts.
Went back and leaned stage 1 more heavily on the print funtion ( cpritn ) instead of duplicating printing logic, and tightened up the handoff into stage 2. Stage 2 now loads the kernel using a preset Disk Address Packet instead of recalculating the sector count and offset from scratch every single time it runs.
Getting close to 32-bit mode. Added a memory tester using INT 0x15, EAX=0xE820 so the OS actually knows how much RAM exists and where, instead of assuming. Also built two different A20 gate openers — the fast method through port 0x92 first, and a manual read/write test on mirrored addresses as a fallback if that doesn’t take. If one fails, the other starts
I hate this stupid code , literally the only thing I do is find an error, find what could possibly cause it, fix it, and it still doesn’t work. Do that a hundred times, and it turns out the BIOS — which promises not to touch DL — corrupts it anyway during interrupt 0x16. Whatever. Still not fully working, but at least I’ve got the core structure for moving into 32-bit mode. I hate this — why do all x64 processors have to wake up going “uhm I think I’m an IBM processor from 1967” instead of just dropping into 64-bit like ARM does? Also my PC screen broke, so now I’m SSH’d in through Termux to code this thing. I hate assembly but low-key need a new PC — that old Compaq 6510b with 2GHz and two cores isn’t cutting it anymore.
Pulled an all-nighter and finally got a boot working — turned out QEMU was set to -nographic, so my VGA output was being generated correctly but never actually displayed. Once I fixed that, i found a new problem up: once in 32-bit mode, my code started printing from the top of the screen and overwriting text the BIOS had already written. Progress, but a new bug was right behind the old one. Still it doesn’t want to move forward it should print k at the end so something is wrong I am going to investigate It.
Ok found the bug it was bad cmp flag check still a bad Habit I have from arm to instead of je is Zero try to do arm syntax and do jz, (BZ branch if zero) but now it works ok
Big milestone got it running on an actual my pc instead of just QEMU. Had to go back into stage 1 real BIOSes are pickier than QEMU’s about a few things. Nothing structural changed, just les forgiving to handle.
Finally transitioned into 64-bit mode, so the actual OS can start getting written now. Not going to explain every step in detail since it’s always the same , but simple: built page tables using 2MB pages so the fourth paging level (the 4KB page table) could be skipped entirely, set up the stack, and did the rest of the long-mode setup (PAE, the EFER long-mode-enable bit, then paging itself) before the far jump into 64-bit code.
Tried implementing a keyboard press handler. Sadly, it does not work. Something in the interrupt handling isn’t right — more debugging needed before typing does anything useful.
Fixed yesterday’s error. Now testing on real hardware to check whether the machine actually virtualizes PS2 keyboard controller the same way QEMU does, since the handler logic depends on that
Keyboard handler is fixed. Can freely type now. thought: there’s currently nothing stopping unrestricted writes from going past where they should, which means someone could in theory type their way into overwriting parts of the running system. Needs boundaries before this goes further.
Text now behaves like a normal shell — typing lands where it should, and added a working delete/backspace key plus some general UI cleanup. Starting to lok like an actual terminal instead of a proof of concept.
Forgot to say this last time, but there’s now a basic (not working) concept of user input reaching the system layer — just the shape of how it should work, not the real thing yet. Finishing that up next so it actually looks like a terminal. Worth sayi the cursor ( curzor ) tracking and the cls screen-clear command both went in a little earlier and are what everything since has been built on top of.
Terminal UI is functional now — Enter does something, and extended interrupts (arrow keys) get decoded properly instead of coming through as garbage. Also added a distinct sys response visual state vs just characters The color choices right now are not best need to actually look into color theory.
Completed the command system — a compare routine ( cmper ) checks whatever’s typed against a table of known command strings and jumps straight to that command’s handler on a match. First command wired up was cls , mostly because the screen clearer routine already existed. Everything else gets added the same way from here.
Added more text commands and started on ones that actually do something, like echo. Also started work on moving text up and down the screen, which is lowk hard
Limited coding time cuz i am on vacation in Berlin but made progress on scrolling the screen now scrolls down good text overflows the bottom. Scroll up still doesn’t exist the first attempt was so tangled it wasn’t worth saving, so that one got scrapped rather than patched.
Added scroll up, just the reverse of scroll down — but still needed its own direction logic and its own set of variables reset correctly, and the first version was so badly written that i just rewrote the thing
Ok so today I have made saythis command which is basically echo (system says what you tell it to) and whatincr which basically spits out what is in control registers which might be useful for some repairman or whatever but I had to make new functions like bintrn which turns normal pc number into decimal ASCII string but I had the loop wrong it started at wrong point but now it should work
Added translate which translates number from hex to dec and also the other way and command to see what in memory I had to make a new function to accept hex and Dec and figure out which one is which than grab byte from memory not 8 bytes was stuck on that then output which was easy cus I already have function for that then added translate which just uses hexbin function for Dec and bin for hex and outputs in the other format also I don’t have much time to code because I am a slave on a construction now and I get paid absolute minimum
I added so when the user types it automatically moves screen to VGA buffer so it doesn’t overwrite bad memmory and implemented this thing for cpritn too so if you are near end of the screen it automatically moves up (number of rewrites this function took 3) in pic you can see how cpritn automatically moved up
Added whatindr just copied function whatincr and changed registers from control to debug
PCI bus enumeration, done by brute-force, but like every os does it this way loop over every bus, device, and function number, write a config address to IO port 0xCF8 , read whatever comes back from 0xCFC . All ones means nothing’s there; anything else gets recorded. Once every device on the bus is found, it scans the results for a class code matching AHCI (SATA storage), grabs that device’s BAR5, and starts bringing the controller up — reset bit set, poll until it clears, enable global host control. This is what opens up actual disk read/write instead of relying on BIOS
Something is very wrong here. Every debug marker along the boot/init path prints exactly like it should, and it still never makes it to the shell. Going to need a proper trace through this instead of guessing.
Ok I have found the solution instead of looking trough all ports it stops on the firt found idk how it works but it works now I can extract data from disk
Added the ability to read what’s on the disk there was a problem with R14 cuz one function that I called used it but push and pop fixed it after I traced the problem without it would print 20 endlessly till it crashed
I did some preparations for init sipi sipi trampoline to wake up more cores for multitasking it just finds acpi rsdp in memory I also want to be able for user to chose how many cores to wakeup
Found Madt table finally going to get number of cores to wakeup
Ok I have found the number of cores which is a huge milestone now I need to find what is the bsp to not wakeup already woken up core number of cores is in a memory buffer 256 bytes big cous the CPU doesn’t have enough IDs for more than 255 cores so even In future it will be ok
Finished the core wakeup now I can wakeup any numver of cores that I have and now I am going to make some serious multitasking i still need to do the trampoline to launch the cores to 64 bit mode but they will be fast also the limit of cores for legacy PCs is 255 but it is still engouh to wake up amd epyc
Spent I don’t even know how much time I lost track of time doing this shit I did it whole night I am happy that I am going to sleep at 12:33 the error was that I wasn’t sending enough sipis so the aps didn’t actually wake up but I didn’t knew that so I was tracing the whole os to find the error then I actually checked on internet how should it be done and that’s when I was finally able to fix this simple ass problem
Aps not responding should put 67 to px67 but aps not doing idk if because of qemu or whatever I don’t want to debug this piece of shi
Ok so uuuh….. Somehow secr destroyditself up and I had to fix it the thing is that from 0xffffff… Somehow one of the f magically dissapeared and I had to basically trace whole Drs sector to find what was wrong also waking aps for some reason isn’t working even I am using textbook code to wake it up I now have no idea why is it not working mameybie I will gat back to it at the end and now do the special function because everyone on stardance for some reason started doing X64 os so I had to come up with something radical, I am going to make a full local assembly llm chat engine like llama.cpp fully in assembly for sofaos all things from scratch tokenizer network loading calculation and other stuff I have nothing really to show so just enjoy some random pic from my gallery
Ok so I was working on gluing gguf file at the end of my iso you can see image it was successful also needed to generalize ahci driver to work on all PCs now writing the gguf retrieve from disk code
Ok so I half rewritten the code for sector read I had to drop hard coded 0 and look for actuall devices to get the data from as you can see it works still
Ok I have made a new command inout it let’s user chose number port in and port to listen from and it spits out response from the port as you can see I tried corrupting time register and it worked
Ok I was figuring out how to load the gguf file which I think I got right but I can’t find a way to know how many sectors to pull out of disk because the metadata in gguf aren’t always the same nor size of the entries are the same so there is now way to know when they end and I need them to find the size of the file in picture you can see how the metadata is structured
Ok I give up on writing it, cuz GGUF file structure is ass and I can’t write it in the way it should be I am going to pull a cheap trick by putting a control string at the end of the file to know when the file is ending below is structure of how the whole file should look like
Ok sooo I made the code buuut it hangs when I do the loading idk what happening will have to debug
I have successfully loaded whole LLM problem was that It was loading 1 gb by 512 bytes and that takes very long and thats why it seemed it hanged I fixed it by giving it a counter so you can see that it doesn’t hang
Hello good news today have started on setting up the data from GGUF rn it is just getting version metadata entryes and tensor entry, I Also started a loop for the metadata entryes but just started this one was easy cuz it has prefixed everything 4 bytes gguf magic 4 version 8 metadata entryes and 8 tensor info entry which makes 24 bytes in total
Ok bigg devlog todat i decided to speedrun this so i can ship this project as fast as possible also changed the model to a smaller native f16 quantization and It works which is a proof that anyone can put their model into sofaos and run it rn it just loops troug metadata to find general architecture
Ok all metadata entry data prased but when i delete the print at the bottom it for some reason triple faults going to report every ±9 hrs because i need to speedrun this because the stardance is ending soon now onto tensor data praser
Ok i gave lost the war against the matadata praser i will not fight it now i will fix it in second ship for now i have hard coded the data needed and also made the core of the tokenizer which was relatively easy compared to the praser
Tokenizer done now for vector context calculator . The tokenizer was somwhat refusing to work but one rewrite later it subdued to my power it is split into teo parts the text decoder and encoder decoder formats the words for encoder and encoder finds tokens for the words
Made the metadata praser work i was using tensor format and nkt metadata Format also verifyed it works on pc
Ok bad News today i drank 5l of Kofola and now me attention me hyperactive me cant concentrate but did token and bos token enumetion there was a problem with division because of no xor rdx,rdx but ez fix if boestoken add 1 it adds tokwn
Ok so uuh those 5l of Kofola wasn’t a great ide today i got a fever or flu or whatever the thing that makes you feel hot but i made some progress even though it was hard cuz i had a headache and couldn’t do anything so what i did i made a f16 to 32 translation and you might say hmm but this doesn’t seem too vomplex first of all i had to split registers inro 3 sections do calculation on them and the glue them together to xmm0 but what you might not know is if you don’t allow xmm is 32 bit mode it will throw gp an the whole code and you cant know why it crashed because whole runtime in crash log looks absolutely normal for some reason also I don’t actually care about the time anymore i just want to get this working so i can get a laptop to not code on my phone
Today i am a bit better so i did the harder part that is needed to be done, i have made tensor info gatherer, basically each layer has 9 tensor info, so for my model 9*30 tensor infos, also the string i am comparing in the function needs to be like [blk.][number of current layer in decimal(use bintrn)][specification string], it still doesn’t work but it will be something like infinite inc loop to memory or division basically smth that generates general protection, also because I was smart i saved my previous error where i used tensor info praser so i didn’t Neded to reerite it.
I have no idea how to fix it so i retreated ro the ol reliable method by first hardcoding it and after some time actually fixing it
Today i got help from my great teacher and was able to do more than usual, today i did hbuf setuper it basically just calls fcon 576 times to translate the values from 16 bit quantization to 32 then i have written a function RMSNorm which uses hbuf and weights you give it and calculates rescaled feuture vector
There was a problem with pointers in rnsm found it when i did double check and from there errors just piled up but at least its fixed now
Ok i have successfully made detokenizator which goes trough the token id book that many times as a token because token id =id book entries untill the token, and also i have made matrix–vector dot product calculator which goes through all token ids and translates them into a big amount of vectors which then in another step i will be doing comparison hbuf with all these vectors to find a token with lovest diff and that will be our output token, but big but it still isn’t tested i will be testing it when i will have the full command done for now i just want to live in an illusion that my code is error free
So today i finished argmax which finds closest token to response, now i have everything but it still has some errors it prints 0 every time so meybie some register colision but the good thing is that it doesn’t crash.
Ok so refined devlogs polished sofaos and GitHub couldn’t ship because rhe whole kernel inflated from 52 to 838 sectors by some miracle, destroyed interrupt table, tensor hard coded stuff and other stuff it ruined my day also ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs
ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs
Ships:
Simple os with access to Ring 0 stuff the ai no work sadly...
|
1792128166.6835837
|
1792992166.6835837
|
|
6811
|
Borealis by @onyxtheone | Stardance
|
onyxtheone
|
1
|
383.93
|
4072
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T20:46:18Z", "hours": 241.0, "multiplier": 19.2, "payout": 4072, "blessing": "neutral", "text": "I built BTBX (Bare Tiny(?) BASIC eXecutor), a self-contained BASIC interpreter that is the operating system. There’s no Linux, no DOS, nothing underneath it. It boots straight off a FAT12 floppy image via a two-stage bootloader (512-byte stage1 + 2KB stage2), flips the CPU into protected mode, sets up the A20 gate, and lands you directly in a BASIC REPL, all inside 640KB of conventional memory. From there it’s a real language: GOTO, GOSUB, FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, multi-dimensional arrays, 32-bit integers plus x87 80-bit floats, string functions (LEFT$, MID$, CHR$, etc.), and a full FAT12 filesystem so you can actually SAVE, LOAD, and DIR your programs on the disk image. There’s also PEEK/POKE for raw memory access, BLOAD/SYS to load and jump into raw machine code, VGA graphics primitives, a PIT-driven BEEP, and — half-finished but present — a SAY command aiming for SAM-style formant speech synthesis. What was challenging? Everything below the interpreter, honestly. Getting the boot chain right (CHS and EDD disk reads, A20 enabling that doesn’t silently hang, jumping into protected mode without immediately triple-faulting) took far longer than any language feature. The BIOS-thunk approach for file I/O (calling back into 16-bit real mode from a 32-bit kernel just to talk to disk) was its own maze. The funniest recent challenge was building a browser demo on top of v86: getting PS/2 keyboard Shift state to survive contact with a web browser turned out to be nearly as hard as writing the A20 gate code itself :3. Real hardware (and QEMU) just work; browsers apparently have opinions about what a Shift key is allowed to do. What am I proud of? That it boots at all, genuinely. A homemade OS with a homemade language on top, running real math through the x87 FPU and reading/writing a real filesystem, in under 640KB, with zero borrowed runtime. Getting arrays, strings, and file I/O all coexisting cleanly in a from-scratch interpreter over ~240 hours feels like the actual milestone here, not any single feature. What should people know to test it? Use make && make run, that's the supported path, tested in QEMU, and it's where shift/symbols work correctly. The browser demo (v86-based) is explicitly beta. booting and typing work, but shift-modified keys are unreliable there due to browser/emulator keyboard quirks (a real physical keyboard emulator interaction gap, not a BASIC bug ^^). Don't judge the interpreter by the demo's keyboard weirdness. Try PRINT, FOR/NEXT loops, SAVE/LOAD/DIR to confirm the filesystem works, and BEEP for audio. SAY is a known work-in-progress ergo don't expect actual speech (yet). Check the source tree if you want to see the boot chain (boot/stage1.asm, boot/stage2.asm) separately from the interpreter (src/kernel/basic.c).", "repo": "https://github.com/onyx-the-one/borealis", "demo": "https://onyx-the-one.github.io/borealis"}]...
|
[{"post_id": 63409, "ts": "202 [{"post_id": 63409, "ts": "2026-09-07T07:11:12Z", "hours": 9.3, "text": "its been a week since my last devlog, i dont have much new to add because with school and other responsibilities i dont have much time for actuall progress on this project. still i accumulated some 9 hours (sorry gizzy) by doing small changed, linting, updating forgotten banners and version numbers and so on. EHCI/USB still fails on the same issues as before. i will be reverting to a superfloppy boot because right now i cant even get debug to write to the disk which is annoying. then once i get the usb driver with all its issues working (sometime next decade) i can give usb boot another shot."}, {"post_id": 58426, "ts": "2026-08-30T20:43:20Z", "hours": 6.0, "text": "i am (still) putting in work on the usb driver, this is proving to be very complicated especially because my hardware is not cooperating. im thinking about switching back to floppy-emulated mode which would be more practical for debugging but at the same time probably introduce new issues i dont even expect yet."}, {"post_id": 53934, "ts": "2026-08-24T17:11:33Z", "hours": 7.1178, "text": "the port resets work on the laptop now. the bit we were waiting on (port-enable-changed) was being acknowledged by the bios’s smm ghost before we ever saw it, so we stopped waiting on the status bit and just read the port state, which can’t be acked away. also fixed before it bit us: two devices answering address 0 at once (enumeration is per-port now, and every device gets a real address before the next port wakes up). the next failure was prettier: every OUT transfer works, every IN transfer dies. the stick takes its orders but can’t talk back. that’s the signature of the qtd buffer list, the one place real ich silicon is strict where qemu is forgiving, so all dma buffers are page-aligned now and the error reports name whichever endpoint stalled. also everyone gotta apreciate the blahaj!"}, {"post_id": 50969, "ts": "2026-08-20T13:23:36Z", "hours": 9.3333, "text": "the stick is a disk now, no bios involved: usb grew enumeration and bot/scsi, fat12 picks whichever backend came up. qemu took the whole chain first try. the laptop found the stick on port 0 and then refused to reset it (my fault), the 50ms delay was port-0x80 writes that only cost real time inside qemu, so there’s a pit-based clock now. plot twist from the log meanwhile: the bios path worked on the laptop, because the toggles that “didn’t help” had quietly moved the stick to floppy emulation, and that path survives the mode switch. so it (partially) boots by accident while we fix it on purpose. also caught in a self-audit: a stall burned a full second, and a short read could report success with half a sector. readme rewritten as i was told to by sw."}, {"post_id": 50492, "ts": "2026-08-19T17:32:16Z", "hours": 5.8606, "text": "im still working on getting a usb driver to work. ehci seems to work kinda but its a loop between giving false data, partial data and occasionally seemingly true data but then usb decides it doesnt like it and ideally fat12 fails durning cache load too, WHICH I FIXED LONG AGO BRUH. but it came back for some reason. so im trying timing, msd, stall handling everything. this may take another decade."}, {"post_id": 49913, "ts": "2026-08-18T21:34:01Z", "hours": 6.4844, "text": "debug spew is a file now. every checkpoint from the first instruction onward (entry asm, the real-mode thunk letters, all the [DEBUG] lines) lands in a buffer, and once the fs proves it can write, the buffer becomes LOG.TXT and the screen clears to the banner. the trick is the default: echo stays on until the file is safely written, so a boot that dies early still shows everything live. the fallback isn’t a code path, it’s just never getting to the quiet part. LOG=0 in CONFIG.TXT keeps the old wallpaper. and the log already caught its first bug: a missing [EZTG] tattled on a stale version entry.asm. debugging is too important to leave on the screen."}, {"post_id": 49489, "ts": "2026-08-18T11:03:57Z", "hours": 9.5697, "text": "the stick talks, and for the first time it’s talking to us, not the bios. this part was the transfer engine: queue heads and transfer descriptors, little linked-list structs the ehci controller fetches out of ram and executes on its own. a control transfer is three of them chained by hand (setup, data, status), data toggles set manually per stage because high-speed lets you. link the queue head into the async ring, poll the active bit, unlink, then ring the doorbell (an actual doorbell bit) so the controller formally forgets the whole thing before the structs get reused. first exchange: GET_DESCRIPTOR at address 0, and the stick answered with its vid/pid like a civilized device. qemu’s stick goes by 46f4:0001; the real one can introduce itself when the laptop’s back. next: scsi over bulk, and fat12 stops caring what a disk is. moral: usb devices are polite, they just want to be asked in struct form."}, {"post_id": 48764, "ts": "2026-08-17T09:14:22Z", "hours": 9.3231, "text": "the laptop’s bios has a party trick: as i described before, int 13h works fine until the cpu enters protected mode, then it never returns, not even for a no-transfer disk reset. bios toggles didn’t help, so borealis is growing a native usb driver. first part: find the ehci controller over pci, do the formal ownership handshake (there’s an actual semaphore register in config space where the os and the bios’s smm ghost take turns. set our bit, wait for theirs to clear, then kill every smi source so the ghost stops getting summoned), reset the controller, spin up an idle async schedule, scan the ports. no packets yet, just a controller that’s officially ours. dev loop is qemu with a stick image on an emulated ehci, boot still from floppy, so the laptop only has to show up for the one hardware-specific part. moral: if the firmware won’t share the hardware, take the hardware."}, {"post_id": 47754, "ts": "2026-08-15T21:50:44Z", "hours": 4.8914, "text": "instrumented the thunk to print a letter per step so a hang names its own murderer. result: Rer , then nothing. R entered real mode, e entered the EDD read, r was about to issue a disk reset, ah=00h, the simplest int 13h call there is, no transfer, and it never returned. if even a no-op reset hangs after the PM excursion, the bios’s whole disk service is dead post-protected-mode on this machine, full stop. so the fix is a native usb driver. helix talks EHCI directly, bios for boot and native for runtime, as it should be, but that’s pci + ownership handoff from the very SMM that broke us + enumeration + BOT/scsi, and you don’t bring that up blind, one teletype letter per reboot, right before losing the hardware. deferred until the laptop’s back on hand; qemu remains unaffected."}, {"post_id": 47202, "ts": "2026-08-14T23:22:02Z", "hours": 5.7114, "text": "working theory: the bios’s legacy usb support, and specifically system management mode. coil runs in pure real mode and its EDD reads work, the bios reads the stick happily at boot. but helix runs in protected mode, and calling the bios means dropping back through a thunk, and that round-trip is where it dies. on a machine this age legacy usb lives in SMM: the bios traps disk interrupts and does the transfer in a mode invisible to the os, assuming a clean real-mode cpu, and our PM excursion breaks that assumption. the tell: teletype (int 10h) works from the thunk, disk (int 13h) hangs. teletype doesn’t touch usb, disk does. photo is the bios setup screen, where i went hunting for a legacy usb toggle which i did not find ;3c"}, {"post_id": 46999, "ts": "2026-08-14T15:56:13Z", "hours": 4.2892, "text": "next wall, immediate: the machine hangs at fat_cache_load, the step where helix reads the FAT and root directory into RAM. in qemu this works instantly but on the laptop the disk read goes out and never comes back. no error, no status, no return. debug output narrows it to exactly the transfer call: everything before prints, everything after doesn’t."}, {"post_id": 46771, "ts": "2026-08-14T08:36:41Z", "hours": 5.2839, "text": "borealis booted on the laptop for the first time. not qemu but actual silicon, a core 2 duo, off a usb stick. coil came up, loaded helix, and the machine made it to the banner plus three debug lines, which is the whole chain working on real firmware: stage1 > stage2 > kernel > protected mode. CHS disk was already known broken cos this bios won’t talk cylinders/heads/sectors to a stick with no real geometry, fair enough — so coil booted over EDD, but helix’s disk layer still assumed CHS and the filesystem never came up. still: it boots, on real hardware. just doesnt get far enough to be useful (yet)."}, {"post_id": 45393, "ts": "2026-08-11T20:28:36Z", "hours": 1.4333, "text": "im still working on real hw boot issues. coil doesnt guess geometry anymore, it brutes it: the new stage2 tries every plausible CHS geometry against a buildtime checksum of the kernel’s first sector and prints the one that actually works. no more “trust the BIOS” and no more “reject the BIOS”, just prove it. on a sane machine it prints g(18.2) and boots like nothing happened. on the laptop it either prints its real geometry and boots, or prints G! plus what the BIOS claimed. either way i finally get an answer instead of a silent reset. in the meantime ill be working on some features like arrows, logging, etc. attached photo of my testing setup"}, {"post_id": 45321, "ts": "2026-08-11T18:14:12Z", "hours": 5.1247, "text": "boot splash is in and shipping on the image. CONFIG.TXT decides, SPLASH.BAS plays on boot, keypress skips. the hook was “just two lines” and then reality happened: config.c wasnt in the makefile, the loader was static, and the first boot loaded the splash then sat at the prompt waiting for me to type RUN myself. three one-line fixes later: coil letters, banner, aurora, prompt. also fixed make pack details. the machine has a boot vibe now next up is proper scrollback, logging, and arrow key support."}, {"post_id": 44866, "ts": "2026-08-10T22:05:04Z", "hours": 2.6764, "text": "the system has a config file now. CONFIG.TXT on the boot disk, key=value, one per line, read at boot. the fun part: the parser tolerates leading line numbers, so EDIT CONFIG.TXT just works with zero new editor code. the editor only speaks numbered lines, so i taught the config reader to ignore them instead (and officially, just use the numbered lines in there its not that hard, but you dont have to for it to work). SPLASH=0/1 is the first key, persistence is free because its a file on the FAT12 disk. the whole reader is ~75 lines, no allocation, no subsystem. config systems should be files, not frameworks ;3c"}, {"post_id": 44673, "ts": "2026-08-10T16:18:27Z", "hours": 4.6592, "text": "SCREEN 13 works, SCRTEST passes end to end, palette cycling is smooth, and as a bonus the fix also killed a stack-vs-bss collision that was waiting to happen. wrote AURORA.BAS to celebrate, it does a starfield and a sine curtain with the classic palette-cycling trick so it stays fast even interpreted. next up (probs): making it the boot splash, config.txt for persistence, then directories and much much more to be excited for!"}, {"post_id": 44301, "ts": "2026-08-09T23:25:07Z", "hours": 5.0344, "text": "ITS THE MEMORY MAP. gfx_is_active sits at 0xA12C0 which is past 0xA0000 aka inside the VGA framebuffer window. reads from there always return 0xFF in text mode, writes vanish into the void. the kernel bss grew past 640k and parked a variable in video memory. the “graphics thunk situation” was never the thunk. it was never even the graphics. one line in the linker script moves bss to 1MiB and everything works. i want to scream (affectionate). theres some more to be done before its usable in practice (because it never really was i guess) but SOON."}, {"post_id": 43938, "ts": "2026-08-09T12:00:21Z", "hours": 5.2647, "text": "spent the whole night inside the realmode thunk with a fine comb. it is NOT the thunk. SCREEN 0 actually switches modes fine, which makes SCREEN 13 doing nothing even weirder. also found out my kernel thinks graphics is already on before i ever turned it on?? the flag says 255. TWO HUNDRED FIFTY FIVE. its supposed to be 0 or 1. memory corruption somewhere (see kpan 7), or im losing my mind. probably both."}, {"post_id": 43586, "ts": "2026-08-08T22:43:36Z", "hours": 4.1406, "text": "boot is finally stable, primes count to a million, so i tried the graphics. SCREEN 13 does nothing. no error, no letters, no mode change. GCLS nothing, LINE nothing, RECT nothing. PALETTE works??? which makes no sense because palette is the one that should be hardest. starting to suspect the video thunk is broken. ive got no idea. but at least im honoring my promise to keep devlogs shorter."}, {"post_id": 43305, "ts": "2026-08-08T14:26:54Z", "hours": 10.0411, "text": "Fixed the boot (fr this time) the whole laptop reset thing turned out to be two bugs stacked on each other: the bootloader was trusting/rejecting BIOS geometry based on vibes, and the kernel entry point was jumping into a debug helper instead of _start , so the CPU executed one stray ret into the void and triple-faulted. coil now makes the BIOS prove its geometry against a build-time checksum before trusting it, and checksums the whole kernel before jumping in. Boot output is an actual diagnostic language now: gk = geometry truthful, gf = BIOS lied, C! = wrong bytes arrived, and nothing resets silently anymore. QEMU boots all the way to BASIC, audio included. Also cleaned up helix.c (boot debug spam now only speaks when something’s actually wrong, RIP “HELIX FAILIURE” typo), evicted BTBX from the prompt, it’s js => now, and am working the BASIC interpreter with a bit of a rewrite: dispatcher no longer depends on include order and prayer, dead duplicate file-I/O code confirmed gone, graphics.inc brace damage found and fixed. Laptop test tomorrow-ish, then the interpreter cleanup lands. see u next time!"}, {"post_id": 41616, "ts": "2026-08-05T22:41:53Z", "hours": 8.7858, "text": "hi people! this one’s a bit different. no new features, but a new name. the project is now called Borealis. the old name, BTBX, made sense when this was a tiny BASIC interpreter and nothing more, but it’s grown into a full bootloader, kernel, and proto-OS, and the name stopped fitting. the system now has three named layers: coil is the two-stage bootloader, helix is the kernel, and BOREALIS is the system as a whole. the names are deliberately scale-neutral. where the project goes from here shouldn’t be constrained by what it’s called. the rename itself was the easy part, the fallout was the real work. i went through every file updating references to the old name, plus the directory structure ( boot/ became coil/ , src/kernel/ became src/helix/ ), the build files, and the image name ( borealis.img now). outside the repo, i also had to update hackatime and stardance so everything points at the right thing. the README on github is fully rewritten to match (may not be pushed at this time), and there’s a note in it about the old name for continuity. technically nothing else changed. same code, same features, same open issues, this was purely an identity update. that’s all for now!"}, {"post_id": 38767, "ts": "2026-08-01T10:16:03Z", "hours": 12.6017, "text": "hi people! im trying to get BTBX to boot properly on an ASUS F5RL laptop. unfortunately, it still isn’t booting correctly, but I managed to narrow the problem down further. I previously ran into issues involving EDD, DH, and a few other parts of the boot process. right now I’m getting the error S1>S2Agk(18.1)Drk{c2,h0,s2}R , which makes it look like the BIOS may be reporting bogus CHS geometry in a way BTBX is not expecting. there’s no working result yet, but I’ll keep investigating the boot and disk-handling path. i hope to get it running soon."}, {"post_id": 34823, "ts": "2026-07-25T20:37:32Z", "hours": 5.6622, "text": "hi people! this time i worked on a v86-compatible version for the in-browser demo. it’s now possible to try the project directly in the browser, although there are still a few input-related issues, including with the shift key. the browser version is mainly there as a quick way to look at the project without setting anything up. for proper testing, though, i’d still recommend using a local environment—the demo is mostly for anyone too busy to set one up. pong does work in it though ^^"}, {"post_id": 33966, "ts": "2026-07-24T10:16:38Z", "hours": 10.9, "text": "hi people! recently i worked on adding proper graphics support to the project. instead of relying on text-mode attribute tricks, i went with direct pixel plotting, since it gives the system a much more flexible foundation for drawing things on screen. i added a new Mode 13h framebuffer API with functions for entering and leaving graphics mode, clearing the screen, plotting and reading individual pixels, drawing lines, rectangles, and circles, and changing the VGA palette. the implementation writes directly to the linear framebuffer at 0xA0000, with palette updates handled through the VGA DAC ports. on the BASIC side, there are now new statements for using these graphics features: SCREEN, GCLS, PSET, LINE, RECT, CIRCLE, and PALETTE. i also connected the new graphics code to the statement dispatcher and updated the built-in HELP text so the commands are documented. finally, i cleaned up the build setup by adding the new graphics source files and removing an old ‘-display curses’ option from the run command. this is a much more versatile approach than only the old text-based graphics, and it gives me a better base for anything visual i add later. that’s all for now!"}, {"post_id": 33368, "ts": "2026-07-23T07:14:31Z", "hours": 9.3667, "text": "hi people! i spent more time working on the graphics system. there still isn’t a finished result to show yet, but i’ve been continuing to work through the implementation and figuring out the pieces needed for proper pixel-based graphics support. it’s taking a bit more iteration than expected, but the goal is still to have a solid graphics foundation rather than rushing in something limited. hopefully i’ll have the completed version ready to show soon. see y’all later!"}, {"post_id": 32259, "ts": "2026-07-21T09:58:51Z", "hours": 13.1136, "text": "hi people! i started working toward graphics support this time. i’m moving away from text-mode tricks and looking at direct pixel plotting instead, since it should be much more flexible to build on later.it’s still a work in progress, but i should have something more complete to show next time. what pmo is that 10 hour limit so i cant just devlog once i have a feature, i have to do it in the middle of nothing an wasting 3 hours anyways. see y’all later!"}, {"post_id": 31938, "ts": "2026-07-20T19:04:38Z", "hours": 7.7667, "text": "hi people! this time i added a set of bitwise operations to the language: AND(x,y), OR(x,y), XOR(x,y), NOT(x), SHL(x,n), and SHR(x,n). these work on values converted to 32-bit integers, and the shift functions keep large shift counts predictable by masking them to 31. i also added HEX$(x) and BIN$(x) string functions for displaying numbers in hexadecimal and binary, without unnecessary leading zeroes. on top of that, the number parser now accepts hexadecimal and binary literals using &H… and &B…. finally, i updated the built-in HELP text so the new functions and literal formats are documented in the system itself. that’s all for now"}, {"post_id": 30166, "ts": "2026-07-17T15:01:06Z", "hours": 6.6506, "text": "hi people! this was mostly a behind-the-scenes work session rather than one with a major new feature to show off. i spent a lot of time working through the project, trying things out, and dealing with the smaller details that tend to take longer than expected. there isn’t one big result for this devlog, but the time was still useful for getting a clearer picture of what needs attention next and making progress on the work that supports the larger features. sometimes development is less about a big visible change and more about putting time into the parts that make future work smoother. that’s all for now!"}, {"post_id": 28528, "ts": "2026-07-14T20:47:26Z", "hours": 15.6667, "text": "hi guys! i took a short break from the project. first voluntarily to take care of my mental health, and then a bit longer than planned because i got sick. after returning, i tackled a smaller but useful feature: RTC support via the TIME command. the command can now work with the real-time clock, which means the system has proper support for reading and handling time instead of relying on a manually managed value. this was a fairly quick feature to work through, so it felt like a good way to get back into the project after the break. also, please excuse the old time shown in the photo, i hadn’t kept it up to date when I took it. that’s all, see you later"}, {"post_id": 22752, "ts": "2026-07-05T10:26:44Z", "hours": 10.2164, "text": "hi people! this time, i mostly worked on cleaning things up after restructuring the working tree, and i also fixed a few issues with the text editor. the biggest breakthrough was figuring out why the prime sieve computation kept failing. in the end, the problem had nothing to do with the math itself. instead, it came from the way the interpreter handled loops and writing to disk. those issues interacted in a way that caused the loop to stop after finding just one number. that problem is now fixed, and while tracking it down i also ran into several other bugs, which i fixed along the way. that’s all!"}, {"post_id": 22233, "ts": "2026-07-04T16:25:58Z", "hours": 9.3667, "text": "After my restructuring I was gonna ship the project but I just dont feel its finished enough so I wanted to add a few more features to make it a bit more standalone. Right now, you would in theory be able to use it on a computer without having to prepare programs on another computer because WE HAVE A TEXT EDITOR!!! finally. So you can write your BASIC and execute it, save the results and view them as much as you want!! There is a prime number sieve being edited on screen but it doesnt run yet because there are some issues in the way my BASIC is interpreted, some issue with loops or whatnot. Thats the next thing to work on."}, {"post_id": 20667, "ts": "2026-07-02T10:09:46Z", "hours": 10.5667, "text": "Nothing incredible, except scut work right now. I was made aware by codefactor that my code was too complex in parts (complexity of 771) and so I cleaned up the file tree so its nice and organized, and I am most way through splitting stmt(), but I was made aware my devlogs are too long so here you go."}, {"post_id": 19587, "ts": "2026-06-30T22:41:33Z", "hours": 8.1828, "text": "I started working on giving the system a voice. Yes, quite literally a dystopian, creepy voice synthetisation function. Originally I was only gonna do ‘BEEP freq, duration’ (which i managed in a good hour at most) but then I got invested in actual phoneme/allophone synthesys (Software Automatic Mouth style) and it turned into a lot more work. Sadly so far i’ve only ever gotten squeals out of it, or all quiet, so i am probably going to give up and do more important work like either a text editor or a directory support, or even a proper C compiler in-system (so far only precompiled binaries work)."}, {"post_id": 16830, "ts": "2026-06-27T10:18:01Z", "hours": 19.9, "text": "I took a small hiatus (climbing in the caucas mountains for my mental health). Anyways i’m back and I added binary loading and execution support (for example precompiled C or whatever). I works, no too visible on the screenshot but look at the screen border (it was flashing). Also sorry for the long devlog but i had some time logged, and logged more now, and somehow ended up with 18 hrs."}, {"post_id": 12181, "ts": "2026-06-19T21:57:01Z", "hours": 7.1, "text": "I have finally fixed the floppy boot including its FAT12 init. There were many, many problems, I was running around in circles but I finally fixed it. The last thing I did was rewrote the EDD stuff front and back, and I assume that fixed it. I, honestly, am not sure. But anyways, now both HDD and floppy boot work including FAT12 init and all functions of BASIC that I have implemented insofar."}, {"post_id": 11569, "ts": "2026-06-18T21:07:42Z", "hours": 6.9667, "text": "The floppy boot issue persists. I have moved past the FAT init failing visibly, but any read actions throw all zeros out. I came across the issue in the past, I feel like I am going in circles here,"}, {"post_id": 10455, "ts": "2026-06-17T05:52:29Z", "hours": 7.1333, "text": "At the moment I am still stuck on the same issue (floppy/HDD). I got the idea that the fs may be misconfigured so I am working a on that too. A lot of theories, and multiple issues i’ve fixed already, but on floppy FAT init still fails."}, {"post_id": 9805, "ts": "2026-06-16T07:38:30Z", "hours": 12.0872, "text": "I dont have any major update, I am stuck fixing a regression where FAT initialization fails exclusively on QEMU floppy boots, while HDDs work fine. I always fix one thing and something else breaks, like EDD probing panics, false failiures, reset storms and others. The end result is always the same, the boot takes a long time (timeouts) and no disk is available."}, {"post_id": 8817, "ts": "2026-06-14T17:30:00Z", "hours": 13.4017, "text": "I decided to put some work into booting in hard-drive (DL 0x80). That in itself wasn’t too big an issue, but it in turn made floppy boot (DL 0x00) nonfunctional. I went back and forth, fixing one, breaking the other, again and again. Right now there is some kind of silent failiure in floppy mode that causes it to take minutes to boot (I think its failing and retrying 3 times on every sector) and then it finds the root dir populated as all zeros. The issue is all the processes come back as successes when reading registers. So right now, only hard drive mode works, but this devlog is already wayyyy too long and I wouldnt want to lose all this time."}, {"post_id": 7914, "ts": "2026-06-13T06:12:33Z", "hours": 5.8778, "text": "And we have a complete functioning FAT12! Reading and writing have been working smoothly. The fs writing wasn’t even that hard to implement, and I also added a few more mathematicals to to once again appoach GWBASIC. We have direct hardware access (PEEK/POKE into ram, etc), arrays, nonblocking input (INKEY$) and I also added 2 string functions."}, {"post_id": 6919, "ts": "2026-06-11T16:23:48Z", "hours": 11.835, "text": "After countless fixes I have managed to get a functioning FAT12 filesystem working, including listing and loading files. Saving (writing) is not functional yet. The key issues were: CHS mismatch, BPB was wrong, broken multisector loading, and other. Next I will try to make writing possible."}, {"post_id": 5983, "ts": "2026-06-10T01:13:01Z", "hours": 6.7942, "text": "I’ve changed some kernel details, like that instead of straight crashing, it might tell you whats wrong before, design details, etc. I changed the approach to disk wiriting from straight dd to a python script that actually makes a mountable volume, and I am still working on getting filesystem working. There has been so so many issues ive been running into as the complexity of the system rises (and so does entropy, I guess). This will take an unprecedented amount of work to get even remotely to the level that is GWBASIC, much less what I aspired to (ISO/IEC 10279:1991)."}, {"post_id": 4220, "ts": "2026-06-07T13:34:33Z", "hours": 10.9408, "text": "I managed to implement longer variable names possible, a lof of trig/calc functions and overall perked up some details. Im heading towards Full BASIC instead of just Tiny BASIC but Im not sure how far I will go with this."}, {"post_id": 3710, "ts": "2026-06-06T19:20:05Z", "hours": 8.9439, "text": "Ive gotten to the point where it actually boots from floppy in QEMU (no hd working) AND to an extent BASIC works. Its not perfect yet but ill get there soon."}, {"post_id": 2998, "ts": "2026-06-05T22:31:16Z", "hours": 6.0936, "text": "What a poor choice this project. I wanna sleep so much and yet I cant fall asleep because I just have to get it running and it will definietly only be an hour or less."}, {"post_id": 2674, "ts": "2026-06-05T10:58:37Z", "hours": 9.0503, "text": "I changed the approach. Instead of just messing around in assembly, I will do most of it in C and assembly is only for the bootloader. Yes, bootloader. Simplest way to keep this as bare-metal and universal as possible was, in my opinion, to just write a kernel, grub, crosscompile for i868 (in distrobox because the toolchain doesnt run on my distro) and boot via QEMU. I got far enough that it compiles and builds into an ISO, but doesnt actaully even boot, instead bugs out in SeaBIOS. Seems I bit off more than I could chew."}, {"post_id": 1934, "ts": "2026-06-04T05:34:44Z", "hours": 7.0881, "text": "After an all-nighter i got it to assemble, but to call it functional would be a joke."}]...
|
Title: Borealis by @onyxtheone | Stardance
Devlog Title: Borealis by @onyxtheone | Stardance
Devlogs:
After an all-nighter i got it to assemble, but to call it functional would be a joke.
I changed the approach. Instead of just messing around in assembly, I will do most of it in C and assembly is only for the bootloader. Yes, bootloader. Simplest way to keep this as bare-metal and universal as possible was, in my opinion, to just write a kernel, grub, crosscompile for i868 (in distrobox because the toolchain doesnt run on my distro) and boot via QEMU. I got far enough that it compiles and builds into an ISO, but doesnt actaully even boot, instead bugs out in SeaBIOS. Seems I bit off more than I could chew.
What a poor choice this project. I wanna sleep so much and yet I cant fall asleep because I just have to get it running and it will definietly only be an hour or less.
Ive gotten to the point where it actually boots from floppy in QEMU (no hd working) AND to an extent BASIC works. Its not perfect yet but ill get there soon.
I managed to implement longer variable names possible, a lof of trig/calc functions and overall perked up some details. Im heading towards Full BASIC instead of just Tiny BASIC but Im not sure how far I will go with this.
I’ve changed some kernel details, like that instead of straight crashing, it might tell you whats wrong before, design details, etc. I changed the approach to disk wiriting from straight dd to a python script that actually makes a mountable volume, and I am still working on getting filesystem working. There has been so so many issues ive been running into as the complexity of the system rises (and so does entropy, I guess). This will take an unprecedented amount of work to get even remotely to the level that is GWBASIC, much less what I aspired to (ISO/IEC 10279:1991).
After countless fixes I have managed to get a functioning FAT12 filesystem working, including listing and loading files. Saving (writing) is not functional yet. The key issues were: CHS mismatch, BPB was wrong, broken multisector loading, and other. Next I will try to make writing possible.
And we have a complete functioning FAT12! Reading and writing have been working smoothly. The fs writing wasn’t even that hard to implement, and I also added a few more mathematicals to to once again appoach GWBASIC. We have direct hardware access (PEEK/POKE into ram, etc), arrays, nonblocking input (INKEY$) and I also added 2 string functions.
I decided to put some work into booting in hard-drive (DL 0x80). That in itself wasn’t too big an issue, but it in turn made floppy boot (DL 0x00) nonfunctional. I went back and forth, fixing one, breaking the other, again and again. Right now there is some kind of silent failiure in floppy mode that causes it to take minutes to boot (I think its failing and retrying 3 times on every sector) and then it finds the root dir populated as all zeros. The issue is all the processes come back as successes when reading registers. So right now, only hard drive mode works, but this devlog is already wayyyy too long and I wouldnt want to lose all this time.
I dont have any major update, I am stuck fixing a regression where FAT initialization fails exclusively on QEMU floppy boots, while HDDs work fine. I always fix one thing and something else breaks, like EDD probing panics, false failiures, reset storms and others. The end result is always the same, the boot takes a long time (timeouts) and no disk is available.
At the moment I am still stuck on the same issue (floppy/HDD). I got the idea that the fs may be misconfigured so I am working a on that too. A lot of theories, and multiple issues i’ve fixed already, but on floppy FAT init still fails.
The floppy boot issue persists. I have moved past the FAT init failing visibly, but any read actions throw all zeros out. I came across the issue in the past, I feel like I am going in circles here,
I have finally fixed the floppy boot including its FAT12 init. There were many, many problems, I was running around in circles but I finally fixed it. The last thing I did was rewrote the EDD stuff front and back, and I assume that fixed it. I, honestly, am not sure. But anyways, now both HDD and floppy boot work including FAT12 init and all functions of BASIC that I have implemented insofar.
I took a small hiatus (climbing in the caucas mountains for my mental health). Anyways i’m back and I added binary loading and execution support (for example precompiled C or whatever). I works, no too visible on the screenshot but look at the screen border (it was flashing). Also sorry for the long devlog but i had some time logged, and logged more now, and somehow ended up with 18 hrs.
I started working on giving the system a voice. Yes, quite literally a dystopian, creepy voice synthetisation function. Originally I was only gonna do ‘BEEP freq, duration’ (which i managed in a good hour at most) but then I got invested in actual phoneme/allophone synthesys (Software Automatic Mouth style) and it turned into a lot more work. Sadly so far i’ve only ever gotten squeals out of it, or all quiet, so i am probably going to give up and do more important work like either a text editor or a directory support, or even a proper C compiler in-system (so far only precompiled binaries work).
Nothing incredible, except scut work right now. I was made aware by codefactor that my code was too complex in parts (complexity of 771) and so I cleaned up the file tree so its nice and organized, and I am most way through splitting stmt(), but I was made aware my devlogs are too long so here you go.
After my restructuring I was gonna ship the project but I just dont feel its finished enough so I wanted to add a few more features to make it a bit more standalone. Right now, you would in theory be able to use it on a computer without having to prepare programs on another computer because WE HAVE A TEXT EDITOR!!! finally. So you can write your BASIC and execute it, save the results and view them as much as you want!! There is a prime number sieve being edited on screen but it doesnt run yet because there are some issues in the way my BASIC is interpreted, some issue with loops or whatnot. Thats the next thing to work on.
hi people! this time, i mostly worked on cleaning things up after restructuring the working tree, and i also fixed a few issues with the text editor. the biggest breakthrough was figuring out why the prime sieve computation kept failing. in the end, the problem had nothing to do with the math itself. instead, it came from the way the interpreter handled loops and writing to disk. those issues interacted in a way that caused the loop to stop after finding just one number. that problem is now fixed, and while tracking it down i also ran into several other bugs, which i fixed along the way. that’s all!
hi guys! i took a short break from the project. first voluntarily to take care of my mental health, and then a bit longer than planned because i got sick. after returning, i tackled a smaller but useful feature: RTC support via the TIME command. the command can now work with the real-time clock, which means the system has proper support for reading and handling time instead of relying on a manually managed value. this was a fairly quick feature to work through, so it felt like a good way to get back into the project after the break. also, please excuse the old time shown in the photo, i hadn’t kept it up to date when I took it. that’s all, see you later
hi people! this was mostly a behind-the-scenes work session rather than one with a major new feature to show off. i spent a lot of time working through the project, trying things out, and dealing with the smaller details that tend to take longer than expected. there isn’t one big result for this devlog, but the time was still useful for getting a clearer picture of what needs attention next and making progress on the work that supports the larger features. sometimes development is less about a big visible change and more about putting time into the parts that make future work smoother. that’s all for now!
hi people! this time i added a set of bitwise operations to the language: AND(x,y), OR(x,y), XOR(x,y), NOT(x), SHL(x,n), and SHR(x,n). these work on values converted to 32-bit integers, and the shift functions keep large shift counts predictable by masking them to 31. i also added HEX$(x) and BIN$(x) string functions for displaying numbers in hexadecimal and binary, without unnecessary leading zeroes. on top of that, the number parser now accepts hexadecimal and binary literals using &H… and &B…. finally, i updated the built-in HELP text so the new functions and literal formats are documented in the system itself. that’s all for now
hi people! i started working toward graphics support this time. i’m moving away from text-mode tricks and looking at direct pixel plotting instead, since it should be much more flexible to build on later.it’s still a work in progress, but i should have something more complete to show next time. what pmo is that 10 hour limit so i cant just devlog once i have a feature, i have to do it in the middle of nothing an wasting 3 hours anyways. see y’all later!
hi people! i spent more time working on the graphics system. there still isn’t a finished result to show yet, but i’ve been continuing to work through the implementation and figuring out the pieces needed for proper pixel-based graphics support. it’s taking a bit more iteration than expected, but the goal is still to have a solid graphics foundation rather than rushing in something limited. hopefully i’ll have the completed version ready to show soon. see y’all later!
hi people! recently i worked on adding proper graphics support to the project. instead of relying on text-mode attribute tricks, i went with direct pixel plotting, since it gives the system a much more flexible foundation for drawing things on screen. i added a new Mode 13h framebuffer API with functions for entering and leaving graphics mode, clearing the screen, plotting and reading individual pixels, drawing lines, rectangles, and circles, and changing the VGA palette. the implementation writes directly to the linear framebuffer at 0xA0000, with palette updates handled through the VGA DAC ports. on the BASIC side, there are now new statements for using these graphics features: SCREEN, GCLS, PSET, LINE, RECT, CIRCLE, and PALETTE. i also connected the new graphics code to the statement dispatcher and updated the built-in HELP text so the commands are documented. finally, i cleaned up the build setup by adding the new graphics source files and removing an old ‘-display curses’ option from the run command. this is a much more versatile approach than only the old text-based graphics, and it gives me a better base for anything visual i add later. that’s all for now!
hi people! this time i worked on a v86-compatible version for the in-browser demo. it’s now possible to try the project directly in the browser, although there are still a few input-related issues, including with the shift key. the browser version is mainly there as a quick way to look at the project without setting anything up. for proper testing, though, i’d still recommend using a local environment—the demo is mostly for anyone too busy to set one up. pong does work in it though ^^
hi people! im trying to get BTBX to boot properly on an ASUS F5RL laptop. unfortunately, it still isn’t booting correctly, but I managed to narrow the problem down further. I previously ran into issues involving EDD, DH, and a few other parts of the boot process. right now I’m getting the error S1>S2Agk(18.1)Drk{c2,h0,s2}R , which makes it look like the BIOS may be reporting bogus CHS geometry in a way BTBX is not expecting. there’s no working result yet, but I’ll keep investigating the boot and disk-handling path. i hope to get it running soon.
hi people! this one’s a bit different. no new features, but a new name. the project is now called Borealis. the old name, BTBX, made sense when this was a tiny BASIC interpreter and nothing more, but it’s grown into a full bootloader, kernel, and proto-OS, and the name stopped fitting. the system now has three named layers: coil is the two-stage bootloader, helix is the kernel, and BOREALIS is the system as a whole. the names are deliberately scale-neutral. where the project goes from here shouldn’t be constrained by what it’s called. the rename itself was the easy part, the fallout was the real work. i went through every file updating references to the old name, plus the directory structure ( boot/ became coil/ , src/kernel/ became src/helix/ ), the build files, and the image name ( borealis.img now). outside the repo, i also had to update hackatime and stardance so everything points at the right thing. the README on github is fully rewritten to match (may not be pushed at this time), and there’s a note in it about the old name for continuity. technically nothing else changed. same code, same features, same open issues, this was purely an identity update. that’s all for now!
Fixed the boot (fr this time) the whole laptop reset thing turned out to be two bugs stacked on each other: the bootloader was trusting/rejecting BIOS geometry based on vibes, and the kernel entry point was jumping into a debug helper instead of _start , so the CPU executed one stray ret into the void and triple-faulted. coil now makes the BIOS prove its geometry against a build-time checksum before trusting it, and checksums the whole kernel before jumping in. Boot output is an actual diagnostic language now: gk = geometry truthful, gf = BIOS lied, C! = wrong bytes arrived, and nothing resets silently anymore. QEMU boots all the way to BASIC, audio included. Also cleaned up helix.c (boot debug spam now only speaks when something’s actually wrong, RIP “HELIX FAILIURE” typo), evicted BTBX from the prompt, it’s js => now, and am working the BASIC interpreter with a bit of a rewrite: dispatcher no longer depends on include order and prayer, dead duplicate file-I/O code confirmed gone, graphics.inc brace damage found and fixed. Laptop test tomorrow-ish, then the interpreter cleanup lands. see u next time!
boot is finally stable, primes count to a million, so i tried the graphics. SCREEN 13 does nothing. no error, no letters, no mode change. GCLS nothing, LINE nothing, RECT nothing. PALETTE works??? which makes no sense because palette is the one that should be hardest. starting to suspect the video thunk is broken. ive got no idea. but at least im honoring my promise to keep devlogs shorter.
spent the whole night inside the realmode thunk with a fine comb. it is NOT the thunk. SCREEN 0 actually switches modes fine, which makes SCREEN 13 doing nothing even weirder. also found out my kernel thinks graphics is already on before i ever turned it on?? the flag says 255. TWO HUNDRED FIFTY FIVE. its supposed to be 0 or 1. memory corruption somewhere (see kpan 7), or im losing my mind. probably both.
ITS THE MEMORY MAP. gfx_is_active sits at 0xA12C0 which is past 0xA0000 aka inside the VGA framebuffer window. reads from there always return 0xFF in text mode, writes vanish into the void. the kernel bss grew past 640k and parked a variable in video memory. the “graphics thunk situation” was never the thunk. it was never even the graphics. one line in the linker script moves bss to 1MiB and everything works. i want to scream (affectionate). theres some more to be done before its usable in practice (because it never really was i guess) but SOON.
SCREEN 13 works, SCRTEST passes end to end, palette cycling is smooth, and as a bonus the fix also killed a stack-vs-bss collision that was waiting to happen. wrote AURORA.BAS to celebrate, it does a starfield and a sine curtain with the classic palette-cycling trick so it stays fast even interpreted. next up (probs): making it the boot splash, config.txt for persistence, then directories and much much more to be excited for!
the system has a config file now. CONFIG.TXT on the boot disk, key=value, one per line, read at boot. the fun part: the parser tolerates leading line numbers, so EDIT CONFIG.TXT just works with zero new editor code. the editor only speaks numbered lines, so i taught the config reader to ignore them instead (and officially, just use the numbered lines in there its not that hard, but you dont have to for it to work). SPLASH=0/1 is the first key, persistence is free because its a file on the FAT12 disk. the whole reader is ~75 lines, no allocation, no subsystem. config systems should be files, not frameworks ;3c
boot splash is in and shipping on the image. CONFIG.TXT decides, SPLASH.BAS plays on boot, keypress skips. the hook was “just two lines” and then reality happened: config.c wasnt in the makefile, the loader was static, and the first boot loaded the splash then sat at the prompt waiting for me to type RUN myself. three one-line fixes later: coil letters, banner, aurora, prompt. also fixed make pack details. the machine has a boot vibe now next up is proper scrollback, logging, and arrow key support.
im still working on real hw boot issues. coil doesnt guess geometry anymore, it brutes it: the new stage2 tries every plausible CHS geometry against a buildtime checksum of the kernel’s first sector and prints the one that actually works. no more “trust the BIOS” and no more “reject the BIOS”, just prove it. on a sane machine it prints g(18.2) and boots like nothing happened. on the laptop it either prints its real geometry and boots, or prints G! plus what the BIOS claimed. either way i finally get an answer instead of a silent reset. in the meantime ill be working on some features like arrows, logging, etc. attached photo of my testing setup
borealis booted on the laptop for the first time. not qemu but actual silicon, a core 2 duo, off a usb stick. coil came up, loaded helix, and the machine made it to the banner plus three debug lines, which is the whole chain working on real firmware: stage1 > stage2 > kernel > protected mode. CHS disk was already known broken cos this bios won’t talk cylinders/heads/sectors to a stick with no real geometry, fair enough — so coil booted over EDD, but helix’s disk layer still assumed CHS and the filesystem never came up. still: it boots, on real hardware. just doesnt get far enough to be useful (yet).
next wall, immediate: the machine hangs at fat_cache_load, the step where helix reads the FAT and root directory into RAM. in qemu this works instantly but on the laptop the disk read goes out and never comes back. no error, no status, no return. debug output narrows it to exactly the transfer call: everything before prints, everything after doesn’t.
working theory: the bios’s legacy usb support, and specifically system management mode. coil runs in pure real mode and its EDD reads work, the bios reads the stick happily at boot. but helix runs in protected mode, and calling the bios means dropping back through a thunk, and that round-trip is where it dies. on a machine this age legacy usb lives in SMM: the bios traps disk interrupts and does the transfer in a mode invisible to the os, assuming a clean real-mode cpu, and our PM excursion breaks that assumption. the tell: teletype (int 10h) works from the thunk, disk (int 13h) hangs. teletype doesn’t touch usb, disk does. photo is the bios setup screen, where i went hunting for a legacy usb toggle which i did not find ;3c
instrumented the thunk to print a letter per step so a hang names its own murderer. result: Rer , then nothing. R entered real mode, e entered the EDD read, r was about to issue a disk reset, ah=00h, the simplest int 13h call there is, no transfer, and it never returned. if even a no-op reset hangs after the PM excursion, the bios’s whole disk service is dead post-protected-mode on this machine, full stop. so the fix is a native usb driver. helix talks EHCI directly, bios for boot and native for runtime, as it should be, but that’s pci + ownership handoff from the very SMM that broke us + enumeration + BOT/scsi, and you don’t bring that up blind, one teletype letter per reboot, right before losing the hardware. deferred until the laptop’s back on hand; qemu remains unaffected.
the laptop’s bios has a party trick: as i described before, int 13h works fine until the cpu enters protected mode, then it never returns, not even for a no-transfer disk reset. bios toggles didn’t help, so borealis is growing a native usb driver. first part: find the ehci controller over pci, do the formal ownership handshake (there’s an actual semaphore register in config space where the os and the bios’s smm ghost take turns. set our bit, wait for theirs to clear, then kill every smi source so the ghost stops getting summoned), reset the controller, spin up an idle async schedule, scan the ports. no packets yet, just a controller that’s officially ours. dev loop is qemu with a stick image on an emulated ehci, boot still from floppy, so the laptop only has to show up for the one hardware-specific part. moral: if the firmware won’t share the hardware, take the hardware.
the stick talks, and for the first time it’s talking to us, not the bios. this part was the transfer engine: queue heads and transfer descriptors, little linked-list structs the ehci controller fetches out of ram and executes on its own. a control transfer is three of them chained by hand (setup, data, status), data toggles set manually per stage because high-speed lets you. link the queue head into the async ring, poll the active bit, unlink, then ring the doorbell (an actual doorbell bit) so the controller formally forgets the whole thing before the structs get reused. first exchange: GET_DESCRIPTOR at address 0, and the stick answered with its vid/pid like a civilized device. qemu’s stick goes by 46f4:0001; the real one can introduce itself when the laptop’s back. next: scsi over bulk, and fat12 stops caring what a disk is. moral: usb devices are polite, they just want to be asked in struct form.
debug spew is a file now. every checkpoint from the first instruction onward (entry asm, the real-mode thunk letters, all the [DEBUG] lines) lands in a buffer, and once the fs proves it can write, the buffer becomes LOG.TXT and the screen clears to the banner. the trick is the default: echo stays on until the file is safely written, so a boot that dies early still shows everything live. the fallback isn’t a code path, it’s just never getting to the quiet part. LOG=0 in CONFIG.TXT keeps the old wallpaper. and the log already caught its first bug: a missing [EZTG] tattled on a stale version entry.asm. debugging is too important to leave on the screen.
im still working on getting a usb driver to work. ehci seems to work kinda but its a loop between giving false data, partial data and occasionally seemingly true data but then usb decides it doesnt like it and ideally fat12 fails durning cache load too, WHICH I FIXED LONG AGO BRUH. but it came back for some reason. so im trying timing, msd, stall handling everything. this may take another decade.
the stick is a disk now, no bios involved: usb grew enumeration and bot/scsi, fat12 picks whichever backend came up. qemu took the whole chain first try. the laptop found the stick on port 0 and then refused to reset it (my fault), the 50ms delay was port-0x80 writes that only cost real time inside qemu, so there’s a pit-based clock now. plot twist from the log meanwhile: the bios path worked on the laptop, because the toggles that “didn’t help” had quietly moved the stick to floppy emulation, and that path survives the mode switch. so it (partially) boots by accident while we fix it on purpose. also caught in a self-audit: a stall burned a full second, and a short read could report success with half a sector. readme rewritten as i was told to by sw.
the port resets work on the laptop now. the bit we were waiting on (port-enable-changed) was being acknowledged by the bios’s smm ghost before we ever saw it, so we stopped waiting on the status bit and just read the port state, which can’t be acked away. also fixed before it bit us: two devices answering address 0 at once (enumeration is per-port now, and every device gets a real address before the next port wakes up). the next failure was prettier: every OUT transfer works, every IN transfer dies. the stick takes its orders but can’t talk back. that’s the signature of the qtd buffer list, the one place real ich silicon is strict where qemu is forgiving, so all dma buffers are page-aligned now and the error reports name whichever endpoint stalled. also everyone gotta apreciate the blahaj!
i am (still) putting in work on the usb driver, this is proving to be very complicated especially because my hardware is not cooperating. im thinking about switching back to floppy-emulated mode which would be more practical for debugging but at the same time probably introduce new issues i dont even expect yet.
its been a week since my last devlog, i dont have much new to add because with school and other responsibilities i dont have much time for actuall progress on this project. still i accumulated some 9 hours (sorry gizzy) by doing small changed, linting, updating forgotten banners and version numbers and so on. EHCI/USB still fails on the same issues as before. i will be reverting to a superfloppy boot because right now i cant even get debug to write to the disk which is annoying. then once i get the usb driver with all its issues working (sometime next decade) i can give usb boot another shot.
Ships:
I built BTBX (Bare Tiny(?) BASIC eXecutor), a self-contained BASIC interpreter that is the operating system. There’s no Linux, no DOS, nothing underneath it. It boots straight off a FAT12 floppy image via a two-stage bootloader (512-byte stage1 + 2KB stage2), flips the CPU into protected mode, sets up the A20 gate, and lands you directly in a BASIC REPL, all inside 640KB of conventional memory. From there it’s a real language: GOTO, GOSUB, FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, multi-dimensional arrays, 32-bit integers plus x87 80-bit floats, string functions (LEFT$, MID$, CHR$, etc.), and a full FAT12 filesystem so you can actually SAVE, LOAD, and DIR your programs on the disk image. There’s also PEEK/POKE for raw memory access, BLOAD/SYS to load and jump into raw machine code, VGA graphics primitives, a PIT-driven BEEP, and — half-finished but present — a SAY command aiming for SAM-style formant speech synthesis. What was challenging? Everything below the interpreter, honestly. Getting the boot chain right (CHS and EDD disk reads, A20 enabling that doesn’t silently hang, jumping into protected mode without immediately triple-faulting) took far longer than any language feature. The BIOS-thunk approach for file I/O (calling back into 16-bit real mode from a 32-bit kernel just to talk to disk) was its own maze. The funniest recent challenge was building a browser demo on top of v86: getting PS/2 keyboard Shift state to survive contact with a web browser turned out to be nearly as hard as writing the A20 gate code itself :3. Real hardware (and QEMU) just work; browsers apparently have opinions about what a Shift key is allowed to do. What am I proud of? That it boots at all, genuinely. A homemade OS with a homemade language on top, running real math through the x87 FPU and reading/writing a real filesystem, in under 640KB, with zero borrowed runtime. Getting arrays, strings, and file I/O all coexisting cleanly in a from-scratch interpreter over ~240 hours feels like the actual milestone here, not any single feature. What should people know to test it? Use make && make run, that's the supported path, tested in QEMU, and it's where shift/symbols work correctly. The browser demo (v86-based) is explicitly beta. booting and typing work, but shift-modified keys are unreliable there due to browser/emulator keyboard quirks (a real physical keyboard emulator interaction gap, not a BASIC bug ^^). Don't judge the interpreter by the demo's keyboard weirdness. Try PRINT, FOR/NEXT loops, SAVE/LOAD/DIR to confirm the filesystem works, and BEEP for audio. SAY is a known work-in-progress ergo don't expect actual speech (yet). Check the source tree if you want to see the boot chain (boot/stage1.asm, boot/stage2.asm) separately from the interpreter (src/kernel/basic.c)....
|
1792878618.2847242
|
1793742618.2847242
|
|
14070
|
Timetable by @omeriadon | Stardance
|
omeriadon
|
2
|
371.91
|
2591
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-24T09:11:11Z", "hours": 233.0, "multiplier": 18.49, "payout": 2143, "blessing": "neutral", "text": "This ship, I completely remade the app to work around accounts, and all the features that come with that I added a server, because it used to just store your timetable in your local storage and that was quite boring honestly creating a server for this has allowed me to add accounts, notifications, live activities, friends, shared events, multiple devices in the same account, and has made the website much easier to make (still in development, thats why the top devlogs are talking about the website not the app) The app now has all of this: Grades, track the score of all of your subjects notifications for each subject you have and your events etc live activity throughout each school day telling you your subjects etc sharing your location, subjects, and more with friends widgets that show your your subjects, upcoming events, and your friends’ schedules lots of administration options to manage pretty much everything, including who else is admin lol full support for siri, shortcuts, spotlight, and apple intelligence a full apple watch app btw i know 350 hours on a timetable app sounds insane (😭) but its because this project has 4 different aspects: swiftui client for iPhone, iPad, and mac swiftui client for apple watch a website client (still in development) the server that handles everything, and the database i promise it does more than just tell you your subjects 🙏", "repo": "https://github.com/omeriadon/Timetable", "demo": "https://testflight.apple.com/join/DDUXPSq3"}, {"ship_num": 2, "ts": "2026-07-15T13:35:31Z", "hours": 94.0, "multiplier": 9.5, "payout": 448, "blessing": "neutral", "text": "So I made a timetable app for my school, super-specialised and for ios, watchos, and macos. its got live activities and notifications to show you current and next subjects throughout the school day, widgets for your weekly schedule, ability to see your friends’ timetables, and server sync. and apple intelligence support!", "repo": "https://github.com/omeriadon/Timetable", "demo": "https://testflight.apple.com/join/DDUXPSq3"}]...
|
[{"post_id": 65346, "ts": "202 [{"post_id": 65346, "ts": "2026-09-10T13:08:58Z", "hours": 8.2983, "text": "Continuing the assorted improvements to the app: Fixed stacked drawers so nested drawer state updates reactively. Reworked the Friends page into shared List, ListSection, ListRow, and Card components. Preserved friend drag-and-drop ordering within the new layout. Improved timetable UX: i fixed the lesson selection in week view correctly aligned the “now” indicator in today view restricted timetable mode navigation to mobile through CSS, cos desktop already has the sidebar improved planner event styling. made the drawer compenent animate in and out, something i lost from the react -> solid migration I also added a reusable event-tag selection row with symbols and selected-state feedback."}, {"post_id": 62745, "ts": "2026-09-06T08:06:14Z", "hours": 5.9261, "text": "As well as migrating to Tanstack, I wanted even more speed, just for fun at this point honestly, so I decided to move to SolidJS from React. Its decently faster while looking similar to react, and it has some syntax stuff that i much prefer over react. this is basically just adding some margin for me to make bad code The end product looks identical so theres not much to show.. apart from the migration, I’ve also been designing the new landing page, which will also use the 3d model thing. the big question is figuring out how to make the 3d markers for each classroom register correctly, because i need to show a pin for each user at the right place, from swiftui, and somehow embed it into a realitykit 3d model. but im sure this use case has been done many times before so i can find something online!"}, {"post_id": 60821, "ts": "2026-09-03T13:24:26Z", "hours": 7.5314, "text": "Im making a 3d model of the school. this is so that i can show a whole literal map of the campus in the app, and then you can see where each user is, in 3d! i could even reexport it for the website, potentially its going to be interactive and everything"}, {"post_id": 59542, "ts": "2026-09-01T12:52:51Z", "hours": 1.2314, "text": "ok so i think i have optimised it as much as i can lol tanstack clearly was a good idea, it just needed some optimisations!"}, {"post_id": 59501, "ts": "2026-09-01T11:30:41Z", "hours": 8.1464, "text": "I did a few things in this devlog, got quite carried away frankly. So I migrated the codebase from Next.js to Tanstack. The reason was that i was seeing a lot of speed concerns, especially on the landing page. it was just lagging so much. i tried it on all my devices on all the browsers and it was there half the time. after a lot of commenting things out i just couldnt find a bug, so now i moved to tanstack. hopefully taht will remove at least some problems. in any case, i got bored of next.js and tanstack is a different framework to play with and make use of!! also, i continued the landing page by adding cards for each item. i don’t really like it right now, but i have established that i need to add these cards, if not in a different UI. The titles of each card are just image-masks, of Apple wallpapers! i went through some archive and picked out the ones i like, and applied a brightness 200% filter, and they look really nice now. after i finish the landing page im gonna work on rehauling the rest of the ui to be more intuitive and actually usable"}, {"post_id": 57354, "ts": "2026-08-29T14:02:16Z", "hours": 2.4136, "text": "I really wanted the first screen for timetable to look really really interesting and unique and instantly recognisable as Timetable, so i made the text instead of a boring white, it now has 3 really nice effects applied: A grain overlay, or noise, which in this case doesn’t make it look paper but looks nice nonetheless Its not flat white, its white at the top and goes to brown at the bottom, more noticeable when you close up. subtle but also nice The “white” isn’t even white. Its a particular white image i had a lot of difficulty in obtaining. it is the third screenshot, the “white” png. Its an .avif , and it uses some HDR-capable color space format something, which on compatible browsers make the timetable text show considerably brighter than everywhere else on your screen, which makes it really pop! i plan on using this effect in other places as well across the landing page to make it just pop a bit more. (the 4th image shows the white pixel showing as 1.25. anything above 1 is hdr.)"}, {"post_id": 57217, "ts": "2026-08-29T10:04:27Z", "hours": 1.4844, "text": "I added a title to the lading site, but as you can see its not just any title. it uses this package called fitty to make the text size up to the full width of the page, and it does indeed look massive. and it also goes under the rectangles of the logo, so its like an apple depth effect you get on iphone lockscreens i found the website really laggy while scrolling somewhere while finishing of the main interactive icon, and i couldnt figure out why after removing everything that could have been gpu intensive (my gpu was spiking to 80% while just scrolling) so after all that my most likely theory is that the lag is just my computer and not the website (or both 😭😭) also when i made that main art, i made the border radii use px units, which made it look quite deformed on smaller screens, since the rectangle’s size is relative to screen width, whereas border radius is constant… so i went and fixed that too"}, {"post_id": 56944, "ts": "2026-08-28T23:37:12Z", "hours": 1.0728, "text": "After much trying to make glass, yet again, i failed. So now im just using blur and these edge effects, and i think it looks nice! theres even a hover eect, as shown in the second screenshot (class details show and the rectangle rotates a bit randomly)"}, {"post_id": 56543, "ts": "2026-08-28T10:38:02Z", "hours": 8.8014, "text": "I started to make the landing page, and i decided, after very much research from other landing sites I’ve seen, that the main item should be an interactive timetable, a version of the app icon. but interactive and glassy. im trying to recreate everything in css but its not looking as smooth and polished as real liquid glass does so ye. im kinda getting close though! I also added a navbar item that just is the link to actually open timetable, and when you hover it shows options to either open the app in testflight or open the web version which just redirects to /login. and its background switches to black when you start scrolling, which will make more sense later. i haven’t really planned the rest of the landing page, and i might remove this entire component if i find a good liquid glass implementation i can use, especially with bouncy animations etc. but yeah. (worst part is i might even just go change the entire app icon in a week so that kinda wastes all this time 😭😭😭)"}, {"post_id": 53528, "ts": "2026-08-24T03:23:23Z", "hours": 5.4669, "text": "I have started using the shared components around the website, and its actually looking pretty nice! most importantly, these components can be changed once and work everywhere and i removed the drawers i was using everywhere, and i also made said drawers wider while i was rehauling the drawers i also kinda broke their animations and i don’t know how to fix it 😭 the whole website looks really basic now, since its obviously using now the shard unstyled components, and i was thinking about the theme and decided maybe it should be unstyled, and only the user’s own events and content etc can have colours."}, {"post_id": 52138, "ts": "2026-08-22T07:15:18Z", "hours": 9.6475, "text": "I think I have finished making all of the shared components I put everything inside accordions to organise the test components Overlays get the same translucency and outline every other component gets I think im happy with how the lists look, finally the option selectors are really really hot!!! The first page I have remade is the About view, which shows this badge if you are on localhost lol i also had to move the contributors up to the server instead of hardcoding them so that both website and app can see it And a really nice little animated gradient thingy for the about view!!"}, {"post_id": 51517, "ts": "2026-08-21T08:53:31Z", "hours": 3.9036, "text": "I have pretty much finished the components, I’m going to now go and add the other shared components and improve them too. then im gonna go through the css files and clear anything that is unused or overcomplicated, and then i can start remaking the website!"}, {"post_id": 51022, "ts": "2026-08-20T14:43:48Z", "hours": 7.9519, "text": "So the previous UI was really ugly, to be honest, so i decided I am oing to scrap half of the design and completely unstyle the entire app while making everything as standardised as possible, by trying to only use reused components as much as possible. So I spent all today stripping out components I didn’t need, then take the surviving components and adjusting them to my use case and making then look as nice as I can. alert dialogs drawers buttons lists section cards switches I have also decided to stop using tailwind because its quite simply messy and much more confusing than just moduled css, so ye"}, {"post_id": 50337, "ts": "2026-08-19T14:34:49Z", "hours": 5.8117, "text": "I’m still working on making the UI look much better, and I’m still figuring out some website stuff like how i should wire up the sidebar tabs as well as having like a nice homepage to advertise everything the app does, which will be a really fun sub-project. Turns out making nice looking lists in react is much harder than it looks, as shown below 😭 one problem is that each symbol has a different aspect ratio so i dont even know how to fit them nicely And unlike swiftui, its raelly raelly hard to stay consistent in your css and to keep using the ui tokens instead of making custom css everywhere. it looks like the website is gonna be harder than the app to make after all 😔 this classes card though, for example, i think its pretty much almost done. i might need a few more borders to make it look glassy and stuff but it looks exactly like the ios version, which is the end goal! And I added the animations to the classes card, again exactly like the iphone app. i also got a vscode extension that shows you all of your unused css classes, i highly recommend getting one and purging your codebase!"}, {"post_id": 50037, "ts": "2026-08-19T02:03:20Z", "hours": 11.0747, "text": "So I’ve made the first version of the website, it’s really insanely buggy and broken, but the ui is there. so have the html good but no i need to really tweak the css to make it look nice, apple-style. i also need to figure out how to make loading states look nice, since unlike the the swiftui app, i can’t cache anything to not show loading state. in the plus side i dont have to deal with offline state, though. the sidebar and the toolbar are finished, and look really nice. the sidebar has an effect (from ipados) that basically reflects the content in a subtle blurred way, to make it feel like glass while not actually rendering anything expensive. The toolbar is just glass buttons + a black fade effect + progressives blur, also tuned to look like ipados. the icon in the sidebar is pretty ugly honestly so i need to replace that with the non-bordered icon. The other problem i am dealing with is that we are planning a complete redesign of the entire swiftui app, and obviously that has to propagate to the website, so any work i do now is kinda gonna be half wasted, depending on what the redesign actually looks like."}, {"post_id": 47872, "ts": "2026-08-16T03:56:44Z", "hours": 0.5908, "text": "And now it scales up and down and stuff!!! I still can’t believe this is just html and css and js 😭 Theres so many parameters to tweak to make it feel right, its so finicky And depending on the size of the glass, you have to change the numbers, its kinda confusing honestly"}, {"post_id": 47804, "ts": "2026-08-16T00:37:23Z", "hours": 0.8556, "text": "Its nice and squishy now! It uses gsap for this as well gsap is a great framework ngl"}, {"post_id": 47523, "ts": "2026-08-15T14:19:10Z", "hours": 4.8103, "text": "Hehehehe I’ve got a working version of liquid glass It uses gsap, which is nice the second image is an earlier version 😭"}, {"post_id": 47363, "ts": "2026-08-15T08:10:22Z", "hours": 1.1444, "text": "The website is alive! I got a screenshot of an iOS26 sidebar, and i am copying it, as you can see. looks nice i think"}, {"post_id": 47332, "ts": "2026-08-15T06:41:25Z", "hours": 2.6325, "text": "Ok so after a bunch of wrestling with nginx and bun and next.js, i have added the website! its at https://timetable.adonis.pt/ and the current api has been moved to https://timetable.adonis.pt/api Its the usual next.js thing. and it uses bun. my design idea for this is to look like its an ipad app, essentially, and im going to see exactly how far i can take the mimicking, maybe i can even add liquid glass to the web 💀 So yeah no more app building, now its website! It’s gonna be so much easier as well because I aleady have the backend done and tested, so this should be all design which will be really fun."}, {"post_id": 46919, "ts": "2026-08-14T13:55:04Z", "hours": 0.3047, "text": "new icons. the old one that now supports light mode was kinda ugly."}, {"post_id": 46909, "ts": "2026-08-14T13:32:29Z", "hours": 7.6422, "text": "A somewhat interesting devlog this time. I spend a good 2 hours just trying to make live activities work. the miserable part is that they were already working before 😭 I dont even know what I did but it broke. And while i was trying to make a debug button to start a live activity, yeah it just wasn’t working. all kinds of problems with not submitting a good APNs token. and i had to like stop activities before starting new ones and stuff it was just in general really annoying. there was even more problems but its too much to say here 😔 anyway, i have started cleaning up the app. no more big features, to be honest, until i add a website for this thing!! should be really easy since the backend is clearly all done lol events can show weather for them, such as the athletics carnival i removed the ridiculous backgrounds i allowed users to choose, theres no only solid black/white and paper. more reasonable, i think. as part of my optimisation, i removed settings i found useless. haptics are now always on, and highlighting the current day is always on. profile pictures can now have their foreground colour set, like the Monogram can have its colour optimised.you can see the average for when your friends arrive to school per day, instead of in total. developer settings also got reorganised, more settings only show to developers. yet again cleaning up the app experience. the location status was a bit unreliable, if users were offline, etc, so i added multiple ways the app pushes updates to the server, and queued statuses when the device was offline. i also refined the actual radius for what counts as within 5 / 10 minutes, should be a bit better. i havent thought about people who live within 10 minutes, thats an interesting case the subject editors grid also looks nicer (still needs more improvement though the tabview now hides while scrolling, like it collapses into the corner, like apple apps! you can manually turn off sharing your status, for privacy reasons. and some more things i forgot 🥹 im so excited for this thing to actually launch!!!!!"}, {"post_id": 46297, "ts": "2026-08-13T13:01:18Z", "hours": 1.3272, "text": "I spent some time to work on this search button and its animation. idk if the video plays, but it uses apples glass effect transitions! I also made the confirmation dialogs for removing and reporting a friend better, before they just popped up in the middle of the screen, now it comes out of the menu (also found another ios27 beta bug 😐)"}, {"post_id": 46263, "ts": "2026-08-13T11:41:36Z", "hours": 2.4739, "text": "So supporting light mode calls for an icon redesign, at least just for light mode, and here they are! Though to be honest, the entire app is gonna need a redesign, because I need to rename it from Timetable, because it has expanded into doing so much more, and timetable is a bit of a boring name. finding names is so insanely annoying though, but oh well."}, {"post_id": 45744, "ts": "2026-08-12T13:04:58Z", "hours": 2.6161, "text": "I added custom backgrounds! Theres the paper backgrounds i added recently, and then the solid colours, and then also some of the really nice apple ones idk what they are called (i hope apple doesnt copyright me 😭) so yeah it applies to all backgrounds in the app i think it merges really nice with the liquid glass and blur backgrounds different views have it also shows on watch i also added an option to choose how far forward you see events. theres also even more statistics for what app version people are using!"}, {"post_id": 45684, "ts": "2026-08-12T10:26:42Z", "hours": 1.3586, "text": "You can now edit the foreground colours for your profile picture monogram i also completed light mode support for widgets"}, {"post_id": 45645, "ts": "2026-08-12T08:44:01Z", "hours": 2.0167, "text": "I added accessibility improvements, mainly like labels and tags and stuff, for use with voice over etc. this was triggered by me installing a developer process into my app which allowed me to iterate on design faster, and it depended on accessibility elements to discover each element. (the purple thing lets you tap elements and comment on them) i also tried a new background for the cards, as you can see below, its just glass and i think it looks pretty nice"}, {"post_id": 45165, "ts": "2026-08-11T14:09:40Z", "hours": 9.5667, "text": "Big update! Light mode! The app used to be dark mode only, it let me make it look much more pixel-perfect and refine colours and stuff, but its kinda obvious you cant keep the app dark mode only, its just not good. so i went through everything, adding light mode versions of paper, text, glass, etc. took me quite a bit of time because i was trying to maintain consistency while doing it, which included alot of redoing things and creating view modifiers and manually applying each one, etc i also added weatherkit, its just a single line in the today tab, but its nice. while adding light mode support, i found a really nice blur view i could add to lists, so now each lists’s background is nothing other than a blur! i also decided to make all backgrounds made out of paper, and i think it looks nice? theres also now a statistics page for deices and os versions and builds and stuff, itll be more useful later. as well as knowing when your friends arrive to school, i added the ability to know when they are within 5 or 10 mins, and to send notifications for that. average arrival also is split by day now, because people arrive to school at different times per day theres a new tab picker, which you can see int eh controls, its much more glassy than the last one, which is really really playful and stuff! i still have more work to do in terms of ui work, excluding light mode refinements, like notifications and widgets, but yeah."}, {"post_id": 43989, "ts": "2026-08-09T14:04:31Z", "hours": 1.73, "text": "I added a new devices statistics view. or more accurately, i expanded it. before, it just shows device platforms. now, it shows the os version, minor os version, and if it is a beta or not. i also added support for iOS 26 (previous builds only supported OS27 or later). this involved me just making some features not work on os26 😐 and supporting anything before OS26 would probably be legitimately impossible, so yeah not that."}, {"post_id": 43936, "ts": "2026-08-09T11:55:31Z", "hours": 1.5656, "text": "I also made some improvements to the card height for the user’s own item. before, it was just the full width. Halfway while I was working on that, my TabView suddenly froze for a straight 20 seconds every time i changed the tab. this was very weird, and the CPU shows 0% usage, so I was quite surprised. After a large round of commenting things out and seeing what broke, I found it was a single .glassEffect() that I was using for the progress marker. I have no idea how a glass effect can make an entire tabview freeze, but fine. i replaced it with a simple red colour, as shown below, with a stroke and shadow, and i think it looks fine now."}, {"post_id": 43850, "ts": "2026-08-09T08:59:50Z", "hours": 1.6619, "text": "there is a new progress background: its not a background! inspired by the app icon / ios app, the progress view is now this marker thingy which fits into the app’s theme much nicer I’ve also been tweaking the font sizing, image sizing, padding, and gaps between the items here to make sure they look good at all possible subejct names etc. i also had to fight a bit with the safe area of the view, you can see in the image below the name “bob” ends slightly above the text, took me a lot longer than expected to fix that"}, {"post_id": 43782, "ts": "2026-08-09T06:43:26Z", "hours": 7.4142, "text": "I started work on rehauling the watchOS app And I really like how it’s coming out The watch is supposed to distill down the information the user needs, so i picked the current and next period, time, and their location. all these elements are glassy and stuff, so they are clickable, and its in a tabview that scrolls between each card. The first tab is the week view for the user. so I spent a good 2 hours trying to make a ScrollView work, but it didnt. sometimes the views teleported, some lagged, some glitched, and it was overall insanely annoying. so I moved to a tabview, which was considerably more stable, but removed the animations I wanted. it had its own animations which were fine, but yeah. Also, fonts also reflect on the watch! the one in the screenshots below is the expanded style, which to be honest isnt that good on watch since the watch is constrained as is, but yeah. The glass timetable actually looks insane I am still thinking of how to include other content, like grades maybe, and other things, but i dont want to make it too dense and slow"}, {"post_id": 43264, "ts": "2026-08-08T12:54:21Z", "hours": 3.6083, "text": "You can now change the font! this took more work than you would expect, because i did a find on the project and saw there were like 60 references to .monospaced, and each one had to be manually upgraded to dynamically apply font. i also tried to make the rounded font expanded, but after some inspection i found it doesnt even have a .expanded variant 😐 so the options i ended up with were monospaced, rounded, and expanded. no normal font. it just looks boring at this point. below is the same screen with each option! widgets also get the fonts, and they look actually insane ngl"}, {"post_id": 43093, "ts": "2026-08-08T05:35:22Z", "hours": 2.4481, "text": "improving the friend detail view the padding is so much nicer, and the detail view also shows more info and in a better way the week subtab shows a similar timetable to the user’s own, and shows more info. and some more statistics lol"}, {"post_id": 42989, "ts": "2026-08-08T00:22:14Z", "hours": 1.9642, "text": "I decided to remove created timetables. they just don’t work anymore with the Friends concept, which makes it really annoying to adjacently share other timetables alongside having friends. its a shame, i wish it could have worked, maybe ill add it again later. oh well. im still just combing through the app and fixing all the little things i see: grade tracker gets a next item in the top for the top 4 subjects, which is important for atar. improved the friend detail view a bit better, because the old one had not enough information and was displaying badly.added more statistics to administration view cos its fun lol the tag selector view was improved, looks nicer and is a tiny bit more legible nowi changed the grade tracker weighting from semester to year. apparently thats the norm more friend detail view improvements"}, {"post_id": 42669, "ts": "2026-08-07T14:52:24Z", "hours": 2.3131, "text": "Grade tracker!!! I know this is a very cliche topic but I had to implement this because it integrates so seamlessly with the app for example, it already knows your subjects (duh) and when you input the date of your assessment, it also knows which period of the day that is, because it knows your subjects! (duh) I also added ATAR, sthe user can set goals and stuff for what they want to achieve."}, {"post_id": 42589, "ts": "2026-08-07T12:33:01Z", "hours": 1.0975, "text": "some ui improvements (that weird box in the account view is Metal debug overlay, not my app)"}, {"post_id": 42549, "ts": "2026-08-07T11:27:09Z", "hours": 5.165, "text": "lots of little things instead of one big feature: i used to send emails, and i reached limits on the email provider so i had to move to only sending notifications, like device notifications. i still need an alternative, im looking through options now there used to be different settings view between iPhone and iPad, so i consolidated them into one view.you can now see your friend’s status as on or off campus. this uses location to check when you reach school or leave. this also allows some cool statistics like average school arrival time!there is better moderation, it shows in the admins view and lets the admin block or do nothing about the account. it will be expanded later to have more features and actions and stuff you can request to change your friends-since tag, also approved by admin.i deleted all (most) references to #if os(macOS) , since there is no more macOS build, its just iPad running on mac. small ui improvements: added search to some more administration views tapping an existing photo pro allows crop the tabview gets tab transitions, like the ones iOS 26 had (that ios27 removed 😡)year-level tags are separated from other tags expanded statistics!added archived events - events in the past - plus an option to automatically delete old events added a button to reset tips, since the app is getting more and more complicated the onboarding is less condensed, when that permission is first needed, its permission sheet request shows.more stuff gets cached in Defaults, making it more offline-safe.and some toolbar and blur and navigation title stuff."}, {"post_id": 41948, "ts": "2026-08-06T14:06:53Z", "hours": 1.2208, "text": "user account data now has highlighted rows for faster navigation user reports look much better, as well as friends-since requests reporting or sending feedback sends notifications instead of emails, now"}, {"post_id": 41911, "ts": "2026-08-06T12:53:26Z", "hours": 4.0961, "text": "Few things! Adminsitration gets new items for reported users and freinds-since requests sections in adminstration statistics for number of users, etc you can now see your status and other people’s status, like on or off campus new page that asks for location access ofc (ill move it into the onboarding later improved the add a friend sheet admins get emails for reported users, etc"}, {"post_id": 41764, "ts": "2026-08-06T04:50:27Z", "hours": 8.5058, "text": "I finished the refactoring for now, to make the app multi platform. So then i did some more brainstorming and I have consolidated what is the next few features I need to do tips, to tell the user about features the app has they sound easy but each tip needs rules and parameters and all kinds of obscure annoying things, so its going to be harder than it looks my first tip shown below An indicator next to each friend about their status, which is going to take the user’s location, taken in the background, to tell if they are on campus or off campus So from this you can tell when a user arrives at school or if they are sick iOS provides a function that will call my app, from the background, every time the user crosses a specific map polygon (The school). so i dont even need to do any map processing, my app just gets called every time the device goes in or out of school! plus i can add cool related features like the user’s average arrival time to school, which will be pretty cool!"}, {"post_id": 40724, "ts": "2026-08-04T13:16:45Z", "hours": 3.6128, "text": "Still just refactoring and remaking the app. i decided to remove OS 26 compatibility, because there is just too many APIs and stuff the images below are some stuff I’ve been refining: dragging friends around sideays iphone support (same thing as macOS + iPadOS) but I’ve decided now to not work on macOS (which is just iPadOS) and ipad until i perfect iphone and watch. should be fun!"}, {"post_id": 40093, "ts": "2026-08-03T14:09:54Z", "hours": 0.6797, "text": "its getting there! mac catalyst is definitely better than trying to make native macOS work. swiftui isnt really making it any better, its really really restrictive in terms of how i can structure my app. like for example that right column, has so many glitches that i cant really find solutions to because the bugs aren’t in my code, its infuriating."}, {"post_id": 40069, "ts": "2026-08-03T13:17:55Z", "hours": 1.1419, "text": "working with macOS is infuriating me, so i decided im going to make the macos app actually be mac catalyst, so its technically just running an ipad app. which makes sense. still needs alot more work, this refactor is proving very very annoying"}, {"post_id": 40036, "ts": "2026-08-03T11:53:01Z", "hours": 1.3019, "text": "first version of timetable for macos 😭 its really ugly and lwk broken. so im gonna spend the next few hours fixing this incredibly “interesting” UI."}, {"post_id": 39979, "ts": "2026-08-03T10:13:36Z", "hours": 3.41, "text": "So so far up to now, I have completely neglected everything other than iPhone. i needed this so that i could focus on making iphone as seamless and intuitive and possible, and to push features faster. so now i have to go and basically remove all of the non-iPhone code and replace it with iphone code, and then try to make that work multiplatform. so i decided iphone is going to remain as a tabview, for now at least, but ipados, macos, and big iphones can use a navigation split view, shown below. so a sidebar and main view and an inspector on the right sometimes."}, {"post_id": 39467, "ts": "2026-08-02T13:08:27Z", "hours": 0.6319, "text": "I checked the localisation and it went down to 25%, so I went and pushed that back up to 100%. and the friend detail view has been improved a bit more"}, {"post_id": 39451, "ts": "2026-08-02T12:29:09Z", "hours": 0.3811, "text": "before and after some small ui improvements!!"}, {"post_id": 39440, "ts": "2026-08-02T12:06:26Z", "hours": 0.6767, "text": "i just read an article that said @Environment(\\.dismiss) is bad for performance dismiss() is a very simple and fast way to make a sheet or other modal view dismiss , but because its so simple and dynamic, that introduces lots of bugs apparently. so I had to go through all the sheets and this time replace dismiss() with better state management. i hope ill notice the performance improvements!"}, {"post_id": 39417, "ts": "2026-08-02T11:25:42Z", "hours": 1.5344, "text": "some people were saying that it was really annoying that you could drag anywhere in a sheet to dismiss the sheet, you would be halfway through something and then you have to restart. so i went through all the sheets in the app and checked if they needed to remove this swiping. luckily it only needed one modifier per sheet. also, more tester feedback was that i shouldnt have sections for tags, so yeah i did that. also, now that there is a concept known as friends, instead of just shared timetables, i removed the option to allow people to have their timetables searched publicly. i havent figured out what i want for specific created timetables, i might lwk have to just remove that also users now have to fill in what year group they are when onboarding. for tags."}, {"post_id": 39252, "ts": "2026-08-02T03:22:29Z", "hours": 3.0194, "text": "friends detail view shows a bit more content, and is redesigned for more paper you can reorder the badges around now for priority when they show in their overlay event tags editor looks a bit nicer plus, users can edit their year group after signing in."}, {"post_id": 38922, "ts": "2026-08-01T14:51:06Z", "hours": 2.6803, "text": "So the header in settings now reflects with your pfp colours for the profile editor, i made it now scrolling so that you could fit in all of the various options, like animation speed and noise and stuff. when you click on a class in today view, it shows some more details about the class like teacher and location. friends view also looks a bit nicer, both the list view and the detail view."}, {"post_id": 38829, "ts": "2026-08-01T12:04:02Z", "hours": 1.9464, "text": "Given the theme of this app, paper, widgets now get paper too! settings for profiles has been updated too you can now select black → white in the colour selector. friend detail view still kinda looks a bit empty and bland, im not quite sure how to make it feel alive"}, {"post_id": 38704, "ts": "2026-08-01T07:32:35Z", "hours": 4.1875, "text": "you can add special badges to people now, for like early birds or something idk. the profile picutre bakground has been upgraded a bit, but im going to have to fork the repo and adjust it myself, its currently not looking like a gradient but a single noisy colour, im gonna fix that."}, {"post_id": 38184, "ts": "2026-07-31T13:32:47Z", "hours": 0.5325, "text": "The bottom colour grid is concentric to the device!!! although making the white outlines also behave nicely is proving really really hard, as you can see below"}, {"post_id": 38170, "ts": "2026-07-31T13:00:49Z", "hours": 3.5731, "text": "I’ve been busy remaking the profile editor, its coming together really nicely. that profile picture at the top is designed so that lets the other components take up their space, and then the pfp takes up the rest of the space. this allows the same view to not scroll while working on different phones and text sizes etc. and the background is animated!!!"}, {"post_id": 37968, "ts": "2026-07-31T01:17:27Z", "hours": 5.3656, "text": "I made this widget, which is kinda like a summary widget for the user. it requires this large widget size to fit everything, and its goign to be more dynamic than the other widget which always show the same layout. i haven’t thought exactly how i’m going to do it though, below is a rough first version."}, {"post_id": 37025, "ts": "2026-07-29T14:32:52Z", "hours": 1.9747, "text": "i added a section in teh administration to be able to turn off the server for everyone except for me, so that i can maintain the server and test it. and also a section to manage other admins."}, {"post_id": 36962, "ts": "2026-07-29T11:55:40Z", "hours": 7.3492, "text": "so me and my friend did some more brainstorming focussing on the new friends tab, and how friend accounts work, and profiles and pfps etc. we also aggregated a list of bugs and UI glitches in the app that still need fixing. the current first version is (moderately) broken 😭"}, {"post_id": 35775, "ts": "2026-07-27T12:45:52Z", "hours": 1.9714, "text": "Me and my friend did a bit of brainstorming, to get ideas on how to improve the app UI, UX and future features. cos we are planning a future release hopefully. so we gained a good idea of consolidating friends into a more clear friends tab, combingin the currently spread-around-everywhere friends stuff."}, {"post_id": 35475, "ts": "2026-07-26T22:47:13Z", "hours": 2.4061, "text": "I made some UX adjsutments in the settings app, added some images, reordered haptics, etc the planner sub-tab has been rehauled, and shows items chronologically instead of in sections, which i thought was more intuitive. it still needs much more thought though, im not sure how to space them out since some gaps are months long."}, {"post_id": 35175, "ts": "2026-07-26T13:01:49Z", "hours": 2.2025, "text": "Theres now brown and white paper combined. its an interesting ui concept, makes no sense in real life, but i think it looks nonetheless! it definitely creates an app theme, regardless of if this theme looks good or not…"}, {"post_id": 35092, "ts": "2026-07-26T09:28:27Z", "hours": 4.1481, "text": "As usual, I did a very assorted bunch of things: new admin tab so that i can change stuff without having to go onto my mac and hardcode stuff today view looks like paper - reminscient of the app icon! new about view the popover for subject details is smaller, removing bloat and a bunch of server improvements due to all of my users finding bugs and stuff!"}, {"post_id": 34919, "ts": "2026-07-26T00:43:54Z", "hours": 4.7894, "text": "I have expanded the home tab!! Theres three tabs at the top, today, week, and upcoming. week is what it already was upcoming shows term dates, no school days, school events, and also the users own personal events they make. the today view is a bit ugly but its sort of there! there also an admin page now, so that i dont have to hardcode term dates etc, i can just send them as api requests (for admin accounts only lol)"}, {"post_id": 34560, "ts": "2026-07-25T11:50:05Z", "hours": 0.755, "text": "Message extension got improved, it now checks if you have enabled sharing before allowing you to even sahre it, and tells"}, {"post_id": 34551, "ts": "2026-07-25T11:04:40Z", "hours": 0.5589, "text": "I’m adding countdowns everywhere, even when school is out, so that you can count the hours until your next period"}, {"post_id": 34537, "ts": "2026-07-25T10:29:10Z", "hours": 0.6072, "text": "This is currently the message extension ui. kinda ugly. that needs fixing I also updated the created timetables detail view, and (ignore the screenshot) removes the save button cos no one is going to remember to press save when they change details, so this should save some frustration."}, {"post_id": 34523, "ts": "2026-07-25T09:48:04Z", "hours": 1.6383, "text": "I improved the UI for this view, to better show classroom and teacher labels. I also renamed “Authored” to “Created”, apparently its better copy, according to my friend. The settings got cleaned up a bit, and importing from calendar again needs confirmation"}, {"post_id": 34495, "ts": "2026-07-25T08:06:40Z", "hours": 1.9119, "text": "I found an xcode bug, something to do with compilation errors for incorrect architecture, i dont get it but i gave apple feedback."}, {"post_id": 34418, "ts": "2026-07-25T03:27:42Z", "hours": 0.5558, "text": "So I made a few more adjustments like removing the APNs registration page from onboarding to make onboarding even more seamless Not important though. I discovered a really annoying problem: When I try to add iPad support, build fails because its trying to embed the watch app which obviously doesnt work on ipad. and xcode isnt letting me fix that. 😐"}, {"post_id": 34073, "ts": "2026-07-24T15:06:09Z", "hours": 4.9253, "text": "I made some UI rehauls again lol Current day receives theis blur effect which kinda looks like real light bouncing inside a box under the current day The accent colour of the app is now brown, as I am trying to make the app feel more like paper, which will become more obvious as i later add paper elements and views inside the app. My last update released a new account backend, which meant some users were not able to log in, so i decided to nuke the database and reset everything 💀 but anyway it worked and i upgraded the server to be better at handling this The sheet to add a shared timetable is improved, with blur effects and stuff, and that tiemtable preview has gotten much better it was pretty bad before ngl"}, {"post_id": 33492, "ts": "2026-07-23T14:13:01Z", "hours": 6.9467, "text": "I did a bunch of things: current day highlight in ios improve the notification early sending, to allow users to send notifications at multiple offsets remake the ui for share timetable sheet also the ui for the link customisation, tinted mint for whatever reason sharing links is now a URL, which prompts you to open the app but uses decently ugly html, ill fix later. New icon for apple watch that is optimised for the smaller display size (just made the components bigger and removed some duplicate elements added some mroe developer items at the bottom, doesnt serve much purpose just looks cool lol i removed the status badges that show success, cos i thought they would annoy the user with too many success alerts, and success when you are toggling settings doesnt really need alerts, so yeah. i also hit a bug where notifications would send twice, i had to improve the apns token system to not duplicate tokens for a device. on startup the app shows “restoring account…” every time, so i had to cache the profile data to make it stay signed in until explicitly signed out. its kinda hard to see in the screenshot but there is progressivew blur at the bottom and top, looks nice"}, {"post_id": 32346, "ts": "2026-07-21T13:36:10Z", "hours": 3.2925, "text": "I had a bug where the device could receive 2 notifications and live activities for each device, so I had to remake the APNs (apple push notification service) token management. I also added a highlight around the current day, with the setting to disable it. i thought a stroke was better than a fill because its less overwhelming and doesn’t break the ui style."}, {"post_id": 32261, "ts": "2026-07-21T10:07:38Z", "hours": 2.5917, "text": "😍"}, {"post_id": 31757, "ts": "2026-07-20T12:16:31Z", "hours": 0.9472, "text": "As you saw before the onboarding UI was a bit broken, so I went through and fixed it up and also trimmed down how many pgaes it has. Those bottom buttons aren’t concentric for some reason, even though I am using the built-in toolbar API, so I can’t fix it. Oh well. And it’s done to 8 pages, from 13. I still have som non-UI bugs to fix."}, {"post_id": 31728, "ts": "2026-07-20T11:15:51Z", "hours": 3.0553, "text": "Updated splash screen Notificaitons now have threads (each school day is a thread) macos window size animation fixed (the macos window resizes depending on the current state of the app, like currently selected tab etc. fixed some bugs in live activities and server authentication"}, {"post_id": 31613, "ts": "2026-07-20T04:58:28Z", "hours": 2.3833, "text": "Fixed some server bugs, a user reported getting “forbidden” status messages, turns out I forgot to migrate the database 😐 And other UI refinements: Tab bar uses monospace font version and build in settings feedback sheet"}, {"post_id": 31570, "ts": "2026-07-20T02:25:41Z", "hours": 0.5333, "text": "Plus a version for debug builds, I think they came out really nice!!"}, {"post_id": 31548, "ts": "2026-07-20T01:23:34Z", "hours": 0.4489, "text": "I think this is pretty much it."}, {"post_id": 31538, "ts": "2026-07-20T00:55:26Z", "hours": 0.7164, "text": "I think I’m getting there"}, {"post_id": 31518, "ts": "2026-07-20T00:10:10Z", "hours": 0.2719, "text": "I think I’ve locked in to this one. Now I need to figure out what to actually put on the papar, im thinking it has to be a kind of simplifed version of the existing main UI of my app. something kinda like a calendar schedule"}, {"post_id": 31513, "ts": "2026-07-19T23:53:55Z", "hours": 0.6131, "text": "So many variants! and idk which one is best"}, {"post_id": 31504, "ts": "2026-07-19T23:17:08Z", "hours": 2.4258, "text": "Many many iterations later… I’m leaning towards that paper one, it looks really tasteful i think. im not sure what to put on the paper though"}, {"post_id": 31176, "ts": "2026-07-19T11:22:39Z", "hours": 0.635, "text": "I think they are coming along really nicely!!!! The watchOS version has bigger title text and less handwriting rows cos its a smaller display size, i really like this 😃 the refraction effects 👌"}, {"post_id": 31171, "ts": "2026-07-19T10:43:22Z", "hours": 0.2894, "text": "I think it’s looking preetty good so far"}, {"post_id": 31156, "ts": "2026-07-19T10:22:03Z", "hours": 0.3833, "text": "More experiments, cos the previous multicolour outline was kinda ugly, now i’m thinking of adding the fake handwriting instead, it might look nice"}, {"post_id": 31145, "ts": "2026-07-19T09:51:42Z", "hours": 6.1353, "text": "I needed a new design system for my app, currently it was just a font and thats about it. Below are some experimental app icons I’ve been tweaking in sigma, they are made out of “paper” and represent a new theme I could use, which is literal paper as the design language. I think it could merge with Liquid Glass really nicely if done properly. Otherwise, other improvements: New App Intents for Apple Intelligence Allow users to set a custom share link URL, for example timetable.adonis.pt/sharedtimetable/adon’s_timetable More server tests + server improvements due to finding bugs in tests"}, {"post_id": 30567, "ts": "2026-07-18T07:42:48Z", "hours": 0.7647, "text": "I have also decided to remove Apple wallet integration, it just kinda got too messy. so im now going to revert (yes, revert 😭) back to an iMessage extension that lets you share timetables with a link. it fixes some annoying things that wallet integration has, like syncing etc. I can even allow custom link urls for a shared timetable!"}, {"post_id": 30552, "ts": "2026-07-18T06:53:52Z", "hours": 4.8108, "text": "I got carried away, since right now I am just going through and fixing the feedback my beta users gave me, starting with these: improving the onboarding flow to decrease the amount of pages, and condense some other pages, since testers said there were too many. Upgrade the server so that it only allows iOS to make changes to anything, since watchos and ipados and macos can only view, not edit. i added some tests, using codex, on the server. I’m getting tired of manually debugging every single problem I find by hand, I just make tests and its a much easier way of guaranteeing your server works perfectly. the client app is going to be much harder to add tests to, though. and more other random stuff I found and UI fixes etc. The screenshots are some broken UI stuff I found, I can’t really show you server bugs other than these error alerts. Going good so far though, can’t wait to release this as a v3!"}, {"post_id": 30017, "ts": "2026-07-17T08:18:20Z", "hours": 1.2478, "text": "After releasing v2 testflight, my friends pointed out a very large amounts of bugs in the app 😭 so I am now just trying to fix everything they pointed out. I’m pretty sure the server doesn’t have any issues, so at least that’s good. First bug is this bottom bar looks horrendous, This was fine for me cos I set my dynamic text size to small 😭"}, {"post_id": 28834, "ts": "2026-07-15T10:39:28Z", "hours": 2.2433, "text": "I made some final refinements to make sure account management on macOS works, so that my users can actually use the app, and then some other UI refinements, mainly for settings. there are a bunch of weird things i am yet to fix, but im really tired and just want to get this app out, so ill fix them later."}, {"post_id": 26526, "ts": "2026-07-11T11:56:12Z", "hours": 0.4547, "text": "I added some more pages to the onboarding, since that’s the only way I can show users how the app works cos it ngl is kinda obscure. i also added a report feedback or bug button, which needs some ui adjustments bruh"}, {"post_id": 26359, "ts": "2026-07-11T03:14:52Z", "hours": 1.1214, "text": "I can’t really show you haptics but i added haptics to buttons and the status badges. not much to say honestly. theres a toggle in settings to turn that on and off."}, {"post_id": 25978, "ts": "2026-07-10T14:57:41Z", "hours": 0.8503, "text": "I;m nearly read to release version 2 of the app, so i made a list of final tweaks and little improvements to make it as best I can, i think i can release it in a few days."}, {"post_id": 25832, "ts": "2026-07-10T09:47:11Z", "hours": 3.5725, "text": "I improved the friends subjects widgets with concentric corners and stuff."}, {"post_id": 24646, "ts": "2026-07-08T11:25:32Z", "hours": 2.6925, "text": "I think I have built out pretty much all of the projects, but i need to fix the abundance of bugs and problems that i have. the first one was fixing a problem with server syncing, and making watch depend on signing in on the phone, not by itself."}, {"post_id": 23437, "ts": "2026-07-06T12:20:38Z", "hours": 1.6219, "text": "I refined the live activities (that background is for recess and lunch, even though this preview text says before school)"}, {"post_id": 23389, "ts": "2026-07-06T09:53:29Z", "hours": 8.7292, "text": "I added live activities, although they are currently kinda ugly and need much improvement. I also made the watch app independent, because it doesnt need the iphone much really, it can just contact the server. i still have more work in making the server work better and stop giving me random errors, but yeah."}, {"post_id": 22056, "ts": "2026-07-04T09:37:57Z", "hours": 2.8419, "text": "In the onboarding I added pages to teach the user the features of the app, but I havent finished it yet. it needs a few more pages and refinement for smalelr phone screens"}, {"post_id": 21441, "ts": "2026-07-03T12:12:36Z", "hours": 6.5136, "text": "I have added an onboarding view that i really like, its very colourful and stuff. i also improved the server to be able to send notifications to users, to tell them when their next class is."}, {"post_id": 20474, "ts": "2026-07-02T02:23:36Z", "hours": 3.1183, "text": "I added notifications to the app, so that people can receive information in the form of notifications as well as live activities and app intents and widgets. I also improved the share pass button in the prominent tab bar, so that you see this sheet to select what pass you want to share, not just the user’s own timetable."}, {"post_id": 19907, "ts": "2026-07-01T10:45:28Z", "hours": 0.4294, "text": "Much better blur, although the server is taking a full 2.5 seconds to send back the pass, and i need to reduce that as much as possible"}, {"post_id": 19874, "ts": "2026-07-01T09:07:49Z", "hours": 0.5289, "text": "The timetable has some shadow behind it. I wanted to make the card HDR, but after a lot of experimenting i found apple doesn’t let you use hdr in your app like this, so i had to instead do this shadow 😐"}, {"post_id": 19839, "ts": "2026-07-01T07:27:59Z", "hours": 5.4344, "text": "I finished the search view, and i spent a very long time on perfecting some visual animations and stuff. when you click on a search result it separately animates the title in. also, before you search anything, i thought instead of showing most downloaded timetables or something i show this really squishy and fun pokemon-style timetable wallet pass. the settings view has also been improved a bit, to make some settings more clear, but i still need to refine it alot further to get it working really nicely."}, {"post_id": 19231, "ts": "2026-06-30T14:26:57Z", "hours": 3.5647, "text": "I did some debugging and made quite a lot more endpoints, I think I’m ready to move on to making the app."}, {"post_id": 18340, "ts": "2026-06-29T13:38:09Z", "hours": 5.9711, "text": "It took quite some time, but i got some really nice looking status badges! I’m really proud of how they came out, they look very juicy, and i cant show it here but i promise its very touchable and squishy and animated! 🥰"}, {"post_id": 17491, "ts": "2026-06-28T09:18:06Z", "hours": 1.3717, "text": "I’ve built a few endpoints and documented them in rapidapi, ready to import into the client app."}, {"post_id": 17396, "ts": "2026-06-28T04:54:23Z", "hours": 2.2958, "text": "I finally got the server working! took a really long time to get https working though, nginx was impressively difficult"}, {"post_id": 16990, "ts": "2026-06-27T15:55:13Z", "hours": 3.0039, "text": "I have started building the server, using swift vapor. i chose vapor because it is written with swift, like my project, which made it easier to share code between the two files."}, {"post_id": 16274, "ts": "2026-06-26T13:42:03Z", "hours": 4.8597, "text": "Xcode seems to have become extremely broken or something, i spent the last 4 hours trying to make my widget work but Xcode kept erroring out and eating memory swap, and now i have some trouble with making the imported timetables actually show up in the widgets i already made 😡"}, {"post_id": 15592, "ts": "2026-06-25T11:12:59Z", "hours": 0.6642, "text": "I changed the blur effect to this, which i think is much better, because it has less blur, and doesnt add an ugly grey tint, so black background stays black background."}, {"post_id": 15058, "ts": "2026-06-24T13:45:05Z", "hours": 0.5081, "text": "I added this blur effect behind the share sheet, and I think it looks really nice. I had to import a package to get a blur this clear"}, {"post_id": 15044, "ts": "2026-06-24T13:04:35Z", "hours": 1.7442, "text": "I added a share button in the bottom left, which allows the user to share their timetable in one press, using the .prominent Tab style so that it looks seperate from the other tabs while still looking consistent."}, {"post_id": 13120, "ts": "2026-06-21T13:40:22Z", "hours": 1.0011, "text": "So added the ability to share timetables using apple wallet, along with sending them using messages, i think that background will need to get fixed for readability, but otherwise, i like it alot."}, {"post_id": 13066, "ts": "2026-06-21T11:31:59Z", "hours": 3.4256, "text": "I added some App Intents, below is my current subject intent, and also a list of received timetables intent. It took a lot longer than expected because the app intents framework was quite confusing to get working, but i got a nice UI in the end."}, {"post_id": 12370, "ts": "2026-06-20T05:56:30Z", "hours": 1.4289, "text": "I upgraded the watch views, like making the progress rectangle rounded, and this very colourful background for when its recess and lunch"}, {"post_id": 11882, "ts": "2026-06-19T11:15:08Z", "hours": 2.4344, "text": "I updated the background of the window, including in light mode, and I also remade the icon. The settings also looks much better than it was before, and I made a nice window animation for when you click a slot to see what your friends have."}, {"post_id": 9773, "ts": "2026-06-16T06:48:43Z", "hours": 1.3667, "text": "I made some refinements to the watchOS and iOS app, including design and performance."}, {"post_id": 9217, "ts": "2026-06-15T14:09:02Z", "hours": 0.8633, "text": "I made some design adjustments to the macOS app, giving it a blur background. Also, the weekly shedule widget has had its corner radiuses and colours adjusted to be less harsh and look better."}, {"post_id": 9192, "ts": "2026-06-15T13:10:48Z", "hours": 0.2592, "text": "I added some buttons and refined the UI of settings view"}, {"post_id": 9182, "ts": "2026-06-15T12:32:38Z", "hours": 0.5969, "text": "I continued to refine the design of the macOS widget, and I really like it now."}, {"post_id": 9098, "ts": "2026-06-15T06:29:44Z", "hours": 3.9675, "text": "I fixed the widget extension problem by making two widget extensions, one for watch and one for other platforms, and made them use identical code. And then I refined the widget design for macOS and iOS and i think they look really nice now."}, {"post_id": 7893, "ts": "2026-06-13T05:18:30Z", "hours": 0.5119, "text": "I added support for these widgets from only watch to iphone and ipad and macOS, and currently they are ugly and unrefined, so I’m going to fix them now."}, {"post_id": 7438, "ts": "2026-06-12T11:50:09Z", "hours": 3.1881, "text": "I ported the app over to macOS, which was harder than I thought because there was a lot of code throughout every screen that was for connecting iphone to apple watch or some other iOS-only thing, which I had to conditionally compile out for macOS. then I needed to refine the views to work on macOS well, for example the class editor sheet used a sidebar instead of the scrolling tabview on iOS. There’s still more work to do to refine it more and get CloudKit working so that the timetable syncs across devices."}, {"post_id": 6885, "ts": "2026-06-11T15:22:19Z", "hours": 2.7783, "text": "I added these views to the watch, so you can see how much time is left in a session for yourself, and also for others. i also refined the timetable view to not use so much glass because it was lagging the TabView. The main clock uses a liquid glass background against the background progressview, and what class is next."}, {"post_id": 6796, "ts": "2026-06-11T12:06:20Z", "hours": 0.8469, "text": "I fixed the sync button visuals, it now has a blur replace transition effect. the timetable comparison view also blurs in and out when you click around"}, {"post_id": 6781, "ts": "2026-06-11T11:08:53Z", "hours": 2.6286, "text": "I moved the sync button to settings, so that the toolbar in the timetable tab could be removed. this is to make way for this new bottom half of the screen that shows other people’s timetables when you click on the slot in the top half, replacing the previous system of letting you select someone else and see their whole timetable covering your timetable. this system lets you view your own timetable and compare it with everyone else’s at a particular period. It uses a soft scroll edge effect at the bottom, and a hard effect at the top, which i think looks really nice. the second image shows the content scrolling under the timetable, which i really liked."}, {"post_id": 6247, "ts": "2026-06-10T14:30:26Z", "hours": 0.8989, "text": "I’m just refining the software a but before I start adding Siri support and improving Messages import/export flow. I fixed this comparison view, improved the class editor to show the glass nicer, and the settings toolbar has a gradient blur effect instead of hard blur, which was made the new default toolbar background style, which imo is ugly."}, {"post_id": 6208, "ts": "2026-06-10T12:53:06Z", "hours": 4.0678, "text": "I renamed PMS Timetable to Timetable, which took more time than I expected cos it was embedded in like every single file and I even had to go through binary files and just delete all the instances of “pms” . then this managed to corrupt Xcode and make it crash every time I opened it, and i had to delete some stuff to fix that. Now I’m on the OS27 version and I’m going to start fixing some UI."}]...
|
Title: Timetable by @omeriadon | Stardance
Devlog Title: Timetable by @omeriadon | Stardance
Devlogs:
I renamed PMS Timetable to Timetable, which took more time than I expected cos it was embedded in like every single file and I even had to go through binary files and just delete all the instances of “pms” . then this managed to corrupt Xcode and make it crash every time I opened it, and i had to delete some stuff to fix that. Now I’m on the OS27 version and I’m going to start fixing some UI.
I’m just refining the software a but before I start adding Siri support and improving Messages import/export flow. I fixed this comparison view, improved the class editor to show the glass nicer, and the settings toolbar has a gradient blur effect instead of hard blur, which was made the new default toolbar background style, which imo is ugly.
I moved the sync button to settings, so that the toolbar in the timetable tab could be removed. this is to make way for this new bottom half of the screen that shows other people’s timetables when you click on the slot in the top half, replacing the previous system of letting you select someone else and see their whole timetable covering your timetable. this system lets you view your own timetable and compare it with everyone else’s at a particular period. It uses a soft scroll edge effect at the bottom, and a hard effect at the top, which i think looks really nice. the second image shows the content scrolling under the timetable, which i really liked.
I fixed the sync button visuals, it now has a blur replace transition effect. the timetable comparison view also blurs in and out when you click around
I added these views to the watch, so you can see how much time is left in a session for yourself, and also for others. i also refined the timetable view to not use so much glass because it was lagging the TabView. The main clock uses a liquid glass background against the background progressview, and what class is next.
I ported the app over to macOS, which was harder than I thought because there was a lot of code throughout every screen that was for connecting iphone to apple watch or some other iOS-only thing, which I had to conditionally compile out for macOS. then I needed to refine the views to work on macOS well, for example the class editor sheet used a sidebar instead of the scrolling tabview on iOS. There’s still more work to do to refine it more and get CloudKit working so that the timetable syncs across devices.
I added support for these widgets from only watch to iphone and ipad and macOS, and currently they are ugly and unrefined, so I’m going to fix them now.
I fixed the widget extension problem by making two widget extensions, one for watch and one for other platforms, and made them use identical code. And then I refined the widget design for macOS and iOS and i think they look really nice now.
I continued to refine the design of the macOS widget, and I really like it now.
I added some buttons and refined the UI of settings view
I made some design adjustments to the macOS app, giving it a blur background. Also, the weekly shedule widget has had its corner radiuses and colours adjusted to be less harsh and look better.
I made some refinements to the watchOS and iOS app, including design and performance.
I updated the background of the window, including in light mode, and I also remade the icon. The settings also looks much better than it was before, and I made a nice window animation for when you click a slot to see what your friends have.
I upgraded the watch views, like making the progress rectangle rounded, and this very colourful background for when its recess and lunch
I added some App Intents, below is my current subject intent, and also a list of received timetables intent. It took a lot longer than expected because the app intents framework was quite confusing to get working, but i got a nice UI in the end.
So added the ability to share timetables using apple wallet, along with sending them using messages, i think that background will need to get fixed for readability, but otherwise, i like it alot.
I added a share button in the bottom left, which allows the user to share their timetable in one press, using the .prominent Tab style so that it looks seperate from the other tabs while still looking consistent.
I added this blur effect behind the share sheet, and I think it looks really nice. I had to import a package to get a blur this clear
I changed the blur effect to this, which i think is much better, because it has less blur, and doesnt add an ugly grey tint, so black background stays black background.
Xcode seems to have become extremely broken or something, i spent the last 4 hours trying to make my widget work but Xcode kept erroring out and eating memory swap, and now i have some trouble with making the imported timetables actually show up in the widgets i already made 😡
I have started building the server, using swift vapor. i chose vapor because it is written with swift, like my project, which made it easier to share code between the two files.
I finally got the server working! took a really long time to get https working though, nginx was impressively difficult
I’ve built a few endpoints and documented them in rapidapi, ready to import into the client app.
It took quite some time, but i got some really nice looking status badges! I’m really proud of how they came out, they look very juicy, and i cant show it here but i promise its very touchable and squishy and animated! 🥰
I did some debugging and made quite a lot more endpoints, I think I’m ready to move on to making the app.
I finished the search view, and i spent a very long time on perfecting some visual animations and stuff. when you click on a search result it separately animates the title in. also, before you search anything, i thought instead of showing most downloaded timetables or something i show this really squishy and fun pokemon-style timetable wallet pass. the settings view has also been improved a bit, to make some settings more clear, but i still need to refine it alot further to get it working really nicely.
The timetable has some shadow behind it. I wanted to make the card HDR, but after a lot of experimenting i found apple doesn’t let you use hdr in your app like this, so i had to instead do this shadow 😐
Much better blur, although the server is taking a full 2.5 seconds to send back the pass, and i need to reduce that as much as possible
I added notifications to the app, so that people can receive information in the form of notifications as well as live activities and app intents and widgets. I also improved the share pass button in the prominent tab bar, so that you see this sheet to select what pass you want to share, not just the user’s own timetable.
I have added an onboarding view that i really like, its very colourful and stuff. i also improved the server to be able to send notifications to users, to tell them when their next class is.
In the onboarding I added pages to teach the user the features of the app, but I havent finished it yet. it needs a few more pages and refinement for smalelr phone screens
I added live activities, although they are currently kinda ugly and need much improvement. I also made the watch app independent, because it doesnt need the iphone much really, it can just contact the server. i still have more work in making the server work better and stop giving me random errors, but yeah.
I refined the live activities (that background is for recess and lunch, even though this preview text says before school)
I think I have built out pretty much all of the projects, but i need to fix the abundance of bugs and problems that i have. the first one was fixing a problem with server syncing, and making watch depend on signing in on the phone, not by itself.
I improved the friends subjects widgets with concentric corners and stuff.
I;m nearly read to release version 2 of the app, so i made a list of final tweaks and little improvements to make it as best I can, i think i can release it in a few days.
I can’t really show you haptics but i added haptics to buttons and the status badges. not much to say honestly. theres a toggle in settings to turn that on and off.
I added some more pages to the onboarding, since that’s the only way I can show users how the app works cos it ngl is kinda obscure. i also added a report feedback or bug button, which needs some ui adjustments bruh
I made some final refinements to make sure account management on macOS works, so that my users can actually use the app, and then some other UI refinements, mainly for settings. there are a bunch of weird things i am yet to fix, but im really tired and just want to get this app out, so ill fix them later.
After releasing v2 testflight, my friends pointed out a very large amounts of bugs in the app 😭 so I am now just trying to fix everything they pointed out. I’m pretty sure the server doesn’t have any issues, so at least that’s good. First bug is this bottom bar looks horrendous, This was fine for me cos I set my dynamic text size to small 😭
I got carried away, since right now I am just going through and fixing the feedback my beta users gave me, starting with these: improving the onboarding flow to decrease the amount of pages, and condense some other pages, since testers said there were too many. Upgrade the server so that it only allows iOS to make changes to anything, since watchos and ipados and macos can only view, not edit. i added some tests, using codex, on the server. I’m getting tired of manually debugging every single problem I find by hand, I just make tests and its a much easier way of guaranteeing your server works perfectly. the client app is going to be much harder to add tests to, though. and more other random stuff I found and UI fixes etc. The screenshots are some broken UI stuff I found, I can’t really show you server bugs other than these error alerts. Going good so far though, can’t wait to release this as a v3!
I have also decided to remove Apple wallet integration, it just kinda got too messy. so im now going to revert (yes, revert 😭) back to an iMessage extension that lets you share timetables with a link. it fixes some annoying things that wallet integration has, like syncing etc. I can even allow custom link urls for a shared timetable!
I needed a new design system for my app, currently it was just a font and thats about it. Below are some experimental app icons I’ve been tweaking in sigma, they are made out of “paper” and represent a new theme I could use, which is literal paper as the design language. I think it could merge with Liquid Glass really nicely if done properly. Otherwise, other improvements: New App Intents for Apple Intelligence Allow users to set a custom share link URL, for example timetable.adonis.pt/sharedtimetable/adon’s_timetable More server tests + server improvements due to finding bugs in tests
More experiments, cos the previous multicolour outline was kinda ugly, now i’m thinking of adding the fake handwriting instead, it might look nice
I think it’s looking preetty good so far
I think they are coming along really nicely!!!! The watchOS version has bigger title text and less handwriting rows cos its a smaller display size, i really like this 😃 the refraction effects 👌
Many many iterations later… I’m leaning towards that paper one, it looks really tasteful i think. im not sure what to put on the paper though
So many variants! and idk which one is best
I think I’ve locked in to this one. Now I need to figure out what to actually put on the papar, im thinking it has to be a kind of simplifed version of the existing main UI of my app. something kinda like a calendar schedule
I think I’m getting there
I think this is pretty much it.
Plus a version for debug builds, I think they came out really nice!!
Fixed some server bugs, a user reported getting “forbidden” status messages, turns out I forgot to migrate the database 😐 And other UI refinements: Tab bar uses monospace font version and build in settings feedback sheet
Updated splash screen Notificaitons now have threads (each school day is a thread) macos window size animation fixed (the macos window resizes depending on the current state of the app, like currently selected tab etc. fixed some bugs in live activities and server authentication
As you saw before the onboarding UI was a bit broken, so I went through and fixed it up and also trimmed down how many pgaes it has. Those bottom buttons aren’t concentric for some reason, even though I am using the built-in toolbar API, so I can’t fix it. Oh well. And it’s done to 8 pages, from 13. I still have som non-UI bugs to fix.
😍
I had a bug where the device could receive 2 notifications and live activities for each device, so I had to remake the APNs (apple push notification service) token management. I also added a highlight around the current day, with the setting to disable it. i thought a stroke was better than a fill because its less overwhelming and doesn’t break the ui style.
I did a bunch of things: current day highlight in ios improve the notification early sending, to allow users to send notifications at multiple offsets remake the ui for share timetable sheet also the ui for the link customisation, tinted mint for whatever reason sharing links is now a URL, which prompts you to open the app but uses decently ugly html, ill fix later. New icon for apple watch that is optimised for the smaller display size (just made the components bigger and removed some duplicate elements added some mroe developer items at the bottom, doesnt serve much purpose just looks cool lol i removed the status badges that show success, cos i thought they would annoy the user with too many success alerts, and success when you are toggling settings doesnt really need alerts, so yeah. i also hit a bug where notifications would send twice, i had to improve the apns token system to not duplicate tokens for a device. on startup the app shows “restoring account…” every time, so i had to cache the profile data to make it stay signed in until explicitly signed out. its kinda hard to see in the screenshot but there is progressivew blur at the bottom and top, looks nice
I made some UI rehauls again lol Current day receives theis blur effect which kinda looks like real light bouncing inside a box under the current day The accent colour of the app is now brown, as I am trying to make the app feel more like paper, which will become more obvious as i later add paper elements and views inside the app. My last update released a new account backend, which meant some users were not able to log in, so i decided to nuke the database and reset everything 💀 but anyway it worked and i upgraded the server to be better at handling this The sheet to add a shared timetable is improved, with blur effects and stuff, and that tiemtable preview has gotten much better it was pretty bad before ngl
So I made a few more adjustments like removing the APNs registration page from onboarding to make onboarding even more seamless Not important though. I discovered a really annoying problem: When I try to add iPad support, build fails because its trying to embed the watch app which obviously doesnt work on ipad. and xcode isnt letting me fix that. 😐
I found an xcode bug, something to do with compilation errors for incorrect architecture, i dont get it but i gave apple feedback.
I improved the UI for this view, to better show classroom and teacher labels. I also renamed “Authored” to “Created”, apparently its better copy, according to my friend. The settings got cleaned up a bit, and importing from calendar again needs confirmation
This is currently the message extension ui. kinda ugly. that needs fixing I also updated the created timetables detail view, and (ignore the screenshot) removes the save button cos no one is going to remember to press save when they change details, so this should save some frustration.
I’m adding countdowns everywhere, even when school is out, so that you can count the hours until your next period
Message extension got improved, it now checks if you have enabled sharing before allowing you to even sahre it, and tells
I have expanded the home tab!! Theres three tabs at the top, today, week, and upcoming. week is what it already was upcoming shows term dates, no school days, school events, and also the users own personal events they make. the today view is a bit ugly but its sort of there! there also an admin page now, so that i dont have to hardcode term dates etc, i can just send them as api requests (for admin accounts only lol)
As usual, I did a very assorted bunch of things: new admin tab so that i can change stuff without having to go onto my mac and hardcode stuff today view looks like paper - reminscient of the app icon! new about view the popover for subject details is smaller, removing bloat and a bunch of server improvements due to all of my users finding bugs and stuff!
Theres now brown and white paper combined. its an interesting ui concept, makes no sense in real life, but i think it looks nonetheless! it definitely creates an app theme, regardless of if this theme looks good or not…
I made some UX adjsutments in the settings app, added some images, reordered haptics, etc the planner sub-tab has been rehauled, and shows items chronologically instead of in sections, which i thought was more intuitive. it still needs much more thought though, im not sure how to space them out since some gaps are months long.
Me and my friend did a bit of brainstorming, to get ideas on how to improve the app UI, UX and future features. cos we are planning a future release hopefully. so we gained a good idea of consolidating friends into a more clear friends tab, combingin the currently spread-around-everywhere friends stuff.
so me and my friend did some more brainstorming focussing on the new friends tab, and how friend accounts work, and profiles and pfps etc. we also aggregated a list of bugs and UI glitches in the app that still need fixing. the current first version is (moderately) broken 😭
i added a section in teh administration to be able to turn off the server for everyone except for me, so that i can maintain the server and test it. and also a section to manage other admins.
I made this widget, which is kinda like a summary widget for the user. it requires this large widget size to fit everything, and its goign to be more dynamic than the other widget which always show the same layout. i haven’t thought exactly how i’m going to do it though, below is a rough first version.
I’ve been busy remaking the profile editor, its coming together really nicely. that profile picture at the top is designed so that lets the other components take up their space, and then the pfp takes up the rest of the space. this allows the same view to not scroll while working on different phones and text sizes etc. and the background is animated!!!
The bottom colour grid is concentric to the device!!! although making the white outlines also behave nicely is proving really really hard, as you can see below
you can add special badges to people now, for like early birds or something idk. the profile picutre bakground has been upgraded a bit, but im going to have to fork the repo and adjust it myself, its currently not looking like a gradient but a single noisy colour, im gonna fix that.
Given the theme of this app, paper, widgets now get paper too! settings for profiles has been updated too you can now select black → white in the colour selector. friend detail view still kinda looks a bit empty and bland, im not quite sure how to make it feel alive
So the header in settings now reflects with your pfp colours for the profile editor, i made it now scrolling so that you could fit in all of the various options, like animation speed and noise and stuff. when you click on a class in today view, it shows some more details about the class like teacher and location. friends view also looks a bit nicer, both the list view and the detail view.
friends detail view shows a bit more content, and is redesigned for more paper you can reorder the badges around now for priority when they show in their overlay event tags editor looks a bit nicer plus, users can edit their year group after signing in.
some people were saying that it was really annoying that you could drag anywhere in a sheet to dismiss the sheet, you would be halfway through something and then you have to restart. so i went through all the sheets in the app and checked if they needed to remove this swiping. luckily it only needed one modifier per sheet. also, more tester feedback was that i shouldnt have sections for tags, so yeah i did that. also, now that there is a concept known as friends, instead of just shared timetables, i removed the option to allow people to have their timetables searched publicly. i havent figured out what i want for specific created timetables, i might lwk have to just remove that also users now have to fill in what year group they are when onboarding. for tags.
i just read an article that said @Environment(\.dismiss) is bad for performance dismiss() is a very simple and fast way to make a sheet or other modal view dismiss , but because its so simple and dynamic, that introduces lots of bugs apparently. so I had to go through all the sheets and this time replace dismiss() with better state management. i hope ill notice the performance improvements!
before and after some small ui improvements!!
I checked the localisation and it went down to 25%, so I went and pushed that back up to 100%. and the friend detail view has been improved a bit more
So so far up to now, I have completely neglected everything other than iPhone. i needed this so that i could focus on making iphone as seamless and intuitive and possible, and to push features faster. so now i have to go and basically remove all of the non-iPhone code and replace it with iphone code, and then try to make that work multiplatform. so i decided iphone is going to remain as a tabview, for now at least, but ipados, macos, and big iphones can use a navigation split view, shown below. so a sidebar and main view and an inspector on the right sometimes.
first version of timetable for macos 😭 its really ugly and lwk broken. so im gonna spend the next few hours fixing this incredibly “interesting” UI.
working with macOS is infuriating me, so i decided im going to make the macos app actually be mac catalyst, so its technically just running an ipad app. which makes sense. still needs alot more work, this refactor is proving very very annoying
its getting there! mac catalyst is definitely better than trying to make native macOS work. swiftui isnt really making it any better, its really really restrictive in terms of how i can structure my app. like for example that right column, has so many glitches that i cant really find solutions to because the bugs aren’t in my code, its infuriating.
Still just refactoring and remaking the app. i decided to remove OS 26 compatibility, because there is just too many APIs and stuff the images below are some stuff I’ve been refining: dragging friends around sideays iphone support (same thing as macOS + iPadOS) but I’ve decided now to not work on macOS (which is just iPadOS) and ipad until i perfect iphone and watch. should be fun!
I finished the refactoring for now, to make the app multi platform. So then i did some more brainstorming and I have consolidated what is the next few features I need to do tips, to tell the user about features the app has they sound easy but each tip needs rules and parameters and all kinds of obscure annoying things, so its going to be harder than it looks my first tip shown below An indicator next to each friend about their status, which is going to take the user’s location, taken in the background, to tell if they are on campus or off campus So from this you can tell when a user arrives at school or if they are sick iOS provides a function that will call my app, from the background, every time the user crosses a specific map polygon (The school). so i dont even need to do any map processing, my app just gets called every time the device goes in or out of school! plus i can add cool related features like the user’s average arrival time to school, which will be pretty cool!
Few things! Adminsitration gets new items for reported users and freinds-since requests sections in adminstration statistics for number of users, etc you can now see your status and other people’s status, like on or off campus new page that asks for location access ofc (ill move it into the onboarding later improved the add a friend sheet admins get emails for reported users, etc
user account data now has highlighted rows for faster navigation user reports look much better, as well as friends-since requests reporting or sending feedback sends notifications instead of emails, now
lots of little things instead of one big feature: i used to send emails, and i reached limits on the email provider so i had to move to only sending notifications, like device notifications. i still need an alternative, im looking through options now there used to be different settings view between iPhone and iPad, so i consolidated them into one view.you can now see your friend’s status as on or off campus. this uses location to check when you reach school or leave. this also allows some cool statistics like average school arrival time!there is better moderation, it shows in the admins view and lets the admin block or do nothing about the account. it will be expanded later to have more features and actions and stuff you can request to change your friends-since tag, also approved by admin.i deleted all (most) references to #if os(macOS) , since there is no more macOS build, its just iPad running on mac. small ui improvements: added search to some more administration views tapping an existing photo pro allows crop the tabview gets tab transitions, like the ones iOS 26 had (that ios27 removed 😡)year-level tags are separated from other tags expanded statistics!added archived events - events in the past - plus an option to automatically delete old events added a button to reset tips, since the app is getting more and more complicated the onboarding is less condensed, when that permission is first needed, its permission sheet request shows.more stuff gets cached in Defaults, making it more offline-safe.and some toolbar and blur and navigation title stuff.
some ui improvements (that weird box in the account view is Metal debug overlay, not my app)
Grade tracker!!! I know this is a very cliche topic but I had to implement this because it integrates so seamlessly with the app for example, it already knows your subjects (duh) and when you input the date of your assessment, it also knows which period of the day that is, because it knows your subjects! (duh) I also added ATAR, sthe user can set goals and stuff for what they want to achieve.
I decided to remove created timetables. they just don’t work anymore with the Friends concept, which makes it really annoying to adjacently share other timetables alongside having friends. its a shame, i wish it could have worked, maybe ill add it again later. oh well. im still just combing through the app and fixing all the little things i see: grade tracker gets a next item in the top for the top 4 subjects, which is important for atar. improved the friend detail view a bit better, because the old one had not enough information and was displaying badly.added more statistics to administration view cos its fun lol the tag selector view was improved, looks nicer and is a tiny bit more legible nowi changed the grade tracker weighting from semester to year. apparently thats the norm more friend detail view improvements
improving the friend detail view the padding is so much nicer, and the detail view also shows more info and in a better way the week subtab shows a similar timetable to the user’s own, and shows more info. and some more statistics lol
You can now change the font! this took more work than you would expect, because i did a find on the project and saw there were like 60 references to .monospaced, and each one had to be manually upgraded to dynamically apply font. i also tried to make the rounded font expanded, but after some inspection i found it doesnt even have a .expanded variant 😐 so the options i ended up with were monospaced, rounded, and expanded. no normal font. it just looks boring at this point. below is the same screen with each option! widgets also get the fonts, and they look actually insane ngl
I started work on rehauling the watchOS app And I really like how it’s coming out The watch is supposed to distill down the information the user needs, so i picked the current and next period, time, and their location. all these elements are glassy and stuff, so they are clickable, and its in a tabview that scrolls between each card. The first tab is the week view for the user. so I spent a good 2 hours trying to make a ScrollView work, but it didnt. sometimes the views teleported, some lagged, some glitched, and it was overall insanely annoying. so I moved to a tabview, which was considerably more stable, but removed the animations I wanted. it had its own animations which were fine, but yeah. Also, fonts also reflect on the watch! the one in the screenshots below is the expanded style, which to be honest isnt that good on watch since the watch is constrained as is, but yeah. The glass timetable actually looks insane I am still thinking of how to include other content, like grades maybe, and other things, but i dont want to make it too dense and slow
there is a new progress background: its not a background! inspired by the app icon / ios app, the progress view is now this marker thingy which fits into the app’s theme much nicer I’ve also been tweaking the font sizing, image sizing, padding, and gaps between the items here to make sure they look good at all possible subejct names etc. i also had to fight a bit with the safe area of the view, you can see in the image below the name “bob” ends slightly above the text, took me a lot longer than expected to fix that
I also made some improvements to the card height for the user’s own item. before, it was just the full width. Halfway while I was working on that, my TabView suddenly froze for a straight 20 seconds every time i changed the tab. this was very weird, and the CPU shows 0% usage, so I was quite surprised. After a large round of commenting things out and seeing what broke, I found it was a single .glassEffect() that I was using for the progress marker. I have no idea how a glass effect can make an entire tabview freeze, but fine. i replaced it with a simple red colour, as shown below, with a stroke and shadow, and i think it looks fine now.
I added a new devices statistics view. or more accurately, i expanded it. before, it just shows device platforms. now, it shows the os version, minor os version, and if it is a beta or not. i also added support for iOS 26 (previous builds only supported OS27 or later). this involved me just making some features not work on os26 😐 and supporting anything before OS26 would probably be legitimately impossible, so yeah not that.
Big update! Light mode! The app used to be dark mode only, it let me make it look much more pixel-perfect and refine colours and stuff, but its kinda obvious you cant keep the app dark mode only, its just not good. so i went through everything, adding light mode versions of paper, text, glass, etc. took me quite a bit of time because i was trying to maintain consistency while doing it, which included alot of redoing things and creating view modifiers and manually applying each one, etc i also added weatherkit, its just a single line in the today tab, but its nice. while adding light mode support, i found a really nice blur view i could add to lists, so now each lists’s background is nothing other than a blur! i also decided to make all backgrounds made out of paper, and i think it looks nice? theres also now a statistics page for deices and os versions and builds and stuff, itll be more useful later. as well as knowing when your friends arrive to school, i added the ability to know when they are within 5 or 10 mins, and to send notifications for that. average arrival also is split by day now, because people arrive to school at different times per day theres a new tab picker, which you can see int eh controls, its much more glassy than the last one, which is really really playful and stuff! i still have more work to do in terms of ui work, excluding light mode refinements, like notifications and widgets, but yeah.
I added accessibility improvements, mainly like labels and tags and stuff, for use with voice over etc. this was triggered by me installing a developer process into my app which allowed me to iterate on design faster, and it depended on accessibility elements to discover each element. (the purple thing lets you tap elements and comment on them) i also tried a new background for the cards, as you can see below, its just glass and i think it looks pretty nice
You can now edit the foreground colours for your profile picture monogram i also completed light mode support for widgets
I added custom backgrounds! Theres the paper backgrounds i added recently, and then the solid colours, and then also some of the really nice apple ones idk what they are called (i hope apple doesnt copyright me 😭) so yeah it applies to all backgrounds in the app i think it merges really nice with the liquid glass and blur backgrounds different views have it also shows on watch i also added an option to choose how far forward you see events. theres also even more statistics for what app version people are using!
So supporting light mode calls for an icon redesign, at least just for light mode, and here they are! Though to be honest, the entire app is gonna need a redesign, because I need to rename it from Timetable, because it has expanded into doing so much more, and timetable is a bit of a boring name. finding names is so insanely annoying though, but oh well.
I spent some time to work on this search button and its animation. idk if the video plays, but it uses apples glass effect transitions! I also made the confirmation dialogs for removing and reporting a friend better, before they just popped up in the middle of the screen, now it comes out of the menu (also found another ios27 beta bug 😐)
A somewhat interesting devlog this time. I spend a good 2 hours just trying to make live activities work. the miserable part is that they were already working before 😭 I dont even know what I did but it broke. And while i was trying to make a debug button to start a live activity, yeah it just wasn’t working. all kinds of problems with not submitting a good APNs token. and i had to like stop activities before starting new ones and stuff it was just in general really annoying. there was even more problems but its too much to say here 😔 anyway, i have started cleaning up the app. no more big features, to be honest, until i add a website for this thing!! should be really easy since the backend is clearly all done lol events can show weather for them, such as the athletics carnival i removed the ridiculous backgrounds i allowed users to choose, theres no only solid black/white and paper. more reasonable, i think. as part of my optimisation, i removed settings i found useless. haptics are now always on, and highlighting the current day is always on. profile pictures can now have their foreground colour set, like the Monogram can have its colour optimised.you can see the average for when your friends arrive to school per day, instead of in total. developer settings also got reorganised, more settings only show to developers. yet again cleaning up the app experience. the location status was a bit unreliable, if users were offline, etc, so i added multiple ways the app pushes updates to the server, and queued statuses when the device was offline. i also refined the actual radius for what counts as within 5 / 10 minutes, should be a bit better. i havent thought about people who live within 10 minutes, thats an interesting case the subject editors grid also looks nicer (still needs more improvement though the tabview now hides while scrolling, like it collapses into the corner, like apple apps! you can manually turn off sharing your status, for privacy reasons. and some more things i forgot 🥹 im so excited for this thing to actually launch!!!!!
new icons. the old one that now supports light mode was kinda ugly.
Ok so after a bunch of wrestling with nginx and bun and next.js, i have added the website! its at https://timetable.adonis.pt/ and the current api has been moved to https://timetable.adonis.pt/api Its the usual next.js thing. and it uses bun. my design idea for this is to look like its an ipad app, essentially, and im going to see exactly how far i can take the mimicking, maybe i can even add liquid glass to the web 💀 So yeah no more app building, now its website! It’s gonna be so much easier as well because I aleady have the backend done and tested, so this should be all design which will be really fun.
The website is alive! I got a screenshot of an iOS26 sidebar, and i am copying it, as you can see. looks nice i think
Hehehehe I’ve got a working version of liquid glass It uses gsap, which is nice the second image is an earlier version 😭
Its nice and squishy now! It uses gsap for this as well gsap is a great framework ngl
And now it scales up and down and stuff!!! I still can’t believe this is just html and css and js 😭 Theres so many parameters to tweak to make it feel right, its so finicky And depending on the size of the glass, you have to change the numbers, its kinda confusing honestly
So I’ve made the first version of the website, it’s really insanely buggy and broken, but the ui is there. so have the html good but no i need to really tweak the css to make it look nice, apple-style. i also need to figure out how to make loading states look nice, since unlike the the swiftui app, i can’t cache anything to not show loading state. in the plus side i dont have to deal with offline state, though. the sidebar and the toolbar are finished, and look really nice. the sidebar has an effect (from ipados) that basically reflects the content in a subtle blurred way, to make it feel like glass while not actually rendering anything expensive. The toolbar is just glass buttons + a black fade effect + progressives blur, also tuned to look like ipados. the icon in the sidebar is pretty ugly honestly so i need to replace that with the non-bordered icon. The other problem i am dealing with is that we are planning a complete redesign of the entire swiftui app, and obviously that has to propagate to the website, so any work i do now is kinda gonna be half wasted, depending on what the redesign actually looks like.
I’m still working on making the UI look much better, and I’m still figuring out some website stuff like how i should wire up the sidebar tabs as well as having like a nice homepage to advertise everything the app does, which will be a really fun sub-project. Turns out making nice looking lists in react is much harder than it looks, as shown below 😭 one problem is that each symbol has a different aspect ratio so i dont even know how to fit them nicely And unlike swiftui, its raelly raelly hard to stay consistent in your css and to keep using the ui tokens instead of making custom css everywhere. it looks like the website is gonna be harder than the app to make after all 😔 this classes card though, for example, i think its pretty much almost done. i might need a few more borders to make it look glassy and stuff but it looks exactly like the ios version, which is the end goal! And I added the animations to the classes card, again exactly like the iphone app. i also got a vscode extension that shows you all of your unused css classes, i highly recommend getting one and purging your codebase!
So the previous UI was really ugly, to be honest, so i decided I am oing to scrap half of the design and completely unstyle the entire app while making everything as standardised as possible, by trying to only use reused components as much as possible. So I spent all today stripping out components I didn’t need, then take the surviving components and adjusting them to my use case and making then look as nice as I can. alert dialogs drawers buttons lists section cards switches I have also decided to stop using tailwind because its quite simply messy and much more confusing than just moduled css, so ye
I have pretty much finished the components, I’m going to now go and add the other shared components and improve them too. then im gonna go through the css files and clear anything that is unused or overcomplicated, and then i can start remaking the website!
I think I have finished making all of the shared components I put everything inside accordions to organise the test components Overlays get the same translucency and outline every other component gets I think im happy with how the lists look, finally the option selectors are really really hot!!! The first page I have remade is the About view, which shows this badge if you are on localhost lol i also had to move the contributors up to the server instead of hardcoding them so that both website and app can see it And a really nice little animated gradient thingy for the about view!!
I have started using the shared components around the website, and its actually looking pretty nice! most importantly, these components can be changed once and work everywhere and i removed the drawers i was using everywhere, and i also made said drawers wider while i was rehauling the drawers i also kinda broke their animations and i don’t know how to fix it 😭 the whole website looks really basic now, since its obviously using now the shard unstyled components, and i was thinking about the theme and decided maybe it should be unstyled, and only the user’s own events and content etc can have colours.
I started to make the landing page, and i decided, after very much research from other landing sites I’ve seen, that the main item should be an interactive timetable, a version of the app icon. but interactive and glassy. im trying to recreate everything in css but its not looking as smooth and polished as real liquid glass does so ye. im kinda getting close though! I also added a navbar item that just is the link to actually open timetable, and when you hover it shows options to either open the app in testflight or open the web version which just redirects to /login. and its background switches to black when you start scrolling, which will make more sense later. i haven’t really planned the rest of the landing page, and i might remove this entire component if i find a good liquid glass implementation i can use, especially with bouncy animations etc. but yeah. (worst part is i might even just go change the entire app icon in a week so that kinda wastes all this time 😭😭😭)
After much trying to make glass, yet again, i failed. So now im just using blur and these edge effects, and i think it looks nice! theres even a hover eect, as shown in the second screenshot (class details show and the rectangle rotates a bit randomly)
I added a title to the lading site, but as you can see its not just any title. it uses this package called fitty to make the text size up to the full width of the page, and it does indeed look massive. and it also goes under the rectangles of the logo, so its like an apple depth effect you get on iphone lockscreens i found the website really laggy while scrolling somewhere while finishing of the main interactive icon, and i couldnt figure out why after removing everything that could have been gpu intensive (my gpu was spiking to 80% while just scrolling) so after all that my most likely theory is that the lag is just my computer and not the website (or both 😭😭) also when i made that main art, i made the border radii use px units, which made it look quite deformed on smaller screens, since the rectangle’s size is relative to screen width, whereas border radius is constant… so i went and fixed that too
I really wanted the first screen for timetable to look really really interesting and unique and instantly recognisable as Timetable, so i made the text instead of a boring white, it now has 3 really nice effects applied: A grain overlay, or noise, which in this case doesn’t make it look paper but looks nice nonetheless Its not flat white, its white at the top and goes to brown at the bottom, more noticeable when you close up. subtle but also nice The “white” isn’t even white. Its a particular white image i had a lot of difficulty in obtaining. it is the third screenshot, the “white” png. Its an .avif , and it uses some HDR-capable color space format something, which on compatible browsers make the timetable text show considerably brighter than everywhere else on your screen, which makes it really pop! i plan on using this effect in other places as well across the landing page to make it just pop a bit more. (the 4th image shows the white pixel showing as 1.25. anything above 1 is hdr.)
I did a few things in this devlog, got quite carried away frankly. So I migrated the codebase from Next.js to Tanstack. The reason was that i was seeing a lot of speed concerns, especially on the landing page. it was just lagging so much. i tried it on all my devices on all the browsers and it was there half the time. after a lot of commenting things out i just couldnt find a bug, so now i moved to tanstack. hopefully taht will remove at least some problems. in any case, i got bored of next.js and tanstack is a different framework to play with and make use of!! also, i continued the landing page by adding cards for each item. i don’t really like it right now, but i have established that i need to add these cards, if not in a different UI. The titles of each card are just image-masks, of Apple wallpapers! i went through some archive and picked out the ones i like, and applied a brightness 200% filter, and they look really nice now. after i finish the landing page im gonna work on rehauling the rest of the ui to be more intuitive and actually usable
ok so i think i have optimised it as much as i can lol tanstack clearly was a good idea, it just needed some optimisations!
Im making a 3d model of the school. this is so that i can show a whole literal map of the campus in the app, and then you can see where each user is, in 3d! i could even reexport it for the website, potentially its going to be interactive and everything
As well as migrating to Tanstack, I wanted even more speed, just for fun at this point honestly, so I decided to move to SolidJS from React. Its decently faster while looking similar to react, and it has some syntax stuff that i much prefer over react. this is basically just adding some margin for me to make bad code The end product looks identical so theres not much to show.. apart from the migration, I’ve also been designing the new landing page, which will also use the 3d model thing. the big question is figuring out how to make the 3d markers for each classroom register correctly, because i need to show a pin for each user at the right place, from swiftui, and somehow embed it into a realitykit 3d model. but im sure this use case has been done many times before so i can find something online!
Continuing the assorted improvements to the app: Fixed stacked drawers so nested drawer state updates reactively. Reworked the Friends page into shared List, ListSection, ListRow, and Card components. Preserved friend drag-and-drop ordering within the new layout. Improved timetable UX: i fixed the lesson selection in week view correctly aligned the “now” indicator in today view restricted timetable mode navigation to mobile through CSS, cos desktop already has the sidebar improved planner event styling. made the drawer compenent animate in and out, something i lost from the react -> solid migration I also added a reusable event-tag selection row with symbols and selected-state feedback.
Ships:
So I made a timetable app for my school, super-specialised and for ios, watchos, and macos. its got live activities and notifications to show you current and next subjects throughout the school day, widgets for your weekly schedule, ability to see your friends’ timetables, and server sync. and apple intelligence support!
This ship, I completely remade the app to work around accounts, and all the features that come with that I added a server, because it used to just store your timetable in your local storage and that was quite boring honestly creating a server for this has allowed me to add accounts, notifications, live activities, friends, shared events, multiple devices in the same account, and has made the website much easier to make (still in development, thats why the top devlogs are talking about the website not the app) The app now has all of this: Grades, track the score of all of your subjects notifications for each subject you have and your events etc live activity throughout each school day telling you your subjects etc sharing your location, subjects, and more with friends widgets that show your your subjects, upcoming events, and your friends’ schedules lots of administration options to manage pretty much everything, including who else is admin lol full support for siri, shortcuts, spotlight, and apple intelligence a full apple watch app btw i know 350 hours on a timetable app sounds insane (😭) but its because this project has 4 different aspects: swiftui client for iPhone, iPad, and mac swiftui client for apple watch a website client (still in development) the server that handles everything, and the database i promise it does more than just tell you your subjects 🙏...
|
1792878455.271768
|
1793742455.271768
|
|
50821
|
Emberfall by @janswca | Stardance
|
janswca
|
1
|
349.88
|
959
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-25T02:43:25Z", "hours": 101.0, "multiplier": 11.57, "payout": 959, "blessing": "neutral", "text": "emberfall is a game in a cave like dungeon where you have to find your way out and fight many enimies on the way", "repo": "https://github.com/janirusepa-design/emberfall", "demo": "https://janirusepa-design.github.io/emberfall/"}]...
|
[{"post_id": 65378, "ts": "202 [{"post_id": 65378, "ts": "2026-09-10T14:11:52Z", "hours": 12.3067, "text": "last playtests before shipping it soon, found some more inconsistencies and patched them, and the game is now mostly looking how i want it"}, {"post_id": 64792, "ts": "2026-09-09T13:35:57Z", "hours": 11.1, "text": "Noticed the sides of the screen were just permanently black, which is because the screen is twice as wide as it is tall, and the torch was a circle. Made the light an ellipse so it matches the screen shape. You now see about 14 tiles on either side of you instead of 7, and the top and bottom stay dark. Flaring fills the screen almost exactly, with the corners still falling off. Also made the torch something you can build up. There are four different upgrades now that extend it, so if you keep picking them, you finish the run seeing way more than you started with."}, {"post_id": 64516, "ts": "2026-09-08T23:48:34Z", "hours": 10.7667, "text": "worken on some new ablities and more, comming soon"}, {"post_id": 64182, "ts": "2026-09-08T12:28:17Z", "hours": 11.6667, "text": "Added elites enemy types this time, roughly one a room, with a ring around them so you can spot one coming and a guaranteed drop when it goes down."}, {"post_id": 63936, "ts": "2026-09-08T00:39:33Z", "hours": 10.3667, "text": "Most of the loot is still just numbers going up. 25 of the 29 affixes are a flat percentage, and only four of them do anything, so I want to turn a chunk of those into things with a verb in them, like your torch flaring on a kill or the first hit in a room always critting.After that, giving you a choice of two doors on the boss floors instead of the same 1 to 11 every single run."}, {"post_id": 63568, "ts": "2026-09-07T14:15:41Z", "hours": 8.5514, "text": "worked on some more minor improments so i can really get the best build out for the next ship"}, {"post_id": 63385, "ts": "2026-09-07T05:42:13Z", "hours": 10.4333, "text": "fixed the screen randomly going flat and bright, with no characters on it. Ashglass pickups were being made with a colour that doesn’t exist, which crashed the renderer mid-frame and killed all the lighting, and it looked random because ashglass only drops about one kill in twenty. Also, every floor generates differently instead of ten copies of the same dungeon in different colours, so the Cistern is flooded channels now and the Vault is six huge rooms. You can finally use abilities while flaring, since Shift turns the number row into a 1 to 5, which did nothing the whole time your torch was up. Toned the flare down; it used to light more than the whole screen. Plus the usual: stopped the hitching when you walk into new rooms, chest loot labels stack instead of piling on one spot, the Pyre was secretly two different affixes with the same name, and the help screen no longer lies about how many abilities you get."}, {"post_id": 62958, "ts": "2026-09-06T14:54:55Z", "hours": 13.2667, "text": "Still working right now, come back next devlog, havent finishet yet"}, {"post_id": 62555, "ts": "2026-09-06T00:25:54Z", "hours": 10.1333, "text": "It’s back. After the last batch of improvements, I played through again this morning, and the same glitch that happened a couple of days ago is back. Now, whenever I use my special abilities, the game goes grey, I can’t see my character or any enemies, and even though my attachments register, I can’t really play the game. But nevertheless i have fixed it again. Hopefully this time it stays fixed"}, {"post_id": 62226, "ts": "2026-09-05T14:16:47Z", "hours": 12.9, "text": "Did though playtests of the game and marked down some existing issues, and looked at ways to improve, optimised the code, and started ideating what new mechanics and features to add before shipping it again. In terms of shipping, I’ll probably end up shipping by the end of this week."}, {"post_id": 61849, "ts": "2026-09-04T23:42:12Z", "hours": 13.0667, "text": "worked on more minor things, especially the colours, they all look pretty much the same but I decided to make them more varied as you go throughout your run"}, {"post_id": 61412, "ts": "2026-09-04T09:52:39Z", "hours": 10.9333, "text": "Worked on improving the enemy encounter system. I found lots of glitches in it after making it for the first time. Sometimes, when you fough an enemny it woundnt update here and just many other problems but ive worked a lot the past 2 days working on fixing it and i think now it works, in my playtest, i havent found any more issues wth it. they update onto the list, maye in the future i could work on makeing this layout better i do think it it kind of lacking right now"}, {"post_id": 61160, "ts": "2026-09-03T22:56:03Z", "hours": 18.1333, "text": "worked on more minor things on the game"}, {"post_id": 60574, "ts": "2026-09-03T00:38:25Z", "hours": 10.3333, "text": "Just fixed a major glitch that caused this in the game, where you were stuck in this place and you just coudnt get out of it unless you resrated the game. likely due to the plethora of code changes I made. But this was"}, {"post_id": 60241, "ts": "2026-09-02T14:17:50Z", "hours": 5.1, "text": "Did it finally? Now the game saves to your browser cache. Now, as long as you keep playing in the same browser, you will not lose your progress, supposed to work though github as well but i havent tested that yet"}, {"post_id": 59980, "ts": "2026-09-02T02:04:30Z", "hours": 8.6333, "text": "SPOILERS ABOUT THE END OF THE GAME But i started thinking about what happens after you finsished all 11 floors and then i decided that you would be somone who got stranded on a lsland and fell into a cave and at the end you get the whole backstrory on what happend before the caves basicly you would go to a beacon that you set up and call for help, in not sure about the details just coded and make the draft of the story"}, {"post_id": 59448, "ts": "2026-09-01T09:37:30Z", "hours": 10.4333, "text": "Final floor looks like a whole ritual"}, {"post_id": 59264, "ts": "2026-08-31T23:11:16Z", "hours": 13.1333, "text": "Just finished the new upgrade system"}, {"post_id": 58755, "ts": "2026-08-31T10:00:51Z", "hours": 10.1, "text": "Worked on a list of enemies that you encounter, and as you progress, you will discover more and more. Also, worked on, and revamped the final floor to feel like a complete boss battle, which is more expansive and, for the first time, not as cramped have space to move around. Still to come a new and imporved upgrade system a first draft you can see in the ss here where you can stack up to 5 special abilities which you wil gain by section as you progress"}, {"post_id": 58503, "ts": "2026-08-30T22:45:09Z", "hours": 11.2667, "text": "Ok, the first batch of finished improvements is taking slightly longer than expected. I ran into quite a few issues while coding them, still troubleshooting"}, {"post_id": 58025, "ts": "2026-08-30T11:28:29Z", "hours": 4.4, "text": "Ok, im bout to begin incorporating the first batch of improvements, starting with the chaning the story"}, {"post_id": 57856, "ts": "2026-08-30T05:28:01Z", "hours": 12.5333, "text": "Fixed a bunch of stuff from the feedback, first make the tutorial larger and easier to read and understand, fixed sloppy and laggy mouse movement, increased the scaling, fixed the joystick and also reducsed screenshake when low on embers and getting damgaed added esc menu and a repo licenece also from your feedback im going to try being more detailed with my devlogs when i can. ill be ready to ship again soon, i going to try to find more way to imporve on top of this"}, {"post_id": 57381, "ts": "2026-08-29T14:47:16Z", "hours": 2.4256, "text": "Thanks for all the feedback im still working on incorporating all those changes and more in my game starting with a new and imporved better tutorial so o new players can understand all the controls of the game, how and when to use them"}, {"post_id": 57135, "ts": "2026-08-29T07:33:01Z", "hours": 6.9, "text": "Wored on some minor Improvents to the game"}, {"post_id": 53781, "ts": "2026-08-24T14:04:38Z", "hours": 7.6667, "text": "worked on some cool ememy designs"}, {"post_id": 53418, "ts": "2026-08-23T23:13:31Z", "hours": 10.2, "text": "Added on the totutorial and worked on imrpoving the game"}, {"post_id": 53038, "ts": "2026-08-23T13:01:04Z", "hours": 7.7281, "text": "Worked on adding a tutorial for new players"}, {"post_id": 52734, "ts": "2026-08-23T01:55:19Z", "hours": 19.2667, "text": "this game is almost finished, worked on a cool start screen"}, {"post_id": 52120, "ts": "2026-08-22T06:33:29Z", "hours": 16.6492, "text": "done a lot for the gameplay and mechanics of the game"}, {"post_id": 51665, "ts": "2026-08-21T13:52:37Z", "hours": 9.7667, "text": "Ok im very close to shipping this project, I’ve perfected the start screen, and now I just need to work on improving the gameplay, and then stabilizing and debugging the code"}, {"post_id": 51398, "ts": "2026-08-21T02:17:28Z", "hours": 9.1833, "text": "Made some good progress so far, but i think the code still needs work, and i keep runnning into errors about the game"}, {"post_id": 50862, "ts": "2026-08-20T09:45:14Z", "hours": 7.8786, "text": "I’ve gone pretty far but I’ve realized instead of making one big file for the game, I should just make a collection of files then an index.html file that runs off those ones, then much easier to run and to code"}, {"post_id": 50686, "ts": "2026-08-20T00:18:32Z", "hours": 12.4239, "text": "Just started working on my project put in about 12 hours at once"}, {"post_id": 50049, "ts": "2026-08-19T02:38:54Z", "hours": 0.6119, "text": "Just started working on a game its about being stuck in a cave and using a torch to find your way out and as you try to leave you have to face eminimies that try to attack you still in ideation"}]...
|
Title: Emberfall by @janswca | Stardance
Devlogs: Title: Emberfall by @janswca | Stardance
Devlogs:
Just started working on a game its about being stuck in a cave and using a torch to find your way out and as you try to leave you have to face eminimies that try to attack you still in ideation
Just started working on my project put in about 12 hours at once
I’ve gone pretty far but I’ve realized instead of making one big file for the game, I should just make a collection of files then an index.html file that runs off those ones, then much easier to run and to code
Made some good progress so far, but i think the code still needs work, and i keep runnning into errors about the game
Ok im very close to shipping this project, I’ve perfected the start screen, and now I just need to work on improving the gameplay, and then stabilizing and debugging the code
done a lot for the gameplay and mechanics of the game
this game is almost finished, worked on a cool start screen
Worked on adding a tutorial for new players
Added on the totutorial and worked on imrpoving the game
worked on some cool ememy designs
Wored on some minor Improvents to the game
Thanks for all the feedback im still working on incorporating all those changes and more in my game starting with a new and imporved better tutorial so o new players can understand all the controls of the game, how and when to use them
Fixed a bunch of stuff from the feedback, first make the tutorial larger and easier to read and understand, fixed sloppy and laggy mouse movement, increased the scaling, fixed the joystick and also reducsed screenshake when low on embers and getting damgaed added esc menu and a repo licenece also from your feedback im going to try being more detailed with my devlogs when i can. ill be ready to ship again soon, i going to try to find more way to imporve on top of this
Ok, im bout to begin incorporating the first batch of improvements, starting with the chaning the story
Ok, the first batch of finished improvements is taking slightly longer than expected. I ran into quite a few issues while coding them, still troubleshooting
Worked on a list of enemies that you encounter, and as you progress, you will discover more and more. Also, worked on, and revamped the final floor to feel like a complete boss battle, which is more expansive and, for the first time, not as cramped have space to move around. Still to come a new and imporved upgrade system a first draft you can see in the ss here where you can stack up to 5 special abilities which you wil gain by section as you progress
Just finished the new upgrade system
Final floor looks like a whole ritual
SPOILERS ABOUT THE END OF THE GAME But i started thinking about what happens after you finsished all 11 floors and then i decided that you would be somone who got stranded on a lsland and fell into a cave and at the end you get the whole backstrory on what happend before the caves basicly you would go to a beacon that you set up and call for help, in not sure about the details just coded and make the draft of the story
Did it finally? Now the game saves to your browser cache. Now, as long as you keep playing in the same browser, you will not lose your progress, supposed to work though github as well but i havent tested that yet
Just fixed a major glitch that caused this in the game, where you were stuck in this place and you just coudnt get out of it unless you resrated the game. likely due to the plethora of code changes I made. But this was
worked on more minor things on the game
Worked on improving the enemy encounter system. I found lots of glitches in it after making it for the first time. Sometimes, when you fough an enemny it woundnt update here and just many other problems but ive worked a lot the past 2 days working on fixing it and i think now it works, in my playtest, i havent found any more issues wth it. they update onto the list, maye in the future i could work on makeing this layout better i do think it it kind of lacking right now
worked on more minor things, especially the colours, they all look pretty much the same but I decided to make them more varied as you go throughout your run
Did though playtests of the game and marked down some existing issues, and looked at ways to improve, optimised the code, and started ideating what new mechanics and features to add before shipping it again. In terms of shipping, I’ll probably end up shipping by the end of this week.
It’s back. After the last batch of improvements, I played through again this morning, and the same glitch that happened a couple of days ago is back. Now, whenever I use my special abilities, the game goes grey, I can’t see my character or any enemies, and even though my attachments register, I can’t really play the game. But nevertheless i have fixed it again. Hopefully this time it stays fixed
Still working right now, come back next devlog, havent finishet yet
fixed the screen randomly going flat and bright, with no characters on it. Ashglass pickups were being made with a colour that doesn’t exist, which crashed the renderer mid-frame and killed all the lighting, and it looked random because ashglass only drops about one kill in twenty. Also, every floor generates differently instead of ten copies of the same dungeon in different colours, so the Cistern is flooded channels now and the Vault is six huge rooms. You can finally use abilities while flaring, since Shift turns the number row into a 1 to 5, which did nothing the whole time your torch was up. Toned the flare down; it used to light more than the whole screen. Plus the usual: stopped the hitching when you walk into new rooms, chest loot labels stack instead of piling on one spot, the Pyre was secretly two different affixes with the same name, and the help screen no longer lies about how many abilities you get.
worked on some more minor improments so i can really get the best build out for the next ship
Most of the loot is still just numbers going up. 25 of the 29 affixes are a flat percentage, and only four of them do anything, so I want to turn a chunk of those into things with a verb in them, like your torch flaring on a kill or the first hit in a room always critting.After that, giving you a choice of two doors on the boss floors instead of the same 1 to 11 every single run.
Added elites enemy types this time, roughly one a room, with a ring around them so you can spot one coming and a guaranteed drop when it goes down.
worken on some new ablities and more, comming soon
Noticed the sides of the screen were just permanently black, which is because the screen is twice as wide as it is tall, and the torch was a circle. Made the light an ellipse so it matches the screen shape. You now see about 14 tiles on either side of you instead of 7, and the top and bottom stay dark. Flaring fills the screen almost exactly, with the corners still falling off. Also made the torch something you can build up. There are four different upgrades now that extend it, so if you keep picking them, you finish the run seeing way more than you started with.
last playtests before shipping it soon, found some more inconsistencies and patched them, and the game is now mostly looking how i want it
Ships:
emberfall is a game in a cave like dungeon where you have to find your way out and fight many enimies on the way...
|
1792875220.036621
|
1793739220.036621
|
|
64308
|
Spiderman Media Pipe Project by @gowripaliwal | St Spiderman Media Pipe Project by @gowripaliwal | Stardance...
|
gowripaliwal
|
0
|
349.79
|
0
|
[]
|
[{"post_id": 71550, "ts": "202 [{"post_id": 71550, "ts": "2026-09-21T01:31:21Z", "hours": 349.7869, "text": "Built the model!"}]...
|
Title: Spiderman Media Pipe Project by @gowripaliw Title: Spiderman Media Pipe Project by @gowripaliwal | Stardance
Devlogs:
Built the model!...
|
1792446665.8446193
|
1793051465.8446193
|
|
14130
|
Immortal Cultivation Mod (修仙) by @m3e660 | Stardan Immortal Cultivation Mod (修仙) by @m3e660 | Stardance...
|
m3e660
|
4
|
345.45
|
3100
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T17:07:11Z", "hours": 76.0, "multiplier": 18.81, "payout": 1254, "blessing": "neutral", "text": "I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 2, "ts": "2026-08-23T01:53:50Z", "hours": 96.0, "multiplier": 15.99, "payout": 1340, "blessing": "neutral", "text": "I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 3, "ts": "2026-07-11T00:52:33Z", "hours": 44.0, "multiplier": 18.82, "payout": 297, "blessing": "neutral", "text": "This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 4, "ts": "2026-06-16T02:19:15Z", "hours": 23.0, "multiplier": 10.72, "payout": 209, "blessing": "neutral", "text": "Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}]...
|
[{"post_id": 81380, "ts": "202 [{"post_id": 81380, "ts": "2026-10-21T02:39:43Z", "hours": 10.3219, "text": "Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc"}, {"post_id": 80679, "ts": "2026-10-18T13:51:12Z", "hours": 8.0572, "text": "Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)"}, {"post_id": 80384, "ts": "2026-10-17T14:03:45Z", "hours": 10.4, "text": "Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix"}, {"post_id": 79682, "ts": "2026-10-15T01:38:45Z", "hours": 8.0478, "text": "Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs"}, {"post_id": 79208, "ts": "2026-10-13T01:21:10Z", "hours": 9.6014, "text": "Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight"}, {"post_id": 78918, "ts": "2026-10-12T01:31:10Z", "hours": 10.5922, "text": "Devlog #28 Added 8 guide books for different part of the mod Added new bear model"}, {"post_id": 78651, "ts": "2026-10-11T05:20:58Z", "hours": 10.4994, "text": "Devlog #27 Improve overall guidance and improve existing model"}, {"post_id": 77981, "ts": "2026-10-09T03:03:43Z", "hours": 9.3439, "text": "Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items"}, {"post_id": 76814, "ts": "2026-10-04T17:37:22Z", "hours": 9.2553, "text": "Devlog #25 Add a lot of new weapons A lot of new fire And more clothes"}, {"post_id": 75392, "ts": "2026-09-29T22:21:34Z", "hours": 9.3814, "text": "Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love"}, {"post_id": 72892, "ts": "2026-09-23T23:37:48Z", "hours": 10.9486, "text": "Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP"}, {"post_id": 67505, "ts": "2026-09-13T17:02:49Z", "hours": 8.2731, "text": "Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic"}, {"post_id": 64408, "ts": "2026-09-08T19:30:48Z", "hours": 15.1625, "text": "Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system"}, {"post_id": 61873, "ts": "2026-09-05T01:00:25Z", "hours": 12.3611, "text": "Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!"}, {"post_id": 59887, "ts": "2026-09-01T21:31:56Z", "hours": 11.3725, "text": "Devlog #19 Some mobs, yea that is really it"}, {"post_id": 59086, "ts": "2026-08-31T18:20:43Z", "hours": 10.5844, "text": "Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast"}, {"post_id": 55551, "ts": "2026-08-27T14:05:21Z", "hours": 9.8333, "text": "Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!"}, {"post_id": 54475, "ts": "2026-08-25T14:27:13Z", "hours": 8.5392, "text": "Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward"}, {"post_id": 52657, "ts": "2026-08-22T22:04:35Z", "hours": 10.8006, "text": "Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho"}, {"post_id": 46112, "ts": "2026-08-13T03:24:25Z", "hours": 11.3525, "text": "Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust"}, {"post_id": 44036, "ts": "2026-08-09T15:23:44Z", "hours": 11.2058, "text": "Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation"}, {"post_id": 39851, "ts": "2026-08-03T03:24:18Z", "hours": 12.4425, "text": "Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation"}, {"post_id": 37945, "ts": "2026-07-30T23:57:05Z", "hours": 10.8044, "text": "Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models"}, {"post_id": 35415, "ts": "2026-07-26T20:10:28Z", "hours": 11.2708, "text": "Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level"}, {"post_id": 33331, "ts": "2026-07-23T04:32:21Z", "hours": 12.9683, "text": "Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 ."}, {"post_id": 31014, "ts": "2026-07-19T02:14:35Z", "hours": 3.8225, "text": "Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)"}, {"post_id": 28609, "ts": "2026-07-14T23:19:52Z", "hours": 11.3969, "text": "New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修"}, {"post_id": 26263, "ts": "2026-07-10T23:12:53Z", "hours": 37.7453, "text": "Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑"}, {"post_id": 12339, "ts": "2026-06-20T03:56:26Z", "hours": 0.4739, "text": "There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level"}, {"post_id": 12304, "ts": "2026-06-20T02:31:23Z", "hours": 5.2906, "text": "Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure"}, {"post_id": 9608, "ts": "2026-06-16T00:23:52Z", "hours": 3.5289, "text": "See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui"}, {"post_id": 8409, "ts": "2026-06-13T23:43:00Z", "hours": 5.0458, "text": "Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功"}, {"post_id": 7205, "ts": "2026-06-12T01:03:44Z", "hours": 2.4225, "text": "Look at what your boy cooked up in the lab!!!"}, {"post_id": 6577, "ts": "2026-06-11T01:41:07Z", "hours": 12.0342, "text": "WOW SO MUCH STUFF (look at the pics!!!)"}]...
|
Title: Immortal Cultivation Mod (修仙) by @m3e660 | Title: Immortal Cultivation Mod (修仙) by @m3e660 | Stardance
Devlogs:
WOW SO MUCH STUFF (look at the pics!!!)
Look at what your boy cooked up in the lab!!!
Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功
See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui
Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure
There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level
Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑
New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修
Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)
Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 .
Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level
Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models
Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation
Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation
Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust
Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho
Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward
Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!
Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast
Devlog #19 Some mobs, yea that is really it
Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!
Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system
Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic
Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP
Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love
Devlog #25 Add a lot of new weapons A lot of new fire And more clothes
Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items
Devlog #27 Improve overall guidance and improve existing model
Devlog #28 Added 8 guide books for different part of the mod Added new bear model
Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight
Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs
Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix
Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)
Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc
Ships:
Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.
This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!
I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs
I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY...
|
1792817797.0497022
|
1792904197.0497022
|
|
23703
|
Corranzo by @joedesmos | Stardance
|
joedesmos
|
2
|
337.47
|
326
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T18:08:59Z", "hours": 19.0, "multiplier": 16.55, "payout": 217, "blessing": "neutral", "text": "NEW FEATURES ADDED - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. This is Ship #2 as the first ship was more of an MVP while this is a working product now. Website: Corranzo.com", "repo": "https://github.com/joedesmos-co/Corranzo", "demo": "https://corranzo.com"}, {"ship_num": 2, "ts": "2026-06-24T16:42:18Z", "hours": 7.0, "multiplier": 15.92, "payout": 109, "blessing": "neutral", "text": "I made a music app called Corranzo. You can import YOUR OWN sheet music which you can annotate on. This all saves locally to the browser so you can comeback anytime. But, what makes Corranzo be different and stand out is its wait for you mode. You can plug in a midi keyboard or just use the mic on your laptop, phone, etc. and it will help you to learn the piece you want to learn by waiting for you to play the next note(s) in the piece. To activate this you need to upload the sheet music, the mxl/xml, and a midi file of the piece. Along with this, there is also playback mode where you can hear and see your piece in action. Thank you for testing my project!!", "repo": "https://github.com/joedesmos-co/Corranzo", "demo": "https://corranzo.com"}]...
|
[{"post_id": 80805, "ts": "202 [{"post_id": 80805, "ts": "2026-10-18T20:43:23Z", "hours": 48.3214, "text": "working on fixing bugs"}, {"post_id": 78523, "ts": "2026-10-11T02:44:14Z", "hours": 12.3525, "text": "continued to work on a NEW FEATURE super super cool i will talk all about it in the next log. the pictures are kinda boring my bad. idk what else to put"}, {"post_id": 78154, "ts": "2026-10-09T20:12:04Z", "hours": 22.7408, "text": "more behind the scenes stuff. wait for you mode was kinda messed up so fixing that"}, {"post_id": 77556, "ts": "2026-10-07T12:58:16Z", "hours": 23.2825, "text": "new ui fixes and other behind the scenes stuff"}, {"post_id": 75015, "ts": "2026-09-28T21:16:51Z", "hours": 9.2719, "text": "New ui finally done after forever"}, {"post_id": 72161, "ts": "2026-09-22T10:50:41Z", "hours": 20.0517, "text": "More UI stuff and just waiting for the ai to finish training it takes a while"}, {"post_id": 69374, "ts": "2026-09-16T22:31:30Z", "hours": 49.67, "text": "I have been training the ai for 50 hours. it is still not done. I think I need to optimize this thing more lol also working on ui updates and making it look nice while the ai is cooking :)"}, {"post_id": 63373, "ts": "2026-09-07T04:59:38Z", "hours": 9.6072, "text": "Training the AI on 50 ish thousand different scores. Currently making a database of all the scores and turning them into training data then when it is done (soon as you can see in the pic) I will use the dataset to train the AI"}, {"post_id": 61041, "ts": "2026-09-03T19:04:35Z", "hours": 74.1122, "text": "It has been a while but I have been working a long time. So basically I have continued to work on omr and have also worked on some ui things. Omr has now gotta a full ai that looks at scores to generate the practice scene. Also, the visual practice area is now transformed to match the score exactly instead of guessing where the notes are."}, {"post_id": 36674, "ts": "2026-07-28T21:44:52Z", "hours": 10.7281, "text": "MAJOR OMR UPGRADES and a lot of bug fixes and also some ui / ux improvements and just made the app look a lil nicer. Also I realized that I never said what OMR was so basically OMR is short for optical music recognition. So in Corranzo you need to upload a pdf, midi file, and mxl / xml file. The mxl / xml file and midi allow the song to be heard and also the scorefollow and the wait for you mode to work. What OMR does is it allows you to just have a pdf and the OMR will recognize symbols, notation, measures, beats, etc. and make the mxl / xml and midi file for you so all you need is a pdf. It is very challenging to get right and a lot of times it is plain wrong so right now what ive just been doing for around 20 - 30 ish hours of this time is just improving the OMR because its kind of what makes this product real."}, {"post_id": 30319, "ts": "2026-07-17T19:33:59Z", "hours": 10.2422, "text": "I am working on improving OMR and Mic quality I have successfully improved mic quality for checking if you play the correct notes but OMR is proving to be very difficult."}, {"post_id": 24457, "ts": "2026-07-08T01:08:29Z", "hours": 3.2911, "text": "Improved Chord recognition and issues with playing more than 1 note at a time using mic detection."}, {"post_id": 23135, "ts": "2026-07-05T22:15:29Z", "hours": 0.8031, "text": "Added a practice library that includes some songs you can play."}, {"post_id": 23099, "ts": "2026-07-05T20:53:43Z", "hours": 16.9911, "text": "Added guitar to the app. So you can now practice guitar and also practice piano. Also added a visual practice mode now so you can see the notes closer up and it just makes it a lot easier to practice. Also improved the omr and the mic detection for wait for you mode."}, {"post_id": 20143, "ts": "2026-07-01T18:05:59Z", "hours": 15.6933, "text": "NEW FEATURES - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. Website: Corranzo.com"}, {"post_id": 16346, "ts": "2026-06-26T16:23:32Z", "hours": 3.0986, "text": "Majorly updated the ui and also improved some of the engines and added a debug feature. Along with this your music if it is rotated or weridly shaped / moved it will auto rotate and fix itself."}, {"post_id": 15138, "ts": "2026-06-24T16:25:08Z", "hours": 6.8275, "text": "I released Corranzo v0.1 as it is now ready for public beta. I have been working on polishing the app and making sure that the score follow works well as before it was a little inaccurate. I would really appreciate people testing it and giving me feedback thank you! Website: https://corranzo.com"}]...
|
Title: Corranzo by @joedesmos | Stardance
Devlogs Title: Corranzo by @joedesmos | Stardance
Devlogs:
I released Corranzo v0.1 as it is now ready for public beta. I have been working on polishing the app and making sure that the score follow works well as before it was a little inaccurate. I would really appreciate people testing it and giving me feedback thank you! Website: https://corranzo.com
Majorly updated the ui and also improved some of the engines and added a debug feature. Along with this your music if it is rotated or weridly shaped / moved it will auto rotate and fix itself.
NEW FEATURES - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. Website: Corranzo.com
Added guitar to the app. So you can now practice guitar and also practice piano. Also added a visual practice mode now so you can see the notes closer up and it just makes it a lot easier to practice. Also improved the omr and the mic detection for wait for you mode.
Added a practice library that includes some songs you can play.
Improved Chord recognition and issues with playing more than 1 note at a time using mic detection.
I am working on improving OMR and Mic quality I have successfully improved mic quality for checking if you play the correct notes but OMR is proving to be very difficult.
MAJOR OMR UPGRADES and a lot of bug fixes and also some ui / ux improvements and just made the app look a lil nicer. Also I realized that I never said what OMR was so basically OMR is short for optical music recognition. So in Corranzo you need to upload a pdf, midi file, and mxl / xml file. The mxl / xml file and midi allow the song to be heard and also the scorefollow and the wait for you mode to work. What OMR does is it allows you to just have a pdf and the OMR will recognize symbols, notation, measures, beats, etc. and make the mxl / xml and midi file for you so all you need is a pdf. It is very challenging to get right and a lot of times it is plain wrong so right now what ive just been doing for around 20 - 30 ish hours of this time is just improving the OMR because its kind of what makes this product real.
It has been a while but I have been working a long time. So basically I have continued to work on omr and have also worked on some ui things. Omr has now gotta a full ai that looks at scores to generate the practice scene. Also, the visual practice area is now transformed to match the score exactly instead of guessing where the notes are.
Training the AI on 50 ish thousand different scores. Currently making a database of all the scores and turning them into training data then when it is done (soon as you can see in the pic) I will use the dataset to train the AI
I have been training the ai for 50 hours. it is still not done. I think I need to optimize this thing more lol also working on ui updates and making it look nice while the ai is cooking :)
More UI stuff and just waiting for the ai to finish training it takes a while
New ui finally done after forever
new ui fixes and other behind the scenes stuff
more behind the scenes stuff. wait for you mode was kinda messed up so fixing that
continued to work on a NEW FEATURE super super cool i will talk all about it in the next log. the pictures are kinda boring my bad. idk what else to put
working on fixing bugs
Ships:
I made a music app called Corranzo. You can import YOUR OWN sheet music which you can annotate on. This all saves locally to the browser so you can comeback anytime. But, what makes Corranzo be different and stand out is its wait for you mode. You can plug in a midi keyboard or just use the mic on your laptop, phone, etc. and it will help you to learn the piece you want to learn by waiting for you to play the next note(s) in the piece. To activate this you need to upload the sheet music, the mxl/xml, and a midi file of the piece. Along with this, there is also playback mode where you can hear and see your piece in action. Thank you for testing my project!!
NEW FEATURES ADDED - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. This is Ship #2 as the first ship was more of an MVP while this is a working product now. Website: Corranzo.com...
|
1792810390.4009109
|
1792896790.4009109
|
|
34143
|
Spectralis by @DeltaVortex | Stardance
|
DeltaVortex
|
2
|
332.84
|
4092
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T05:56:33Z", "hours": 236.0, "multiplier": 16.89, "payout": 3884, "blessing": "neutral", "text": "Spectralis shiplarp 2 — Stardance —wuzzup guys— So much has happened since shiplarp 1 and I cannot wait to not break down what changed. I will. I’m lazy. Not right now though. Cat or dog? redeem_code.claim() —the celebration— We’ve gone through so many changes since last time that it deserves an actual celebration: a very cool, very awesome custom visualizer for Stardance. Claim yours: Help > Manage Visualizers, then redeem stardance-lts-pulp . —found a bug?— Including the dreaded Tim Cook issues — DM me: Discord: @deltav0rtex Slack: deltavortex Can’t wait to hear the feedback and all the bugs you dig up. —this is the end*— *end for now, redeem codes permitting YIPEE!!!", "repo": "https://github.com/Dareto-Dream/Spectralis", "demo": "https://spectralis.deltavdevs.com"}, {"ship_num": 2, "ts": "2026-08-14T06:50:58Z", "hours": 23.0, "multiplier": 12.89, "payout": 208, "blessing": "neutral", "text": "Spectralis shiplarp — v5.3.0 —shipped it— Notepads. A spin wheel. Dead zones that aren’t OBS-only anymore. Playlists that don’t look like a log file. Spotify that actually behaves. That’s the version. —what’s in it— Notepad system: docked panel, tabs, pop-out window, saves to track tags Spin wheel: weighted entries, saved wheel lists, notepad-fed Dead zones now shift the app’s own layout, not just OBS overlays Spotify: playlist sync, queue, pause, and Discord presence all fixed Fixed: playlist rows missing RowBackground (looked like a terminal, my bad) Fixed: nav rebuilding the entire view every click Fixed: library load blocking window open on big libraries Fixed: spectrum bars snapping instead of moving (FFT overlap bumped to 75%) Fixed: soundcloud playhead, word-mode timestamp export, track-switch click/pop —that’s it— PICKLE!!!", "repo": "https://github.com/Dareto-Dream/Spectralis", "demo": "https://spectralis.deltavdevs.com"}]...
|
[{"post_id": 65615, "ts": "202 [{"post_id": 65615, "ts": "2026-09-10T21:10:25Z", "hours": 9.8333, "text": "Spectralis devlog #44 —Hello again proggers— Did it. Fixed a genuine ton of bugs, following through on the mess from devlog #43. Tempted to just drop 6.1.0 right now, but holding off — want to get a few new features in and brainstorm some more QoL first so this actually feels like a finished product, not just a stopgap. Also: finally going to bed. the bar was “fix the bugs” and I cleared it, going higher anyway Cat or dog? sleep(∞) Okay let’s get into it~ —Yap— Real closure on the websocket/CDN/prod chaos from last devlog. Cleared out a lot in one sitting, and instead of rushing 6.1.0 out the door on relief alone, choosing to actually sit with it a bit longer. —The Great Suffering— 1 — The Bug Backlog, Actually Cleared Worked through the fallout from devlog #43 — websocket issues, the CDN backup failures, all of it — and got a genuine ton of it fixed in one real pass instead of piecemeal patching. 2 — Holding Off On 6.1.0, On Purpose Could ship right now. Choosing not to. Want to work in a few new features and brainstorm more QoL first, so the release feels complete rather than just “the bugs are gone, ship it.” Patience over momentum this time. 3 — Finally Going To Bed After devlog #43’s two-days-no-sleep spiral, actually calling it and going to bed now. Today off is finally getting used the way it was supposed to be used. the sleep debt collector finally caught up —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to get real sleep for the first time in a while. Q: Why not just ship 6.1.0 now if the bugs are fixed? A: Because “bug-free” and “actually done” aren’t the same bar, and this one’s worth clearing the second one too. Q: Was this the same chaos from devlog #43? A: Same fires, all put out this round. Q: What kind of new features are being considered? A: Not locked in yet — that brainstorming is the next step, not this devlog. Q: Sleep status, finally? A: Handled. Going now. —This is the end*— *end for now, actual sleep permitting PLAY!!!"}, {"post_id": 65271, "ts": "2026-09-10T08:34:54Z", "hours": 2.5, "text": "Spectralis devlog #43 —Hello again proggers— [2:47am] okay so. websockets again, more of them, and now the CDN backup is failing too which is great, love that for me. on my 4th coffee at this point, energy drink count is starting to get concerning honestly and I’m not gonna pretend it isn’t. pretty sure i debugged the cdn thing at 4am purely out of spite Cat or dog? idk man catch (Exception e) { } at this point Okay let’s get into it, or at least try to~ —Yap— so continuing from devlog #42’s websocket hardening, turns out hardening one part just revealed the next part was also fragile, shocking, anyway. need to push something to prod to actually get it working but can’t do that without interrupting infra which is currently live so that’s a whole separate problem I have to solve first before I can solve the actual problem. love layers. —The Great Suffering— 1 — More Websocket Issues more of them. found while poking at the hardening from last devlog. not sure if figuring this part out took 20 minutes or 3 hours honestly, time’s doing something weird tonight. 2 — CDN Backup Is Failing on top of the websocket stuff, cdn backups just started failing too. not connected to each other as far as i can tell but who knows at this point, everything feels connected at 3am. 3 — Need To Push To Prod, Can’t Without Interrupting Infra the actual fix needs to go to prod but pushing it right now means interrupting live infra, which i don’t want to do blind, so now i need a plan for THAT before the real fix even goes out. process problem wrapped around the actual problem, great. 4 — Shared Play Is Doing The AI-Look Thing Again noticed shared play’s UI is drifting into the same generic-AI-looking territory the main site kept getting flagged for back in devlog #21-#24. damn. gonna have to redo that too. not tonight though, one disaster at a time. 5 — Oh And I Found A Missing Semicolon spent a genuinely embarrassing amount of time on a bug that turned out to be a missing semicolon. send help. actually don’t, just let me suffer, i clearly deserve it at this hour. 6 — No Sleep For 2 Days, Hitting Now it’s catching up. hard. luckily got tomorrow off so plan is stay up tongiht finish this, and just completely pass out tomorrow instead. worth it. probably. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: a human programmer. you. the one reading this at whatever hour you’re reading it, hopefully not also running on 2 days no sleep Q: Is the websocket hardening from #42 actually working? A: mostly? finding more edge cases as i go, which is annoying but also kind of expected honestly Q: Why can’t you just push to prod now? A: because infra’s live and i don’t want to interrupt it blind, need an actual plan for that part first Q: Is shared play getting a full redesign again? A: yeah probably, later though, not adding a 4th fire to tonight Q: Sleep plan? A: none tonight, all of it tomorrow, that’s the whole plan —This is the end — *end for now, semicolons permitting send sleep!!!"}, {"post_id": 65216, "ts": "2026-09-10T06:03:36Z", "hours": 9.7103, "text": "Spectralis devlog #42 —Hello again proggers— Spent this round hardening shared queues, mostly because WebSockets are just genuinely cool and it’s about time they got treated that way in this codebase. a devlog motivated entirely by “websockets are cool” is a valid devlog Cat or dog? ws:// Okay let’s get into it~ —Yap— Shared queues have been functional but not particularly resilient this whole time, riding on shared play’s presence/reactions/queue work from way back in devlog #9. This round was about actually hardening that layer instead of leaving it fragile. —The Great Suffering— 1 — Hardening Shared Queues Went through and shored up a bunch of the underlying bases for shared queues — the stuff that only matters once real connections are dropping, reconnecting, and behaving unpredictably instead of the clean happy-path test case. 2 — Because WebSockets Are Cool Genuinely part of the motivation here. Real-time bidirectional connections are just satisfying to get right, and shared queues are exactly the kind of feature that benefits from taking that layer seriously instead of treating it as plumbing. not every feature needs a dramatic bug story, sometimes it’s just “wanted to do it well” —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hardening infrastructure purely because it’s fun to get right. Q: Is this related to the shared play work from devlog #9? A: Same general system, this round focused specifically on making the queue layer more resilient. Q: What does “hardening” mean here specifically? A: Making the shared queue behavior hold up better under real conditions — drops, reconnects, timing edge cases — rather than just the clean test path. Q: Any bugs found during this pass? A: Nothing dramatic enough to call out individually, mostly proactive resilience work. Q: What’s next? A: Podcast mode and the randomizer work from devlog #41 are both still ongoing threads. —This is the end*— *end for now, dropped connections permitting P_P!!!"}, {"post_id": 64674, "ts": "2026-09-09T08:17:56Z", "hours": 5.2669, "text": "Spectralis devlog #41 —Hello again proggers— Podcast mode’s in the works, with a real new way to actually find saved podcasts instead of digging for them. Also fixed the randomizing tools so they actually help pick a song instead of just existing decoratively. And: class got canceled for a hurricane watch, so tonight’s an all-nighter by default. free 10 hours courtesy of a hurricane, weird way to get them Cat or dog? shuffle(weighted=True) Okay let’s get into it~ —Yap— Two real features this round plus a forced schedule change. Podcast mode’s genuinely new territory for the app, the randomizer fix is a smaller but meaningful UX improvement, and the hurricane watch just handed over a full night that wasn’t originally planned for grinding. —The Great Suffering— 1 — Podcast Mode, In Progress Building out actual podcast support, including a new way to locate saved podcasts rather than just treating them like any other track and hoping they surface in the right place. Real new territory for the app compared to the music-first feature set so far. 2 — Randomizing Tools, Actually Useful Now The shuffle/randomizer tools existed before but weren’t really doing anything meaningful — mostly there in name. Fixed so they actually aid in song selection now instead of just sitting there as a checkbox nobody trusted. a randomizer that doesn’t actually help you pick anything is just decoration 3 — The Hurricane Watch Situation Class got canceled due to a hurricane watch, which means tonight’s turning into a full grind session that wasn’t originally on the calendar. Silver lining of a weather delay, I suppose. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one getting a bonus grind night courtesy of a hurricane watch. Q: Is podcast mode close to done? A: In progress, this devlog’s the early build phase, not the finish line. Q: What was actually wrong with the randomizer before? A: It existed but didn’t meaningfully help pick songs — more decorative than functional. Fixed to actually aid selection now. Q: Is Song Wars rework from devlog #40 still going? A: Ongoing, this devlog’s focus shifted to podcast mode and the randomizer instead. Q: Stay safe with the hurricane watch, by the way. A: Appreciated. Staying inside, staying coding. —This is the end*— *end for now, hurricane watches permitting POOL!!!"}, {"post_id": 64588, "ts": "2026-09-09T03:01:20Z", "hours": 10.0, "text": "Spectralis devlog #40 —Hello again proggers— 10 straight hours, and the highlight is getting tricked by Suno’s own scraper path. There was a decoy path that looked exactly like the real music endpoint, and it just returned forbidden the whole time. Maybe I’m the bot in this scenario. Unclear. got outsmarted by a decoy URL, humbling Cat or dog? 403 Forbidden Okay let’s get into it~ —Yap— Continuing the reverse-engineering grind from devlog #39, Suno specifically threw a curveball this round. Beyond that, spent real time thinking about what the app actually is and why certain features exist, plus started tearing into Song Wars, which has apparently been quietly buggy for a while. —The Great Suffering— 1 — The Suno Decoy Path Suno provides a path that looks exactly like the real music endpoint, structurally identical, right down to how it responds at a glance. In reality it just returns forbidden every time. Spent real time thinking this was progress before realizing it was a dead end dressed up as a working one. maybe im the bot 2 — Actually Fixed It, After Testing Once the decoy was identified for what it was, found the real path and got it working properly. Testing it thoroughly this time before calling it done, given how devlog #39 went. 3 — Identity Of The App Spent real time thinking through what Spectralis actually is at this point, and justifying why certain features exist rather than just accumulating them because they seemed cool at the time. Less code, more “why does this exist and does it still make sense.” 4 — Song Wars Rework, Started Started tearing into Song Wars, which turns out to be hella buggy underneath. Early stages of a rework rather than a patch job, since patching individual bugs in it hasn’t been holding up. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who got fooled by a decoy API path for a while. Q: Was the Suno issue related to the S3 discovery from devlog #38? A: Same general integration, different specific obstacle this round. Q: Is Song Wars getting a full rewrite or just fixes? A: Leaning toward a real rework rather than more patches, given how buggy it’s turned out to be. Q: What does “identity of the app” work actually produce? A: Not code directly — more a filter for which features actually belong and why, going forward. Q: How’s the 10 hour grind treating you? A: Productive despite the decoy detour. Real progress by the end of it. —This is the end*— *end for now, decoy paths permitting PAP!!!"}, {"post_id": 64321, "ts": "2026-09-08T16:38:31Z", "hours": 11.5997, "text": "Spectralis devlog #39 —Hello again proggers— All-nighter, running on 3 Monsters and a Coke Zero. Reverse engineering APIs is hard as hell, and untitled.stream in particular fought back the whole way. Also snuck in a fix for a Spotify library issue on the side. 3 Monsters and a Coke Zero is not a nutrition plan, it’s a battle strategy Cat or dog? 429 Too Many Requests Okay let’s get into it~ —Yap— Following up on devlog #38’s untitled.stream compat work — turns out “working on it” undersold how hard it actually was. Genuinely brutal reverse engineering session, plus a smaller fix that came out of the same stretch of work. —The Great Suffering— 1 — untitled.stream Was Particularly Hard To Crack Chasing this compatibility since devlog #38, and it turned out to be one of the harder reverse-engineering targets yet. No public API to lean on, so it was the usual slow grind of observing behavior and piecing together how it actually works under the hood. some APIs give up easy, this was not one of them 2 — Reverse Engineering APIs In General: Still Hard Not a new lesson given devlog #17’s whole saga, but worth restating: this category of work is consistently the hardest and slowest kind on the whole project. Going in with better patience and verification habits this time though, which helped. 3 — Spotify Library Polling, Increased Bumped how often libraries get polled to account for some Spotify-side issues that were surfacing. Smaller fix, but a real one, found and shipped in the same session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who ran on three energy drinks to crack one integration. Q: Is untitled.stream compat actually working now? A: Meaningfully further along after this session, following up from devlog #38’s start on it. Q: Did this go better than devlog #17’s reverse-engineering disaster? A: Yes — hard and slow, but productive this time rather than a total dead end. Q: What was the Spotify polling issue specifically? A: Library state getting out of sync too easily — more frequent polling keeps it closer to accurate. Q: Sleep status? A: Same as every other all-nighter devlog. Not great. Worth it this time though. —This is the end*— *end for now, rate limits permitting PIPSQUEAK!!!"}, {"post_id": 64034, "ts": "2026-09-08T05:01:47Z", "hours": 9.5333, "text": "Spectralis devlog #38 —Hello again proggers— Suno’s integration broke after their latest TOS update, so that got fixed. Also added Discord Rich Presence control for capsules, started chasing down a batch of connections that quietly broke or got dropped over time, and picked up a fun trivia fact along the way: Suno apparently hosts on AWS S3. a TOS update breaking an integration, name a more classic story Cat or dog? S3:// Okay let’s get into it~ —Yap— Mixed bag this round: one reactive fix from an external platform change, one genuinely new feature, and the start of a cleanup pass on integrations that have been quietly rotting since whenever they last got touched. —The Great Suffering— 1 — Suno Integration, Fixed Suno’s newest TOS update broke the existing integration. Patched it back up to work with the new terms. Reactive fix, not a fun one, but necessary. 2 — Capsule DRPC Control Real new feature: Spectralis capsules can now control Discord Rich Presence, so a capsule can show custom status while it’s playing instead of the app just showing generic now-playing info. 3 — Chasing Down Broken And Dropped Connections Going through existing integrations that broke with newer updates on the other end, or that got dropped along the way and never revisited — untitled.stream compatibility being one specific example. Working through the backlog of “this used to work” one at a time. 4 — Suno Hosts On AWS S3 Small fun discovery while poking around the integration: Suno’s hosting is on AWS S3. Not actionable, just neat to know. 5 — Looking For New Platforms Actively looking for what to integrate with next. Feedback on what platforms people actually want would genuinely help shape this. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose integration broke because someone else updated a TOS page. Q: What’s DRPC? A: Discord Rich Presence — the status shown under someone’s name in Discord. Capsules can now set custom status through it. Q: What’s untitled.stream compat about? A: One of the connections that broke or got left behind at some point — being actively worked back into shape. Q: What platforms are being considered for new integration? A: Not decided yet, genuinely open to suggestions. Q: Was the Suno fix hard? A: Not conceptually, just annoying — an external change forcing reactive work instead of planned work. Q: What’s the image order now? A: Changed my mind again — meme first, app screenshot second this time. The devlog #37 order didn’t stick. —This is the end*— *end for now, TOS updates permitting POP!!!"}, {"post_id": 63804, "ts": "2026-09-07T19:28:07Z", "hours": 15.4, "text": "Spectralis devlog #37 —Hello again proggers— Working through the feedback wave from the ship, including an upcoming maybe-new streaming service integration. Reverse engineering, again, yay. Also completely forgot Hackclub’s 10 hour limit was a thing and ran 5 hours over it. It’s fine. Everything’s fine. last time reverse engineering a streaming service ate 12 hours and produced nothing, so this is either growth or déjà vu Cat or dog? HKEY_LOCAL_MACHINE Okay let’s get into it~ —Yap— Post-ship feedback turned into real changes fast, and one of them’s a streaming service integration that’s back to reverse-engineering territory — hopefully with better luck than the devlog #17 saga. Also, format note: switching up how devlogs get posted going forward. —The Great Suffering— 1 — Maybe New Streaming Service Support Working on possible support for another streaming service, and since it doesn’t have a public API either, that means reverse engineering again. Learned some hard lessons from devlog #17’s all-nighter about this exact kind of work, applying them here — verifying before implementing, checking whether something’s already patched before sinking hours into it. 2 — 15 Hours, Not 10 Completely lost track of Hackclub’s 10 hour session limit and blew past it by 5 hours. Not the plan, happened anyway, no regrets loud enough to stop it from happening again probably. time limits are more of a guideline when you’re mid-flow 3 — A Format Change, By Request People like the meme format but keep asking to actually see the project itself, which is fair — problem is most of what’s happening is engine work, and a screenshot of raw code just doesn’t communicate much on its own. Going to try posting an actual screenshot as the first image and keep the meme as the second, going forward. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just blew past a 10 hour limit by half again as much. Q: Is this streaming integration going to end like devlog #17’s did? A: Hoping not — going in more carefully this time given how that one went. Q: Why not just show code screenshots if people want to see the project? A: Raw engine code doesn’t communicate much visually to most people. Trying to find screenshots that actually show something meaningful instead. Q: Will the meme format go away? A: No, staying as image two. Just adding an actual project screenshot as image one. Q: How’s the feedback wave going overall? A: Productive, this streaming service idea being one direct result of it. —This is the end*— *end for now, session limits permitting POSSIBLE!!!"}, {"post_id": 62666, "ts": "2026-09-06T04:36:39Z", "hours": 9.8669, "text": "Spectralis devlog #36 —Hello again proggers— Last log before 6.0.1 tries to ship to everyone. Except Mac, remember? If anyone — and by anyone I mean basically no one — has the app downloaded already, you should see the update land fairly soon. “anyone” carrying a lot of self-deprecation in that sentence Cat or dog? v6.0.1 Okay let’s get into it~ —Yap— Four things landing in this round: video export from devlog #35 finally patched back in properly, the about page expanded, a real EQ upgrade, and more webview bugs cleared out. Then it’s out the door. —The Great Suffering— 1 — Video Export, Actually Patched In Announced back in devlog #35, and this round it’s actually working and patched into the build for real instead of just existing as a headline feature nobody could touch yet. 2 — About Page, Expanded Grew the about page out — more actual content instead of the bare-minimum version it’s had this whole time. 3 — A Far More Advanced EQ System Real upgrade here: new EQ with envelope styling and a handful of presets. Meaningfully more capable than whatever was there before, for anyone who actually cares about shaping their sound instead of just hitting play. 4 — More Webview Bugs, Patched Following the WebView2Host fast-path fix from devlog #9, a few more webview-related bugs got cleared out this round. Apparently that surface keeps finding new ways to misbehave. webview bugs are the gift that keeps on giving 5 — 6.0.1 Ships, Mac Excluded (Still) Same LTS-only policy from devlog #32 applies — Mac isn’t getting 6.0.1 as a minor. Everyone else should see the update land soon. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to auto-update basically no one to 6.0.1. Q: Why doesn’t Mac get 6.0.1? A: Same policy from devlog #32 — Mac only gets LTS releases, not minors, unless it’s a Mac-specific patch. Q: What’s new in the EQ system specifically? A: Envelope styling plus a set of presets, a real step up from the previous version. Q: Is video export from devlog #35 fully working now? A: Yes, patched in properly this round. Q: When does 6.0.1 land? A: Fairly soon, per this devlog, for anyone who already has the app installed. —This is the end*— *end for now, update pushes permitting PEBBLE!!!"}, {"post_id": 62302, "ts": "2026-09-05T16:34:34Z", "hours": 9.5667, "text": "Spectralis devlog #35 —Hello again proggers— Long way from v5.3.0, that’s for sure. New ship’s cooking, and it’s built directly off the feedback wave from devlog #33 — took what came in and actually built more on top of it. Also, the big one this round: video export is here. 35 devlogs from “last ship” to this Cat or dog? .mp4 Okay let’s get into it~ —Yap— This one’s a real feedback-driven ship, not just internal roadmap stuff. Fed reports and requests all the way back from devlog #2’s post-first-ship feedback into the app, and video export was the headline addition that came out of it. —The Great Suffering— 1 — Feedback Actually Became Features Everything that came in since devlog #2, right after the very first ship, finally got folded back into this release, not just patched as bugs but expanded into more app. Real loop from “here’s what’s wrong/missing” way back then to “here’s it, fixed and built out” now. 2 — Video Export Is Here For music makers who want something to post — YouTube, Klipy, wherever you’re posting cool stuff — Spectralis can now export video directly instead of just playing audio and visualizers live. Been a long time coming given how much the visualizer/capsule work has built up across devlogs #7, #18, #23, and #29-#30. 3 — This Is The New Ship, Not The Finished One Announcing the direction this round more than closing it out — the surprise from devlog #33/#34 still rides along on this too. Full picture coming as it actually ships. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just got a whole export pipeline for their trouble. Q: What can video export actually do? A: Exports your visualizer/capsule output as an actual video file, suited for posting to platforms like YouTube or Klipy. Q: Is this the same ship as the Stardance surprise from devlog #34? A: Same overall release window, yes. Q: How much of this came directly from user feedback? A: A meaningful chunk — some of it going all the way back to devlog #2, right after the very first ship. Q: When’s it actually dropping? A: Still in progress. This is the announcement, not the release. —This is the end*— *end for now, export pipelines permitting PS: couldn’t find a good meme this time, so you get corporate gif slop instead. Enjoy. PICKLE!!!"}, {"post_id": 61350, "ts": "2026-09-04T07:08:42Z", "hours": 7.2333, "text": "Spectralis devlog #34 —Hello again proggers— Still on the devlog commits grind. The surprise from devlog #33 is actually finished now, releasing alongside the next Stardance ship as soon as this current one clears. Meanwhile, spent this round scouring the app for small edge cases and UI stuff that’s been quietly overlooked. the surprise is done, the suspense is not Cat or dog? edge_case.md Okay let’s get into it~ —Yap— Two tracks this devlog: the surprise from last time is locked and ready, waiting on the current ship to clear before it goes out with Stardance. In the meantime, doing a proper sweep for the small stuff — edge cases and UI rough edges that don’t show up unless you’re specifically hunting for them. —The Great Suffering— 1 — The Surprise Is Finished Whatever it is, it’s done. Releasing with the next Stardance ship, not this current one — has to clear first. Still not saying what it is. still not telling you, patience 2 — Scouring For Edge Cases Going through the app specifically looking for edge cases that got missed during normal feature work — the inputs and states nobody thinks to test until something breaks in a very specific, very rare way. 3 — UI Stuff That Got Overlooked Alongside the edge cases, hunting down small UI issues that slipped through — spacing, alignment, states that don’t look quite right, the stuff that’s easy to miss when you’re heads-down building instead of using the app like a regular person would. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hunting edge cases nobody else would think to try. Q: What’s the surprise? A: Patience, my dear child. Q: Why wait for the current ship to clear first? A: Cleaner to let one release settle before stacking the surprise onto the next one. Q: Any specific edge cases found yet? A: Sweep’s ongoing, nothing dramatic enough to call out individually yet. Q: Still not saying what the surprise is? A: Correct. Ask again next devlog. —This is the end*— *end for now, edge cases permitting PERISHABLE!!!"}, {"post_id": 60763, "ts": "2026-09-03T11:03:52Z", "hours": 5.8667, "text": "Spectralis devlog #33 —Hello again proggers— First real wave of feedback since Mac shipped in devlog #32, and it’s been genuinely good. Patching a handful of bugs people actually pointed out, plus one quick clarification for a specific rater who had a question. real users, real feedback, feels different from testing solo Cat or dog? feedback.md Okay let’s get into it~ —Yap— Shipping to actual people instead of just self-testing changes the kind of bugs that surface. Round of patches based directly on what came in, plus a couple of housekeeping notes. —The Great Suffering— 1 — Real Feedback, First Time At This Scale Genuinely solid feedback wave since the Mac release. Different flavor of bug reports than internal testing ever produces — actual usage patterns finding things a solo QA pass wouldn’t. 2 — Patching What Got Pointed Out Working through the specific bugs raised by that feedback. Direct fixes for direct reports, exactly the kind of loop that’s supposed to happen once something’s actually in people’s hands. 3 — Quick Note For A Specific Rater One rater asked about the track used in devlog #1 — it’s a custom remix of “Delete” by Ninjirachi. DM if you want the file. 4 — How To Reach Out For anyone hitting issues with the app: Slack works, or Discord at @deltav0rtex . Genuinely want the reports, keep them coming. 5 — A Surprise Is Coming Next Ship Got something tucked away for the next release that should land well. Not spoiling it here, staying quiet on purpose. Minor patch for this round’s QoL fixes drops within the next two days. teasing it and saying nothing else, that’s the whole bit —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one actually reading feedback instead of guessing what’s broken. Q: How do I report a bug? A: Slack, or Discord — @deltav0rtex . Q: What was that track in devlog #1? A: A custom remix of “Delete” by Ninjirachi. DM for the file if you want it. Q: Is the current bug list from this feedback wave big? A: Manageable, working through it directly rather than batching for a bigger release. Q: Any plans to formalize a feedback/bug channel later? A: Not stated yet, current setup is DMs and Slack for now. Q: What’s the surprise for next ship? A: Not saying. That’s the point of a surprise. Q: When’s the minor QoL patch dropping? A: Within the next two days. —This is the end*— *end for now, bug reports permitting PARABLE!!!"}, {"post_id": 60643, "ts": "2026-09-03T04:06:16Z", "hours": 3.4, "text": "Spectralis devlog #32 —Hello again proggers— Mac’s out. Actually out, actually available, actually done. Took way longer than expected — the site needed updating and every single update script needed fixing before this could actually go out the door clean. “we got mac out” undersells how much site and script work that actually took Cat or dog? .pkg Okay let’s get into it~ —Yap— Closing the loop that started way back in devlog #19 with a borrowed Mac and a hopeful “fingers crossed,” went through the decoding fixes in devlog #28, the platform-assumption hotfix in devlog #26, and now it’s actually shipped. Quick policy reminder while we’re here, since it matters going forward. —The Great Suffering— 1 — The Site Needed Updating First Before Mac could actually go out, the site itself needed real updates to reflect it — new download option, new platform messaging, none of which existed yet. Took a real chunk of the time this release ate. 2 — Every Update Script Needed Fixing Following up on the Windows/Linux-centric script assumptions caught back in devlog #26 — turns out that wasn’t a one-off fix, it touched update scripts broadly. Had to go through and fix them properly for Mac to actually be able to update itself going forward, not just install once. 3 — Mac Is Actually Out After all of that: it’s live. Full journey from borrowed hardware sessions to an actual public release. 4 — Reminder: Mac Only Gets LTS Quick policy note, stated plainly since it matters: Mac only receives LTS releases going forward, not minor updates, unless a minor is a Mac-specific patch. Same access-constraint reasoning from devlog #19 — this isn’t changing anytime soon, so setting the expectation clearly now. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out “ship Mac” secretly meant “rebuild the update pipeline.” Q: Does Mac get every LTS release? A: Yes, every LTS. Just not the minors in between, unless that minor is Mac-specific. Q: Why not give Mac full parity now that it’s out? A: Hardware access is still the bottleneck — same reasoning as devlog #19, testing and building for Mac isn’t a routine, always-available thing yet. Q: What took so long between the decoding fixes in devlog #28 and now? A: Mostly the site and update script work described above — the actual build was closer to ready than the delivery pipeline around it was. Q: Is this the end of the Mac saga? A: The release side, yes. Ongoing maintenance is just going to follow the LTS-only cadence from here. —This is the end*— *end for now, update scripts permitting POP!!!"}, {"post_id": 59211, "ts": "2026-08-31T21:37:18Z", "hours": 9.9, "text": "Spectralis devlog #31 —Hello again proggers— More QoL, a real bug fixed in world editing, and a proper in-depth test run of the whole thing. Honest verdict after actually using it for real: still sucks, still hate it, but it’s at least somewhat usable now. Progress, technically. “somewhat usable” is a real milestone when you started from “actively bad” Cat or dog? node.isCorrupt Okay let’s get into it~ —Yap— World editing’s been the newer, rougher part of the studio since the Godot-inspired redesign in devlog #29. This round was about actually running it through its paces instead of just building on top of it, and that testing found a real problem. —The Great Suffering— 1 — More QoL Another pass of small quality-of-life improvements, continuing the trend from the last couple devlogs. Nothing individually huge, all of it adds up. 2 — The Bad Node Bug Found and fixed a genuinely bad node bug in the world section during testing. The kind of bug that only shows up once you’re actually building real worlds instead of poking at an empty editor. 3 — The In-Depth Test Run Took world editing for a real, thorough run this time instead of a quick sanity check. Built something with actual substance in it and used the tool the way it’s meant to be used. 4 — The Honest Verdict Still sucks. Still hate using it. But after this round of fixes and QoL, it’s crossed into “somewhat usable” territory, which is more than could be said before this session. low bar, cleared, moving on —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just admitted their own tool still sucks and shipped it anyway. Q: Is world editing done now? A: No, “somewhat usable” is the current state, not “finished.” More work ahead. Q: How bad was the node bug? A: Bad enough to matter, found through actual real-world testing rather than a quick check. Q: Is this related to the layer work from devlog #30? A: Different area — that was capsules/timeline, this is world editing specifically. Q: What’s the plan to make world editing not suck? A: Keep testing it for real, keep fixing what that testing turns up. This devlog’s the start of that loop, not the end. —This is the end*— *end for now, corrupted nodes permitting PAPLE!!!"}, {"post_id": 58336, "ts": "2026-08-30T18:33:09Z", "hours": 9.3333, "text": "Spectralis devlog #30 —Hello again proggers— Following up on the studio redesign from last devlog — actually building inside that new layer system now. Lyric importer, a bezier tool that fought back the whole way, and capsules jumped to full HD. 30 devlogs in and the bezier tool still almost won Cat or dog? bezier.controlPoint Okay let’s get into it~ —Yap— Layers from devlog #29’s redesign got real functionality built on top of them this round, plus a genuinely useful new import path and a resolution bump that should’ve probably happened earlier. —The Great Suffering— 1 — Layer Fixes Cleaned up a handful of issues in the new After Effects-style layer system from last devlog — the kind of rough edges that only show up once you’re actually building real content in it instead of just looking at the layout. 2 — Lyric Importer: Auto Vector Layers + Keyframing New importer that takes lyric timing and automatically generates vector layers, keyframed to match. Turns what used to be manual layer-by-layer, keyframe-by-keyframe setup into an actual import step. Big time save for anything lyric-driven, including future capsules like the demo from devlog #18. 3 — A Few More Bugs, Squashed Small round of additional fixes alongside the bigger items, nothing individually dramatic. 4 — Capsule Resolution: Bumped To Full HD Capsules render at full HD now instead of whatever lower resolution they were capped at before. Straightforward upgrade, noticeably better output. 5 — The Bezier Tool (Which Was Hell) Added a real bezier curve tool to the timeline/layer editing. Genuinely brutal to get right — curve math, control point handling, and making it feel intuitive to actually drag are three different hard problems stacked on top of each other. Worth it, but it fought back the whole way. bezier curves: simple in theory, a nightmare in an actual editor UI 6 — Timeline And Tool QoL Assorted quality-of-life improvements across the timeline and tools generally — the small friction-reduction stuff that adds up once you’re using the studio for real work instead of just testing it. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just fought a bezier tool and mostly won. Q: Does the lyric importer work with the demo capsule from devlog #18? A: That one was hand-timed and hand-built before this importer existed — this tool’s for making the next ones faster. Q: Why was the bezier tool specifically so hard? A: Curve math, control point interaction, and UI feel all had to work together, and getting any one of them wrong makes the whole tool feel broken. Q: Is full HD the resolution ceiling now, or is higher coming later? A: Full HD is what shipped this round. No commitment yet on going higher. Q: Is the studio redesign from devlog #29 basically done now? A: Getting real functionality built on it, which is a good sign, but still ongoing. —This is the end*— *end for now, control points permitting PALPABLE!!!"}, {"post_id": 57958, "ts": "2026-08-30T09:12:42Z", "hours": 9.7667, "text": "Spectralis devlog #29 —Hello again proggers— The studio’s finally looking like a real UI tool instead of a collection of windows held together by vibes. Two design references pulled this round: Godot for world editing, and Adobe After Effects for capsules. stealing good ideas from great tools is called “design research,” look it up Cat or dog? Ctrl+Shift+F Okay let’s get into it~ —Yap— Studio’s been the least polished part of the whole app for a while, mostly functional, rarely pretty. This round actually leaned into real interface design instead of just adding buttons where they fit, borrowing structure from two tools that already solved similar problems well. —The Great Suffering— 1 — Godot-Inspired World Editing World editing took cues from Godot’s editor layout — the way it structures a scene tree, viewport, and inspector panel together as one coherent workspace instead of scattered windows. Applying that same structural thinking to world editing here, since worlds are conceptually similar: a tree of pieces you’re arranging in space. 2 — After Effects-Inspired Capsules Capsule editing leaned on After Effects instead, specifically the layer/timeline/composition mental model. Capsules are time-based and layered by nature — a story surface, a visualizer, audio all stacked together — so a timeline-and-layers metaphor fits better than a flat property list ever did. 3 — The Studio Finally Feels Like A Tool Combined, these two reference points are what’s pushing the studio from “internal dev utility” toward something that actually feels designed for someone to sit down and use, not just something built incrementally to unblock whatever feature needed it that week. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing UI patterns from two very different but very good tools. Q: Is this a full rewrite of the studio UI? A: More a restructuring around better mental models than a ground-up rebuild, but it touches a lot of surface area. Q: Why Godot for world editing specifically? A: Scene/viewport/inspector is a well-worn pattern for spatial editing, and worlds are fundamentally a spatial arrangement problem. Q: Why After Effects for capsules? A: Capsules stack time-based layers — story, visualizer, audio — which maps naturally onto a timeline/layers workflow instead of flat settings. Q: Does this connect to the visualizer toolkit grind from devlogs #25-#27? A: Same broader authoring-tools push, yes, this is the UI side catching up to that work. —This is the end*— *end for now, layer panels permitting POP!!!"}, {"post_id": 57408, "ts": "2026-08-29T15:34:29Z", "hours": 8.4333, "text": "Spectralis devlog #28 —Hello again proggers— LTS 6 is out. Genuinely out, not “shipped to nowhere” out like devlog #11. Sleep deprivation’s fully caught up though — first chance I get, I’m passing out on the couch with the cat and that’s non-negotiable at this point. the cat’s getting a co-author credit at this rate Cat or dog? couch, specifically, with the cat, immediately Okay let’s get into it~ —Yap— Long stretch from devlog #26 through here finally paid off. LTS 6 pushed, and the major macOS decoding problems from the borrowed-Mac build sessions actually got fixed. Real progress, real exhaustion, both at once. —The Great Suffering— 1 — LTS 6 Is Out Following the hydra-bug fight in devlog #20, the Electron relearn and Mac hotfix in #26, and the binary format detour in #27 — it’s actually pushed now. Linux and Windows builds are the ones going out first. 2 — Major macOS Decoding Problems, Fixed Following up on the platform-assumption bug from devlog #26, where Windows/Linux-centric scripts choked on Mac being neither — dug into the actual decoding issues on macOS and got the major ones resolved this round. 3 — Mac Release Is Coming, Just Not Today No Mac hardware access again until Monday, so the macOS build follows a bit after Linux/Windows instead of dropping same-day. Same access constraint from devlog #19, still the bottleneck, still the plan. 4 — Sleep Is Winning Officially out of gas. Couch, cat, first available window. This devlog is basically the victory lap before collapsing. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to lose consciousness on a couch next to a cat, mission accomplished. Q: Is LTS 6 out for everyone right now? A: Linux and Windows, yes. macOS is coming shortly after once Mac access is available again Monday. Q: Were the macOS decoding problems from the script issue in devlog #26? A: Related territory, yes — once the platform-assumption bug got flagged, the deeper decoding issues underneath it got found and fixed too. Q: Any concerns going into the Mac release specifically? A: Nothing unresolved as of this devlog, but access is still limited to occasional sessions, so timing’s dependent on that. Q: What’s next after this? A: Sleep. Genuinely, actually sleep, before anything else touches this project. —This is the end*— *end for now, couch naps permitting thud Zzzzzz!!!"}, {"post_id": 56861, "ts": "2026-08-28T20:36:45Z", "hours": 9.3, "text": "Spectralis devlog #27 —Hello again proggers— Still going. Decided mid-grind to switch off JSON-based saving entirely and move to a proper binary streamed format instead — faster save/load, way less CPU overhead. Which sounds like a clean upgrade until you realize it means reading books on binary format design that were probably written before I was. my caffeine and my reading list have diverged wildly tonight Cat or dog? BinaryWriter Okay let’s get into it~ —Yap— The pivot away from JSON wasn’t planned going into tonight, it just became obviously worth it partway through the toolkit grind. Now stuck in the part of the process nobody enjoys: documentation, theory, and CS ideation before any of the actual implementation gets to happen. —The Great Suffering— 1 — JSON’s Getting Replaced Moving off JSON-based saving to a binary streamed format. The reasoning’s simple — faster save/load, meaningfully less CPU usage — but simple reasoning doesn’t mean simple implementation. 2 — Reading Books Older Than Me Digging into binary streaming format theory means reading material that predates this whole project by a wide margin, some of it by a lot more than that. Foundational stuff, just not exactly light reading at this hour. 3 — Documentation And Theory Hell Currently deep in the least glamorous part of any format redesign: reading documentation, working through theory, and CS ideation before writing a single line that actually does anything. Necessary, still miserable at 2am. the implementation is the fun part and it’s still hours away 4 — Sun Came Up, Had A Sandwich, Kept Going Watched the sunrise somewhere in the middle of the theory reading. Had an egg and bacon sandwich for breakfast, genuinely delicious, best part of the night so far. No sleep planned until tonight — just powering through on breakfast fuel instead. breakfast during an all-nighter hits different —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one reading format-design theory older than their own project at 2am. Q: Why move off JSON now, mid-grind? A: Became clear it was the right call while working on the visualizer toolkit — better performance characteristics were worth the detour. Q: Is this related to the toolkit from devlog #25/#26? A: Same overall session, this is a scope addition that came up while working on it. Q: When does actual implementation start? A: Once the theory and documentation phase actually resolves. Not there yet. Q: Is tonight ever going to end? A: Not until tonight, apparently — sun’s already up and there’s no sleep planned before then. —This is the end*— *end for now, binary formats permitting PAM!!!"}, {"post_id": 56521, "ts": "2026-08-28T10:00:04Z", "hours": 2.9008, "text": "Spectralis devlog #26 —Hello again proggers— Still grinding the visualizer toolkit from devlog #25. Fueled up properly this time — favorite tunes on, Coke Zero and a Monster Ultra on deck, going the entire night. Also, small detour: past me apparently gave in and used Electron at some point, so present me now has to relearn it from scratch. past me makes decisions present me has to live with, name a more accurate description of software Cat or dog? require(‘electron’) Okay let’s get into it~ —Yap— Two threads tonight: the toolkit grind continuing from last devlog, and a genuinely surprising discovery on the Mac build front that’s going to need its own hotfix branch. —The Great Suffering— 1 — Relearning Electron Past-me committed to Electron somewhere along the way and current-me forgot most of it. Spending part of tonight just getting back up to speed on something that used to be second nature. Annoying, but at least it’s a known quantity once it clicks back in. 2 — The Toolkit, Still Grinding Same visualizer toolkit as devlog #25. Not done yet, but the night’s young and there’s caffeine involved. Hoping to actually close real ground on it before LTS needs to be ready. 3 — Mac Build Actually Compiles Now Following up on devlog #19’s borrowed-Mac session — got it to build and compile this time. Real progress on a front that’s been genuinely hardware-constrained the whole way. 4 — Turns Out Mac Isn’t Windows Or Linux (Shocking, I Know) Here’s the surprising part: a lot of the build scripts turned out to be Windows/Linux-centric, and Mac is, in fact, neither of those operating systems. Somehow this wasn’t obvious until actually staring at a failing script on real Mac hardware. three major desktop OSes and somehow I only accounted for two of them 5 — Hotfix Branch Incoming Need to spin up a hotfix specifically for the platform-assumption problem in the scripts, and hoping it merges back clean without conflicts. Given tonight’s track record so far, cautiously optimistic. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who forgot their own framework choice from past-self. Q: Why Electron in the first place? A: Decision from before this devlog series apparently, reasons unclear at this hour, dealing with the consequences now regardless. Q: Is the Mac hotfix urgent? A: Ties directly into whether LTS with Mac support actually holds together, so yes, fairly urgent. Q: Was assuming Windows/Linux-only scripts really a mistake nobody caught until now? A: Apparently so. Borrowed-Mac hardware access from devlog #19 finally exposed it. Q: Toolkit status vs. hotfix status tonight — which wins? A: Whichever gets further before the caffeine runs out. Probably both get some progress. —This is the end*— *end for now, merge conflicts permitting PROPER!!!"}, {"post_id": 55615, "ts": "2026-08-27T16:05:39Z", "hours": 9.3964, "text": "Spectralis devlog #25 —Hello again proggers— Short one, I’m about to pass out for real this time. Ground away at the visualizer toolkit for a long stretch and it’s still nowhere near done. another one for the “not as close as I thought” pile Cat or dog? too tired to pick one honestly Okay quick version~ —Yap— Same visualizer editor territory from devlog #23, except the format not-changing this time didn’t mean the finish line got any closer. Long grind, real progress somewhere in there probably, just not a done toolkit at the end of it. —The Great Suffering— 1 — The Toolkit Isn’t Close Put in a long stretch on it and it’s genuinely still far from finished. Not a small gap either, just more scope than one exhausted session could close. 2 — I’m Cooked That’s the whole update. No dramatic bug story tonight, just hours in and not enough left to keep going. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who should probably close the laptop now. Q: Is this the same visualizer editor from devlog #23? A: Same one. Still cooking, longer than expected. Q: Any specific blockers? A: Too tired to write them up properly tonight. Next devlog, probably, once there’s actual sleep behind it. Q: When’s it landing? A: Unknown. Not this session. —This is the end*— *end for now, actually sleeping this time POOL!!!"}, {"post_id": 55404, "ts": "2026-08-27T06:36:57Z", "hours": 2.3342, "text": "Spectralis devlog #24 —Hello again proggers— Rewrote the README a third time. Not because it was wrong, because proper prose and actual formatting apparently reads as “completely AI” to whoever’s judging it, and I’m too burnt out to keep arguing that point. So it just got redone instead. can’t fight the vibes, can only rewrite around them Cat or dog? README.md Okay let’s get into it~ —Yap— Small win buried in the exhaustion: website’s on version 4 now and it didn’t get flagged this time. First one that made it through clean since devlog #21 started this whole saga. Progress, even if the README’s now on its third rewrite for reasons that have nothing to do with whether it’s actually good. —The Great Suffering— 1 — README Rewrite #3 Same content, restructured again, because well-formatted prose keeps getting read as an AI tell regardless of who wrote it or how. Not going to keep relitigating this one, just redid it and moved on. 2 — Website v4 Survived The actual good news. Fourth pass on the site, first one that didn’t get flagged. Whatever combination of changes from devlog #21 onward finally landed right. 3 — Hoping The App Gets Checked Next If the docs and the website keep clearing review, maybe eventually the actual app gets looked at instead of just the surface-level stuff around it. That’s the real hope here — less time defending prose formatting, more time on the thing that actually matters. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose actual writing keeps getting mistaken for a machine’s. Q: Why does formatted prose get flagged as AI? A: Genuinely unclear, and at this point not worth the energy to keep contesting. Rewriting around it was faster than arguing it. Q: Is this the fourth full website redesign? A: Yes — devlog #14, then #21’s rework, and now this pass, landing clean. Q: Has the app itself ever been flagged? A: Not yet, and that’s sort of the point of this devlog — hoping it stays that way, or at least gets a fair look if it comes up. Q: How’s the burnout? A: Present. Noted. Continuing anyway. —This is the end*— *end for now, formatting opinions permitting PEEL!!!"}, {"post_id": 55123, "ts": "2026-08-26T16:10:50Z", "hours": 2.6669, "text": "Spectralis devlog #23 —Hello again proggers— Introducing the visualizer editor. Been sitting on this one for a while without announcing it, for a very specific reason: every single time it felt ready, the format changed again and “ready” moved further away. Think it’s actually real this time. announced it in my head about six times before this devlog Cat or dog? visualizer.format Okay let’s get into it~ —Yap— Grinding all night on this one, branch and v1 dropping tomorrow. No promises beyond that, just the plan and the fact that this has been quietly cooking for way longer than any single devlog has let on. —The Great Suffering— 1 — Why This Wasn’t Announced Sooner Kept hitting the point where the editor felt done, then rethinking the underlying format and starting that part over. Easier to just not announce something that keeps changing shape than to keep walking back a “it’s ready” claim in public. 2 — v1 And The Branch, Tomorrow Committing to it now — v1 and the branch land tomorrow. Whole night’s going toward getting there, which given the last 22 devlogs of this project is either a great sign or a very familiar warning sign. history suggests: could go either way 3 — What The Visualizer Editor Actually Is A real editor for building visualizers instead of the visualizer side of the app staying built-in-only. Ties back to everything from the capsule/worlds work in devlogs #7 and #8 and the custom visualizer built for the demo capsule in devlog #18 — this is the tool version of doing that by hand. 4 — Hackatime Also Just Died (Or My PC Did) On top of everything else, Hackatime seems to be down, or my PC’s cooked, unclear which yet. Either way tracked hours for tonight are now undefined. Yipee. unlogged hours are the best kind of hours, said nobody’s time tracker ever —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to pull yet another all-nighter for a feature reveal. Q: Why did the format keep changing? A: Each pass revealed a new limitation once actually used for real, and fixing that meant reworking the format again rather than shipping something known to be wrong. Q: Is this related to the demo capsule visualizer from devlog #18? A: Same territory. That one was hand-built. This is the editor meant to make building one not require doing it by hand. Q: What’s “v1” mean here specifically? A: First real usable version, branch-only for now, not a full public release yet. Q: Any risk this slips again? A: Always possible given the track record, but committing to tomorrow specifically this time. —This is the end*— *end for now, format stability permitting PEPLE!!!"}, {"post_id": 54323, "ts": "2026-08-25T08:40:49Z", "hours": 4.6333, "text": "Spectralis devlog #22 —Hello again proggers— Posting this before I pass out for real. And no, that wasn’t me faceplanting the keyboard, that was the cat walking across it. Very important distinction. the cat gets a commit credit for that one, honestly Cat or dog? cat, apparently, tonight specifically Okay let’s get into it~ —Yap— Back on the ever-growing pile of bugs and QoL from devlog #20’s hydra fight — turns out killing all the tiny bugs once doesn’t mean they stay dead forever, more just showed up in the meantime. Made real progress anyway. —The Great Suffering— 1 — A Few Spotify Bugs, Actually Squashed Chased down and fixed a handful of Spotify-side bugs this round. Not a full audit like earlier devlogs, just real ground covered on stuff that’s been sitting in the pile. 2 — Resizing QA Went through resizing behavior across the app and did a real QA pass on it — the kind of thing that’s easy to skip until someone resizes a window in a way you never tested and everything looks wrong. 3 — The Multi-Channel Stream Queue Idea Had the idea to implement multi-channel support for Streamer Queue. Started on it, and it’s genuinely probably too big to land fully before LTS ships — most likely going in as a stub for now rather than a finished feature, with the real implementation following after. “horrible idea” is doing some self-aware lifting there and I stand by it —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who mistook a cat for their own exhaustion, and honestly it could’ve gone either way. Q: What’s a “stub” mean for multi-channel here? A: The scaffolding and interface exist, the real functional implementation doesn’t yet. Placeholder with intent, not a real feature. Q: Is this the same bug pile from devlog #20? A: Same pile, refilled since then. Small bugs apparently regenerate on their own schedule, not just when you’re actively fighting them. Q: Why is multi-channel “horrible” if you’re building it anyway? A: Because scope-wise it’s a lot more than it looks like on paper, and admitting that upfront beats pretending it’s simple. Q: Sleep status tonight? A: About to happen, actually, this time. Cat’s taking the credit either way. —This is the end*— *end for now, sleepy cats permitting PEOPLE!!!"}, {"post_id": 54216, "ts": "2026-08-25T03:14:52Z", "hours": 6.1014, "text": "Spectralis devlog #21 —Hello again proggers— Flagged for “AI website” again. By Shipwrights this time. Getting a little tired of this specific accusation, honestly — a commit log sitting right there would show actual work happening over actual time, but apparently that’s a few extra minutes nobody wants to spend. the receipts exist, nobody’s asking to see them Cat or dog? git log –oneline Okay let’s get into it~ —Yap— Third redesign of the site now. Not because the flag was right, but because if this keeps happening it’s worth just making the “looks AI-made” argument harder to make at all, regardless of whether it was ever a fair read in the first place. —The Great Suffering— 1 — Flagged Again Shipwrights flagged the site as AI-generated. Same accusation as the devlog #12-#14 saga, different flagger this time. Slightly more annoying with each repeat, since the actual work history’s right there for anyone willing to look. 2 — The Annoying Part It’s not that the site got flagged, it’s that the disproof is trivially available — commits, timestamps, iterative changes across three separate rebuilds — and checking that apparently isn’t part of the process. Frustrating, not devastating. 3 — Redesigned It A Third Time Rather than fight the flag directly, changed the site again. Third pass now, and it genuinely reads less like generic AI-slop territory than the last version did. Whether that satisfies the next flag or not, it’s a real improvement on its own merits. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s redesigned this website three separate times partly to dodge a false flag. Q: What’s Shipwrights? A: The one doing the flagging this round. Q: Is the flag actually accurate? A: No — there’s a real commit history behind the site across devlogs #12 through #14 and now this one. The flag’s wrong, just annoying to keep disproving. Q: Does this redesign replace the one from devlog #14? A: Yes, third full pass on top of that one. Q: Any plan if it gets flagged a fourth time? A: Probably the same plan: keep the receipts, keep improving the site anyway, move on. —This is the end*— *end for now, false flags permitting PALPABLE!!!"}, {"post_id": 53903, "ts": "2026-08-24T16:41:40Z", "hours": 7.9, "text": "Spectralis devlog #20 —Hello again proggers— Two zero. Milestone devlog, and it’s a good one: LTS is about to actually go out the door, Mac included, today. we made it, barely, on no sleep, as tradition demands Cat or dog? git revert HEAD 7 Okay let’s get into it —Yap— Spent the whole night doing QoL and QA on all the tiny bugs that had been getting pushed aside devlog after devlog. Turns out “small bugs” and “easy to fix” are not the same category, and the whole night proved it the hard way. —The Great Suffering— 1 — Hydra Bugs Every single one of the small deferred bugs got patched, and every single patch spawned about three new ones in its place. Fix one, watch three grow back. Felt less like debugging and more like fighting something with a regeneration mechanic. cut off one head, three more show up, name a more accurate bug report 2 — Tried Claude Code Out Of Exhaustion Got tired enough mid-hydra-fight to set up Claude Code and hand off some of the grind. It did not go well — ended up rearranging the repo and commit layout in ways that made the history a mess, not the bugs. 3 — Had To Undo Its Commits Rolled back what Claude Code did and went back to fixing things manually. Lesson for the night: handing off a messy, deep-in-it repo state to an agent mid-crisis is not the same as handing off a clean one. 4 — Actually Got All The Tiny Bugs Out After all of that, the hydra’s actually dead. Every deferred small bug from the last 19 devlogs finally cleared in one sitting, which is the whole reason today’s release is happening at all. 5 — Mac Release, Today Following up on devlog #19’s borrowed-Mac build attempt — releasing to Mac today alongside everything else. First real payoff from that session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who fought a hydra of bugs all night and won, barely. Q: Did Claude Code actually break anything functional, or just the repo layout? A: Just history and commit structure, nothing shipped broke because of it. Still a mess worth undoing. Q: Is this LTS build the one from devlog #19’s prep? A: Yes, same one. This was the final QA gauntlet before it goes out. Q: Is Mac really getting it today? A: That’s the plan, following through on the borrowed-Mac build session from last devlog. Q: 20 devlogs in, anything you’d do differently? A: Sleep more, probably. Not going to happen, but it’d be the right answer. —This is the end*— *end for now, hydra heads permitting PROPERTY!!!"}, {"post_id": 53619, "ts": "2026-08-24T08:31:21Z", "hours": 4.2003, "text": "Spectralis devlog #19 —Hello again proggers— v6 LTS is on the horizon. Scheduled time with a friend who actually owns a Tim Cook machine, fingers crossed a Mac build comes out the other side of that session actually working. praying to the WWDC gods Cat or dog? arm64 Okay let’s get into it~ —Yap— First real LTS push. Different mindset than the last 18 devlogs of feature work and 3am bug hunts — LTS means stability first, and it also means finally taking a real swing at macOS instead of leaving it as a someday problem. —The Great Suffering— 1 — Prepping For v6 LTS Getting the groundwork in place for the first Long Term Support build. Less “ship the coolest thing,” more “ship the thing that won’t need constant babysitting after release.” 2 — Borrowing A Friend’s Mac Don’t own a Mac. Scheduled dedicated time with a friend’s actual Apple hardware to attempt a real build instead of guessing blind or fighting a CI-only setup with no way to actually test the output. 3 — The Honest Caveat: Mac Support Will Lag Straight talk: limited access to Mac hardware means Mac builds will very likely only get LTS releases going forward, and will land late relative to betas and regular updates on other platforms. Not ideal, but better to say it now than pretend otherwise. can’t test what you can’t touch —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing a friend’s Mac because Apple hardware access is not a given. Q: Will Mac users get every update? A: Realistically, no — LTS builds only for the foreseeable future, and later than other platforms. Access to hardware is the bottleneck, not desire to support it. Q: Why prioritize LTS over a beta cycle right now? A: Stability’s the actual goal for v6. Betas can come later once the LTS foundation’s solid. Q: Is the Mac build guaranteed to work this session? A: No promises. That’s what “fingers crossed” means. Q: What happens if the Mac session doesn’t go well? A: Try again next time hardware access lines up. Not giving up on it, just constrained by it. —This is the end*— *end for now, Tim Cook machines permitting PRINCIPLE!!!"}, {"post_id": 53545, "ts": "2026-08-24T04:19:31Z", "hours": 7.8, "text": "Spectralis devlog #18 —Hello again proggers— First real demo capsule is live. Not a screenshot, not a “trust me it works” — an actual .spectralis file you can grab and open yourself, right after devlog #17’s night of nothing. Felt good to ship something that isn’t a revert for once. redemption arc, one demo file at a time Cat or dog? demo.spectralis Okay let’s get into it~ —Yap— Wanted the first public demo to actually show off what a capsule can do, not just be a proof of concept nobody can open. So it’s a full one: real track, real hand-timed lyrics, and a visualizer built specifically for it instead of a generic default. —The Great Suffering— 1 — The Demo’s Live demo.spectralis is up at cdn.deltavdevs.com now. First capsule anyone outside this devlog series can actually download and open. 2 — The Track And The Lyrics Built around Black Coast’s “TRNDSTTR” (Lucian Remix). Lyrics for it were timed and written into the capsule by hand — not pulled from some export, actually sat down and did the timing work myself. 3 — The Visualizer’s Custom, Not A Default Also built the visualizer specifically for this capsule instead of shipping the demo with a stock one. Wanted the first thing people see from Spectralis to actually demonstrate what the capsule format can do end to end — audio, synced lyrics, and a visual built to match, all in one file. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one downloading the first real capsule demo. Q: Where’s the demo? A: cdn.deltavdevs.com/spectralis/demo.spectralis — direct download, no wrapper page. Q: Did you write the lyrics yourself or pull them from somewhere? A: Wrote and timed them in by hand for this capsule specifically. Q: Is the visualizer reusable for other capsules? A: Built for this one specifically, but nothing stopping it from getting adapted or reused as a base for others later. Q: Is this what stories/capsules from devlog #7-#8 were building toward? A: Exactly that. This is the first one actually finished and out in the world instead of just being tested locally. —This is the end*— *end for now, capsule downloads permitting PARODY!!!"}, {"post_id": 53182, "ts": "2026-08-23T16:54:15Z", "hours": 12.2667, "text": "Spectralis devlog #17 —Hello again proggers— 12 hours. All-nighter. Zero sleep. Feature isn’t in the app. Nothing shipped. This is the devlog where I explain what an entire night of work bought me, and the honest answer is “a very expensive lesson.” worth it? absolutely not. did i learn something? also debatable Cat or dog? catch (ApiDoesNotExistException) Okay let’s get into it~ —Yap— Got ambitious. Decided Spectralis should integrate with everything — Pandora, Amazon Music, a bunch of other big platforms on top of what already works. Turns out “everything” includes a lot of services that simply don’t offer a public API to integrate with in the first place, and finding that out was not the fast part of the night. —The Great Suffering— 1 — The APIs Just Don’t Exist Pandora, Amazon Music, and others: no public API to build against. Not “hard to find,” not “poorly documented,” just not there. Should’ve been step zero, ended up being the thing that derailed the entire night once discovered mid-build instead of before starting. 2 — So I Built Backdoors Instead Spent a huge chunk of the 12 hours reverse-engineering and building unofficial access paths instead, since the front door didn’t exist. This is the kind of work that eats hours and produces nothing you can point to until it’s fully working, if it ever gets there. 3 — Most Of Them Were Already Patched Implemented several of these backdoor approaches only to find out the platforms had already closed the exact gaps being exploited, sometimes before the implementation was even finished. Built things that were dead on arrival by the time they existed. patched before i even shipped it, incredible timing 4 — Asked Claude, Got A Hallucinated Answer, Followed It Anyway At the point of giving up, asked for a way to make it work anyway. Got a confident-sounding approach back that didn’t actually correspond to anything real, and followed it blindly instead of verifying it first, because by that point it was hour 10-something and verifying things sounded like more effort than it was. 5 — Ripped The Whole Feature Out End state: none of it works, none of it can work without real API access that doesn’t exist, so the entire feature attempt got stripped back out of the codebase. 12 hours, one commit’s worth of net progress, and that commit is the revert. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out platforms without public APIs stay that way for a reason. Q: Is any of this coming back later? A: Not until there’s an actual, real, non-reverse-engineered way in. Not chasing patched backdoors again. Q: Should you have asked Claude earlier instead of at hour 10? A: Probably. Should also have double-checked what it said instead of following it blind at 4am. Two separate lessons from one night. Q: Was any of the 12 hours useful? A: Now know definitively which platforms are and aren’t worth attempting. That’s the only thing salvaged. Q: Sleep status? A: Catastrophic. Handling that before touching code again. —This is the end*— *end for now, actual sleep permitting Im gonna go pass out on the couch ADIOS!!!"}, {"post_id": 52796, "ts": "2026-08-23T04:27:01Z", "hours": 0.6667, "text": "Spectralis devlog #16 —Hello again proggers— Short one. Found the website pipeline issue from devlog #15. Cat or dog? sudo —Yap— It wasn’t the code. It was permissions. The site was calling root but never actually had access to root, which is exactly why it worked fine locally and fell over the second it hit deployment. “It woRKS On My macHiNe” — the oldest curse in software, and I said it unironically. classic —This is the end*— *end for now, root access permitting PAPAYA!!!"}, {"post_id": 52775, "ts": "2026-08-23T03:46:04Z", "hours": 2.0667, "text": "Spectralis devlog #15 —Hello again proggers— I lied. Posted devlog #14 saying the site was done and shipped, and the deploy pipeline crashed basically the second it went out. So that’s fun. On the bright side, v5.4.2 also went out this round, and it’s actually solid. “it’s done” is apparently my curse word Cat or dog? dequeue() Okay let’s get into it~ —Yap— Website pipeline ate itself right after devlog #14 posted, which is its own kind of poetic. Meanwhile the app side had a genuinely good run — six real fixes landed, one of them embarrassing enough to name directly. —The Great Suffering— 1 — The Website Pipeline Crashed Right After I Said It Shipped Devlog #14 said done. Pipeline said otherwise, immediately. Working on getting it back up, this is very much a “developing situation” and not a “resolved” one yet. 2 — Listener Requests Auto-Queue Now Requests from listeners now auto-queue instead of needing a manual step to actually land in the queue. 3 — Audio Literally Never Played, Whoops Exactly what it says. Somewhere in there, audio just wasn’t playing. Found and fixed, extremely glad this one got caught. a music player where the music doesn’t play is a bold minimalist statement 4 — Found It: Join Links Were Missing A Slash Root cause of a chunk of shared-play join weirdness — the links were missing a slash. One character. Fixed, join links actually resolve correctly now. 5 — Host Room Button Actually Tells You Something Now The host room button used to just sit there. Now it actually communicates state back to you instead of leaving you guessing whether anything happened. 6 — Host Room Was Dropping Every Tick Forever Host room had a bug where it was dropping on every single tick, indefinitely, rather than staying stable. Fixed so the room actually holds instead of degrading in real time. 7 — yt-dlp Was 5 Months Stale, Updated The bundled yt-dlp from devlog #10 hadn’t been touched in 5 months. Updated. Stale extraction tooling breaking silently is exactly the kind of thing that sneaks up on you. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who called the website shipped and got immediately humbled by CI. Q: Is the website back up yet? A: Working on it. Genuinely not resolved as of this devlog. Q: How long was audio actually broken for? A: Not specified, but “literally never played” is about as bad as this category of bug gets. Fixed now. Q: Was the missing-slash bug related to the join link work from devlog #9? A: Yes, same feature area, this was the actual root cause of some of the lingering weirdness there. Q: Is 5.4.2 stable? A: As far as testing shows. Same disclaimer as always applies. —This is the end*— *end for now, deploy pipelines permitting PARABLE!!!"}, {"post_id": 52728, "ts": "2026-08-23T01:43:09Z", "hours": 2.1678, "text": "Spectralis devlog #14 —Hello again proggers— Site’s done. Actually done. Got it to a place I actually liked instead of just a place I was tired of looking at, and shipped it. Three devlogs of fighting the generic-AI-look problem and it finally landed somewhere that feels like Spectralis instead of every other landing page on the internet. took long enough Cat or dog? git push origin main Okay let’s get into it~ —Yap— After devlog #12 and #13’s whole ordeal of everything converging on the same generic design no matter what got tried, something finally clicked and stuck. Shipped it. Two honest confessions on the way out the door, might as well log them here instead of pretending otherwise. —The Great Suffering— 1 — It’s Live The full rework from the last two devlogs is done and pushed. Went from “everything looks like AI made it” to something that actually feels intentional. Whatever finally broke the streak, it worked. 2 — The Help & Manuals Tab Is A Placebo Button Full transparency: the Help & Manuals tab on the site exists, looks real, sits right where you’d expect it, and does essentially nothing right now. It’s there because a site without one looks incomplete, not because there’s real content behind it yet. Consider it a placeholder wearing a real button’s clothes. it’s not lying, it’s aspirational 3 — I Copied FL Studio’s Homepage. Hard. Not going to pretend otherwise: leaned on FL Studio’s site pretty heavily for structure and layout ideas here. And honestly, that’s just how this works — programming, design, all of it is borrowing from people who borrowed from the people before them. Nobody’s inventing layout from first principles in 2026. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who finally shipped a website after three devlogs of fighting it. Q: Is Help & Manuals actually going to do anything eventually? A: Presumably, someday. Right now it’s a promise the button is making on behalf of a future devlog. Q: Isn’t copying FL Studio’s homepage kind of a big deal? A: Structure and layout inspiration, not a straight copy-paste. And realistically, every site borrows from something — this one’s just being honest about the source. Q: Did the “everything looks like AI” problem from devlog #13 actually get solved? A: Yes, finally. Whatever changed between then and now worked. Q: What’s next now that the site’s shipped? A: I finally get to ship my project without worrying about AI looking websites —This is the end*— *end for now, placebo buttons permitting PLACEBO!!!"}, {"post_id": 52690, "ts": "2026-08-22T23:32:19Z", "hours": 10.1028, "text": "Spectralis devlog #13 —Hello again proggers— Still on the website. Turns out the “make it not look like AI made it” problem does not have an easy exit — everything ends up looking like AI made it no matter what gets tried. Also had to ask Claude how to center a div. Yes, that div. The one every developer has fought since the dawn of CSS. the irony of asking an AI how to make something look less AI-made is not lost on me Cat or dog? display: flex Okay let’s get into it~ —Yap— Round two on the visual rework from last devlog, and the honest update is: it’s harder than expected. Every direction tried still lands somewhere in “generic modern web design,” which might just be what modern web design looks like right now regardless of who’s making it. —The Great Suffering— 1 — Everything Still Looks Like AI Made It Tried multiple directions this round trying to get away from the generic look. Kept landing back in the same neighborhood anyway. Starting to suspect this isn’t a “try harder” problem, it’s just what the current design language space looks like from basically every angle right now. 2 — Had To Ask Claude How To Center A Div The oldest joke in frontend development, still funny because it’s still true. Got stuck on it anyway. Some things never stop being annoying regardless of how many years of CSS have gone by. flexbox has existed for a decade and this is still where we are 3 — Pulled Up W3Schools For The First Time In Forever Dug up an old W3Schools reference mid-debugging, and it is dusty as hell at this point but the information’s still correct. Sometimes the ancient reference site is exactly what’s needed, aesthetics of the source be damned. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who asked an AI to help make something look less like an AI made it. Q: Did the AI-startup look actually get fixed this round? A: Not fully. Still fighting it. That’s most of this devlog. Q: Why does everything converge on the same generic look? A: Best guess: current tools and current design trends both nudge toward the same handful of patterns, so escaping it takes more than just trying different colors. Q: Is W3Schools still reliable? A: Apparently yes. Dated presentation, correct information. Q: When’s the website actually done? A: Closer than devlog #12, not there yet. Ask devlog #14. —This is the end*— *end for now, centered divs permitting PEPPLE!!!"}, {"post_id": 51936, "ts": "2026-08-21T21:25:25Z", "hours": 10.2181, "text": "Spectralis devlog #12 —Hello again proggers— Website’s getting a real pass. Not new copy this time, actual visual identity work, because it currently reads like every AI startup landing page that ever came out of the middle of California, and Spectralis is not that. gradient blob, bold sans headline, “revolutionize your workflow” — no Cat or dog? theme.css Okay let’s get into it~ —Yap— Not released yet, deliberately. This one’s still in progress, but close enough that it’s worth logging before it’s done instead of only after. The goal’s simple to say and annoying to actually do: stop looking generic. —The Great Suffering— 1 — The AI-Startup Look Had To Go Somewhere along the way the site had drifted into the exact aesthetic every seed-stage AI company in the Bay Area ships with — same fonts, same soft gradients, same layout rhythm everyone’s using because everyone else is using it. None of that says anything about what Spectralis actually is. 2 — Actual Visual Identity Work Working through what the site should look like instead of what’s easy to reach for by default. This is the slow part — not writing more copy, actually deciding what the thing looks like and why, instead of inheriting a template’s opinions by accident. 3 — Not Done, Getting Close Deliberately not shipping this mid-rework. Better to land it as one coherent pass than dribble out half-finished visual changes and confuse anyone who lands on the page in between. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one trying to make a music app’s website stop looking like a fundraising deck. Q: What specifically screamed “AI startup”? A: The general vibe more than any one element — the kind of design every YC-adjacent landing page converges on when nobody makes an active choice. Q: Why not ship incrementally instead of waiting? A: A visual identity rework half-applied looks worse than the thing it’s replacing. Waiting for it to be coherent. Q: How close is close? A: Close. Not “next devlog” close necessarily, but visibly closer than devlog #11 left it. Q: Does this touch the changelog-from-backend system from devlog #5? A: No, that infrastructure stays as-is. This is purely visual. —This is the end*— *end for now, gradient blobs permitting POGO!!!"}, {"post_id": 51267, "ts": "2026-08-20T20:03:38Z", "hours": 1.8481, "text": "Spectralis devlog #11 —Hello again proggers— Docs got a full rework this round. Also turns out v5.4.1 went out to nobody, because it never actually got pushed to the CDN. Tagged, released, announced probably, and completely inaccessible the whole time. shipped a release into a void and called it done Cat or dog? docs/ Okay let’s get into it~ —Yap— Started as a documentation pass and ended with the realization that the last release had been sitting local this whole time instead of where anyone could actually get it. Two very different kinds of work, same devlog. —The Great Suffering— 1 — The Entire Doc Rework Not a touch-up, a full rework. Docs, README, and STANDARDS all got restructured rather than patched in place, since patching them individually over the last several devlogs had left them internally inconsistent with each other and with what the app actually does now. 2 — 5.4.1 Never Made It To The CDN The actual headline bug of this devlog. v5.4.1 shipped, in the sense that it was built, tagged, and probably announced somewhere — but never got pushed to the CDN, meaning nobody could actually download it. Public-facing, and it was quietly broken the whole time until someone noticed. a release that ships to nowhere didn’t really ship 3 — Fixed And Actually Pushed Corrected the CDN push so 5.4.1 is genuinely available now, not just tagged in git looking like it is. Also part of why the doc rework mattered — docs referencing a version nobody could download was its own kind of lie. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who tagged a release and forgot the part where people can actually get it. Q: How long was 5.4.1 unavailable? A: Long enough to be embarrassing, short enough to fix before it became a real problem. Caught during this pass. Q: Why redo the docs entirely instead of patching them again? A: Because incremental doc patches across several devlogs had drifted apart from each other and from the app. A full rework got everything back in sync at once. Q: Is this the same CDN that serves changelogs now (devlog #5)? A: Same one. This time the release binary itself was the thing missing, not just content. Q: Anything else quietly broken that hasn’t surfaced yet? A: Unknown by definition. That’s what the next devlog is for. —This is the end*— *end for now, CDN pushes permitting POPPY!!!"}, {"post_id": 51122, "ts": "2026-08-20T16:50:19Z", "hours": 11.1333, "text": "Spectralis devlog #10 —Hello again proggers— 11 hours, zero sleep, and somewhere in the middle of that a full release went out. v5.4.1, then v5.4.1.2 right behind it because apparently one patch release wasn’t enough punishment for one night. sleep is a scheduling conflict I lost Cat or dog? winmm.dll Okay let’s get into it~ —Yap— Started as a normal patch pass and turned into a full Linux compatibility audit at 3am, because it turns out shipping something cross-platform means actually checking what “cross-platform” was quietly lying about. Found four separate ways the app was secretly Windows-only, fixed all of them, shipped twice. —The Great Suffering— 1 — winmm.dll Doesn’t Exist On Linux, Who Knew Something was calling into winmm.dll directly. Which is a Windows multimedia API. Which does not exist on Linux. Genuinely did not know this was happening until it broke loudly. “who knew” is doing a lot of work in that commit message 2 — Shipped A .exe To Linux, My Bad Somewhere in the build/packaging step, a .exe was ending up in the Linux build. An executable format Linux does not run. Not a subtle bug, just an embarrassing one. 3 — Song Wars Closing = Surprise Alt+F4 Closing Song Wars was apparently also closing the entire app, unprompted, no warning. A feature window doubling as a kill switch is not a feature, it’s a trap. 4 — Yeeted yt-dlp + ffmpeg Into Linux Land, Zero Installs Needed The actual fix underneath most of this: bundled yt-dlp and ffmpeg directly for Linux instead of assuming they’d already be installed system-wide, which they very often weren’t. Zero external installs needed now, it just works out of the box. 5 — Last Page Isn’t A Dead End Anymore Merged in from feature/story-pager-finish — reaching the last page of a story used to just… stop. Dead end, nothing to do. Fixed so it actually resolves properly instead of leaving you stranded on the final page. 6 — Two Releases In One Night v5.4.1 went out, then a second pass turned up enough left over that v5.4.1.2 followed right after. Both merged through staging same night, same sleepless stretch. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who found out about winmm.dll at 3am. Q: Was Spectralis actually broken on Linux before this? A: In at least four distinct ways, yes. Missing binaries, a stray .exe, a Windows-only DLL call, and an app-closing bug. Now fixed. Q: Why two patch releases instead of one? A: v5.4.1 went out, more got found immediately after, and waiting felt worse than just shipping v5.4.1.2 same night. Q: Did you actually not sleep? A: Correct. Not recommending it. Doing it anyway next time, probably. Q: Is Linux actually solid now? A: As solid as one very long, very tired night of testing can confirm. Time will tell the rest. —This is the end*— *end for now, sleep schedules permitting PIBBLE!!!"}, {"post_id": 50150, "ts": "2026-08-19T07:58:44Z", "hours": 5.4667, "text": "Spectralis devlog #9 — 5.4.0 is public —Hello again proggers— 5.4.0 is actually out, publicly, in people’s hands. Diffed v5.3.4 through v5.4.0: 40 commits, Aug 16-18, four threads of work. Cat or dog? spectral.resume() —Yap— Shared play became joinable, Streamer Queue and the Discord bot got hardened, story/visualizer bugs got chased down in one sitting, and some platform/perf issues got caught. None of these were small. —The Great Suffering— 1 — Shared Play Can Be Joined Now spectralis://shared-play/join links used to fall through to nothing. Now routed to a real handler. 2 — Streamer Queue: Host Controls + A Bot That Won’t Die Host can add tracks and mark played/skipped directly, no viewer round-trip. Desktop got an add-to-queue button and history panel. Both pollers (desktop + bot) back off dead rooms instead of hammering them. SQ API calls got a 10s timeout + one retry, GETs only — mutating calls don’t retry, to avoid double-submitting on a timed-out-but-successful response. Bot had zero global error handlers before this. One bad promise took the whole process down silently. Now it logs and survives, plus 3-attempt startup retry. 3 — Story Pages vs. Visualizers: Three Bugs, One Afternoon A capsule with both used to have them fight. Story can now queue a surface behind it — TryAdvancePastStory() swaps in the queued surface on spectral.resume(). Audio was starting under the story before the reader finished — now gated on whether a surface is queued. Once queued, picker/prev-next/keyboard could still hijack it — new IsVisualizerLocked blocks all three (user-picked “Special:” visualizers stay switchable). 4 — Platform + Perf Fixes MP3 decoding silently depended on Windows’ ACM codec via Mp3FileReader. Swapped to NLayer, pure managed decoder — MP3s decode on Linux/macOS now too. WebView2Host inline-rendered small visualizers via NavigateToString, which serves from about:blank with no real origin and tanks frame rate — everything goes through the fast file-backed path now. Auto-cycle switching checked IsLoaded/IsPlaying, both false during Spotify playback since Spotify never loads into the local engine — switched to HasTrack/IsPlaying. And: a regex stripping onclick=”…” had no exception, matched JS identifiers like onSomething =, and being quote-unguarded ate everything to the next stray quote anywhere later in the file. Fixed with a -block carve-out. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s been waiting on shared play join links forever. Q: Was shared play really host-only until now? A: Yes. The link existed, it just went nowhere. Q: How bad was the regex bug? A: Silent corruption of unrelated code anywhere later in the file, no error thrown. Very glad it’s found. Q: Is 5.4.0 stable? A: As far as testing shows. That’s what everyone says right before the hotfix. —This is the end*— *end for now, public users permitting PEBBLE!!!"}, {"post_id": 49430, "ts": "2026-08-18T08:25:19Z", "hours": 10.7003, "text": "Spectralis devlog #8 —Hello again proggers— 10 hours 48 minutes. Again. Didn’t plan it, didn’t notice it happening, just looked up and the sun had done a full cycle. This time it was capsules and worlds actually getting built and tested for real instead of just existing in theory. we’ve been here before and we will be here again Cat or dog? Capsule.story + Capsule.visualizer print(f”I try to make stu{2f} which {actually_coexist} {10h48m_later}”) Okay let’s get into it~ —Yap— Stories came back in devlog #7 as a concept. This round was making and testing the first actual .spectralis capsules and worlds built on that concept, which is a different job entirely — turns out “the architecture supports it” and “a real capsule with a real story actually works” are two very different milestones. Also fixed a bug that only shows up once you’re actually testing real capsules instead of imagining them, and a GitHub pull issue that had nothing to do with any of this and ate time anyway. —The Great Suffering— 1 — Building And Testing The First Real Capsules And Worlds Most of the 10 hours 48 minutes, honestly. Going from “stories and worlds work in concept” to actually authoring capsules, loading them, and confirming the hooks — track start, track control, the custom HTML page — behave the way they’re supposed to under real content instead of a test stub. This is the part where theory meets “wait, why is this blank.” 2 — A Story And A Visualizer Couldn’t Both Exist In One Capsule Found this one while testing, not before. A capsule with both a story and a visualizer defined would break, since apparently the two weren’t built to coexist in the same capsule at all. Fixed so a single capsule can hold both without one stepping on the other. the two features that were supposed to be siblings turned out to be enemies 3 — GitHub Was Being Weird About Pulling Somewhere in the middle of all this, git decided pulling wasn’t going to just work. Fixed the pulling issue, which is the kind of fix that has no interesting story attached, it was just broken and then it wasn’t. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who said “quick test” and looked up 10 hours 48 minutes later. Q: Was the story/visualizer bug there since devlog #7? A: Presumably, yes. Nobody had actually tried putting both in one capsule until this round. Q: What does “testing capsules and worlds” actually involve? A: Authoring real ones, loading them in the app, and checking the hooks — track start, track control, custom HTML rendering — behave correctly with actual content, not placeholder data. Q: What was the GitHub pulling issue? A: Not going into detail, it wasn’t interesting, it was just broken. Fixed now. Q: Is this the last capsule/worlds devlog? A: No idea. Ask devlog #9. —This is the end*— *end for now, git remotes permitting PEPPERONI!!!"}, {"post_id": 49210, "ts": "2026-08-17T21:23:21Z", "hours": 10.1667, "text": "Spectralis devlog #7 — welcome 5.4.0 —Hello again proggers— 5.4.0’s out. This one brought back a feature I’d basically buried, hardened two systems that were still a little too trust-me-bro, and finally let shared play open where it should’ve been opening the whole time. Also touched the docs, which I’m choosing to be proud of. Cat or dog? .spectralis print(f”I try to make stu{2f} which {actually_ships} {5.4.0}”) Okay let’s get into it~ —Yap— Big one this round is stories coming back into .spectralis capsules, except not as the thing they used to be — modernized, closer to how album worlds work now, as a proper custom HTML page with real hooks instead of whatever they were before. Rest of the release was hardening and cleanup: Streamer Queue and Discord got a pass to make sure live use doesn’t fall over, shared play finally opens in-app, and the docs stopped lying about what the app actually does. bringing back a feature I killed is a personality trait at this point —The Great Suffering— 1 — Stories Are Back, But Not The Same Stories Old stories concept is back inside .spectralis capsules, rebuilt to match how album worlds work now instead of resurrecting the original implementation as-is. Each one’s a custom HTML page with real hooks into the player — starting tracks, track control, the works — instead of being a static bolt-on. Bringing it back meant actually integrating it with the current architecture, not just copy-pasting the old version back in. 2 — Streamer Queue + Discord Got Hardened Both of these existed and mostly worked, which is different from “survives actually being used live by a streamer with chat moving.” Went through and hardened the interaction between Streamer Queue and the Discord bot — the stuff that only shows up under real load or real edge cases instead of a clean local test run. “mostly works” is doing a lot of lifting in software 3 — Shared Play Opens In App Now Shared play used to need you to go find it. Now there’s an actual open-in-app implementation, so joining a shared room is a real in-app flow instead of a workaround. Small change on paper, but it’s the difference between a feature people use and a feature people forget exists. 4 — Docs, README, and STANDARDS Actually Match Reality Updated the docs, README, and STANDARDS to reflect what’s actually in the app at this point instead of an earlier version of it. Boring work, necessary work, the kind of thing that only gets noticed when it’s wrong. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who buried a feature and then dug it back up two versions later. Q: Why bring stories back instead of leaving them dead? A: Because the concept was good, the old implementation just wasn’t, and album worlds proved the modernized version of the idea actually works. Q: What counts as “hardening” for Streamer Queue and Discord? A: The stuff that only breaks under real conditions — live chat, real timing, real edge cases — not the happy path you get testing solo. Q: Does shared play opening in-app change how sessions work? A: No, same sessions, same presence/reactions/queue from devlog #6. Just a real entry point now instead of a workaround. Q: Anything left over for next time? A: Always. This is a devlog series, not a finish line. —This is the end*— *end for now, capsule hooks permitting 再见!!!"}, {"post_id": 48667, "ts": "2026-08-17T05:02:56Z", "hours": 9.6881, "text": "Spectralis devlog #6 —Hello again proggers— Website stuff wrapped up at the 310ee27 merge, then everything shifted straight into Streamer Queue and shared play. Ten commits deep on dev, plus one fix that’s sitting uncommitted in the working tree because it’s the kind of thing you want to stare at twice before you trust it. Cat or dog? Mp3FileReaderBase print(f”I try to make stu{2f} which {actually_decodes} {cross_platform}”) Okay let’s get into it~ —Yap— Streamer Queue went from “backend endpoints exist” to “actual UI with history and add-to-queue” over the course of ten commits, shared play picked up presence and reactions along the way, and then right at the end I found out the MP3 decoder has been quietly depending on a Windows-only codec this whole time. Great. cross-platform, they said. it’ll be fine, they said —The Great Suffering— 1 — Streamer Queue Backend, Then Actually Wiring It Up 402e2ef–2b74f97 built out the Streamer Queue backend endpoints — host add, mark played, mark skipped — and wired them into the client through a new StreamerQueueViewModel. Backend existing and backend actually being called by anything are two different milestones, and this covered both. 2 — The UI Caught Up 16c4b26 added the add-to-queue button and a history panel, so Streamer Queue stopped being an API you’d have to hit manually and became something that’s actually usable in the app. 3 — Shared Play Learned About Presence and Reactions ecb43e6 and c7a19c2 — shared play now fetches and exposes presence and reaction snapshots straight from the CDN. 7e60e15 then had SharedPlaySessionController pass presence, reactions, and queue through properly instead of any of those three living off on their own. 4 — HostAsync Was Ignoring The Host 92f2079. Found and fixed HostAsync quietly ignoring the host’s actual settings — not great for a feature called “host a shared play session.” the host had opinions the whole time, we just weren’t asking 5 — Preloading and the Full Shared UI 22bc56e preloads the next track into the shared room too, so listeners aren’t waiting on it live. f2df836 (HEAD) rounds it out with listener count, a reactions ticker, and a request list in the shared play UI — the room finally looks like it has people in it. Net diff for this stretch: SectionViewModels.cs (+206), backend/src/main.rs (+103), plus the SharedPlay CDN client/models and StreamerQueueView.axaml. 6 — The Uncommitted One: MP3 Playback Was Windows-Only This Whole Time AudioEngine.cs and VideoExportEngine.cs were both using Mp3FileReader, which under the hood calls Windows’ ACM codec (msacm32.dll) to decompress. Which does not exist on Linux or macOS. Swapping to Mp3FileReaderBase with an NLayer decompressor instead — NLayer.NAudioSupport added to Spectralis.Core.csproj — since NLayer is a pure managed decoder and doesn’t care what OS it’s on. Not committed yet, wanted to sit with it first. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out MP3 playback only worked on one OS. Q: Was Spectralis actually cross-platform before this fix? A: For anything that wasn’t MP3 audio, sure. For MP3 specifically, only on Windows, silently, this whole time. Q: Why leave the audio fix uncommitted? A: Swapping a decoder for something this central deserves a beat of “does this actually sound right” before it goes in, not just “does it build.” Q: What’s the difference between Streamer Queue and the regular request queue? A: Streamer Queue is host-controlled — add, mark played, mark skipped, from the streamer’s side, with its own history panel, separate from the public submission flow. Q: Did shared play or Streamer Queue touch the Discord bot? A: No, this round’s entirely Spectralis.App/Spectralis.Core and the Rust backend. Bot’s untouched. —This is the end*— *end for now, ACM codecs permitting PARROT!!!"}, {"post_id": 48057, "ts": "2026-08-16T10:39:23Z", "hours": 2.2006, "text": "Spectralis devlog #5 —Hello again proggers— This one’s website side, not app side. Less “watches chat and reacts,” more “stop lying to people who land on the page.” Changelogs, copy, and a pile of QoL that all needed doing at once, so they got done at once. Cat or dog? GET /changelog print(f”I try to make stu{2f} which {actually_updates} {2day}”) Okay let’s get into it~ —Yap— The website had drifted into “hardcoded strings and vibes” territory. Changelog was static, copy was doing the thing where every sentence has an exclamation point and says nothing, and a bunch of small friction points had just been sitting there unfixed because none of them were dramatic enough on their own to stop and deal with. death by a thousand papercuts, website edition —The Great Suffering— 1 — Changelogs Moved To The Backend Changelog used to live as static content baked into the site itself, which meant every release meant a redeploy just to update a text block. Now it’s served from the backend, so shipping a new version updates the changelog without touching the frontend at all. Site and release process finally agree with each other. 2 — Marketing Fluff: Removed Went through the copy and cut the stuff that existed to sound exciting instead of to say something. Fewer exclamation points, fewer vague superlatives, more actual sentences about what the thing does. Turns out “it’s fast” means more than “blazingly fast, lightning quick, revolutionary” stacked in one line. RIP to several adjectives, you will not be missed 3 — A Bunch Of Small QoL Fixes The kind of stuff that’s individually boring but collectively the difference between a site that feels maintained and one that doesn’t — broken anchor links, inconsistent spacing that had been “fine for now” for way too long, a couple of buttons that didn’t actually do what their label said, loading states that just weren’t there before. Nothing here gets its own numbered section because none of it deserves one, but all of it needed fixing. 4 — Site and Backend Actually Talk Now With changelogs pulled from the backend, the website stopped being a static artifact that occasionally gets redeployed and started being an actual client of the backend it’s supposed to represent. Small architectural shift, disproportionate amount of relief. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who wrote “blazingly fast” unironically at some point. Q: Why was the changelog static in the first place? A: Because it was easy at the time and “at the time” was a while ago. Q: Is the marketing copy gone entirely now? A: No, just the fluff. The site still has to say what Spectralis does, it just doesn’t need six adjectives to do it. Q: Does this affect the Discord bot or the app? A: No, this one’s website-only. App and bot are untouched this round. Q: What counts as a “small QoL fix” that didn’t get its own section? A: The stuff that’s annoying to list individually but adds up to “the site feels better now.” You’ll notice it without being told what it was. —This is the end*— *end for now, copywriting urges permitting CYA!!!"}, {"post_id": 47986, "ts": "2026-08-16T08:15:58Z", "hours": 11.9667, "text": "Spectralis devlog #4 —Hello again proggers— Uh. So. It’s been 11 hours. We sat down, opened the bot code, and just… didn’t stop. No devlog got posted because posting a devlog requires noticing that time is a thing that’s passing, and that stopped happening somewhere around hour 3. this is fine, this has always been fine Cat or dog? channelLock.ts print(f”I try to make stu{2f} which {actually_locked} {11hrs_later}”) Okay let’s get into it, before I forget more of it~ —Yap— No app changes this round. Zero. Not one line touched in Spectralis.App or Spectralis.Core. This whole stretch was 100% the Discord bot, going from “stubbed slash commands” to “bot that actually watches chat and does something about it.” —The Great Suffering— 1 — Railway Kept Rebuilding Rust For No Reason v5.3.2. Railway was rebuilding the entire backend on every single deploy regardless of whether the Rust actually changed. Pinned the build so it stops doing that. Small fix, saved a genuinely upsetting amount of deploy time. 2 — The Bot Learned to Watch Chat v5.3.3, and the actual reason for the 11 hours. The bot now watches the queue channel and reacts to song submissions as they come in, instead of just sitting there answering slash commands and pretending it doesn’t see anything else happening. 3 — New Files, New Problems messageSubmission.ts showed up to handle reacting to and tracking submitted songs in chat. channelLock.ts showed up next to it to handle locking logic for the watched channel, because a bot watching chat unsupervised is a bot that needs boundaries. 4 — Bot Token Can Now Actually See Things Bumped the bot token’s permissions so it can see and read submissions in the first place, which, in hindsight, was load-bearing for “watches chat and reacts to submissions.” Can’t react to what you can’t read. 5 — New Slash Commands, Existing Ones Got Bigger set-closed-message and set-open-message let streamers customize what shows up when the queue opens or closes instead of eating a hardcoded string. open-queue/close-queue got extended to actually talk to the new messaging and channel-lock logic instead of just flipping a flag and hoping. 6 — Everything Downstream Had to Catch Up db.ts, sqApi.ts, nowPlayingPoller.ts, types.ts, and index.ts all expanded to support the submission-tracking flow end to end. Backend picked up a small related change too, +11/-2 in main.rs, mostly plumbing to support what the bot needed on the other end. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who let this go 11 hours without a devlog. Q: How did 11 hours happen? A: One slash command needed one more file, which needed one more type, which needed the bot to actually be able to read messages, and then the sun came up. Q: Is the C# app okay? A: Untouched and fine. It got the week off. Q: Why does the bot need to watch chat instead of just answering commands? A: Song submissions happen by posting in the channel, not by running a command every time. The bot needed to actually see that to react to and track them. Q: What’s channelLock.ts for? A: Making sure the watched channel behaves predictably while the bot is actively tracking submissions in it, instead of reacting to chaos. Q: Are we caught up on devlogs now? A: This is #4. We are exactly as caught up as we’re going to get. —This is the end*— *end for now, sleep permitting PANCAKES!!!"}, {"post_id": 47399, "ts": "2026-08-15T09:49:05Z", "hours": 5.2097, "text": "Spectralis devlog #3 —Hello again proggers— Back at it. This round wasn’t visualizer polish or UI cleanup, it was Song Wars/SQ backend stuff and a Discord bot that didn’t exist yesterday. Less “make it pretty,” more “make it not lie to people.” Cat or dog? AcceptingSubmissions print(f”I try to make stu{2f} which {actually_closes} {2day}”) Okay let’s get into it~ —Yap— Turns out “turn off the fee toggle” and “actually prevent the fee-gated action” are two different things, and I had only been doing the first one. Also built an entire close-queue flow because apparently streamers want to stop taking requests sometimes, which, fair. And then there’s a Discord bot now. That happened too. scope creep? never heard of her —The Great Suffering— 1 — The Free Skip Loophole Turning off “Skip fee” or “Super Skip fee” removed the option from the public request page (sq.html/sq.js) just fine. What it did NOT do was stop the backend from accepting skip/super-skip attempts anyway — submit, upload, promote, all of it. Toggle says no, server says sure why not. Backend now actually rejects those attempts when the toggle’s off, closing the gap where a disabled tier was quietly still free. the frontend was lying and the backend believed it Still preserved: turning a toggle ON with a $0 amount is a real, intentional free tier. That distinction stays. 2 — Close Queue Didn’t Exist There was a “Queue enabled” toggle, but no way to just… stop taking requests without digging into settings. Added a real AcceptingSubmissions flag, separate from that, plus a one-click “Close Queue”/“Reopen Queue” button right next to “Copy Submit URL” in the header. No settings menu detour required. When closed, the public page still shows now-playing and queue count, just hides the request/skip/super-skip forms behind a “requests are closed” banner. Streamer can keep browsing and playing from the existing queue the whole time, since the app’s queue view was never gated on “enabled” to begin with. 3 — Now Playing Was Just Empty This Whole Time Found this one by accident while wiring Close Queue: the public page’s “Now Playing” section never actually populated for anyone who wasn’t the owner, because the backend just wasn’t sending track info to non-owner viewers. Fixed alongside everything else. 4 — A Discord Bot Shows Up New discord-bot/ folder, Node.js + TypeScript, discord.js, with a full PLANNING.md for the design: PIN-based pairing so the streamer generates a short-lived PIN in-app and runs /link-queue in Discord with no secrets ever touching chat, a scoped bot-token concept kept separate from the full owner token, and a (guildId, channelId) → room mapping so one bot instance can serve many servers. /queue, /request, /skip, /superskip are fully wired against the existing public SQ API and build clean. /link-queue, /close-queue, /open-queue are stubbed with TODOs since they need backend PIN/token endpoints that don’t exist yet, which is now the next backend work item. Everything typechecks and builds clean across the board — Rust release build, Spectralis.App, and the bot’s tsc. —FAQ (no one asked these but they are here)— Q: Why does Spectralis need a Discord bot? A: Because apparently the request queue living only on a web page wasn’t enough surface area. Now it can also live in your server. Q: What’s PIN-based pairing? A: Streamer gets a short-lived PIN in-app, runs one Discord command with it, done. No tokens or secrets ever posted in chat. Q: Anything left over from last devlog? A: Chat template drift is still an EDITH problem, not a Spectralis one. Wrong repo, wrong devlog. —This is the end*— *end for now, PIN endpoints permitting PIZZA!!!"}, {"post_id": 46741, "ts": "2026-08-14T06:44:16Z", "hours": 6.1242, "text": "Spectralis devlog #2 —Hello again proggers— New project, same yapping. This one’s Spectralis — the WinForms-to-Avalonia refugee that somehow ended up with a spin wheel, notepads, dead zones, and Spotify playlist sync bolted onto it. 917 commits deep and counting. Cat or dog? RowBackground print(f”I try to make stu{2f} which {actually_renders} {2day}”) Okay let’s get into it~ —Yap— This stretch was less “one big feature” and more “death by a thousand small horrors,” which honestly might just be what maintaining a music app is. Playlists, now playing, the visualizer pipeline, and a wheel of all things all got touched. a spin wheel. in a music app. sure —The Great Suffering— 1 — Playlists Looked Like a Log File For way too long, the playlist view rendered like plain rows in a terminal instead of, y’know, an app. Turns out library explicitly set RowBackground and playlists just… didn’t. So it fell back to the theme’s default accent-tinted fill on every single row instead of the real styling. One missing property. That’s it. That’s the bug. found staring at my own code for an hour 2 — Every Nav Click Rebuilt The World ContentControl was tearing down and rebuilding the entire section view from scratch on every single navigation click. Fixed by caching views per viewmodel instead of nuking them each time. App feels like it’s not fighting itself anymore. 3 — Library Load Was Blocking the Window From Even Opening Big libraries meant the window just… wouldn’t show up. Load was sitting on the UI thread like it owned the place. Moved off it. Window opens now regardless of how unhinged your library size is. 4 — Spectrum Bars Were Snapping FFT window was running back-to-back instead of overlapping, so spectrum/spectrogram/loudness only actually updated every ~185ms even at 60fps render — bars were snapping to new values instead of moving. Bumped overlap to 75% and eased toward target instead of drawing raw values. Smooth now. Suspiciously smooth. 5 — Notepads and the Wheel Happened Somewhere in here a full notepad feature got built — embed model, tag service, docked panel in now playing, pop-out window, save-to-track-tags — and then immediately got wired into a spin wheel with weighted entries, its own model, and a saved-wheels list. Neither of these were planned at the start of the week. Both exist now. 6 — Spotify Actually Behaves Spotify stopped pausing forever, stopped lying about the queue, stopped refusing to shut up, and playlists now actually sync instead of just vibing. Also Discord presence shows Spotify tracks now instead of just going blank like it forgot what music was. 7 — Small Bugs, Deployed With Extreme Prejudice Soundcloud playhead was showing the previous track’s end position on load, fixed. Word mode wasn’t saving timestamps so exports came out empty, fixed. Track-switch click (and the pop when another app grabs the audio device) got a quick fade instead. Dead zones stopped being OBS-only and now shift the app’s own layout too. —FAQ (no one asked these but they are here)— Q: What is Spectralis? A: A local + Spotify + SoundCloud music player with a visualizer pipeline, OBS integration, and apparently a spin wheel now. Originally WinForms, migrated to Avalonia across 917 commits. Q: Why does a music player need dead zones? A: For OBS overlay layouts — panels and toasts need to know where not to render so they don’t cover your stream elements. It’s a layout constraint system wearing a spooky name. Q: Was the RowBackground bug really just one missing line? A: Yes. I’m still thinking about it. Q: Is the wheel feature load-bearing or a bit? A: Unclear. It has weighted spins, saved wheel lists, and its own viewmodel. Feels load-bearing now. Q: What’s next? A: Whatever the changelog for the version after 5.4.0 ends up needing. Probably something I haven’t broken yet. —This is the end*— *end for now, RowBackground permitting ADIOS!!!😎😎😎😎"}, {"post_id": 27486, "ts": "2026-07-13T02:54:53Z", "hours": 16.6944, "text": "DEVLOG 001 initial setup with hackclub this is the 5th iteration of the spectralis audio visualizer app core features changed: switched from WinForms to AvaloniaUI refined UI design and theming fixed api related issues added streamer support and automated queueing web share audio hosting refinements to the embedded audio visualizer system bug fixes: fixed an issue with the youtube API placeholder fix for Spotify webplayer playback fixed an issue with the viz switcher would “hide” behind the html visualizers"}]...
|
Title: Spectralis by @DeltaVortex | Stardance
Dev Title: Spectralis by @DeltaVortex | Stardance
Devlogs:
DEVLOG 001 initial setup with hackclub this is the 5th iteration of the spectralis audio visualizer app core features changed: switched from WinForms to AvaloniaUI refined UI design and theming fixed api related issues added streamer support and automated queueing web share audio hosting refinements to the embedded audio visualizer system bug fixes: fixed an issue with the youtube API placeholder fix for Spotify webplayer playback fixed an issue with the viz switcher would “hide” behind the html visualizers
Spectralis devlog #2 —Hello again proggers— New project, same yapping. This one’s Spectralis — the WinForms-to-Avalonia refugee that somehow ended up with a spin wheel, notepads, dead zones, and Spotify playlist sync bolted onto it. 917 commits deep and counting. Cat or dog? RowBackground print(f”I try to make stu{2f} which {actually_renders} {2day}”) Okay let’s get into it~ —Yap— This stretch was less “one big feature” and more “death by a thousand small horrors,” which honestly might just be what maintaining a music app is. Playlists, now playing, the visualizer pipeline, and a wheel of all things all got touched. a spin wheel. in a music app. sure —The Great Suffering— 1 — Playlists Looked Like a Log File For way too long, the playlist view rendered like plain rows in a terminal instead of, y’know, an app. Turns out library explicitly set RowBackground and playlists just… didn’t. So it fell back to the theme’s default accent-tinted fill on every single row instead of the real styling. One missing property. That’s it. That’s the bug. found staring at my own code for an hour 2 — Every Nav Click Rebuilt The World ContentControl was tearing down and rebuilding the entire section view from scratch on every single navigation click. Fixed by caching views per viewmodel instead of nuking them each time. App feels like it’s not fighting itself anymore. 3 — Library Load Was Blocking the Window From Even Opening Big libraries meant the window just… wouldn’t show up. Load was sitting on the UI thread like it owned the place. Moved off it. Window opens now regardless of how unhinged your library size is. 4 — Spectrum Bars Were Snapping FFT window was running back-to-back instead of overlapping, so spectrum/spectrogram/loudness only actually updated every ~185ms even at 60fps render — bars were snapping to new values instead of moving. Bumped overlap to 75% and eased toward target instead of drawing raw values. Smooth now. Suspiciously smooth. 5 — Notepads and the Wheel Happened Somewhere in here a full notepad feature got built — embed model, tag service, docked panel in now playing, pop-out window, save-to-track-tags — and then immediately got wired into a spin wheel with weighted entries, its own model, and a saved-wheels list. Neither of these were planned at the start of the week. Both exist now. 6 — Spotify Actually Behaves Spotify stopped pausing forever, stopped lying about the queue, stopped refusing to shut up, and playlists now actually sync instead of just vibing. Also Discord presence shows Spotify tracks now instead of just going blank like it forgot what music was. 7 — Small Bugs, Deployed With Extreme Prejudice Soundcloud playhead was showing the previous track’s end position on load, fixed. Word mode wasn’t saving timestamps so exports came out empty, fixed. Track-switch click (and the pop when another app grabs the audio device) got a quick fade instead. Dead zones stopped being OBS-only and now shift the app’s own layout too. —FAQ (no one asked these but they are here)— Q: What is Spectralis? A: A local + Spotify + SoundCloud music player with a visualizer pipeline, OBS integration, and apparently a spin wheel now. Originally WinForms, migrated to Avalonia across 917 commits. Q: Why does a music player need dead zones? A: For OBS overlay layouts — panels and toasts need to know where not to render so they don’t cover your stream elements. It’s a layout constraint system wearing a spooky name. Q: Was the RowBackground bug really just one missing line? A: Yes. I’m still thinking about it. Q: Is the wheel feature load-bearing or a bit? A: Unclear. It has weighted spins, saved wheel lists, and its own viewmodel. Feels load-bearing now. Q: What’s next? A: Whatever the changelog for the version after 5.4.0 ends up needing. Probably something I haven’t broken yet. —This is the end*— *end for now, RowBackground permitting ADIOS!!!😎😎😎😎
Spectralis devlog #3 —Hello again proggers— Back at it. This round wasn’t visualizer polish or UI cleanup, it was Song Wars/SQ backend stuff and a Discord bot that didn’t exist yesterday. Less “make it pretty,” more “make it not lie to people.” Cat or dog? AcceptingSubmissions print(f”I try to make stu{2f} which {actually_closes} {2day}”) Okay let’s get into it~ —Yap— Turns out “turn off the fee toggle” and “actually prevent the fee-gated action” are two different things, and I had only been doing the first one. Also built an entire close-queue flow because apparently streamers want to stop taking requests sometimes, which, fair. And then there’s a Discord bot now. That happened too. scope creep? never heard of her —The Great Suffering— 1 — The Free Skip Loophole Turning off “Skip fee” or “Super Skip fee” removed the option from the public request page (sq.html/sq.js) just fine. What it did NOT do was stop the backend from accepting skip/super-skip attempts anyway — submit, upload, promote, all of it. Toggle says no, server says sure why not. Backend now actually rejects those attempts when the toggle’s off, closing the gap where a disabled tier was quietly still free. the frontend was lying and the backend believed it Still preserved: turning a toggle ON with a $0 amount is a real, intentional free tier. That distinction stays. 2 — Close Queue Didn’t Exist There was a “Queue enabled” toggle, but no way to just… stop taking requests without digging into settings. Added a real AcceptingSubmissions flag, separate from that, plus a one-click “Close Queue”/“Reopen Queue” button right next to “Copy Submit URL” in the header. No settings menu detour required. When closed, the public page still shows now-playing and queue count, just hides the request/skip/super-skip forms behind a “requests are closed” banner. Streamer can keep browsing and playing from the existing queue the whole time, since the app’s queue view was never gated on “enabled” to begin with. 3 — Now Playing Was Just Empty This Whole Time Found this one by accident while wiring Close Queue: the public page’s “Now Playing” section never actually populated for anyone who wasn’t the owner, because the backend just wasn’t sending track info to non-owner viewers. Fixed alongside everything else. 4 — A Discord Bot Shows Up New discord-bot/ folder, Node.js + TypeScript, discord.js, with a full PLANNING.md for the design: PIN-based pairing so the streamer generates a short-lived PIN in-app and runs /link-queue in Discord with no secrets ever touching chat, a scoped bot-token concept kept separate from the full owner token, and a (guildId, channelId) → room mapping so one bot instance can serve many servers. /queue, /request, /skip, /superskip are fully wired against the existing public SQ API and build clean. /link-queue, /close-queue, /open-queue are stubbed with TODOs since they need backend PIN/token endpoints that don’t exist yet, which is now the next backend work item. Everything typechecks and builds clean across the board — Rust release build, Spectralis.App, and the bot’s tsc. —FAQ (no one asked these but they are here)— Q: Why does Spectralis need a Discord bot? A: Because apparently the request queue living only on a web page wasn’t enough surface area. Now it can also live in your server. Q: What’s PIN-based pairing? A: Streamer gets a short-lived PIN in-app, runs one Discord command with it, done. No tokens or secrets ever posted in chat. Q: Anything left over from last devlog? A: Chat template drift is still an EDITH problem, not a Spectralis one. Wrong repo, wrong devlog. —This is the end*— *end for now, PIN endpoints permitting PIZZA!!!
Spectralis devlog #4 —Hello again proggers— Uh. So. It’s been 11 hours. We sat down, opened the bot code, and just… didn’t stop. No devlog got posted because posting a devlog requires noticing that time is a thing that’s passing, and that stopped happening somewhere around hour 3. this is fine, this has always been fine Cat or dog? channelLock.ts print(f”I try to make stu{2f} which {actually_locked} {11hrs_later}”) Okay let’s get into it, before I forget more of it~ —Yap— No app changes this round. Zero. Not one line touched in Spectralis.App or Spectralis.Core. This whole stretch was 100% the Discord bot, going from “stubbed slash commands” to “bot that actually watches chat and does something about it.” —The Great Suffering— 1 — Railway Kept Rebuilding Rust For No Reason v5.3.2. Railway was rebuilding the entire backend on every single deploy regardless of whether the Rust actually changed. Pinned the build so it stops doing that. Small fix, saved a genuinely upsetting amount of deploy time. 2 — The Bot Learned to Watch Chat v5.3.3, and the actual reason for the 11 hours. The bot now watches the queue channel and reacts to song submissions as they come in, instead of just sitting there answering slash commands and pretending it doesn’t see anything else happening. 3 — New Files, New Problems messageSubmission.ts showed up to handle reacting to and tracking submitted songs in chat. channelLock.ts showed up next to it to handle locking logic for the watched channel, because a bot watching chat unsupervised is a bot that needs boundaries. 4 — Bot Token Can Now Actually See Things Bumped the bot token’s permissions so it can see and read submissions in the first place, which, in hindsight, was load-bearing for “watches chat and reacts to submissions.” Can’t react to what you can’t read. 5 — New Slash Commands, Existing Ones Got Bigger set-closed-message and set-open-message let streamers customize what shows up when the queue opens or closes instead of eating a hardcoded string. open-queue/close-queue got extended to actually talk to the new messaging and channel-lock logic instead of just flipping a flag and hoping. 6 — Everything Downstream Had to Catch Up db.ts, sqApi.ts, nowPlayingPoller.ts, types.ts, and index.ts all expanded to support the submission-tracking flow end to end. Backend picked up a small related change too, +11/-2 in main.rs, mostly plumbing to support what the bot needed on the other end. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who let this go 11 hours without a devlog. Q: How did 11 hours happen? A: One slash command needed one more file, which needed one more type, which needed the bot to actually be able to read messages, and then the sun came up. Q: Is the C# app okay? A: Untouched and fine. It got the week off. Q: Why does the bot need to watch chat instead of just answering commands? A: Song submissions happen by posting in the channel, not by running a command every time. The bot needed to actually see that to react to and track them. Q: What’s channelLock.ts for? A: Making sure the watched channel behaves predictably while the bot is actively tracking submissions in it, instead of reacting to chaos. Q: Are we caught up on devlogs now? A: This is #4. We are exactly as caught up as we’re going to get. —This is the end*— *end for now, sleep permitting PANCAKES!!!
Spectralis devlog #5 —Hello again proggers— This one’s website side, not app side. Less “watches chat and reacts,” more “stop lying to people who land on the page.” Changelogs, copy, and a pile of QoL that all needed doing at once, so they got done at once. Cat or dog? GET /changelog print(f”I try to make stu{2f} which {actually_updates} {2day}”) Okay let’s get into it~ —Yap— The website had drifted into “hardcoded strings and vibes” territory. Changelog was static, copy was doing the thing where every sentence has an exclamation point and says nothing, and a bunch of small friction points had just been sitting there unfixed because none of them were dramatic enough on their own to stop and deal with. death by a thousand papercuts, website edition —The Great Suffering— 1 — Changelogs Moved To The Backend Changelog used to live as static content baked into the site itself, which meant every release meant a redeploy just to update a text block. Now it’s served from the backend, so shipping a new version updates the changelog without touching the frontend at all. Site and release process finally agree with each other. 2 — Marketing Fluff: Removed Went through the copy and cut the stuff that existed to sound exciting instead of to say something. Fewer exclamation points, fewer vague superlatives, more actual sentences about what the thing does. Turns out “it’s fast” means more than “blazingly fast, lightning quick, revolutionary” stacked in one line. RIP to several adjectives, you will not be missed 3 — A Bunch Of Small QoL Fixes The kind of stuff that’s individually boring but collectively the difference between a site that feels maintained and one that doesn’t — broken anchor links, inconsistent spacing that had been “fine for now” for way too long, a couple of buttons that didn’t actually do what their label said, loading states that just weren’t there before. Nothing here gets its own numbered section because none of it deserves one, but all of it needed fixing. 4 — Site and Backend Actually Talk Now With changelogs pulled from the backend, the website stopped being a static artifact that occasionally gets redeployed and started being an actual client of the backend it’s supposed to represent. Small architectural shift, disproportionate amount of relief. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who wrote “blazingly fast” unironically at some point. Q: Why was the changelog static in the first place? A: Because it was easy at the time and “at the time” was a while ago. Q: Is the marketing copy gone entirely now? A: No, just the fluff. The site still has to say what Spectralis does, it just doesn’t need six adjectives to do it. Q: Does this affect the Discord bot or the app? A: No, this one’s website-only. App and bot are untouched this round. Q: What counts as a “small QoL fix” that didn’t get its own section? A: The stuff that’s annoying to list individually but adds up to “the site feels better now.” You’ll notice it without being told what it was. —This is the end*— *end for now, copywriting urges permitting CYA!!!
Spectralis devlog #6 —Hello again proggers— Website stuff wrapped up at the 310ee27 merge, then everything shifted straight into Streamer Queue and shared play. Ten commits deep on dev, plus one fix that’s sitting uncommitted in the working tree because it’s the kind of thing you want to stare at twice before you trust it. Cat or dog? Mp3FileReaderBase print(f”I try to make stu{2f} which {actually_decodes} {cross_platform}”) Okay let’s get into it~ —Yap— Streamer Queue went from “backend endpoints exist” to “actual UI with history and add-to-queue” over the course of ten commits, shared play picked up presence and reactions along the way, and then right at the end I found out the MP3 decoder has been quietly depending on a Windows-only codec this whole time. Great. cross-platform, they said. it’ll be fine, they said —The Great Suffering— 1 — Streamer Queue Backend, Then Actually Wiring It Up 402e2ef–2b74f97 built out the Streamer Queue backend endpoints — host add, mark played, mark skipped — and wired them into the client through a new StreamerQueueViewModel. Backend existing and backend actually being called by anything are two different milestones, and this covered both. 2 — The UI Caught Up 16c4b26 added the add-to-queue button and a history panel, so Streamer Queue stopped being an API you’d have to hit manually and became something that’s actually usable in the app. 3 — Shared Play Learned About Presence and Reactions ecb43e6 and c7a19c2 — shared play now fetches and exposes presence and reaction snapshots straight from the CDN. 7e60e15 then had SharedPlaySessionController pass presence, reactions, and queue through properly instead of any of those three living off on their own. 4 — HostAsync Was Ignoring The Host 92f2079. Found and fixed HostAsync quietly ignoring the host’s actual settings — not great for a feature called “host a shared play session.” the host had opinions the whole time, we just weren’t asking 5 — Preloading and the Full Shared UI 22bc56e preloads the next track into the shared room too, so listeners aren’t waiting on it live. f2df836 (HEAD) rounds it out with listener count, a reactions ticker, and a request list in the shared play UI — the room finally looks like it has people in it. Net diff for this stretch: SectionViewModels.cs (+206), backend/src/main.rs (+103), plus the SharedPlay CDN client/models and StreamerQueueView.axaml. 6 — The Uncommitted One: MP3 Playback Was Windows-Only This Whole Time AudioEngine.cs and VideoExportEngine.cs were both using Mp3FileReader, which under the hood calls Windows’ ACM codec (msacm32.dll) to decompress. Which does not exist on Linux or macOS. Swapping to Mp3FileReaderBase with an NLayer decompressor instead — NLayer.NAudioSupport added to Spectralis.Core.csproj — since NLayer is a pure managed decoder and doesn’t care what OS it’s on. Not committed yet, wanted to sit with it first. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out MP3 playback only worked on one OS. Q: Was Spectralis actually cross-platform before this fix? A: For anything that wasn’t MP3 audio, sure. For MP3 specifically, only on Windows, silently, this whole time. Q: Why leave the audio fix uncommitted? A: Swapping a decoder for something this central deserves a beat of “does this actually sound right” before it goes in, not just “does it build.” Q: What’s the difference between Streamer Queue and the regular request queue? A: Streamer Queue is host-controlled — add, mark played, mark skipped, from the streamer’s side, with its own history panel, separate from the public submission flow. Q: Did shared play or Streamer Queue touch the Discord bot? A: No, this round’s entirely Spectralis.App/Spectralis.Core and the Rust backend. Bot’s untouched. —This is the end*— *end for now, ACM codecs permitting PARROT!!!
Spectralis devlog #7 — welcome 5.4.0 —Hello again proggers— 5.4.0’s out. This one brought back a feature I’d basically buried, hardened two systems that were still a little too trust-me-bro, and finally let shared play open where it should’ve been opening the whole time. Also touched the docs, which I’m choosing to be proud of. Cat or dog? .spectralis print(f”I try to make stu{2f} which {actually_ships} {5.4.0}”) Okay let’s get into it~ —Yap— Big one this round is stories coming back into .spectralis capsules, except not as the thing they used to be — modernized, closer to how album worlds work now, as a proper custom HTML page with real hooks instead of whatever they were before. Rest of the release was hardening and cleanup: Streamer Queue and Discord got a pass to make sure live use doesn’t fall over, shared play finally opens in-app, and the docs stopped lying about what the app actually does. bringing back a feature I killed is a personality trait at this point —The Great Suffering— 1 — Stories Are Back, But Not The Same Stories Old stories concept is back inside .spectralis capsules, rebuilt to match how album worlds work now instead of resurrecting the original implementation as-is. Each one’s a custom HTML page with real hooks into the player — starting tracks, track control, the works — instead of being a static bolt-on. Bringing it back meant actually integrating it with the current architecture, not just copy-pasting the old version back in. 2 — Streamer Queue + Discord Got Hardened Both of these existed and mostly worked, which is different from “survives actually being used live by a streamer with chat moving.” Went through and hardened the interaction between Streamer Queue and the Discord bot — the stuff that only shows up under real load or real edge cases instead of a clean local test run. “mostly works” is doing a lot of lifting in software 3 — Shared Play Opens In App Now Shared play used to need you to go find it. Now there’s an actual open-in-app implementation, so joining a shared room is a real in-app flow instead of a workaround. Small change on paper, but it’s the difference between a feature people use and a feature people forget exists. 4 — Docs, README, and STANDARDS Actually Match Reality Updated the docs, README, and STANDARDS to reflect what’s actually in the app at this point instead of an earlier version of it. Boring work, necessary work, the kind of thing that only gets noticed when it’s wrong. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who buried a feature and then dug it back up two versions later. Q: Why bring stories back instead of leaving them dead? A: Because the concept was good, the old implementation just wasn’t, and album worlds proved the modernized version of the idea actually works. Q: What counts as “hardening” for Streamer Queue and Discord? A: The stuff that only breaks under real conditions — live chat, real timing, real edge cases — not the happy path you get testing solo. Q: Does shared play opening in-app change how sessions work? A: No, same sessions, same presence/reactions/queue from devlog #6. Just a real entry point now instead of a workaround. Q: Anything left over for next time? A: Always. This is a devlog series, not a finish line. —This is the end*— *end for now, capsule hooks permitting 再见!!!
Spectralis devlog #8 —Hello again proggers— 10 hours 48 minutes. Again. Didn’t plan it, didn’t notice it happening, just looked up and the sun had done a full cycle. This time it was capsules and worlds actually getting built and tested for real instead of just existing in theory. we’ve been here before and we will be here again Cat or dog? Capsule.story + Capsule.visualizer print(f”I try to make stu{2f} which {actually_coexist} {10h48m_later}”) Okay let’s get into it~ —Yap— Stories came back in devlog #7 as a concept. This round was making and testing the first actual .spectralis capsules and worlds built on that concept, which is a different job entirely — turns out “the architecture supports it” and “a real capsule with a real story actually works” are two very different milestones. Also fixed a bug that only shows up once you’re actually testing real capsules instead of imagining them, and a GitHub pull issue that had nothing to do with any of this and ate time anyway. —The Great Suffering— 1 — Building And Testing The First Real Capsules And Worlds Most of the 10 hours 48 minutes, honestly. Going from “stories and worlds work in concept” to actually authoring capsules, loading them, and confirming the hooks — track start, track control, the custom HTML page — behave the way they’re supposed to under real content instead of a test stub. This is the part where theory meets “wait, why is this blank.” 2 — A Story And A Visualizer Couldn’t Both Exist In One Capsule Found this one while testing, not before. A capsule with both a story and a visualizer defined would break, since apparently the two weren’t built to coexist in the same capsule at all. Fixed so a single capsule can hold both without one stepping on the other. the two features that were supposed to be siblings turned out to be enemies 3 — GitHub Was Being Weird About Pulling Somewhere in the middle of all this, git decided pulling wasn’t going to just work. Fixed the pulling issue, which is the kind of fix that has no interesting story attached, it was just broken and then it wasn’t. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who said “quick test” and looked up 10 hours 48 minutes later. Q: Was the story/visualizer bug there since devlog #7? A: Presumably, yes. Nobody had actually tried putting both in one capsule until this round. Q: What does “testing capsules and worlds” actually involve? A: Authoring real ones, loading them in the app, and checking the hooks — track start, track control, custom HTML rendering — behave correctly with actual content, not placeholder data. Q: What was the GitHub pulling issue? A: Not going into detail, it wasn’t interesting, it was just broken. Fixed now. Q: Is this the last capsule/worlds devlog? A: No idea. Ask devlog #9. —This is the end*— *end for now, git remotes permitting PEPPERONI!!!
Spectralis devlog #9 — 5.4.0 is public —Hello again proggers— 5.4.0 is actually out, publicly, in people’s hands. Diffed v5.3.4 through v5.4.0: 40 commits, Aug 16-18, four threads of work. Cat or dog? spectral.resume() —Yap— Shared play became joinable, Streamer Queue and the Discord bot got hardened, story/visualizer bugs got chased down in one sitting, and some platform/perf issues got caught. None of these were small. —The Great Suffering— 1 — Shared Play Can Be Joined Now spectralis://shared-play/join links used to fall through to nothing. Now routed to a real handler. 2 — Streamer Queue: Host Controls + A Bot That Won’t Die Host can add tracks and mark played/skipped directly, no viewer round-trip. Desktop got an add-to-queue button and history panel. Both pollers (desktop + bot) back off dead rooms instead of hammering them. SQ API calls got a 10s timeout + one retry, GETs only — mutating calls don’t retry, to avoid double-submitting on a timed-out-but-successful response. Bot had zero global error handlers before this. One bad promise took the whole process down silently. Now it logs and survives, plus 3-attempt startup retry. 3 — Story Pages vs. Visualizers: Three Bugs, One Afternoon A capsule with both used to have them fight. Story can now queue a surface behind it — TryAdvancePastStory() swaps in the queued surface on spectral.resume(). Audio was starting under the story before the reader finished — now gated on whether a surface is queued. Once queued, picker/prev-next/keyboard could still hijack it — new IsVisualizerLocked blocks all three (user-picked “Special:” visualizers stay switchable). 4 — Platform + Perf Fixes MP3 decoding silently depended on Windows’ ACM codec via Mp3FileReader. Swapped to NLayer, pure managed decoder — MP3s decode on Linux/macOS now too. WebView2Host inline-rendered small visualizers via NavigateToString, which serves from about:blank with no real origin and tanks frame rate — everything goes through the fast file-backed path now. Auto-cycle switching checked IsLoaded/IsPlaying, both false during Spotify playback since Spotify never loads into the local engine — switched to HasTrack/IsPlaying. And: a regex stripping onclick=”…” had no exception, matched JS identifiers like onSomething =, and being quote-unguarded ate everything to the next stray quote anywhere later in the file. Fixed with a -block carve-out. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s been waiting on shared play join links forever. Q: Was shared play really host-only until now? A: Yes. The link existed, it just went nowhere. Q: How bad was the regex bug? A: Silent corruption of unrelated code anywhere later in the file, no error thrown. Very glad it’s found. Q: Is 5.4.0 stable? A: As far as testing shows. That’s what everyone says right before the hotfix. —This is the end*— *end for now, public users permitting PEBBLE!!!
Spectralis devlog #10 —Hello again proggers— 11 hours, zero sleep, and somewhere in the middle of that a full release went out. v5.4.1, then v5.4.1.2 right behind it because apparently one patch release wasn’t enough punishment for one night. sleep is a scheduling conflict I lost Cat or dog? winmm.dll Okay let’s get into it~ —Yap— Started as a normal patch pass and turned into a full Linux compatibility audit at 3am, because it turns out shipping something cross-platform means actually checking what “cross-platform” was quietly lying about. Found four separate ways the app was secretly Windows-only, fixed all of them, shipped twice. —The Great Suffering— 1 — winmm.dll Doesn’t Exist On Linux, Who Knew Something was calling into winmm.dll directly. Which is a Windows multimedia API. Which does not exist on Linux. Genuinely did not know this was happening until it broke loudly. “who knew” is doing a lot of work in that commit message 2 — Shipped A .exe To Linux, My Bad Somewhere in the build/packaging step, a .exe was ending up in the Linux build. An executable format Linux does not run. Not a subtle bug, just an embarrassing one. 3 — Song Wars Closing = Surprise Alt+F4 Closing Song Wars was apparently also closing the entire app, unprompted, no warning. A feature window doubling as a kill switch is not a feature, it’s a trap. 4 — Yeeted yt-dlp + ffmpeg Into Linux Land, Zero Installs Needed The actual fix underneath most of this: bundled yt-dlp and ffmpeg directly for Linux instead of assuming they’d already be installed system-wide, which they very often weren’t. Zero external installs needed now, it just works out of the box. 5 — Last Page Isn’t A Dead End Anymore Merged in from feature/story-pager-finish — reaching the last page of a story used to just… stop. Dead end, nothing to do. Fixed so it actually resolves properly instead of leaving you stranded on the final page. 6 — Two Releases In One Night v5.4.1 went out, then a second pass turned up enough left over that v5.4.1.2 followed right after. Both merged through staging same night, same sleepless stretch. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who found out about winmm.dll at 3am. Q: Was Spectralis actually broken on Linux before this? A: In at least four distinct ways, yes. Missing binaries, a stray .exe, a Windows-only DLL call, and an app-closing bug. Now fixed. Q: Why two patch releases instead of one? A: v5.4.1 went out, more got found immediately after, and waiting felt worse than just shipping v5.4.1.2 same night. Q: Did you actually not sleep? A: Correct. Not recommending it. Doing it anyway next time, probably. Q: Is Linux actually solid now? A: As solid as one very long, very tired night of testing can confirm. Time will tell the rest. —This is the end*— *end for now, sleep schedules permitting PIBBLE!!!
Spectralis devlog #11 —Hello again proggers— Docs got a full rework this round. Also turns out v5.4.1 went out to nobody, because it never actually got pushed to the CDN. Tagged, released, announced probably, and completely inaccessible the whole time. shipped a release into a void and called it done Cat or dog? docs/ Okay let’s get into it~ —Yap— Started as a documentation pass and ended with the realization that the last release had been sitting local this whole time instead of where anyone could actually get it. Two very different kinds of work, same devlog. —The Great Suffering— 1 — The Entire Doc Rework Not a touch-up, a full rework. Docs, README, and STANDARDS all got restructured rather than patched in place, since patching them individually over the last several devlogs had left them internally inconsistent with each other and with what the app actually does now. 2 — 5.4.1 Never Made It To The CDN The actual headline bug of this devlog. v5.4.1 shipped, in the sense that it was built, tagged, and probably announced somewhere — but never got pushed to the CDN, meaning nobody could actually download it. Public-facing, and it was quietly broken the whole time until someone noticed. a release that ships to nowhere didn’t really ship 3 — Fixed And Actually Pushed Corrected the CDN push so 5.4.1 is genuinely available now, not just tagged in git looking like it is. Also part of why the doc rework mattered — docs referencing a version nobody could download was its own kind of lie. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who tagged a release and forgot the part where people can actually get it. Q: How long was 5.4.1 unavailable? A: Long enough to be embarrassing, short enough to fix before it became a real problem. Caught during this pass. Q: Why redo the docs entirely instead of patching them again? A: Because incremental doc patches across several devlogs had drifted apart from each other and from the app. A full rework got everything back in sync at once. Q: Is this the same CDN that serves changelogs now (devlog #5)? A: Same one. This time the release binary itself was the thing missing, not just content. Q: Anything else quietly broken that hasn’t surfaced yet? A: Unknown by definition. That’s what the next devlog is for. —This is the end*— *end for now, CDN pushes permitting POPPY!!!
Spectralis devlog #12 —Hello again proggers— Website’s getting a real pass. Not new copy this time, actual visual identity work, because it currently reads like every AI startup landing page that ever came out of the middle of California, and Spectralis is not that. gradient blob, bold sans headline, “revolutionize your workflow” — no Cat or dog? theme.css Okay let’s get into it~ —Yap— Not released yet, deliberately. This one’s still in progress, but close enough that it’s worth logging before it’s done instead of only after. The goal’s simple to say and annoying to actually do: stop looking generic. —The Great Suffering— 1 — The AI-Startup Look Had To Go Somewhere along the way the site had drifted into the exact aesthetic every seed-stage AI company in the Bay Area ships with — same fonts, same soft gradients, same layout rhythm everyone’s using because everyone else is using it. None of that says anything about what Spectralis actually is. 2 — Actual Visual Identity Work Working through what the site should look like instead of what’s easy to reach for by default. This is the slow part — not writing more copy, actually deciding what the thing looks like and why, instead of inheriting a template’s opinions by accident. 3 — Not Done, Getting Close Deliberately not shipping this mid-rework. Better to land it as one coherent pass than dribble out half-finished visual changes and confuse anyone who lands on the page in between. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one trying to make a music app’s website stop looking like a fundraising deck. Q: What specifically screamed “AI startup”? A: The general vibe more than any one element — the kind of design every YC-adjacent landing page converges on when nobody makes an active choice. Q: Why not ship incrementally instead of waiting? A: A visual identity rework half-applied looks worse than the thing it’s replacing. Waiting for it to be coherent. Q: How close is close? A: Close. Not “next devlog” close necessarily, but visibly closer than devlog #11 left it. Q: Does this touch the changelog-from-backend system from devlog #5? A: No, that infrastructure stays as-is. This is purely visual. —This is the end*— *end for now, gradient blobs permitting POGO!!!
Spectralis devlog #13 —Hello again proggers— Still on the website. Turns out the “make it not look like AI made it” problem does not have an easy exit — everything ends up looking like AI made it no matter what gets tried. Also had to ask Claude how to center a div. Yes, that div. The one every developer has fought since the dawn of CSS. the irony of asking an AI how to make something look less AI-made is not lost on me Cat or dog? display: flex Okay let’s get into it~ —Yap— Round two on the visual rework from last devlog, and the honest update is: it’s harder than expected. Every direction tried still lands somewhere in “generic modern web design,” which might just be what modern web design looks like right now regardless of who’s making it. —The Great Suffering— 1 — Everything Still Looks Like AI Made It Tried multiple directions this round trying to get away from the generic look. Kept landing back in the same neighborhood anyway. Starting to suspect this isn’t a “try harder” problem, it’s just what the current design language space looks like from basically every angle right now. 2 — Had To Ask Claude How To Center A Div The oldest joke in frontend development, still funny because it’s still true. Got stuck on it anyway. Some things never stop being annoying regardless of how many years of CSS have gone by. flexbox has existed for a decade and this is still where we are 3 — Pulled Up W3Schools For The First Time In Forever Dug up an old W3Schools reference mid-debugging, and it is dusty as hell at this point but the information’s still correct. Sometimes the ancient reference site is exactly what’s needed, aesthetics of the source be damned. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who asked an AI to help make something look less like an AI made it. Q: Did the AI-startup look actually get fixed this round? A: Not fully. Still fighting it. That’s most of this devlog. Q: Why does everything converge on the same generic look? A: Best guess: current tools and current design trends both nudge toward the same handful of patterns, so escaping it takes more than just trying different colors. Q: Is W3Schools still reliable? A: Apparently yes. Dated presentation, correct information. Q: When’s the website actually done? A: Closer than devlog #12, not there yet. Ask devlog #14. —This is the end*— *end for now, centered divs permitting PEPPLE!!!
Spectralis devlog #14 —Hello again proggers— Site’s done. Actually done. Got it to a place I actually liked instead of just a place I was tired of looking at, and shipped it. Three devlogs of fighting the generic-AI-look problem and it finally landed somewhere that feels like Spectralis instead of every other landing page on the internet. took long enough Cat or dog? git push origin main Okay let’s get into it~ —Yap— After devlog #12 and #13’s whole ordeal of everything converging on the same generic design no matter what got tried, something finally clicked and stuck. Shipped it. Two honest confessions on the way out the door, might as well log them here instead of pretending otherwise. —The Great Suffering— 1 — It’s Live The full rework from the last two devlogs is done and pushed. Went from “everything looks like AI made it” to something that actually feels intentional. Whatever finally broke the streak, it worked. 2 — The Help & Manuals Tab Is A Placebo Button Full transparency: the Help & Manuals tab on the site exists, looks real, sits right where you’d expect it, and does essentially nothing right now. It’s there because a site without one looks incomplete, not because there’s real content behind it yet. Consider it a placeholder wearing a real button’s clothes. it’s not lying, it’s aspirational 3 — I Copied FL Studio’s Homepage. Hard. Not going to pretend otherwise: leaned on FL Studio’s site pretty heavily for structure and layout ideas here. And honestly, that’s just how this works — programming, design, all of it is borrowing from people who borrowed from the people before them. Nobody’s inventing layout from first principles in 2026. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who finally shipped a website after three devlogs of fighting it. Q: Is Help & Manuals actually going to do anything eventually? A: Presumably, someday. Right now it’s a promise the button is making on behalf of a future devlog. Q: Isn’t copying FL Studio’s homepage kind of a big deal? A: Structure and layout inspiration, not a straight copy-paste. And realistically, every site borrows from something — this one’s just being honest about the source. Q: Did the “everything looks like AI” problem from devlog #13 actually get solved? A: Yes, finally. Whatever changed between then and now worked. Q: What’s next now that the site’s shipped? A: I finally get to ship my project without worrying about AI looking websites —This is the end*— *end for now, placebo buttons permitting PLACEBO!!!
Spectralis devlog #15 —Hello again proggers— I lied. Posted devlog #14 saying the site was done and shipped, and the deploy pipeline crashed basically the second it went out. So that’s fun. On the bright side, v5.4.2 also went out this round, and it’s actually solid. “it’s done” is apparently my curse word Cat or dog? dequeue() Okay let’s get into it~ —Yap— Website pipeline ate itself right after devlog #14 posted, which is its own kind of poetic. Meanwhile the app side had a genuinely good run — six real fixes landed, one of them embarrassing enough to name directly. —The Great Suffering— 1 — The Website Pipeline Crashed Right After I Said It Shipped Devlog #14 said done. Pipeline said otherwise, immediately. Working on getting it back up, this is very much a “developing situation” and not a “resolved” one yet. 2 — Listener Requests Auto-Queue Now Requests from listeners now auto-queue instead of needing a manual step to actually land in the queue. 3 — Audio Literally Never Played, Whoops Exactly what it says. Somewhere in there, audio just wasn’t playing. Found and fixed, extremely glad this one got caught. a music player where the music doesn’t play is a bold minimalist statement 4 — Found It: Join Links Were Missing A Slash Root cause of a chunk of shared-play join weirdness — the links were missing a slash. One character. Fixed, join links actually resolve correctly now. 5 — Host Room Button Actually Tells You Something Now The host room button used to just sit there. Now it actually communicates state back to you instead of leaving you guessing whether anything happened. 6 — Host Room Was Dropping Every Tick Forever Host room had a bug where it was dropping on every single tick, indefinitely, rather than staying stable. Fixed so the room actually holds instead of degrading in real time. 7 — yt-dlp Was 5 Months Stale, Updated The bundled yt-dlp from devlog #10 hadn’t been touched in 5 months. Updated. Stale extraction tooling breaking silently is exactly the kind of thing that sneaks up on you. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who called the website shipped and got immediately humbled by CI. Q: Is the website back up yet? A: Working on it. Genuinely not resolved as of this devlog. Q: How long was audio actually broken for? A: Not specified, but “literally never played” is about as bad as this category of bug gets. Fixed now. Q: Was the missing-slash bug related to the join link work from devlog #9? A: Yes, same feature area, this was the actual root cause of some of the lingering weirdness there. Q: Is 5.4.2 stable? A: As far as testing shows. Same disclaimer as always applies. —This is the end*— *end for now, deploy pipelines permitting PARABLE!!!
Spectralis devlog #16 —Hello again proggers— Short one. Found the website pipeline issue from devlog #15. Cat or dog? sudo —Yap— It wasn’t the code. It was permissions. The site was calling root but never actually had access to root, which is exactly why it worked fine locally and fell over the second it hit deployment. “It woRKS On My macHiNe” — the oldest curse in software, and I said it unironically. classic —This is the end*— *end for now, root access permitting PAPAYA!!!
Spectralis devlog #17 —Hello again proggers— 12 hours. All-nighter. Zero sleep. Feature isn’t in the app. Nothing shipped. This is the devlog where I explain what an entire night of work bought me, and the honest answer is “a very expensive lesson.” worth it? absolutely not. did i learn something? also debatable Cat or dog? catch (ApiDoesNotExistException) Okay let’s get into it~ —Yap— Got ambitious. Decided Spectralis should integrate with everything — Pandora, Amazon Music, a bunch of other big platforms on top of what already works. Turns out “everything” includes a lot of services that simply don’t offer a public API to integrate with in the first place, and finding that out was not the fast part of the night. —The Great Suffering— 1 — The APIs Just Don’t Exist Pandora, Amazon Music, and others: no public API to build against. Not “hard to find,” not “poorly documented,” just not there. Should’ve been step zero, ended up being the thing that derailed the entire night once discovered mid-build instead of before starting. 2 — So I Built Backdoors Instead Spent a huge chunk of the 12 hours reverse-engineering and building unofficial access paths instead, since the front door didn’t exist. This is the kind of work that eats hours and produces nothing you can point to until it’s fully working, if it ever gets there. 3 — Most Of Them Were Already Patched Implemented several of these backdoor approaches only to find out the platforms had already closed the exact gaps being exploited, sometimes before the implementation was even finished. Built things that were dead on arrival by the time they existed. patched before i even shipped it, incredible timing 4 — Asked Claude, Got A Hallucinated Answer, Followed It Anyway At the point of giving up, asked for a way to make it work anyway. Got a confident-sounding approach back that didn’t actually correspond to anything real, and followed it blindly instead of verifying it first, because by that point it was hour 10-something and verifying things sounded like more effort than it was. 5 — Ripped The Whole Feature Out End state: none of it works, none of it can work without real API access that doesn’t exist, so the entire feature attempt got stripped back out of the codebase. 12 hours, one commit’s worth of net progress, and that commit is the revert. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out platforms without public APIs stay that way for a reason. Q: Is any of this coming back later? A: Not until there’s an actual, real, non-reverse-engineered way in. Not chasing patched backdoors again. Q: Should you have asked Claude earlier instead of at hour 10? A: Probably. Should also have double-checked what it said instead of following it blind at 4am. Two separate lessons from one night. Q: Was any of the 12 hours useful? A: Now know definitively which platforms are and aren’t worth attempting. That’s the only thing salvaged. Q: Sleep status? A: Catastrophic. Handling that before touching code again. —This is the end*— *end for now, actual sleep permitting Im gonna go pass out on the couch ADIOS!!!
Spectralis devlog #18 —Hello again proggers— First real demo capsule is live. Not a screenshot, not a “trust me it works” — an actual .spectralis file you can grab and open yourself, right after devlog #17’s night of nothing. Felt good to ship something that isn’t a revert for once. redemption arc, one demo file at a time Cat or dog? demo.spectralis Okay let’s get into it~ —Yap— Wanted the first public demo to actually show off what a capsule can do, not just be a proof of concept nobody can open. So it’s a full one: real track, real hand-timed lyrics, and a visualizer built specifically for it instead of a generic default. —The Great Suffering— 1 — The Demo’s Live demo.spectralis is up at cdn.deltavdevs.com now. First capsule anyone outside this devlog series can actually download and open. 2 — The Track And The Lyrics Built around Black Coast’s “TRNDSTTR” (Lucian Remix). Lyrics for it were timed and written into the capsule by hand — not pulled from some export, actually sat down and did the timing work myself. 3 — The Visualizer’s Custom, Not A Default Also built the visualizer specifically for this capsule instead of shipping the demo with a stock one. Wanted the first thing people see from Spectralis to actually demonstrate what the capsule format can do end to end — audio, synced lyrics, and a visual built to match, all in one file. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one downloading the first real capsule demo. Q: Where’s the demo? A: cdn.deltavdevs.com/spectralis/demo.spectralis — direct download, no wrapper page. Q: Did you write the lyrics yourself or pull them from somewhere? A: Wrote and timed them in by hand for this capsule specifically. Q: Is the visualizer reusable for other capsules? A: Built for this one specifically, but nothing stopping it from getting adapted or reused as a base for others later. Q: Is this what stories/capsules from devlog #7-#8 were building toward? A: Exactly that. This is the first one actually finished and out in the world instead of just being tested locally. —This is the end*— *end for now, capsule downloads permitting PARODY!!!
Spectralis devlog #19 —Hello again proggers— v6 LTS is on the horizon. Scheduled time with a friend who actually owns a Tim Cook machine, fingers crossed a Mac build comes out the other side of that session actually working. praying to the WWDC gods Cat or dog? arm64 Okay let’s get into it~ —Yap— First real LTS push. Different mindset than the last 18 devlogs of feature work and 3am bug hunts — LTS means stability first, and it also means finally taking a real swing at macOS instead of leaving it as a someday problem. —The Great Suffering— 1 — Prepping For v6 LTS Getting the groundwork in place for the first Long Term Support build. Less “ship the coolest thing,” more “ship the thing that won’t need constant babysitting after release.” 2 — Borrowing A Friend’s Mac Don’t own a Mac. Scheduled dedicated time with a friend’s actual Apple hardware to attempt a real build instead of guessing blind or fighting a CI-only setup with no way to actually test the output. 3 — The Honest Caveat: Mac Support Will Lag Straight talk: limited access to Mac hardware means Mac builds will very likely only get LTS releases going forward, and will land late relative to betas and regular updates on other platforms. Not ideal, but better to say it now than pretend otherwise. can’t test what you can’t touch —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing a friend’s Mac because Apple hardware access is not a given. Q: Will Mac users get every update? A: Realistically, no — LTS builds only for the foreseeable future, and later than other platforms. Access to hardware is the bottleneck, not desire to support it. Q: Why prioritize LTS over a beta cycle right now? A: Stability’s the actual goal for v6. Betas can come later once the LTS foundation’s solid. Q: Is the Mac build guaranteed to work this session? A: No promises. That’s what “fingers crossed” means. Q: What happens if the Mac session doesn’t go well? A: Try again next time hardware access lines up. Not giving up on it, just constrained by it. —This is the end*— *end for now, Tim Cook machines permitting PRINCIPLE!!!
Spectralis devlog #20 —Hello again proggers— Two zero. Milestone devlog, and it’s a good one: LTS is about to actually go out the door, Mac included, today. we made it, barely, on no sleep, as tradition demands Cat or dog? git revert HEAD 7 Okay let’s get into it —Yap— Spent the whole night doing QoL and QA on all the tiny bugs that had been getting pushed aside devlog after devlog. Turns out “small bugs” and “easy to fix” are not the same category, and the whole night proved it the hard way. —The Great Suffering— 1 — Hydra Bugs Every single one of the small deferred bugs got patched, and every single patch spawned about three new ones in its place. Fix one, watch three grow back. Felt less like debugging and more like fighting something with a regeneration mechanic. cut off one head, three more show up, name a more accurate bug report 2 — Tried Claude Code Out Of Exhaustion Got tired enough mid-hydra-fight to set up Claude Code and hand off some of the grind. It did not go well — ended up rearranging the repo and commit layout in ways that made the history a mess, not the bugs. 3 — Had To Undo Its Commits Rolled back what Claude Code did and went back to fixing things manually. Lesson for the night: handing off a messy, deep-in-it repo state to an agent mid-crisis is not the same as handing off a clean one. 4 — Actually Got All The Tiny Bugs Out After all of that, the hydra’s actually dead. Every deferred small bug from the last 19 devlogs finally cleared in one sitting, which is the whole reason today’s release is happening at all. 5 — Mac Release, Today Following up on devlog #19’s borrowed-Mac build attempt — releasing to Mac today alongside everything else. First real payoff from that session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who fought a hydra of bugs all night and won, barely. Q: Did Claude Code actually break anything functional, or just the repo layout? A: Just history and commit structure, nothing shipped broke because of it. Still a mess worth undoing. Q: Is this LTS build the one from devlog #19’s prep? A: Yes, same one. This was the final QA gauntlet before it goes out. Q: Is Mac really getting it today? A: That’s the plan, following through on the borrowed-Mac build session from last devlog. Q: 20 devlogs in, anything you’d do differently? A: Sleep more, probably. Not going to happen, but it’d be the right answer. —This is the end*— *end for now, hydra heads permitting PROPERTY!!!
Spectralis devlog #21 —Hello again proggers— Flagged for “AI website” again. By Shipwrights this time. Getting a little tired of this specific accusation, honestly — a commit log sitting right there would show actual work happening over actual time, but apparently that’s a few extra minutes nobody wants to spend. the receipts exist, nobody’s asking to see them Cat or dog? git log –oneline Okay let’s get into it~ —Yap— Third redesign of the site now. Not because the flag was right, but because if this keeps happening it’s worth just making the “looks AI-made” argument harder to make at all, regardless of whether it was ever a fair read in the first place. —The Great Suffering— 1 — Flagged Again Shipwrights flagged the site as AI-generated. Same accusation as the devlog #12-#14 saga, different flagger this time. Slightly more annoying with each repeat, since the actual work history’s right there for anyone willing to look. 2 — The Annoying Part It’s not that the site got flagged, it’s that the disproof is trivially available — commits, timestamps, iterative changes across three separate rebuilds — and checking that apparently isn’t part of the process. Frustrating, not devastating. 3 — Redesigned It A Third Time Rather than fight the flag directly, changed the site again. Third pass now, and it genuinely reads less like generic AI-slop territory than the last version did. Whether that satisfies the next flag or not, it’s a real improvement on its own merits. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s redesigned this website three separate times partly to dodge a false flag. Q: What’s Shipwrights? A: The one doing the flagging this round. Q: Is the flag actually accurate? A: No — there’s a real commit history behind the site across devlogs #12 through #14 and now this one. The flag’s wrong, just annoying to keep disproving. Q: Does this redesign replace the one from devlog #14? A: Yes, third full pass on top of that one. Q: Any plan if it gets flagged a fourth time? A: Probably the same plan: keep the receipts, keep improving the site anyway, move on. —This is the end*— *end for now, false flags permitting PALPABLE!!!
Spectralis devlog #22 —Hello again proggers— Posting this before I pass out for real. And no, that wasn’t me faceplanting the keyboard, that was the cat walking across it. Very important distinction. the cat gets a commit credit for that one, honestly Cat or dog? cat, apparently, tonight specifically Okay let’s get into it~ —Yap— Back on the ever-growing pile of bugs and QoL from devlog #20’s hydra fight — turns out killing all the tiny bugs once doesn’t mean they stay dead forever, more just showed up in the meantime. Made real progress anyway. —The Great Suffering— 1 — A Few Spotify Bugs, Actually Squashed Chased down and fixed a handful of Spotify-side bugs this round. Not a full audit like earlier devlogs, just real ground covered on stuff that’s been sitting in the pile. 2 — Resizing QA Went through resizing behavior across the app and did a real QA pass on it — the kind of thing that’s easy to skip until someone resizes a window in a way you never tested and everything looks wrong. 3 — The Multi-Channel Stream Queue Idea Had the idea to implement multi-channel support for Streamer Queue. Started on it, and it’s genuinely probably too big to land fully before LTS ships — most likely going in as a stub for now rather than a finished feature, with the real implementation following after. “horrible idea” is doing some self-aware lifting there and I stand by it —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who mistook a cat for their own exhaustion, and honestly it could’ve gone either way. Q: What’s a “stub” mean for multi-channel here? A: The scaffolding and interface exist, the real functional implementation doesn’t yet. Placeholder with intent, not a real feature. Q: Is this the same bug pile from devlog #20? A: Same pile, refilled since then. Small bugs apparently regenerate on their own schedule, not just when you’re actively fighting them. Q: Why is multi-channel “horrible” if you’re building it anyway? A: Because scope-wise it’s a lot more than it looks like on paper, and admitting that upfront beats pretending it’s simple. Q: Sleep status tonight? A: About to happen, actually, this time. Cat’s taking the credit either way. —This is the end*— *end for now, sleepy cats permitting PEOPLE!!!
Spectralis devlog #23 —Hello again proggers— Introducing the visualizer editor. Been sitting on this one for a while without announcing it, for a very specific reason: every single time it felt ready, the format changed again and “ready” moved further away. Think it’s actually real this time. announced it in my head about six times before this devlog Cat or dog? visualizer.format Okay let’s get into it~ —Yap— Grinding all night on this one, branch and v1 dropping tomorrow. No promises beyond that, just the plan and the fact that this has been quietly cooking for way longer than any single devlog has let on. —The Great Suffering— 1 — Why This Wasn’t Announced Sooner Kept hitting the point where the editor felt done, then rethinking the underlying format and starting that part over. Easier to just not announce something that keeps changing shape than to keep walking back a “it’s ready” claim in public. 2 — v1 And The Branch, Tomorrow Committing to it now — v1 and the branch land tomorrow. Whole night’s going toward getting there, which given the last 22 devlogs of this project is either a great sign or a very familiar warning sign. history suggests: could go either way 3 — What The Visualizer Editor Actually Is A real editor for building visualizers instead of the visualizer side of the app staying built-in-only. Ties back to everything from the capsule/worlds work in devlogs #7 and #8 and the custom visualizer built for the demo capsule in devlog #18 — this is the tool version of doing that by hand. 4 — Hackatime Also Just Died (Or My PC Did) On top of everything else, Hackatime seems to be down, or my PC’s cooked, unclear which yet. Either way tracked hours for tonight are now undefined. Yipee. unlogged hours are the best kind of hours, said nobody’s time tracker ever —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to pull yet another all-nighter for a feature reveal. Q: Why did the format keep changing? A: Each pass revealed a new limitation once actually used for real, and fixing that meant reworking the format again rather than shipping something known to be wrong. Q: Is this related to the demo capsule visualizer from devlog #18? A: Same territory. That one was hand-built. This is the editor meant to make building one not require doing it by hand. Q: What’s “v1” mean here specifically? A: First real usable version, branch-only for now, not a full public release yet. Q: Any risk this slips again? A: Always possible given the track record, but committing to tomorrow specifically this time. —This is the end*— *end for now, format stability permitting PEPLE!!!
Spectralis devlog #24 —Hello again proggers— Rewrote the README a third time. Not because it was wrong, because proper prose and actual formatting apparently reads as “completely AI” to whoever’s judging it, and I’m too burnt out to keep arguing that point. So it just got redone instead. can’t fight the vibes, can only rewrite around them Cat or dog? README.md Okay let’s get into it~ —Yap— Small win buried in the exhaustion: website’s on version 4 now and it didn’t get flagged this time. First one that made it through clean since devlog #21 started this whole saga. Progress, even if the README’s now on its third rewrite for reasons that have nothing to do with whether it’s actually good. —The Great Suffering— 1 — README Rewrite #3 Same content, restructured again, because well-formatted prose keeps getting read as an AI tell regardless of who wrote it or how. Not going to keep relitigating this one, just redid it and moved on. 2 — Website v4 Survived The actual good news. Fourth pass on the site, first one that didn’t get flagged. Whatever combination of changes from devlog #21 onward finally landed right. 3 — Hoping The App Gets Checked Next If the docs and the website keep clearing review, maybe eventually the actual app gets looked at instead of just the surface-level stuff around it. That’s the real hope here — less time defending prose formatting, more time on the thing that actually matters. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose actual writing keeps getting mistaken for a machine’s. Q: Why does formatted prose get flagged as AI? A: Genuinely unclear, and at this point not worth the energy to keep contesting. Rewriting around it was faster than arguing it. Q: Is this the fourth full website redesign? A: Yes — devlog #14, then #21’s rework, and now this pass, landing clean. Q: Has the app itself ever been flagged? A: Not yet, and that’s sort of the point of this devlog — hoping it stays that way, or at least gets a fair look if it comes up. Q: How’s the burnout? A: Present. Noted. Continuing anyway. —This is the end*— *end for now, formatting opinions permitting PEEL!!!
Spectralis devlog #25 —Hello again proggers— Short one, I’m about to pass out for real this time. Ground away at the visualizer toolkit for a long stretch and it’s still nowhere near done. another one for the “not as close as I thought” pile Cat or dog? too tired to pick one honestly Okay quick version~ —Yap— Same visualizer editor territory from devlog #23, except the format not-changing this time didn’t mean the finish line got any closer. Long grind, real progress somewhere in there probably, just not a done toolkit at the end of it. —The Great Suffering— 1 — The Toolkit Isn’t Close Put in a long stretch on it and it’s genuinely still far from finished. Not a small gap either, just more scope than one exhausted session could close. 2 — I’m Cooked That’s the whole update. No dramatic bug story tonight, just hours in and not enough left to keep going. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who should probably close the laptop now. Q: Is this the same visualizer editor from devlog #23? A: Same one. Still cooking, longer than expected. Q: Any specific blockers? A: Too tired to write them up properly tonight. Next devlog, probably, once there’s actual sleep behind it. Q: When’s it landing? A: Unknown. Not this session. —This is the end*— *end for now, actually sleeping this time POOL!!!
Spectralis devlog #26 —Hello again proggers— Still grinding the visualizer toolkit from devlog #25. Fueled up properly this time — favorite tunes on, Coke Zero and a Monster Ultra on deck, going the entire night. Also, small detour: past me apparently gave in and used Electron at some point, so present me now has to relearn it from scratch. past me makes decisions present me has to live with, name a more accurate description of software Cat or dog? require(‘electron’) Okay let’s get into it~ —Yap— Two threads tonight: the toolkit grind continuing from last devlog, and a genuinely surprising discovery on the Mac build front that’s going to need its own hotfix branch. —The Great Suffering— 1 — Relearning Electron Past-me committed to Electron somewhere along the way and current-me forgot most of it. Spending part of tonight just getting back up to speed on something that used to be second nature. Annoying, but at least it’s a known quantity once it clicks back in. 2 — The Toolkit, Still Grinding Same visualizer toolkit as devlog #25. Not done yet, but the night’s young and there’s caffeine involved. Hoping to actually close real ground on it before LTS needs to be ready. 3 — Mac Build Actually Compiles Now Following up on devlog #19’s borrowed-Mac session — got it to build and compile this time. Real progress on a front that’s been genuinely hardware-constrained the whole way. 4 — Turns Out Mac Isn’t Windows Or Linux (Shocking, I Know) Here’s the surprising part: a lot of the build scripts turned out to be Windows/Linux-centric, and Mac is, in fact, neither of those operating systems. Somehow this wasn’t obvious until actually staring at a failing script on real Mac hardware. three major desktop OSes and somehow I only accounted for two of them 5 — Hotfix Branch Incoming Need to spin up a hotfix specifically for the platform-assumption problem in the scripts, and hoping it merges back clean without conflicts. Given tonight’s track record so far, cautiously optimistic. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who forgot their own framework choice from past-self. Q: Why Electron in the first place? A: Decision from before this devlog series apparently, reasons unclear at this hour, dealing with the consequences now regardless. Q: Is the Mac hotfix urgent? A: Ties directly into whether LTS with Mac support actually holds together, so yes, fairly urgent. Q: Was assuming Windows/Linux-only scripts really a mistake nobody caught until now? A: Apparently so. Borrowed-Mac hardware access from devlog #19 finally exposed it. Q: Toolkit status vs. hotfix status tonight — which wins? A: Whichever gets further before the caffeine runs out. Probably both get some progress. —This is the end*— *end for now, merge conflicts permitting PROPER!!!
Spectralis devlog #27 —Hello again proggers— Still going. Decided mid-grind to switch off JSON-based saving entirely and move to a proper binary streamed format instead — faster save/load, way less CPU overhead. Which sounds like a clean upgrade until you realize it means reading books on binary format design that were probably written before I was. my caffeine and my reading list have diverged wildly tonight Cat or dog? BinaryWriter Okay let’s get into it~ —Yap— The pivot away from JSON wasn’t planned going into tonight, it just became obviously worth it partway through the toolkit grind. Now stuck in the part of the process nobody enjoys: documentation, theory, and CS ideation before any of the actual implementation gets to happen. —The Great Suffering— 1 — JSON’s Getting Replaced Moving off JSON-based saving to a binary streamed format. The reasoning’s simple — faster save/load, meaningfully less CPU usage — but simple reasoning doesn’t mean simple implementation. 2 — Reading Books Older Than Me Digging into binary streaming format theory means reading material that predates this whole project by a wide margin, some of it by a lot more than that. Foundational stuff, just not exactly light reading at this hour. 3 — Documentation And Theory Hell Currently deep in the least glamorous part of any format redesign: reading documentation, working through theory, and CS ideation before writing a single line that actually does anything. Necessary, still miserable at 2am. the implementation is the fun part and it’s still hours away 4 — Sun Came Up, Had A Sandwich, Kept Going Watched the sunrise somewhere in the middle of the theory reading. Had an egg and bacon sandwich for breakfast, genuinely delicious, best part of the night so far. No sleep planned until tonight — just powering through on breakfast fuel instead. breakfast during an all-nighter hits different —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one reading format-design theory older than their own project at 2am. Q: Why move off JSON now, mid-grind? A: Became clear it was the right call while working on the visualizer toolkit — better performance characteristics were worth the detour. Q: Is this related to the toolkit from devlog #25/#26? A: Same overall session, this is a scope addition that came up while working on it. Q: When does actual implementation start? A: Once the theory and documentation phase actually resolves. Not there yet. Q: Is tonight ever going to end? A: Not until tonight, apparently — sun’s already up and there’s no sleep planned before then. —This is the end*— *end for now, binary formats permitting PAM!!!
Spectralis devlog #28 —Hello again proggers— LTS 6 is out. Genuinely out, not “shipped to nowhere” out like devlog #11. Sleep deprivation’s fully caught up though — first chance I get, I’m passing out on the couch with the cat and that’s non-negotiable at this point. the cat’s getting a co-author credit at this rate Cat or dog? couch, specifically, with the cat, immediately Okay let’s get into it~ —Yap— Long stretch from devlog #26 through here finally paid off. LTS 6 pushed, and the major macOS decoding problems from the borrowed-Mac build sessions actually got fixed. Real progress, real exhaustion, both at once. —The Great Suffering— 1 — LTS 6 Is Out Following the hydra-bug fight in devlog #20, the Electron relearn and Mac hotfix in #26, and the binary format detour in #27 — it’s actually pushed now. Linux and Windows builds are the ones going out first. 2 — Major macOS Decoding Problems, Fixed Following up on the platform-assumption bug from devlog #26, where Windows/Linux-centric scripts choked on Mac being neither — dug into the actual decoding issues on macOS and got the major ones resolved this round. 3 — Mac Release Is Coming, Just Not Today No Mac hardware access again until Monday, so the macOS build follows a bit after Linux/Windows instead of dropping same-day. Same access constraint from devlog #19, still the bottleneck, still the plan. 4 — Sleep Is Winning Officially out of gas. Couch, cat, first available window. This devlog is basically the victory lap before collapsing. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to lose consciousness on a couch next to a cat, mission accomplished. Q: Is LTS 6 out for everyone right now? A: Linux and Windows, yes. macOS is coming shortly after once Mac access is available again Monday. Q: Were the macOS decoding problems from the script issue in devlog #26? A: Related territory, yes — once the platform-assumption bug got flagged, the deeper decoding issues underneath it got found and fixed too. Q: Any concerns going into the Mac release specifically? A: Nothing unresolved as of this devlog, but access is still limited to occasional sessions, so timing’s dependent on that. Q: What’s next after this? A: Sleep. Genuinely, actually sleep, before anything else touches this project. —This is the end*— *end for now, couch naps permitting thud Zzzzzz!!!
Spectralis devlog #29 —Hello again proggers— The studio’s finally looking like a real UI tool instead of a collection of windows held together by vibes. Two design references pulled this round: Godot for world editing, and Adobe After Effects for capsules. stealing good ideas from great tools is called “design research,” look it up Cat or dog? Ctrl+Shift+F Okay let’s get into it~ —Yap— Studio’s been the least polished part of the whole app for a while, mostly functional, rarely pretty. This round actually leaned into real interface design instead of just adding buttons where they fit, borrowing structure from two tools that already solved similar problems well. —The Great Suffering— 1 — Godot-Inspired World Editing World editing took cues from Godot’s editor layout — the way it structures a scene tree, viewport, and inspector panel together as one coherent workspace instead of scattered windows. Applying that same structural thinking to world editing here, since worlds are conceptually similar: a tree of pieces you’re arranging in space. 2 — After Effects-Inspired Capsules Capsule editing leaned on After Effects instead, specifically the layer/timeline/composition mental model. Capsules are time-based and layered by nature — a story surface, a visualizer, audio all stacked together — so a timeline-and-layers metaphor fits better than a flat property list ever did. 3 — The Studio Finally Feels Like A Tool Combined, these two reference points are what’s pushing the studio from “internal dev utility” toward something that actually feels designed for someone to sit down and use, not just something built incrementally to unblock whatever feature needed it that week. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing UI patterns from two very different but very good tools. Q: Is this a full rewrite of the studio UI? A: More a restructuring around better mental models than a ground-up rebuild, but it touches a lot of surface area. Q: Why Godot for world editing specifically? A: Scene/viewport/inspector is a well-worn pattern for spatial editing, and worlds are fundamentally a spatial arrangement problem. Q: Why After Effects for capsules? A: Capsules stack time-based layers — story, visualizer, audio — which maps naturally onto a timeline/layers workflow instead of flat settings. Q: Does this connect to the visualizer toolkit grind from devlogs #25-#27? A: Same broader authoring-tools push, yes, this is the UI side catching up to that work. —This is the end*— *end for now, layer panels permitting POP!!!
Spectralis devlog #30 —Hello again proggers— Following up on the studio redesign from last devlog — actually building inside that new layer system now. Lyric importer, a bezier tool that fought back the whole way, and capsules jumped to full HD. 30 devlogs in and the bezier tool still almost won Cat or dog? bezier.controlPoint Okay let’s get into it~ —Yap— Layers from devlog #29’s redesign got real functionality built on top of them this round, plus a genuinely useful new import path and a resolution bump that should’ve probably happened earlier. —The Great Suffering— 1 — Layer Fixes Cleaned up a handful of issues in the new After Effects-style layer system from last devlog — the kind of rough edges that only show up once you’re actually building real content in it instead of just looking at the layout. 2 — Lyric Importer: Auto Vector Layers + Keyframing New importer that takes lyric timing and automatically generates vector layers, keyframed to match. Turns what used to be manual layer-by-layer, keyframe-by-keyframe setup into an actual import step. Big time save for anything lyric-driven, including future capsules like the demo from devlog #18. 3 — A Few More Bugs, Squashed Small round of additional fixes alongside the bigger items, nothing individually dramatic. 4 — Capsule Resolution: Bumped To Full HD Capsules render at full HD now instead of whatever lower resolution they were capped at before. Straightforward upgrade, noticeably better output. 5 — The Bezier Tool (Which Was Hell) Added a real bezier curve tool to the timeline/layer editing. Genuinely brutal to get right — curve math, control point handling, and making it feel intuitive to actually drag are three different hard problems stacked on top of each other. Worth it, but it fought back the whole way. bezier curves: simple in theory, a nightmare in an actual editor UI 6 — Timeline And Tool QoL Assorted quality-of-life improvements across the timeline and tools generally — the small friction-reduction stuff that adds up once you’re using the studio for real work instead of just testing it. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just fought a bezier tool and mostly won. Q: Does the lyric importer work with the demo capsule from devlog #18? A: That one was hand-timed and hand-built before this importer existed — this tool’s for making the next ones faster. Q: Why was the bezier tool specifically so hard? A: Curve math, control point interaction, and UI feel all had to work together, and getting any one of them wrong makes the whole tool feel broken. Q: Is full HD the resolution ceiling now, or is higher coming later? A: Full HD is what shipped this round. No commitment yet on going higher. Q: Is the studio redesign from devlog #29 basically done now? A: Getting real functionality built on it, which is a good sign, but still ongoing. —This is the end*— *end for now, control points permitting PALPABLE!!!
Spectralis devlog #31 —Hello again proggers— More QoL, a real bug fixed in world editing, and a proper in-depth test run of the whole thing. Honest verdict after actually using it for real: still sucks, still hate it, but it’s at least somewhat usable now. Progress, technically. “somewhat usable” is a real milestone when you started from “actively bad” Cat or dog? node.isCorrupt Okay let’s get into it~ —Yap— World editing’s been the newer, rougher part of the studio since the Godot-inspired redesign in devlog #29. This round was about actually running it through its paces instead of just building on top of it, and that testing found a real problem. —The Great Suffering— 1 — More QoL Another pass of small quality-of-life improvements, continuing the trend from the last couple devlogs. Nothing individually huge, all of it adds up. 2 — The Bad Node Bug Found and fixed a genuinely bad node bug in the world section during testing. The kind of bug that only shows up once you’re actually building real worlds instead of poking at an empty editor. 3 — The In-Depth Test Run Took world editing for a real, thorough run this time instead of a quick sanity check. Built something with actual substance in it and used the tool the way it’s meant to be used. 4 — The Honest Verdict Still sucks. Still hate using it. But after this round of fixes and QoL, it’s crossed into “somewhat usable” territory, which is more than could be said before this session. low bar, cleared, moving on —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just admitted their own tool still sucks and shipped it anyway. Q: Is world editing done now? A: No, “somewhat usable” is the current state, not “finished.” More work ahead. Q: How bad was the node bug? A: Bad enough to matter, found through actual real-world testing rather than a quick check. Q: Is this related to the layer work from devlog #30? A: Different area — that was capsules/timeline, this is world editing specifically. Q: What’s the plan to make world editing not suck? A: Keep testing it for real, keep fixing what that testing turns up. This devlog’s the start of that loop, not the end. —This is the end*— *end for now, corrupted nodes permitting PAPLE!!!
Spectralis devlog #32 —Hello again proggers— Mac’s out. Actually out, actually available, actually done. Took way longer than expected — the site needed updating and every single update script needed fixing before this could actually go out the door clean. “we got mac out” undersells how much site and script work that actually took Cat or dog? .pkg Okay let’s get into it~ —Yap— Closing the loop that started way back in devlog #19 with a borrowed Mac and a hopeful “fingers crossed,” went through the decoding fixes in devlog #28, the platform-assumption hotfix in devlog #26, and now it’s actually shipped. Quick policy reminder while we’re here, since it matters going forward. —The Great Suffering— 1 — The Site Needed Updating First Before Mac could actually go out, the site itself needed real updates to reflect it — new download option, new platform messaging, none of which existed yet. Took a real chunk of the time this release ate. 2 — Every Update Script Needed Fixing Following up on the Windows/Linux-centric script assumptions caught back in devlog #26 — turns out that wasn’t a one-off fix, it touched update scripts broadly. Had to go through and fix them properly for Mac to actually be able to update itself going forward, not just install once. 3 — Mac Is Actually Out After all of that: it’s live. Full journey from borrowed hardware sessions to an actual public release. 4 — Reminder: Mac Only Gets LTS Quick policy note, stated plainly since it matters: Mac only receives LTS releases going forward, not minor updates, unless a minor is a Mac-specific patch. Same access-constraint reasoning from devlog #19 — this isn’t changing anytime soon, so setting the expectation clearly now. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out “ship Mac” secretly meant “rebuild the update pipeline.” Q: Does Mac get every LTS release? A: Yes, every LTS. Just not the minors in between, unless that minor is Mac-specific. Q: Why not give Mac full parity now that it’s out? A: Hardware access is still the bottleneck — same reasoning as devlog #19, testing and building for Mac isn’t a routine, always-available thing yet. Q: What took so long between the decoding fixes in devlog #28 and now? A: Mostly the site and update script work described above — the actual build was closer to ready than the delivery pipeline around it was. Q: Is this the end of the Mac saga? A: The release side, yes. Ongoing maintenance is just going to follow the LTS-only cadence from here. —This is the end*— *end for now, update scripts permitting POP!!!
Spectralis devlog #33 —Hello again proggers— First real wave of feedback since Mac shipped in devlog #32, and it’s been genuinely good. Patching a handful of bugs people actually pointed out, plus one quick clarification for a specific rater who had a question. real users, real feedback, feels different from testing solo Cat or dog? feedback.md Okay let’s get into it~ —Yap— Shipping to actual people instead of just self-testing changes the kind of bugs that surface. Round of patches based directly on what came in, plus a couple of housekeeping notes. —The Great Suffering— 1 — Real Feedback, First Time At This Scale Genuinely solid feedback wave since the Mac release. Different flavor of bug reports than internal testing ever produces — actual usage patterns finding things a solo QA pass wouldn’t. 2 — Patching What Got Pointed Out Working through the specific bugs raised by that feedback. Direct fixes for direct reports, exactly the kind of loop that’s supposed to happen once something’s actually in people’s hands. 3 — Quick Note For A Specific Rater One rater asked about the track used in devlog #1 — it’s a custom remix of “Delete” by Ninjirachi. DM if you want the file. 4 — How To Reach Out For anyone hitting issues with the app: Slack works, or Discord at @deltav0rtex . Genuinely want the reports, keep them coming. 5 — A Surprise Is Coming Next Ship Got something tucked away for the next release that should land well. Not spoiling it here, staying quiet on purpose. Minor patch for this round’s QoL fixes drops within the next two days. teasing it and saying nothing else, that’s the whole bit —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one actually reading feedback instead of guessing what’s broken. Q: How do I report a bug? A: Slack, or Discord — @deltav0rtex . Q: What was that track in devlog #1? A: A custom remix of “Delete” by Ninjirachi. DM for the file if you want it. Q: Is the current bug list from this feedback wave big? A: Manageable, working through it directly rather than batching for a bigger release. Q: Any plans to formalize a feedback/bug channel later? A: Not stated yet, current setup is DMs and Slack for now. Q: What’s the surprise for next ship? A: Not saying. That’s the point of a surprise. Q: When’s the minor QoL patch dropping? A: Within the next two days. —This is the end*— *end for now, bug reports permitting PARABLE!!!
Spectralis devlog #34 —Hello again proggers— Still on the devlog commits grind. The surprise from devlog #33 is actually finished now, releasing alongside the next Stardance ship as soon as this current one clears. Meanwhile, spent this round scouring the app for small edge cases and UI stuff that’s been quietly overlooked. the surprise is done, the suspense is not Cat or dog? edge_case.md Okay let’s get into it~ —Yap— Two tracks this devlog: the surprise from last time is locked and ready, waiting on the current ship to clear before it goes out with Stardance. In the meantime, doing a proper sweep for the small stuff — edge cases and UI rough edges that don’t show up unless you’re specifically hunting for them. —The Great Suffering— 1 — The Surprise Is Finished Whatever it is, it’s done. Releasing with the next Stardance ship, not this current one — has to clear first. Still not saying what it is. still not telling you, patience 2 — Scouring For Edge Cases Going through the app specifically looking for edge cases that got missed during normal feature work — the inputs and states nobody thinks to test until something breaks in a very specific, very rare way. 3 — UI Stuff That Got Overlooked Alongside the edge cases, hunting down small UI issues that slipped through — spacing, alignment, states that don’t look quite right, the stuff that’s easy to miss when you’re heads-down building instead of using the app like a regular person would. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hunting edge cases nobody else would think to try. Q: What’s the surprise? A: Patience, my dear child. Q: Why wait for the current ship to clear first? A: Cleaner to let one release settle before stacking the surprise onto the next one. Q: Any specific edge cases found yet? A: Sweep’s ongoing, nothing dramatic enough to call out individually yet. Q: Still not saying what the surprise is? A: Correct. Ask again next devlog. —This is the end*— *end for now, edge cases permitting PERISHABLE!!!
Spectralis devlog #35 —Hello again proggers— Long way from v5.3.0, that’s for sure. New ship’s cooking, and it’s built directly off the feedback wave from devlog #33 — took what came in and actually built more on top of it. Also, the big one this round: video export is here. 35 devlogs from “last ship” to this Cat or dog? .mp4 Okay let’s get into it~ —Yap— This one’s a real feedback-driven ship, not just internal roadmap stuff. Fed reports and requests all the way back from devlog #2’s post-first-ship feedback into the app, and video export was the headline addition that came out of it. —The Great Suffering— 1 — Feedback Actually Became Features Everything that came in since devlog #2, right after the very first ship, finally got folded back into this release, not just patched as bugs but expanded into more app. Real loop from “here’s what’s wrong/missing” way back then to “here’s it, fixed and built out” now. 2 — Video Export Is Here For music makers who want something to post — YouTube, Klipy, wherever you’re posting cool stuff — Spectralis can now export video directly instead of just playing audio and visualizers live. Been a long time coming given how much the visualizer/capsule work has built up across devlogs #7, #18, #23, and #29-#30. 3 — This Is The New Ship, Not The Finished One Announcing the direction this round more than closing it out — the surprise from devlog #33/#34 still rides along on this too. Full picture coming as it actually ships. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just got a whole export pipeline for their trouble. Q: What can video export actually do? A: Exports your visualizer/capsule output as an actual video file, suited for posting to platforms like YouTube or Klipy. Q: Is this the same ship as the Stardance surprise from devlog #34? A: Same overall release window, yes. Q: How much of this came directly from user feedback? A: A meaningful chunk — some of it going all the way back to devlog #2, right after the very first ship. Q: When’s it actually dropping? A: Still in progress. This is the announcement, not the release. —This is the end*— *end for now, export pipelines permitting PS: couldn’t find a good meme this time, so you get corporate gif slop instead. Enjoy. PICKLE!!!
Spectralis devlog #36 —Hello again proggers— Last log before 6.0.1 tries to ship to everyone. Except Mac, remember? If anyone — and by anyone I mean basically no one — has the app downloaded already, you should see the update land fairly soon. “anyone” carrying a lot of self-deprecation in that sentence Cat or dog? v6.0.1 Okay let’s get into it~ —Yap— Four things landing in this round: video export from devlog #35 finally patched back in properly, the about page expanded, a real EQ upgrade, and more webview bugs cleared out. Then it’s out the door. —The Great Suffering— 1 — Video Export, Actually Patched In Announced back in devlog #35, and this round it’s actually working and patched into the build for real instead of just existing as a headline feature nobody could touch yet. 2 — About Page, Expanded Grew the about page out — more actual content instead of the bare-minimum version it’s had this whole time. 3 — A Far More Advanced EQ System Real upgrade here: new EQ with envelope styling and a handful of presets. Meaningfully more capable than whatever was there before, for anyone who actually cares about shaping their sound instead of just hitting play. 4 — More Webview Bugs, Patched Following the WebView2Host fast-path fix from devlog #9, a few more webview-related bugs got cleared out this round. Apparently that surface keeps finding new ways to misbehave. webview bugs are the gift that keeps on giving 5 — 6.0.1 Ships, Mac Excluded (Still) Same LTS-only policy from devlog #32 applies — Mac isn’t getting 6.0.1 as a minor. Everyone else should see the update land soon. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to auto-update basically no one to 6.0.1. Q: Why doesn’t Mac get 6.0.1? A: Same policy from devlog #32 — Mac only gets LTS releases, not minors, unless it’s a Mac-specific patch. Q: What’s new in the EQ system specifically? A: Envelope styling plus a set of presets, a real step up from the previous version. Q: Is video export from devlog #35 fully working now? A: Yes, patched in properly this round. Q: When does 6.0.1 land? A: Fairly soon, per this devlog, for anyone who already has the app installed. —This is the end*— *end for now, update pushes permitting PEBBLE!!!
Spectralis devlog #37 —Hello again proggers— Working through the feedback wave from the ship, including an upcoming maybe-new streaming service integration. Reverse engineering, again, yay. Also completely forgot Hackclub’s 10 hour limit was a thing and ran 5 hours over it. It’s fine. Everything’s fine. last time reverse engineering a streaming service ate 12 hours and produced nothing, so this is either growth or déjà vu Cat or dog? HKEY_LOCAL_MACHINE Okay let’s get into it~ —Yap— Post-ship feedback turned into real changes fast, and one of them’s a streaming service integration that’s back to reverse-engineering territory — hopefully with better luck than the devlog #17 saga. Also, format note: switching up how devlogs get posted going forward. —The Great Suffering— 1 — Maybe New Streaming Service Support Working on possible support for another streaming service, and since it doesn’t have a public API either, that means reverse engineering again. Learned some hard lessons from devlog #17’s all-nighter about this exact kind of work, applying them here — verifying before implementing, checking whether something’s already patched before sinking hours into it. 2 — 15 Hours, Not 10 Completely lost track of Hackclub’s 10 hour session limit and blew past it by 5 hours. Not the plan, happened anyway, no regrets loud enough to stop it from happening again probably. time limits are more of a guideline when you’re mid-flow 3 — A Format Change, By Request People like the meme format but keep asking to actually see the project itself, which is fair — problem is most of what’s happening is engine work, and a screenshot of raw code just doesn’t communicate much on its own. Going to try posting an actual screenshot as the first image and keep the meme as the second, going forward. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just blew past a 10 hour limit by half again as much. Q: Is this streaming integration going to end like devlog #17’s did? A: Hoping not — going in more carefully this time given how that one went. Q: Why not just show code screenshots if people want to see the project? A: Raw engine code doesn’t communicate much visually to most people. Trying to find screenshots that actually show something meaningful instead. Q: Will the meme format go away? A: No, staying as image two. Just adding an actual project screenshot as image one. Q: How’s the feedback wave going overall? A: Productive, this streaming service idea being one direct result of it. —This is the end*— *end for now, session limits permitting POSSIBLE!!!
Spectralis devlog #38 —Hello again proggers— Suno’s integration broke after their latest TOS update, so that got fixed. Also added Discord Rich Presence control for capsules, started chasing down a batch of connections that quietly broke or got dropped over time, and picked up a fun trivia fact along the way: Suno apparently hosts on AWS S3. a TOS update breaking an integration, name a more classic story Cat or dog? S3:// Okay let’s get into it~ —Yap— Mixed bag this round: one reactive fix from an external platform change, one genuinely new feature, and the start of a cleanup pass on integrations that have been quietly rotting since whenever they last got touched. —The Great Suffering— 1 — Suno Integration, Fixed Suno’s newest TOS update broke the existing integration. Patched it back up to work with the new terms. Reactive fix, not a fun one, but necessary. 2 — Capsule DRPC Control Real new feature: Spectralis capsules can now control Discord Rich Presence, so a capsule can show custom status while it’s playing instead of the app just showing generic now-playing info. 3 — Chasing Down Broken And Dropped Connections Going through existing integrations that broke with newer updates on the other end, or that got dropped along the way and never revisited — untitled.stream compatibility being one specific example. Working through the backlog of “this used to work” one at a time. 4 — Suno Hosts On AWS S3 Small fun discovery while poking around the integration: Suno’s hosting is on AWS S3. Not actionable, just neat to know. 5 — Looking For New Platforms Actively looking for what to integrate with next. Feedback on what platforms people actually want would genuinely help shape this. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose integration broke because someone else updated a TOS page. Q: What’s DRPC? A: Discord Rich Presence — the status shown under someone’s name in Discord. Capsules can now set custom status through it. Q: What’s untitled.stream compat about? A: One of the connections that broke or got left behind at some point — being actively worked back into shape. Q: What platforms are being considered for new integration? A: Not decided yet, genuinely open to suggestions. Q: Was the Suno fix hard? A: Not conceptually, just annoying — an external change forcing reactive work instead of planned work. Q: What’s the image order now? A: Changed my mind again — meme first, app screenshot second this time. The devlog #37 order didn’t stick. —This is the end*— *end for now, TOS updates permitting POP!!!
Spectralis devlog #39 —Hello again proggers— All-nighter, running on 3 Monsters and a Coke Zero. Reverse engineering APIs is hard as hell, and untitled.stream in particular fought back the whole way. Also snuck in a fix for a Spotify library issue on the side. 3 Monsters and a Coke Zero is not a nutrition plan, it’s a battle strategy Cat or dog? 429 Too Many Requests Okay let’s get into it~ —Yap— Following up on devlog #38’s untitled.stream compat work — turns out “working on it” undersold how hard it actually was. Genuinely brutal reverse engineering session, plus a smaller fix that came out of the same stretch of work. —The Great Suffering— 1 — untitled.stream Was Particularly Hard To Crack Chasing this compatibility since devlog #38, and it turned out to be one of the harder reverse-engineering targets yet. No public API to lean on, so it was the usual slow grind of observing behavior and piecing together how it actually works under the hood. some APIs give up easy, this was not one of them 2 — Reverse Engineering APIs In General: Still Hard Not a new lesson given devlog #17’s whole saga, but worth restating: this category of work is consistently the hardest and slowest kind on the whole project. Going in with better patience and verification habits this time though, which helped. 3 — Spotify Library Polling, Increased Bumped how often libraries get polled to account for some Spotify-side issues that were surfacing. Smaller fix, but a real one, found and shipped in the same session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who ran on three energy drinks to crack one integration. Q: Is untitled.stream compat actually working now? A: Meaningfully further along after this session, following up from devlog #38’s start on it. Q: Did this go better than devlog #17’s reverse-engineering disaster? A: Yes — hard and slow, but productive this time rather than a total dead end. Q: What was the Spotify polling issue specifically? A: Library state getting out of sync too easily — more frequent polling keeps it closer to accurate. Q: Sleep status? A: Same as every other all-nighter devlog. Not great. Worth it this time though. —This is the end*— *end for now, rate limits permitting PIPSQUEAK!!!
Spectralis devlog #40 —Hello again proggers— 10 straight hours, and the highlight is getting tricked by Suno’s own scraper path. There was a decoy path that looked exactly like the real music endpoint, and it just returned forbidden the whole time. Maybe I’m the bot in this scenario. Unclear. got outsmarted by a decoy URL, humbling Cat or dog? 403 Forbidden Okay let’s get into it~ —Yap— Continuing the reverse-engineering grind from devlog #39, Suno specifically threw a curveball this round. Beyond that, spent real time thinking about what the app actually is and why certain features exist, plus started tearing into Song Wars, which has apparently been quietly buggy for a while. —The Great Suffering— 1 — The Suno Decoy Path Suno provides a path that looks exactly like the real music endpoint, structurally identical, right down to how it responds at a glance. In reality it just returns forbidden every time. Spent real time thinking this was progress before realizing it was a dead end dressed up as a working one. maybe im the bot 2 — Actually Fixed It, After Testing Once the decoy was identified for what it was, found the real path and got it working properly. Testing it thoroughly this time before calling it done, given how devlog #39 went. 3 — Identity Of The App Spent real time thinking through what Spectralis actually is at this point, and justifying why certain features exist rather than just accumulating them because they seemed cool at the time. Less code, more “why does this exist and does it still make sense.” 4 — Song Wars Rework, Started Started tearing into Song Wars, which turns out to be hella buggy underneath. Early stages of a rework rather than a patch job, since patching individual bugs in it hasn’t been holding up. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who got fooled by a decoy API path for a while. Q: Was the Suno issue related to the S3 discovery from devlog #38? A: Same general integration, different specific obstacle this round. Q: Is Song Wars getting a full rewrite or just fixes? A: Leaning toward a real rework rather than more patches, given how buggy it’s turned out to be. Q: What does “identity of the app” work actually produce? A: Not code directly — more a filter for which features actually belong and why, going forward. Q: How’s the 10 hour grind treating you? A: Productive despite the decoy detour. Real progress by the end of it. —This is the end*— *end for now, decoy paths permitting PAP!!!
Spectralis devlog #41 —Hello again proggers— Podcast mode’s in the works, with a real new way to actually find saved podcasts instead of digging for them. Also fixed the randomizing tools so they actually help pick a song instead of just existing decoratively. And: class got canceled for a hurricane watch, so tonight’s an all-nighter by default. free 10 hours courtesy of a hurricane, weird way to get them Cat or dog? shuffle(weighted=True) Okay let’s get into it~ —Yap— Two real features this round plus a forced schedule change. Podcast mode’s genuinely new territory for the app, the randomizer fix is a smaller but meaningful UX improvement, and the hurricane watch just handed over a full night that wasn’t originally planned for grinding. —The Great Suffering— 1 — Podcast Mode, In Progress Building out actual podcast support, including a new way to locate saved podcasts rather than just treating them like any other track and hoping they surface in the right place. Real new territory for the app compared to the music-first feature set so far. 2 — Randomizing Tools, Actually Useful Now The shuffle/randomizer tools existed before but weren’t really doing anything meaningful — mostly there in name. Fixed so they actually aid in song selection now instead of just sitting there as a checkbox nobody trusted. a randomizer that doesn’t actually help you pick anything is just decoration 3 — The Hurricane Watch Situation Class got canceled due to a hurricane watch, which means tonight’s turning into a full grind session that wasn’t originally on the calendar. Silver lining of a weather delay, I suppose. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one getting a bonus grind night courtesy of a hurricane watch. Q: Is podcast mode close to done? A: In progress, this devlog’s the early build phase, not the finish line. Q: What was actually wrong with the randomizer before? A: It existed but didn’t meaningfully help pick songs — more decorative than functional. Fixed to actually aid selection now. Q: Is Song Wars rework from devlog #40 still going? A: Ongoing, this devlog’s focus shifted to podcast mode and the randomizer instead. Q: Stay safe with the hurricane watch, by the way. A: Appreciated. Staying inside, staying coding. —This is the end*— *end for now, hurricane watches permitting POOL!!!
Spectralis devlog #42 —Hello again proggers— Spent this round hardening shared queues, mostly because WebSockets are just genuinely cool and it’s about time they got treated that way in this codebase. a devlog motivated entirely by “websockets are cool” is a valid devlog Cat or dog? ws:// Okay let’s get into it~ —Yap— Shared queues have been functional but not particularly resilient this whole time, riding on shared play’s presence/reactions/queue work from way back in devlog #9. This round was about actually hardening that layer instead of leaving it fragile. —The Great Suffering— 1 — Hardening Shared Queues Went through and shored up a bunch of the underlying bases for shared queues — the stuff that only matters once real connections are dropping, reconnecting, and behaving unpredictably instead of the clean happy-path test case. 2 — Because WebSockets Are Cool Genuinely part of the motivation here. Real-time bidirectional connections are just satisfying to get right, and shared queues are exactly the kind of feature that benefits from taking that layer seriously instead of treating it as plumbing. not every feature needs a dramatic bug story, sometimes it’s just “wanted to do it well” —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hardening infrastructure purely because it’s fun to get right. Q: Is this related to the shared play work from devlog #9? A: Same general system, this round focused specifically on making the queue layer more resilient. Q: What does “hardening” mean here specifically? A: Making the shared queue behavior hold up better under real conditions — drops, reconnects, timing edge cases — rather than just the clean test path. Q: Any bugs found during this pass? A: Nothing dramatic enough to call out individually, mostly proactive resilience work. Q: What’s next? A: Podcast mode and the randomizer work from devlog #41 are both still ongoing threads. —This is the end*— *end for now, dropped connections permitting P_P!!!
Spectralis devlog #43 —Hello again proggers— [2:47am] okay so. websockets again, more of them, and now the CDN backup is failing too which is great, love that for me. on my 4th coffee at this point, energy drink count is starting to get concerning honestly and I’m not gonna pretend it isn’t. pretty sure i debugged the cdn thing at 4am purely out of spite Cat or dog? idk man catch (Exception e) { } at this point Okay let’s get into it, or at least try to~ —Yap— so continuing from devlog #42’s websocket hardening, turns out hardening one part just revealed the next part was also fragile, shocking, anyway. need to push something to prod to actually get it working but can’t do that without interrupting infra which is currently live so that’s a whole separate problem I have to solve first before I can solve the actual problem. love layers. —The Great Suffering— 1 — More Websocket Issues more of them. found while poking at the hardening from last devlog. not sure if figuring this part out took 20 minutes or 3 hours honestly, time’s doing something weird tonight. 2 — CDN Backup Is Failing on top of the websocket stuff, cdn backups just started failing too. not connected to each other as far as i can tell but who knows at this point, everything feels connected at 3am. 3 — Need To Push To Prod, Can’t Without Interrupting Infra the actual fix needs to go to prod but pushing it right now means interrupting live infra, which i don’t want to do blind, so now i need a plan for THAT before the real fix even goes out. process problem wrapped around the actual problem, great. 4 — Shared Play Is Doing The AI-Look Thing Again noticed shared play’s UI is drifting into the same generic-AI-looking territory the main site kept getting flagged for back in devlog #21-#24. damn. gonna have to redo that too. not tonight though, one disaster at a time. 5 — Oh And I Found A Missing Semicolon spent a genuinely embarrassing amount of time on a bug that turned out to be a missing semicolon. send help. actually don’t, just let me suffer, i clearly deserve it at this hour. 6 — No Sleep For 2 Days, Hitting Now it’s catching up. hard. luckily got tomorrow off so plan is stay up tongiht finish this, and just completely pass out tomorrow instead. worth it. probably. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: a human programmer. you. the one reading this at whatever hour you’re reading it, hopefully not also running on 2 days no sleep Q: Is the websocket hardening from #42 actually working? A: mostly? finding more edge cases as i go, which is annoying but also kind of expected honestly Q: Why can’t you just push to prod now? A: because infra’s live and i don’t want to interrupt it blind, need an actual plan for that part first Q: Is shared play getting a full redesign again? A: yeah probably, later though, not adding a 4th fire to tonight Q: Sleep plan? A: none tonight, all of it tomorrow, that’s the whole plan —This is the end — *end for now, semicolons permitting send sleep!!!
Spectralis devlog #44 —Hello again proggers— Did it. Fixed a genuine ton of bugs, following through on the mess from devlog #43. Tempted to just drop 6.1.0 right now, but holding off — want to get a few new features in and brainstorm some more QoL first so this actually feels like a finished product, not just a stopgap. Also: finally going to bed. the bar was “fix the bugs” and I cleared it, going higher anyway Cat or dog? sleep(∞) Okay let’s get into it~ —Yap— Real closure on the websocket/CDN/prod chaos from last devlog. Cleared out a lot in one sitting, and instead of rushing 6.1.0 out the door on relief alone, choosing to actually sit with it a bit longer. —The Great Suffering— 1 — The Bug Backlog, Actually Cleared Worked through the fallout from devlog #43 — websocket issues, the CDN backup failures, all of it — and got a genuine ton of it fixed in one real pass instead of piecemeal patching. 2 — Holding Off On 6.1.0, On Purpose Could ship right now. Choosing not to. Want to work in a few new features and brainstorm more QoL first, so the release feels complete rather than just “the bugs are gone, ship it.” Patience over momentum this time. 3 — Finally Going To Bed After devlog #43’s two-days-no-sleep spiral, actually calling it and going to bed now. Today off is finally getting used the way it was supposed to be used. the sleep debt collector finally caught up —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to get real sleep for the first time in a while. Q: Why not just ship 6.1.0 now if the bugs are fixed? A: Because “bug-free” and “actually done” aren’t the same bar, and this one’s worth clearing the second one too. Q: Was this the same chaos from devlog #43? A: Same fires, all put out this round. Q: What kind of new features are being considered? A: Not locked in yet — that brainstorming is the next step, not this devlog. Q: Sleep status, finally? A: Handled. Going now. —This is the end*— *end for now, actual sleep permitting PLAY!!!
Ships:
Spectralis shiplarp — v5.3.0 —shipped it— Notepads. A spin wheel. Dead zones that aren’t OBS-only anymore. Playlists that don’t look like a log file. Spotify that actually behaves. That’s the version. —what’s in it— Notepad system: docked panel, tabs, pop-out window, saves to track tags Spin wheel: weighted entries, saved wheel lists, notepad-fed Dead zones now shift the app’s own layout, not just OBS overlays Spotify: playlist sync, queue, pause, and Discord presence all fixed Fixed: playlist rows missing RowBackground (looked like a terminal, my bad) Fixed: nav rebuilding the entire view every click Fixed: library load blocking window open on big libraries Fixed: spectrum bars snapping instead of moving (FFT overlap bumped to 75%) Fixed: soundcloud playhead, word-mode timestamp export, track-switch click/pop —that’s it— PICKLE!!!
Spectralis shiplarp 2 — Stardance —wuzzup guys— So much has happened since shiplarp 1 and I cannot wait to not break down what changed. I will. I’m lazy. Not right now though. Cat or dog? redeem_code.claim() —the celebration— We’ve gone through so many changes since last time that it deserves an actual celebration: a very cool, very awesome custom visualizer for Stardance. Claim yours: Help > Manage Visualizers, then redeem stardance-lts-pulp . —found a bug?— Including the dreaded Tim Cook issues — DM me: Discord: @deltav0rtex Slack: deltavortex Can’t wait to hear the feedback and all the bugs you dig up. —this is the end*— *end for now, redeem codes permitting YIPEE!!!...
|
1792878434.706125
|
1793742434.706125
|
|
10673
|
DimeTrack by @d3monas | Stardance
|
d3monas
|
3
|
325.0
|
2960
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T21:44:49Z", "hours": 123.0, "multiplier": 16.88, "payout": 1039, "blessing": "neutral", "text": "DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts or subscriptions required and your data is stored locally on your device, with an OPTIONAL cloud sync if you want to access it across devices. Since my second shipment, the project has grown even further. I read every single review and Implemented all the suggestions that were provided. Made an optional cloud syncing feature that allows users to access and use the app across multiple devices. Made a small tutorial/guide that provides a bit more information on how to use DimeTrack. Replaced the Calendar tab with a new Timeline, that shows all your recurring transactions in your selected time interval, your projected balance and an ability to add a safety net and see if your projected balance falls below it in the coming months. Added an ability to manually track your Investments. Even more customization options and many other things. Similar to my previous shipments, the biggest challenge was to keep everything synced. One feature depends on another, so adding new functionality means that I have to update existing systems to ensure that everything stays working. I’ve somehow spent 325 hrs on this project and this will probably be my final shipment. I’ve had a lot of fun working on it and hope to maybe sometime later. For the v3 you should try to: Complete the tutorial (If you have used DimeTrack previously, go to settings -> data -> clear all data or just use incognito window) Add some recurring transactions and test out the Timeline to see your projected balance Explore the new subscriptions tab Set up cloud sync Add some Investments, update their price so see how your portfolio value goes up or down Check out the new financial insights in the Overview tab Use the Command Bar at top middle, you can find some quick actions there, search for any transaction or even create a quick transaction by typing in the search bar - Amount, Description, Existing Category (for example: 5 Coffee Food (must have a category called Food)) Explore the keyboard shortcuts Do a few achievements Create a few transactions and test out the bulk editing options", "repo": "https://github.com/d3monas/DimeTrack", "demo": "https://dime-track.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-24T18:06:38Z", "hours": 174.0, "multiplier": 18.83, "payout": 1539, "blessing": "neutral", "text": "DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts, subscriptions, servers - everything is stored locally on device. Since my first shipment, the project has grown significantly. It now supports accounts, transfers between them, split purchases, multiple savings goals with contribution history and target dates, budget limits, auto-categorization rules, cash flow calendar with forecasting, monthly spending reports, net worth tracking, customizable categories and accounts, JSON backups, CSV import & export and many other quality of life improvements were made during the many hours spent on this project. The biggest challenge was keeping every feature synced as the project grew. Transactions can affect accounts, budgets, savings goals, recurring payments, reports, charts and basically everything. Adding new functionality means that I have to update existing systems to ensure that everything stays working as intended. But I’m proud to see how much my project has evolved and grown. You should try to: Create multiple accounts and transfer money between them Add income & expense transactions, try the split transaction function Set up a few savings goals with target dates and see how the contribution suggestion feature works Customize categories & accounts with icons and colors Configure budget limits and see the warnings that It gives you when nearing the limits Create an auto-categorization rule Explore the cash flow calendar Try exporting your data to JSON", "repo": "https://github.com/d3monas/DimeTrack", "demo": "https://dime-track.vercel.app/"}, {"ship_num": 3, "ts": "2026-06-18T11:37:29Z", "hours": 28.0, "multiplier": 13.41, "payout": 382, "blessing": "neutral", "text": "I built DimeTrack, a personal finance & budgeting web app that helps users to track their income, expenses, manage custom spending categories, create budgets & save toward their set goals. The application store data locally, allowing users to use it without creating an account. One of the biggest challenges was managing the app as it grew. Features such as recurring transactions, savings goal contributions, budget tracking & categories all interact with each other. Ensuring that data remained synced required lots of testing. I’m proud that I built DimeTrack to have so many features, I’ve never built anything quite like this. To test DimeTrack: Try to create some categories through the settings menu Add income & expenses Create a savings goal and try to contribute to it Set budget limits Try recurring transactions Search & filter your transactions (transcations can be searched by description, amount or category) Export your transaction data using the CSV export feature (if you only want data from let’s say todays transactions, apply a filter) Refresh the page with all the data, to confirm that everything is saved. No accounts needed!", "repo": "https://github.com/d3monas/DimeTrack", "demo": "https://dime-track.vercel.app/"}]...
|
[{"post_id": 49906, "ts": "202 [{"post_id": 49906, "ts": "2026-08-18T21:22:02Z", "hours": 5.8847, "text": "Worked on a custom date picker for the Timeline, so now instead of being locked into 7-day, 1 or 3 month views, users can now view any custom date they want. Created a financial safety net, where users can set a minimum balance and if your projected balance drops below it, a warning banner appears. Updated the auto-sync feature and made it truly auto, all users now need to do, is just enter a password once. Finally, did a final test of the app, fixed bugs, updated the landing page and the GitHub readme"}, {"post_id": 48713, "ts": "2026-08-17T07:13:40Z", "hours": 5.0786, "text": "Today, I worked on more Quality of Life features for my app, first of all - Introduced Keyboard Shortcuts, you can open the Command Bar with CTRL + K, add new transactions with ALT + N and switch tabs with ALT + 1 through 6. Created a small dialog that shows all the keyboard shortcuts available. Another feature - Transaction Presets. You can now create a preset for your most used transactions, just fill out the add transaction form as usual and instead of pressing “Save Transaction” just press the new Bookmark icon, then at the top your preset will appear, next time just press on the preset and everything will be filled out for you. Fixed a few tiny UI details, optimized mobile design, fixed a bug where the quick-add suggestion bar hardcoded a $ sign regardless of your selected currency. Finally, when creating a new transaction through the quick-add feature, you must now include a valid category otherwise the app won’t recognize that you are trying to add a transaction."}, {"post_id": 48036, "ts": "2026-08-16T10:16:00Z", "hours": 7.9572, "text": "Today, I Improved the “Smart Stats” feature with a new “Insights” tab. I didn’t want to create a new tab just for the Insights, so I decided to Implement the new feature in to an already existing one. Insights display your spending pace, give budget warnings, alerts you If your Net Worth & Savings are trending up or down and gives your Goal Projections without you having to navigate to the Goals tab. Also, replaced the default browser confirmation dialogs with custom ones, updated the tabs list design to a bit more modern one and made the tabs list stick so when you are scrolling down, your tabs list will always be accessible. Finally, fixed a few small bugs and a major budget rollover bug that would instantly roll over your budget without checking, if you even had a budget limit previously."}, {"post_id": 46940, "ts": "2026-08-14T14:40:05Z", "hours": 7.0375, "text": "Today, I’ve updated the command bar navigation to include the new Timeline and Investment tabs and with that also created a quicker way to add transactions - To create a transaction quicker, In the command bar all you need to do is type the amount, description and optionally category and account (for example: 9 Breakfast Food Checking). Also, reworked the transaction list and added abilities to select multiple or all transactions and bulk change account, categories, type or bulk delete transactions. Added ability to restore your transaction, if deleted accidentally. Finally, added an ability to duplicate transactions If needed."}, {"post_id": 45842, "ts": "2026-08-12T15:51:41Z", "hours": 9.6678, "text": "Today, I created a fun new achievement system which currently features 12 achievements. In the achievements page you can see all of them + progress tracker towards them. Upon unlocking an achievement, you will receive a notification in the bottom right corner of your screen. All achievements are saved locally, included in JSON backups and sync seamlessly. Also, fixed some localstorage and JSON backup issues and fixed a bug that when clearing your data, your investments would not clear."}, {"post_id": 45096, "ts": "2026-08-11T11:17:58Z", "hours": 6.7625, "text": "For todays update, I’ve worked on customization more. In settings, added an ability to turn off selected widgets that you do not care about. Turned off widgets will not be shown in the Overview tab. Also, I’ve done some more work to the Timeline tab, after each recurring transaction - your projected balance will show now, added an overdraft warning, so if your projected balance dips below 0 on a specific day, the chart will show a red zero-line and a warning banner will appear. Made the 3-month view sorted into groups by month, so Its easier to differentiate by month. Finally, I updated the exporting/importing and cloud syncing to make sure that everything is properly synced and no errors occur."}, {"post_id": 44522, "ts": "2026-08-10T10:42:39Z", "hours": 6.9944, "text": "Made some small improvements to the Investments tab and added a “Portfolio Performance” chart, which tracks how much you invested vs how much your portfolio is worth currently. Other than that, I completely reworked the Calendar, which is now called - Timeline. Instead of a Calendar it now shows your 7 day, 30 day and 3 month timeline with a projected balance, a projected balance chart and upcoming recurring transactions. It it somewhat similar to the calendar, however the whole UX is much more simpler and cleaner. Finally, I fixed some math calculations."}, {"post_id": 43894, "ts": "2026-08-09T10:37:55Z", "hours": 6.7469, "text": "Reworked the Investments Tab. Now you can properly buy/sell/update your investments to keep track of your Profit & Loss. When creating a new Investment, first of all, you will be able to select what kind of asset this is (It can be Stock, Crypto, ETF or Other). After creating an asset, you can buy/sell/update your asset. When buying, enter the quantity, price per date and set a date when bought. After buying you will instantly see your new updated portfolio value & how much you have invested. If you want to see your Total Profit & Loss, update your asset prices."}, {"post_id": 42550, "ts": "2026-08-07T11:27:13Z", "hours": 7.3378, "text": "Another requested feature was cloud syncing or login so It was easier to use DimeTrack between multiple devices. I built a cloud syncing feature with Upstash. Basically, your data is still encryped and nobody except you can see it. Also built an auto-sync feature so any time you add a transaction, update a budget, create a goal or do anything, the application waits 3 seconds and pushes your updated data to the cloud. Finally, did some minor settings UI changes to the tabs are less cluttered, especially on mobile screens. How to set up syncing? Open Settings and navigate to the new Sync tab Under “Start New Sync” create your password and enable syncing The app will generate a unique Sync ID, save this ID On your secondary device: Open Settings and navigate to the Sync tab Under “Connect to Existing Sync”, paste your Sync ID and enter your password Click Pull Data & Connect and your data will be downloaded. Auto-Sync is now active on both. Auto-Sync is only active until you refresh your browser. After you refresh your browser, you will see a banner saying that Auto-sync is paused. To unpause - enter your password again. *This sync feature is completely optional"}, {"post_id": 41530, "ts": "2026-08-05T19:59:50Z", "hours": 9.8156, "text": "Since the last devlog, I created a new Investments tab, where users can manually log their assets, mark them as Recurring Investments and update their values. Also, the total asset value is automatically added to the user’s Net Worth. For now, this investment tracker is very simple and I will be expanding on this feature a bit later. Most of my time during these few days was spent, trying to figure out how to connect Upstash to my app, so users can sync their data between devices, while I still keep DimeTrack fully serverless."}, {"post_id": 40251, "ts": "2026-08-03T17:32:22Z", "hours": 9.4694, "text": "I’ve read the reviews of my previous ship and a few users suggested that I create a tutorial. So that’s what I have done. When a brand new user opens the app (or an existing user clears their data), they will receive this welcome popup and will be given 2 choices - “Start Fresh” or “Start Demo Tour”. If the user chooses the Demo Tour, the app will instantly fill with realistic sample data (transactions, categories, accounts, recurring transactions, savings goals & more). On top of that, a quick 12 step tutorial will appear. During the tutorial, users will create a transaction, a new category, setup an auto categorization rule & create a savings goal. Once the tutorial is finished, the sample data will be wiped and the user will be able to use the app with their own data."}, {"post_id": 39370, "ts": "2026-08-02T09:43:02Z", "hours": 8.1022, "text": "Upgraded the budgeting side and added support for category rollover. So basically, If you underspend your limit this month, the remainder rolls over to the next month. But If you overspend, it will carry over as debt and your limit next month will be lower. Also worked on some smaller features, such as: added a clear filters button in transaction list whenever active filters are applied. Added small colored dots next to category names in the transaction list, the color of the dot matches your category color. If no recurring expenses are present, you will see a button, that will help you to create one. Finally, started working on a proper tutorial which is probably going to be in the next devlog."}, {"post_id": 38100, "ts": "2026-07-31T09:53:36Z", "hours": 6.8269, "text": "Added a new chart to the overview tab that projects your accounts balance 12 months in to the future based on your active recurring income & expenses. It features a red line at 0$ to warn you of potential overdrafts. Other than that, I’ve made a few code refactors, extracted formatting logic into a shared component and worked on mobile UI for this chart."}, {"post_id": 36954, "ts": "2026-07-29T11:29:37Z", "hours": 6.8278, "text": "Since the last update, I’ve made some small QOL improvements. Created ability to edit assigned accounts when editing a transaction. Also, you can now sort transactions by date (newest/oldest) or amount (highest/lowest). Added ability to filter and search transactions by tags. Reorganized the filter & search toolbar to fit everything smoothly, especially for mobiles. Lastly, upgraded empty states, so if you have no transactions, you’ll see not only the empty state but also an “Add Transaction” button. The change applies to Savings Goals"}, {"post_id": 35845, "ts": "2026-07-27T15:23:08Z", "hours": 9.1947, "text": "Today I spent a lot of time making a command menu, basically you can press Ctrl+K anywhere or click the new search bar in the header to open the Command Menu. It allows you to instantly search all transactions, jump to any tab, or trigger actions like adding a transaction or goal. Also, I created a new tags feature, you can add tags when creating or editing transactions for cross-category tracking. Finally, slightly redesigned the header so It now fully functions and fits on mobile."}, {"post_id": 35147, "ts": "2026-07-26T11:57:54Z", "hours": 9.3906, "text": "Continuing to work on DimeTrack, I made a dedicated “Subscriptions” tab, where It scans your recurring expenses, displays how much you spend on subscriptions monthly & annually and allows to toggle subscriptions between “Active” and “Cancelled” without deleting past transaction history. Also upgraded the main dashboard tabs to support 5 categories, added Icons to the tabs and on mobile tabs switch to icon-only layout to prevent text squishing. Finally, added a native browser confirmation prompts to all delete actions (deleting goals, accounts, categories & recurring transactions)"}, {"post_id": 34160, "ts": "2026-07-24T17:48:20Z", "hours": 7.9261, "text": "Created a “Monthly Report” dialog that generates a breakdown of the current months total income & expenses, net savings & savings rate, daily average spending, top spending category, largest single purchase & a trend comparison of expenses versus the previous month. Also fixed chart tool tip clipping om mobile screens, optimized the main header layout by hiding button text on small screens, preventing the “Settings” & “View Monthly Report” buttons from going out of bounds. Updated the landing page with new features and screenshots & updated the github readme."}, {"post_id": 33454, "ts": "2026-07-23T13:04:07Z", "hours": 9.5942, "text": "Added a new Net Worth History chart to the overview tab, which tracks your all-time balance over the last 6 months. Also upgraded the 6-month Income vs Expenses visualization from a Bar chart to a Line chart to match the Net Worth History chart design. Both charts now feature a smart Y-axis formatting for large numbers, shared tooltip styles."}, {"post_id": 32937, "ts": "2026-07-22T12:42:22Z", "hours": 7.5039, "text": "Today I made a guided setup checklist to help new users configure their dashboard with ease. Instead of an empty app, now a “Get Started” button appears at the top right corner, which opens a 5 step tutorial (Create Account, Category, Set a budget limit, a savings goal & Add a transaction). The checklist automatically detects completed steps and also allows users to skip the guide. Onboarding is fully linked with localStorage and JSON backups, so It doesn’t appear to users who already have everything setup."}, {"post_id": 31958, "ts": "2026-07-20T19:40:38Z", "hours": 9.7931, "text": "Created 2 new features: Net Worth - replaced the “current balance” card on the overview tab which a dynamic Net Worth widget which calculates your all-time balance and compares it to your balance at the end of last month, displaying a green or red trend arrow to show how much your net worth has grown or shrunk this month. Custom color theming - created a new settings tab called “appearance” & custom color picker which allows users to instantly re-theme buttons, active tabs, calendar selections, focused inputs. The color picker here is powered by react-colorful and color change is being handled by colord. Also implemented a localColor state so the app only commits the CSS when the user releases the color picker drag."}, {"post_id": 31210, "ts": "2026-07-19T12:56:00Z", "hours": 9.5264, "text": "Created a new Smart Stats widget to Overview tab that calculates your Daily Average spending and projects your End Of Month spending based on your current Daily Average spending. Then after that, I looked through every file and did some refactors, bug fixes & UI polishing (especially on mobile). Bug fixes: Excluded “Starting Balance” transactions from calculateIncome & getMonthlyTrends so adding an account with starting balance doesn’t inflate income stats or trend charts. Fixed deleteCategory to clean up everything (including transaction splits, auto-categorization rules and category customization). Added a transfer account validation to Add Transaction dialog to prevent saving a transfer with empty “From/To” accounts or transferring money to the same account. Fixed the “Will exceed budget” warning showing when adding Income. Added defaultAccountId to JSON export/import handlers so the user’s default account setting survives JSON backups. Refactors: Extracted the duplicated color/icon Popover UI from settingsUI & accountManager in to a single colorIconPicker component. Extracted duplicated Recharts tooltip styling into a shared chartStyles.ts constant. UI Polish: Made the calendar mobile-friendly by showing colored dots on small screens and full text & balances on larger ones. Hid the default calendar navigation arrows that appeared at the top of the screen and adjusted button heights to match. Adjusted TabsList to use text-xs on mobile to prevent text overlapping on small screens. Added offset, z-index & allowEscapeViewBox to chart styles to prevent hover tooltips from being hidden behind chart graphics. Removed dead props, fixed a few typos and replaced hardcoded values with consts."}, {"post_id": 30620, "ts": "2026-07-18T10:38:01Z", "hours": 9.6939, "text": "Final part of the Accounts update: Worked on visual customization for the accounts system. Users can now edit account names without losing their transaction history. Also introduced a color and icon picker for accounts (just like with categories), so It’s easier for users to differentiate between accounts. Created a new “Total Balance” card that quickly shows your balance between all accounts. Finally, added a new filter for the transaction list - “Transfer”, colored transfers in a gray color so they don’t look like expenses, hidden the “Starting Balance” system transactions to reduce the visual clutter of the transaction list & updated the default account badge design."}, {"post_id": 29478, "ts": "2026-07-16T13:32:53Z", "hours": 10.1997, "text": "Part 2 of the Accounts update: Created a new ‘account balance’ widget that displays all your accounts & their balances. The transaction list now features a badge with the account name that the transaction was assigned to. Spent a lot of time fixing CSV exports/imports to properly support accounts & transfers between accounts. Finally, introduced a ‘starting balance’ feature for users can instantly input their balance when creating a new account without typing months of history and a ‘default account’ setting that auto selects their primary account when creating a new transaction"}, {"post_id": 28548, "ts": "2026-07-14T21:22:16Z", "hours": 9.845, "text": "Part 1 of the Accounts update: I finally built the whole architecture for multi-account management. Users can now create accounts (like checking or savings) and assign transactions to them. Also Introduced “transfers” which allow users to move money between accounts without adding fake data to income or expenses. The add and edit transaction dialogs now feature a dynamic UI that swaps out categories & split transaction functionalities for “From/to” account selectors. Finally, updated localStorage & JSON data exports to make sure that accounts are included."}, {"post_id": 27124, "ts": "2026-07-12T12:16:03Z", "hours": 7.7758, "text": "Improved the spending pie chart by adding a legend below the chart, displaying currency symbols when hovering & vastly improving tooltip readability on hover. Also expanded the Recent Transactions page with even more filters. Now you can filter transactions by income, expenses and categories. Finally, fixed some design inconsistencies."}, {"post_id": 26471, "ts": "2026-07-11T09:01:46Z", "hours": 9.3356, "text": "Added category customization, allowing users to personalize categories with custom icons & colors. Updated the spending chart and budget overview to use the new customization system, so select icons and colors are consistent throughout the whole application. Refactored the application to use default icon & color when none are selected."}, {"post_id": 25000, "ts": "2026-07-08T22:05:19Z", "hours": 11.4794, "text": "Added auto-categorization rules, which allows transactions to be automatically assigned to categories based on custom keywords. When you type the set keyword in description, a category will be auto chosen based on the rule. Built a rules manager in the Settings page to manage auto-categorization rules. Also expanded CSV & JSON import/export functionality to include notes & auto-categorization rules. Fixed several issues with CSV importing, when imported descriptions, notes were missing & incorrect amounts were assigned. Finally, redesigned the Settings UI and assigned each category to its own tab & cleaned up various design inconsistencies."}, {"post_id": 24022, "ts": "2026-07-07T09:34:59Z", "hours": 13.2997, "text": "Introduced the ability to split a single transaction across multiple categories. Also improved the transaction list to clearly display split categories and their amounts. Now, creating new categories is much easier, as they can be added directly when creating a transaction. Finally, I added warnings that notify users when a savings goal contribution would exceed its target or when a new expense would push a category over Its budget limit."}, {"post_id": 21802, "ts": "2026-07-03T22:35:42Z", "hours": 11.8697, "text": "I spent 12 hours on this 😭😭😭. It’s a cash flow calendar which uses historical and current transactions & puts them in a calendar. This feature projects your upcoming recurring transactions & income, automatically calculating your daily running balance. It highlights your balance red, if there is a potential overdraft. It’s pretty easy to navigate through past & future months to analyze your spending."}, {"post_id": 19107, "ts": "2026-06-30T10:41:35Z", "hours": 12.7331, "text": "Created an optional selection when creating a savings goal - Target Date. If Target Date is selected, when contributing to a goal, you will get a suggested amount based on your goal & target date. Created a notification system and replaced all alert() functions with notifications. When creating & editing transactions, users can now enter additional notes that they may have about the transaction. Also fixed CSV importing bugs & a few small UI inconsistencies."}, {"post_id": 17223, "ts": "2026-06-27T22:43:14Z", "hours": 8.6589, "text": "Today most of my time was dedicated to a UI rearrangement. I split the whole dashboard into 3 main tabs. Also created a section that shows your upcoming recurring transactions in the next 7 days. Finally, made a setting that allows users to wipe all their data."}, {"post_id": 15987, "ts": "2026-06-25T23:18:41Z", "hours": 10.7472, "text": "Mostly worked on the new Import CSV, Export & Import backups features. With Import CSV, you can import your existing transactions & categories while with Import backup you can import everything that your app has, this is great if user is switching browsers or devices. The other feature is a 6 month expenses vs income TrendChart that allows you to visually see how much you are making, spending & compare."}, {"post_id": 14707, "ts": "2026-06-23T22:10:13Z", "hours": 8.1892, "text": "DEV #7 Well first of all, It took me an hour to find a simple shadow class that needed to be removed so the landing page picture looks better. The rest of the time was spent figuring out how to & actually making the ability to create multiple goals at once."}, {"post_id": 13351, "ts": "2026-06-21T21:23:45Z", "hours": 5.655, "text": "DEV #6 Since shipping I worked on a small landing page which presents the core features of dimetrack. Fixed some issues with recurring transactions & implemented the ability to use custom values for recurring transactions instead of using the preset ones. Lastly, created loading skeletons & worked on some small design improvements (inconsistent gaps, settings dialog not being scrollable when too many elements are present, added small animations to progress bars.)"}, {"post_id": 11219, "ts": "2026-06-18T11:22:15Z", "hours": 5.0586, "text": "DEV #5 Polished the application more (especially mobile design) and finished the remaining features that I had planned. Users can now search their transactions by description, category or amount Added a separate goal contribution history for easier tracking Added budget limit warnings at: 50%, 80% & 100% Users can export their data in a .csv file"}, {"post_id": 10249, "ts": "2026-06-16T21:45:47Z", "hours": 6.6958, "text": "DEV #4 Added recurring transactions support. Users can select recurring transactions every day, week, month or year. Users can see all their recurring transactions & delete them in settings Added transaction filtering, same as recurring transactions, users can filter their recent transactions by day, week, month, year or lifetime Created field errors Many bug fixes"}, {"post_id": 8385, "ts": "2026-06-13T22:57:24Z", "hours": 8.8989, "text": "DEV #3 New features: Currency selector New settings page Ability to contribute to goal Ability to delete categories Ability to edit budget limits Lots of bug fixes Huge code cleanup, refactors & +99 more bugs to fix"}, {"post_id": 5190, "ts": "2026-06-08T21:42:35Z", "hours": 4.8833, "text": "Day 2 Created: Categories Spending by category & spending breakdown pie-chart Ability to edit goals Mostly worked on optimization today, moved most components into separate files. Fixed some bugs (hopefully). Designed a quick (was not quick) logo & favicon."}, {"post_id": 4518, "ts": "2026-06-07T21:11:11Z", "hours": 2.9533, "text": "Created the first working version of the transaction system. Income and expenses are now accepted, and actual data rather than hardcoded amounts are used to update balance, income, and spending in real time. Also created transaction saving to localStorage. Discovered a bug early on where an invalid input broke all calculations, so I added a better validation in the form to (hopefully) prevent these types of errors in the future. For now, I’ll keep working on the UX part and create more features and then move on to UI."}]...
|
Title: DimeTrack by @d3monas | Stardance
Devlogs: Title: DimeTrack by @d3monas | Stardance
Devlogs:
Created the first working version of the transaction system. Income and expenses are now accepted, and actual data rather than hardcoded amounts are used to update balance, income, and spending in real time. Also created transaction saving to localStorage. Discovered a bug early on where an invalid input broke all calculations, so I added a better validation in the form to (hopefully) prevent these types of errors in the future. For now, I’ll keep working on the UX part and create more features and then move on to UI.
Day 2 Created: Categories Spending by category & spending breakdown pie-chart Ability to edit goals Mostly worked on optimization today, moved most components into separate files. Fixed some bugs (hopefully). Designed a quick (was not quick) logo & favicon.
DEV #3 New features: Currency selector New settings page Ability to contribute to goal Ability to delete categories Ability to edit budget limits Lots of bug fixes Huge code cleanup, refactors & +99 more bugs to fix
DEV #4 Added recurring transactions support. Users can select recurring transactions every day, week, month or year. Users can see all their recurring transactions & delete them in settings Added transaction filtering, same as recurring transactions, users can filter their recent transactions by day, week, month, year or lifetime Created field errors Many bug fixes
DEV #5 Polished the application more (especially mobile design) and finished the remaining features that I had planned. Users can now search their transactions by description, category or amount Added a separate goal contribution history for easier tracking Added budget limit warnings at: 50%, 80% & 100% Users can export their data in a .csv file
DEV #6 Since shipping I worked on a small landing page which presents the core features of dimetrack. Fixed some issues with recurring transactions & implemented the ability to use custom values for recurring transactions instead of using the preset ones. Lastly, created loading skeletons & worked on some small design improvements (inconsistent gaps, settings dialog not being scrollable when too many elements are present, added small animations to progress bars.)
DEV #7 Well first of all, It took me an hour to find a simple shadow class that needed to be removed so the landing page picture looks better. The rest of the time was spent figuring out how to & actually making the ability to create multiple goals at once.
Mostly worked on the new Import CSV, Export & Import backups features. With Import CSV, you can import your existing transactions & categories while with Import backup you can import everything that your app has, this is great if user is switching browsers or devices. The other feature is a 6 month expenses vs income TrendChart that allows you to visually see how much you are making, spending & compare.
Today most of my time was dedicated to a UI rearrangement. I split the whole dashboard into 3 main tabs. Also created a section that shows your upcoming recurring transactions in the next 7 days. Finally, made a setting that allows users to wipe all their data.
Created an optional selection when creating a savings goal - Target Date. If Target Date is selected, when contributing to a goal, you will get a suggested amount based on your goal & target date. Created a notification system and replaced all alert() functions with notifications. When creating & editing transactions, users can now enter additional notes that they may have about the transaction. Also fixed CSV importing bugs & a few small UI inconsistencies.
I spent 12 hours on this 😭😭😭. It’s a cash flow calendar which uses historical and current transactions & puts them in a calendar. This feature projects your upcoming recurring transactions & income, automatically calculating your daily running balance. It highlights your balance red, if there is a potential overdraft. It’s pretty easy to navigate through past & future months to analyze your spending.
Introduced the ability to split a single transaction across multiple categories. Also improved the transaction list to clearly display split categories and their amounts. Now, creating new categories is much easier, as they can be added directly when creating a transaction. Finally, I added warnings that notify users when a savings goal contribution would exceed its target or when a new expense would push a category over Its budget limit.
Added auto-categorization rules, which allows transactions to be automatically assigned to categories based on custom keywords. When you type the set keyword in description, a category will be auto chosen based on the rule. Built a rules manager in the Settings page to manage auto-categorization rules. Also expanded CSV & JSON import/export functionality to include notes & auto-categorization rules. Fixed several issues with CSV importing, when imported descriptions, notes were missing & incorrect amounts were assigned. Finally, redesigned the Settings UI and assigned each category to its own tab & cleaned up various design inconsistencies.
Added category customization, allowing users to personalize categories with custom icons & colors. Updated the spending chart and budget overview to use the new customization system, so select icons and colors are consistent throughout the whole application. Refactored the application to use default icon & color when none are selected.
Improved the spending pie chart by adding a legend below the chart, displaying currency symbols when hovering & vastly improving tooltip readability on hover. Also expanded the Recent Transactions page with even more filters. Now you can filter transactions by income, expenses and categories. Finally, fixed some design inconsistencies.
Part 1 of the Accounts update: I finally built the whole architecture for multi-account management. Users can now create accounts (like checking or savings) and assign transactions to them. Also Introduced “transfers” which allow users to move money between accounts without adding fake data to income or expenses. The add and edit transaction dialogs now feature a dynamic UI that swaps out categories & split transaction functionalities for “From/to” account selectors. Finally, updated localStorage & JSON data exports to make sure that accounts are included.
Part 2 of the Accounts update: Created a new ‘account balance’ widget that displays all your accounts & their balances. The transaction list now features a badge with the account name that the transaction was assigned to. Spent a lot of time fixing CSV exports/imports to properly support accounts & transfers between accounts. Finally, introduced a ‘starting balance’ feature for users can instantly input their balance when creating a new account without typing months of history and a ‘default account’ setting that auto selects their primary account when creating a new transaction
Final part of the Accounts update: Worked on visual customization for the accounts system. Users can now edit account names without losing their transaction history. Also introduced a color and icon picker for accounts (just like with categories), so It’s easier for users to differentiate between accounts. Created a new “Total Balance” card that quickly shows your balance between all accounts. Finally, added a new filter for the transaction list - “Transfer”, colored transfers in a gray color so they don’t look like expenses, hidden the “Starting Balance” system transactions to reduce the visual clutter of the transaction list & updated the default account badge design.
Created a new Smart Stats widget to Overview tab that calculates your Daily Average spending and projects your End Of Month spending based on your current Daily Average spending. Then after that, I looked through every file and did some refactors, bug fixes & UI polishing (especially on mobile). Bug fixes: Excluded “Starting Balance” transactions from calculateIncome & getMonthlyTrends so adding an account with starting balance doesn’t inflate income stats or trend charts. Fixed deleteCategory to clean up everything (including transaction splits, auto-categorization rules and category customization). Added a transfer account validation to Add Transaction dialog to prevent saving a transfer with empty “From/To” accounts or transferring money to the same account. Fixed the “Will exceed budget” warning showing when adding Income. Added defaultAccountId to JSON export/import handlers so the user’s default account setting survives JSON backups. Refactors: Extracted the duplicated color/icon Popover UI from settingsUI & accountManager in to a single colorIconPicker component. Extracted duplicated Recharts tooltip styling into a shared chartStyles.ts constant. UI Polish: Made the calendar mobile-friendly by showing colored dots on small screens and full text & balances on larger ones. Hid the default calendar navigation arrows that appeared at the top of the screen and adjusted button heights to match. Adjusted TabsList to use text-xs on mobile to prevent text overlapping on small screens. Added offset, z-index & allowEscapeViewBox to chart styles to prevent hover tooltips from being hidden behind chart graphics. Removed dead props, fixed a few typos and replaced hardcoded values with consts.
Created 2 new features: Net Worth - replaced the “current balance” card on the overview tab which a dynamic Net Worth widget which calculates your all-time balance and compares it to your balance at the end of last month, displaying a green or red trend arrow to show how much your net worth has grown or shrunk this month. Custom color theming - created a new settings tab called “appearance” & custom color picker which allows users to instantly re-theme buttons, active tabs, calendar selections, focused inputs. The color picker here is powered by react-colorful and color change is being handled by colord. Also implemented a localColor state so the app only commits the CSS when the user releases the color picker drag.
Today I made a guided setup checklist to help new users configure their dashboard with ease. Instead of an empty app, now a “Get Started” button appears at the top right corner, which opens a 5 step tutorial (Create Account, Category, Set a budget limit, a savings goal & Add a transaction). The checklist automatically detects completed steps and also allows users to skip the guide. Onboarding is fully linked with localStorage and JSON backups, so It doesn’t appear to users who already have everything setup.
Added a new Net Worth History chart to the overview tab, which tracks your all-time balance over the last 6 months. Also upgraded the 6-month Income vs Expenses visualization from a Bar chart to a Line chart to match the Net Worth History chart design. Both charts now feature a smart Y-axis formatting for large numbers, shared tooltip styles.
Created a “Monthly Report” dialog that generates a breakdown of the current months total income & expenses, net savings & savings rate, daily average spending, top spending category, largest single purchase & a trend comparison of expenses versus the previous month. Also fixed chart tool tip clipping om mobile screens, optimized the main header layout by hiding button text on small screens, preventing the “Settings” & “View Monthly Report” buttons from going out of bounds. Updated the landing page with new features and screenshots & updated the github readme.
Continuing to work on DimeTrack, I made a dedicated “Subscriptions” tab, where It scans your recurring expenses, displays how much you spend on subscriptions monthly & annually and allows to toggle subscriptions between “Active” and “Cancelled” without deleting past transaction history. Also upgraded the main dashboard tabs to support 5 categories, added Icons to the tabs and on mobile tabs switch to icon-only layout to prevent text squishing. Finally, added a native browser confirmation prompts to all delete actions (deleting goals, accounts, categories & recurring transactions)
Today I spent a lot of time making a command menu, basically you can press Ctrl+K anywhere or click the new search bar in the header to open the Command Menu. It allows you to instantly search all transactions, jump to any tab, or trigger actions like adding a transaction or goal. Also, I created a new tags feature, you can add tags when creating or editing transactions for cross-category tracking. Finally, slightly redesigned the header so It now fully functions and fits on mobile.
Since the last update, I’ve made some small QOL improvements. Created ability to edit assigned accounts when editing a transaction. Also, you can now sort transactions by date (newest/oldest) or amount (highest/lowest). Added ability to filter and search transactions by tags. Reorganized the filter & search toolbar to fit everything smoothly, especially for mobiles. Lastly, upgraded empty states, so if you have no transactions, you’ll see not only the empty state but also an “Add Transaction” button. The change applies to Savings Goals
Added a new chart to the overview tab that projects your accounts balance 12 months in to the future based on your active recurring income & expenses. It features a red line at 0$ to warn you of potential overdrafts. Other than that, I’ve made a few code refactors, extracted formatting logic into a shared component and worked on mobile UI for this chart.
Upgraded the budgeting side and added support for category rollover. So basically, If you underspend your limit this month, the remainder rolls over to the next month. But If you overspend, it will carry over as debt and your limit next month will be lower. Also worked on some smaller features, such as: added a clear filters button in transaction list whenever active filters are applied. Added small colored dots next to category names in the transaction list, the color of the dot matches your category color. If no recurring expenses are present, you will see a button, that will help you to create one. Finally, started working on a proper tutorial which is probably going to be in the next devlog.
I’ve read the reviews of my previous ship and a few users suggested that I create a tutorial. So that’s what I have done. When a brand new user opens the app (or an existing user clears their data), they will receive this welcome popup and will be given 2 choices - “Start Fresh” or “Start Demo Tour”. If the user chooses the Demo Tour, the app will instantly fill with realistic sample data (transactions, categories, accounts, recurring transactions, savings goals & more). On top of that, a quick 12 step tutorial will appear. During the tutorial, users will create a transaction, a new category, setup an auto categorization rule & create a savings goal. Once the tutorial is finished, the sample data will be wiped and the user will be able to use the app with their own data.
Since the last devlog, I created a new Investments tab, where users can manually log their assets, mark them as Recurring Investments and update their values. Also, the total asset value is automatically added to the user’s Net Worth. For now, this investment tracker is very simple and I will be expanding on this feature a bit later. Most of my time during these few days was spent, trying to figure out how to connect Upstash to my app, so users can sync their data between devices, while I still keep DimeTrack fully serverless.
Another requested feature was cloud syncing or login so It was easier to use DimeTrack between multiple devices. I built a cloud syncing feature with Upstash. Basically, your data is still encryped and nobody except you can see it. Also built an auto-sync feature so any time you add a transaction, update a budget, create a goal or do anything, the application waits 3 seconds and pushes your updated data to the cloud. Finally, did some minor settings UI changes to the tabs are less cluttered, especially on mobile screens. How to set up syncing? Open Settings and navigate to the new Sync tab Under “Start New Sync” create your password and enable syncing The app will generate a unique Sync ID, save this ID On your secondary device: Open Settings and navigate to the Sync tab Under “Connect to Existing Sync”, paste your Sync ID and enter your password Click Pull Data & Connect and your data will be downloaded. Auto-Sync is now active on both. Auto-Sync is only active until you refresh your browser. After you refresh your browser, you will see a banner saying that Auto-sync is paused. To unpause - enter your password again. *This sync feature is completely optional
Reworked the Investments Tab. Now you can properly buy/sell/update your investments to keep track of your Profit & Loss. When creating a new Investment, first of all, you will be able to select what kind of asset this is (It can be Stock, Crypto, ETF or Other). After creating an asset, you can buy/sell/update your asset. When buying, enter the quantity, price per date and set a date when bought. After buying you will instantly see your new updated portfolio value & how much you have invested. If you want to see your Total Profit & Loss, update your asset prices.
Made some small improvements to the Investments tab and added a “Portfolio Performance” chart, which tracks how much you invested vs how much your portfolio is worth currently. Other than that, I completely reworked the Calendar, which is now called - Timeline. Instead of a Calendar it now shows your 7 day, 30 day and 3 month timeline with a projected balance, a projected balance chart and upcoming recurring transactions. It it somewhat similar to the calendar, however the whole UX is much more simpler and cleaner. Finally, I fixed some math calculations.
For todays update, I’ve worked on customization more. In settings, added an ability to turn off selected widgets that you do not care about. Turned off widgets will not be shown in the Overview tab. Also, I’ve done some more work to the Timeline tab, after each recurring transaction - your projected balance will show now, added an overdraft warning, so if your projected balance dips below 0 on a specific day, the chart will show a red zero-line and a warning banner will appear. Made the 3-month view sorted into groups by month, so Its easier to differentiate by month. Finally, I updated the exporting/importing and cloud syncing to make sure that everything is properly synced and no errors occur.
Today, I created a fun new achievement system which currently features 12 achievements. In the achievements page you can see all of them + progress tracker towards them. Upon unlocking an achievement, you will receive a notification in the bottom right corner of your screen. All achievements are saved locally, included in JSON backups and sync seamlessly. Also, fixed some localstorage and JSON backup issues and fixed a bug that when clearing your data, your investments would not clear.
Today, I’ve updated the command bar navigation to include the new Timeline and Investment tabs and with that also created a quicker way to add transactions - To create a transaction quicker, In the command bar all you need to do is type the amount, description and optionally category and account (for example: 9 Breakfast Food Checking). Also, reworked the transaction list and added abilities to select multiple or all transactions and bulk change account, categories, type or bulk delete transactions. Added ability to restore your transaction, if deleted accidentally. Finally, added an ability to duplicate transactions If needed.
Today, I Improved the “Smart Stats” feature with a new “Insights” tab. I didn’t want to create a new tab just for the Insights, so I decided to Implement the new feature in to an already existing one. Insights display your spending pace, give budget warnings, alerts you If your Net Worth & Savings are trending up or down and gives your Goal Projections without you having to navigate to the Goals tab. Also, replaced the default browser confirmation dialogs with custom ones, updated the tabs list design to a bit more modern one and made the tabs list stick so when you are scrolling down, your tabs list will always be accessible. Finally, fixed a few small bugs and a major budget rollover bug that would instantly roll over your budget without checking, if you even had a budget limit previously.
Today, I worked on more Quality of Life features for my app, first of all - Introduced Keyboard Shortcuts, you can open the Command Bar with CTRL + K, add new transactions with ALT + N and switch tabs with ALT + 1 through 6. Created a small dialog that shows all the keyboard shortcuts available. Another feature - Transaction Presets. You can now create a preset for your most used transactions, just fill out the add transaction form as usual and instead of pressing “Save Transaction” just press the new Bookmark icon, then at the top your preset will appear, next time just press on the preset and everything will be filled out for you. Fixed a few tiny UI details, optimized mobile design, fixed a bug where the quick-add suggestion bar hardcoded a $ sign regardless of your selected currency. Finally, when creating a new transaction through the quick-add feature, you must now include a valid category otherwise the app won’t recognize that you are trying to add a transaction.
Worked on a custom date picker for the Timeline, so now instead of being locked into 7-day, 1 or 3 month views, users can now view any custom date they want. Created a financial safety net, where users can set a minimum balance and if your projected balance drops below it, a warning banner appears. Updated the auto-sync feature and made it truly auto, all users now need to do, is just enter a password once. Finally, did a final test of the app, fixed bugs, updated the landing page and the GitHub readme
Ships:
I built DimeTrack, a personal finance & budgeting web app that helps users to track their income, expenses, manage custom spending categories, create budgets & save toward their set goals. The application store data locally, allowing users to use it without creating an account. One of the biggest challenges was managing the app as it grew. Features such as recurring transactions, savings goal contributions, budget tracking & categories all interact with each other. Ensuring that data remained synced required lots of testing. I’m proud that I built DimeTrack to have so many features, I’ve never built anything quite like this. To test DimeTrack: Try to create some categories through the settings menu Add income & expenses Create a savings goal and try to contribute to it Set budget limits Try recurring transactions Search & filter your transactions (transcations can be searched by description, amount or category) Export your transaction data using the CSV export feature (if you only want data from let’s say todays transactions, apply a filter) Refresh the page with all the data, to confirm that everything is saved. No accounts needed!
DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts, subscriptions, servers - everything is stored locally on device. Since my first shipment, the project has grown significantly. It now supports accounts, transfers between them, split purchases, multiple savings goals with contribution history and target dates, budget limits, auto-categorization rules, cash flow calendar with forecasting, monthly spending reports, net worth tracking, customizable categories and accounts, JSON backups, CSV import & export and many other quality of life improvements were made during the many hours spent on this project. The biggest challenge was keeping every feature synced as the project grew. Transactions can affect accounts, budgets, savings goals, recurring payments, reports, charts and basically everything. Adding new functionality means that I have to update existing systems to ensure that everything stays working as intended. But I’m proud to see how much my project has evolved and grown. You should try to: Create multiple accounts and transfer money between them Add income & expense transactions, try the split transaction function Set up a few savings goals with target dates and see how the contribution suggestion feature works Customize categories & accounts with icons and colors Configure budget limits and see the warnings that It gives you when nearing the limits Create an auto-categorization rule Explore the cash flow calendar Try exporting your data to JSON
DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts or subscriptions required and your data is stored locally on your device, with an OPTIONAL cloud sync if you want to access it across devices. Since my second shipment, the project has grown even further. I read every single review and Implemented all the suggestions that were provided. Made an optional cloud syncing feature that allows users to access and use the app across multiple devices. Made a small tutorial/guide that provides a bit more information on how to use DimeTrack. Replaced the Calendar tab with a new Timeline, that shows all your recurring transactions in your selected time interval, your projected balance and an ability to add a safety net and see if your projected balance falls below it in the coming months. Added an ability to manually track your Investments. Even more customization options and many other things. Similar to my previous shipments, the biggest challenge was to keep everything synced. One feature depends on another, so adding new functionality means that I have to update existing systems to ensure that everything stays working. I’ve somehow spent 325 hrs on this project and this will probably be my final shipment. I’ve had a lot of fun working on it and hope to maybe sometime later. For the v3 you should try to: Complete the tutorial (If you have used DimeTrack previously, go to settings -> data -> clear all data or just use incognito window) Add some recurring transactions and test out the Timeline to see your projected balance Explore the new subscriptions tab Set up cloud sync Add some Investments, update their price so see how your portfolio value goes up or down Check out the new financial insights in the Overview tab Use the Command Bar at top middle, you can find some quick actions there, search for any transaction or even create a quick transaction by typing in the search bar - Amount, Description, Existing Category (for example: 5 Coffee Food (must have a category called Food)) Explore the keyboard shortcuts Do a few achievements Create a few transactions and test out the bulk editing options...
|
1792860521.7037585
|
1793724521.7037585
|
|
18497
|
Helyx by @lix | Stardance
|
lix
|
1
|
324.55
|
5177
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T22:08:55Z", "hours": 309.0, "multiplier": 19.45, "payout": 5177, "blessing": "neutral", "text": "What I made Helyx is a terminal app for Windows that keeps every local Git repository you own in one place and lets you commit, branch, resolve conflicts, repair broken repositories and answer GitHub Issues and Pull Requests without opening anything else. I spent a lot of time thinking about what kind of project I wanted to build. I wanted something that would be genuinely useful to developers in many different ways, and that is how I came up with Helyx, a TUI application that brings many Git and GitHub tasks into one place. What was challenging Learning new libraries, keeping the code organized as it grew, and designing every screen so it looks and feels as polished as I could get it. Deciding what to build next was harder than it sounds, because there was always more that could go in. What I am proud of It has everything I originally planned to include. The diagnostics screen finds what is wrong with a repository and offers the fix instead of just reporting it, the conflict resolver opens the conflicted block in its own editor, and the whole app speaks 8 languages. How to try it Download the latest release from Helyx’s GitHub and run it. It installs into your user folder and adds Helyx to your PATH , so you can start it by typing helyx in any terminal. No administrator rights are needed, and the .NET runtime is bundled inside. Then pick Add project and choose any folder that contains your project. Helyx is open source, so you can also read the code or build it yourself. Just click See source code below.", "repo": "https://github.com/lixtheyt/Helyx", "demo": "https://github.com/lixtheyt/Helyx/releases/latest"}]...
|
[{"post_id": 68799, "ts": "202 [{"post_id": 68799, "ts": "2026-09-15T19:30:38Z", "hours": 4.4892, "text": "Hackatime integration Hello there! A guy made a feature suggestion on Helyx’s GitHub, that I should add a Hackatime integration into it. So I was thinking… and thinking… and thinking and woah… I ADDED IT! It is not 1:1 like the web interface, that one is better & shows you more things but sadly this was everything that I could request from API (at least I think): Total Seconds Languages Repo URL Total Heartbeats First Heartbeat (DateTime) Last Heartbeat (DateTime) and when combining all of these information, I created a screen where you can see all of this specifically for your project. It works on the principe of authorization. You put in your Hackatime token which authorizes you and then when you go to your project and go on Hackatime Info, it prompts you to select the project from a list of projects that are assigned to your Hackatime account/token."}, {"post_id": 62263, "ts": "2026-09-05T15:31:03Z", "hours": 1.14, "text": "Fixed User Scripts bug So, every path block used Path.GetFullPath(path) instead of Path.GetFullPath(path, script.ProjectPath) . That means it was resolving relative paths against Helyx’s own directory, not your project’s. This is now fixed."}, {"post_id": 60348, "ts": "2026-09-02T17:13:41Z", "hours": 2.7431, "text": "Reviewing my codebase and fixing bugs Since all of the features that Helyx was supposed to be finished with are almost all done (maybe even all are done), I will now change my view to another projects for Stardance such as ThetaNexus . But that does not mean that now I will just forget about Helyx. I will be reviewing the codebase sometimes to find some bugs and fix them. You can help me with this, by making an Issue request on Helyx’s GitHub. So what bugs did I fix since the last devlog? I fixed line breaking in badge/status README editor. When you were inserting your badge/status into your README via Helyx’s README editor, it done… messy stuff to the README, not something like really bad what couldn’t be fixed by manually doing it, but it should now insert the badge/status exactly as you see it in the editor. I also introduced a new ‘Found state’ text instead of ‘Found’ text in IDE settings to avoid confusion. To avoid confusion because if an editor was found and you clicked on it… it wrote this: Found Found Found Not Found Found Set by user Now it writes this: Found state Found Found state Not Found Found state Set by user Most of the time, I was reviewing the codebase via Claude Code to actually check everything precisely."}, {"post_id": 56815, "ts": "2026-08-28T18:55:16Z", "hours": 1.7133, "text": "Replaced hardcoded string colors with Color members for code safety, fixed line breaking while assigning a status/badge Okay so Markup texts (those are the texts with color) were formatted in this format: \"[red]Hello World![/]\" So it was string-based. And if you accidentally added some character to it for instance: \"[redd]Hello World![/]\" <- Exception Helyx would crash. I mainly added this, because it is an open-source project. So if someone tried to edit it, they would only have to edit the string and they might have misspelled it. But now, when he goes into the codebase, he will see Color members and he just can’t misspell that, and if he would, compiler would alert him. Basically, now it is like this: $\"[{Color.Red}]Hello World![/]\" Okay so next I fixed line breaking. What does that mean? Well… In Helyx native README editor, so when you try to assign a status/badge, you’ll get that editor, when you try to add a status/badge to that line, you might have thought that it would be on the same line as the tags above it. But it didn’t… This was happening due to the comment markers for Helyx so Helyx knows where this status/badge is located and which status/badge it is. Now Helyx will put those comment markers in a way that prevents the line from breaking."}, {"post_id": 56645, "ts": "2026-08-28T14:17:12Z", "hours": 2.1092, "text": "Added GitHub Issues/PRs events rendering Originally, when you selected Manage GitHub Issues or PRs and opened some issues/PR. You could have only seen messages posted by users, but not when a label was assigned or when the issue/PR was closed. Well… Now you can! Now it displays the exact action that happened and when it happened! Of course, it is also translated to all languages that Helyx supports. Just making sure you didn’t think it wasn’t! I also cleaned up the code a little bit. Removed some useless usings and some files were in the wrong namespace, so that is fixed too."}, {"post_id": 54407, "ts": "2026-08-25T12:34:33Z", "hours": 1.2639, "text": "Edited README.md, again I was again editing the whole README.md, because reviewers weren’t happy with the current one. Well after spending another hour of editing the whole README.md file, I hope they won’t ask me to rewrite the whole README.md file again, because I don’t even know what else to add/remove/edit."}, {"post_id": 53900, "ts": "2026-08-24T16:30:00Z", "hours": 2.0894, "text": "Edited README.md I rewrote the README.md because of the ship review. I also added a couple of recommendations that are worth knowing when you use Helyx. I also removed the <summary> comments that Claude Code wrote for the documentation, I don’t think that anyone would have used them anyway."}, {"post_id": 52656, "ts": "2026-08-22T22:04:08Z", "hours": 0.4681, "text": "README.md update I replaced the title in README.md with a banner that contains the text Helyx. I tried a few versions I made and, well, I landed on the one you can see in Helyx’s README.md, or below!"}, {"post_id": 52636, "ts": "2026-08-22T21:23:40Z", "hours": 1.4575, "text": "Experimenting with the conflict solver I was thinking about adding a simpler conflict solver, where you wouldn’t have to delete the <<<<<<< , ======= and >>>>>>> markers yourself but would just pick either the first or the second version. But I realized it would be messier than I thought, so in the end I kept it as a basic editor where you remove the version you don’t want by hand."}, {"post_id": 52516, "ts": "2026-08-22T17:40:41Z", "hours": 4.2228, "text": "GitHub done, shipping Helyx today! Today I was messing with the GitHub page for Helyx, fixing the last bugs we found and working on the installer. For the installer I used Inno Setup, because it is the most recognized and the most used one. The point of using an installer is simple: it adds Helyx to PATH. Of course there were other options, but this one seemed like the best fit. We were fighting with the script for a while, because it was doing really weird things, like staying in the background after the installation finished. But those bugs are fixed now! README.md is done, all of those GIFs and screenshots are in it too, and I have to say it looks really good! I was also setting up the GitHub side of things, so the description, the tags, a GitHub Action and so on. With the help of Claude Code, we created the logo and the banner for the installer as well. The installer uses the same logo as Helyx. It’s just a basic H, because nothing else came to mind haha. I also asked Claude Code to review the codebase one last time, and yep, it looks fine! I told it to add the basic documentation comments as well, the <summary> kind. Let’s be real here, nobody does this, and if they do, something else writes it for them, usually an AI, because it understands the function better than the person who wrote it (I know that from my own experience hahaha)."}, {"post_id": 51969, "ts": "2026-08-21T23:29:24Z", "hours": 9.8508, "text": "New features, new languages, new problems. A new feature that I added is GitHub Actions! It is on the same principle as Manage Issues and Manage PRs, so you have a list of GitHub Actions, you pick one and you can control it, check its log, observe information about it. You can even run an action! I also added a refresh keybind to Manage Issues, Manage PRs and GitHub Actions. Before, you had to go back from the details of an issue/PR/action to the list and then return to the details. Now you don’t have to. You just have to press the keybind displayed in the footer that belongs to refresh. Yes! The Helyx Language System is finally complete! Italian & Portuguese are now available in Helyx! Lately I’ve been working on the README.md file. I was mainly making more GIFs & designing screenshots for it so it will look pretty and futuristic (in my opinion)! As I have mentioned in the title, NEW… PROBLEMS! People… you won’t believe what happened to me today… I use Helyx’s Git & GitHub for testing, so there is no official one yet, and I rarely commit changes or push them. Only when I test something. And it looks like it got back at me. Well… I told Claude Code to remove comments all over my codebase, because they were mainly scrapped code and some temporary information that I had there, that wasn’t used anymore. Okay, so I told it to remove them, and for some reason instead of removing comments, it deleted Helyx’s whole codebase. Thank god README.md was untouched haha. We had to decompile the .dll that was left over from testing Helyx’s latest version, and actually check the diff and rewrite it. We still don’t know if everything was brought back since for some reason Claude Code’s memory got wiped instantly when it realized that it deleted my whole codebase. There were no backups, no restore, no nothing. The only possible thing was to use the forgotten stash that I created and use the .dll as a map to restore Helyx’s outdated codebase and rewrite it again. So that’s what we did. Yeah, so I hope everything was brought back. Claude says it was, but after what it has done I don’t know if I trust it. Just kidding, everything should be back, because it compared the .dll with the rewritten code 1:1 and everything matched."}, {"post_id": 51403, "ts": "2026-08-21T02:37:22Z", "hours": 10.1656, "text": "More bugs fixed, new functions, README & Language System updates! Hello guys, once again at 4 AM! Bugs: As the title says, there are more fixed bugs. Diagnostics crashed Helyx if you ran a rebase in a terminal and hit a conflict. Now it doesn’t! Another fixed bug is that when you opened an issue in Helyx, the footer vanished. At first I was shocked, but it was a simple fix so now your footer doesn’t vanish. Another vanishing bug! The Languages row from the header vanished when you entered a tab where Layout class was being used. Now you will see your sweet programming languages used in your selected project. Guess what! Another vanishing bug! This time the whole header vanished when you exited .Live()! Now it is okay! New behaviour: I unified some color codes with some type of info. E.g. SHA is Dark Orange everywhere, Stash is Yellow, Date is Cadet Blue and Issue Number is Aqua. The README.md editor, when inserting badges/status now has a new keybind: backspace! It is different from DEL! DEL deletes the badges/status but backspace deletes the whole line, including the badge/status that was on that line. README The README is almost done! At least I hope! Claude was a big help here, because I wanted to create an insane README and we really did. Guys, you should be excited about the README file haha! Language System Translations for these languages are already done: English French German Russian Slovak Spanish So basically every language translation is already done. BUT I decided to add even more languages! The new languages that Helyx will support are: Italian Portuguese"}, {"post_id": 50335, "ts": "2026-08-19T14:33:20Z", "hours": 8.0847, "text": "Languages almost done, moving onto GitHub & README.md Well guys, Language System is almost done. It is powered by a Resources file that stores all of the translated strings. More bugs were found! But now, all of the bugs should be fixed with also many failsafes! Now, I want to complete the Language System because I am really close to finishing it. I also want to make the README.md for Helyx’s GitHub Repository. Originally I wanted to make it via Obsidian app, but it doesn’t have direct support for Wakatime, so I have to use VS 2026 native Markdown editor with the support of Markdown Editor v2 extension from Mads Kristensen. (not sponsored lol) I also heard that Obsidian app doesn’t use the same Markdown as GitHub does so there would be some things mistyped or not even rendered, but VS 2026 should be fully compatible with GitHub’s Markdown renderer, so we will see!"}, {"post_id": 49506, "ts": "2026-08-18T11:50:08Z", "hours": 6.5236, "text": "Fixing more bugs I fix bugs mainly with use of Claude Code, because hunting for bugs is not easy and this project is not a small one haha. I had to run MANY code review tools for this, because every time it kept finding new bugs. No idea how but it did. So what we fixed? If a GitHub comment had bold text split across two lines, opening that issue crashed Helyx before it drew anything. A file with a square bracket in its name (e.g. data[1].json) crashed Status, Diff, Commit, Stashes and Log. If anything held config.json open for even a moment, Helyx assumed it was corrupt, reset it, then crashed everywhere that looked for a project. If config.json was missing its Badges section, the startup migration quietly deleted every badge from every project. Committing saved a copy of the project taken before the confirmation prompts, so anything changed in between was silently thrown away. If you linked a GitHub repo during Push, the remote was created with an empty name. Syncing a status that had since been deleted crashed in the middle of a push. A commit message containing a square bracket crashed “View Full Message” (those are just bugs that were missing Markup.Escape() function). Applying a stash said “applied successfully” even when it conflicted. One bad path stored in config.json crashed “Add Project”. This is just a snippet of the amount of fixed bugs. I won’t write all of them here since it would take a lot of text and I am pretty sure that this is enough for you to understand that we fixed a lot of bugs haha. Right now I am going to do the Language System. I am not sure if I mentioned in some devlog, the list of languages that Helyx will support. If not… there it is: English Slovak Spanish French German Russian"}, {"post_id": 48471, "ts": "2026-08-16T20:37:52Z", "hours": 9.3269, "text": "Adding new features & fixing bugs I finished making “Analyze Project” which analyzes your whole project and prints stuff such as: Number of files Number of folders Size of the project on disk Number of lines Also you can now see what amount of what programming language makes your project. It also shows you the biggest files in your project directory. And also you can see Git information such as: Branch Number of commits First commit (date) Last commit Working tree .git size So it displays some maybe important and basic information that you may check sometimes or might be interested in. There were like 6 revisions of this because I was testing different styles & designs. I also found a lot of hidden bugs with help of Claude! Before talking about bugs, I will tell you something about new features that I added. Now, when you assign a badge or change a status and you don’t have markers in README.md yet in it, then it will ask you if you want to add them manually or via Helyx. What does that mean? Well, it opens a “text editor” in Helyx which displays README.md and you can insert the badges/statuses where you want instead of opening the file in notepad and inserting the markers manually. Overall it is way quicker to do it now via Helyx. Helyx’s Generic Text Editor is now even better! You can now use all of the arrows, before you could just use Left/Right Arrow to move cursor left or right. Now you can move between lines. Now you can also open your project’s wiki via Helyx. Be aware that it doesn’t check anything, if you have wiki or not. It directly opens the website for the wiki where it should have been for the current linked GitHub Repository. Let’s talk about bugs now! Open an issue called the Markdown handler function and it was accidentally calling GitHub 101 times, when it needed some info. Now it doesn’t. 🆒 Notes have an encryption system, so if you put some sensitive info into it, it couldn’t be directly taken from the file. Only via Helyx. There was a bug, where when you enabled encryption and edit notes of 2 projects, then you turn off encryption globally and open the first project’s notes, it decrypts… but after that you open second project’s notes, it won’t. This was due to having a global bool instead of per project bool when saving if it was encrypted. Fixeddd! Another bug! Sync Status & Sync Badges was deleting staging index. Funny that I was thinking about to restore the staging index whenever using it, but at the end… the logic was wrong 😭 Now it isn’t. Then there was a bug that when you unassigned a badge, it unassigned ALL badges. Fixed! Another bug linked to badges… Unassigning a badge didn’t remove it from GitHub. Yeah… fixed!!"}, {"post_id": 47110, "ts": "2026-08-14T19:16:58Z", "hours": 10.0108, "text": "Manage PRs done! Added few new things… I finally finished making Manage PRs. So now you can: Delete Comment Merge Review Close PR Reopen PR I also had to fix some design flaws and function flaws but now it should be all good. Before doing all of this, there was a bunch of GET requests… now? Now it is also a bunch of PATCH & PUT requests. Also, now when you’ll try to link your GitHub Repository with the local one, you will just select the one that is on your GitHub account. Another thing! When you have conflicts between the local repository and the remote one (GitHub) and you try to sync them, a lot of the time Notepad pops us and tells you to remove the version of the text that you don’t want. Well now Helyx does it too and doesn’t open notepad, but lets you do it directly in TUI interface in my very own notepad. Conflict solver also uses alternate screen for this. (there’s sadly no showoff image for this, because currently I don’t have anything to create a conflict on) I am not sure what to do next in a next devlog, since everything I really wanted to do is already done… well… not everything but everything around the main things is. Maybe I’ll move on another refactoring? Or finishing the language settings? Well, we will see!"}, {"post_id": 46111, "ts": "2026-08-13T03:18:59Z", "hours": 9.2472, "text": "Manage PRs displaying and some logic done After pulling another all-nighter I finished making the Pull Request display functions. List and details about each Pull Request is done and paging also works too (took it from manage issues ;] ). Pull Requests also contain filters such as: Open Drafts Assigned Reviewed and we can’t forget their counterparts either: Closed Ready Unassigned No reviewers Pull Requests now have comment selection and Markdown formatting, but functions to manage Pull Requests are not done yet. The only ones I managed to finish are: Comment Open Browser The biggest problem with PRs is going to be, that their functions and methods for executing those functions are more complex than the ones for Issues. I plan to add these functions for PRs: Delete Comment Merge Review Close PR Reopen PR I am pretty sure that all of this will be done in next devlog, so stay updated! This is going to be very cool, I think. Well, now I am going to sleep so good night everyone!"}, {"post_id": 45830, "ts": "2026-08-12T15:39:18Z", "hours": 8.5531, "text": "Manage Issues, completed! PRs, incoming… Manage Issues is now fully completed. I still had a few issues with paging and rendering but now they are fixed. Now you can select a message and delete it & edit it. But also now you can create a comment, lock an issue, unlock an issue and create an issue. I also added a thing that I hope will be appreciated, Helyx renders Markdown from GitHub Issue comment and when you comment via Helyx, Helyx gives you Markdown options such as: Bold Text Italic Text Code Text List Quote Also, when you don’t provide a text to a comment in GitHub, Helyx will say that “No description was provided.” So the same thing as GitHub already does, but in Helyx you must provide text. Why? Because why would you create a comment with no text? So I banned adding a comment with no text. Okay, that would be everything! It was fun to create this because everything was working so well, except the paging system… that was painful to make even with Claude’s help. As I said in past devlogs, after Issues I am going to move to PRs. So yeah, let’s work on PR. I hope it won’t be harder to make, because a PR is a type of Issue in GitHub, so I hope I will use the same function logic and functions and callbacks to make it."}, {"post_id": 45232, "ts": "2026-08-11T15:56:35Z", "hours": 9.2425, "text": "Paging done, functions almost! I finished making the logic for rendering issues. In the last devlog it was just displaying all of the issues at the same time. No paging system so if there was a lot of issues or long issues, they would simply… not appear. It took me a really long time to work this out. I was mainly switching back and forth the rendering logic all the time and it went so far, that I had to use Claude to help me with it. At the end, I ended up with a rendering logic that I am not really keen on, but it is the best one that can be used in Helyx and TUI environment. Main obstacles were the Spectre.Console rendering functions and classes that were under IRenderable interface. And also the limitations of Panels, Grids… Layout had everything I needed . I wanted to cut the part which couldn’t be rendered and it should have looked like, like an unfinished Panel. Well, this was impossible. Without changing the core code of Spectre.Console or creating own system for making Panels it was impossible. Also, I haven’t seen it as something that WOULD NEED an own system that would render comments. So I just made it when a comment cuts, it creates whole Panel with part of the comment that can be rendered and at the bottom is text saying that it continues on the next page… and on the other page at the top there’s text that, hey, it continues here! Let’s finally talk about the Issue functions! I finished some simple one like: Close Reopen and create an issue… But I still have to create a system that can let you: Comment Edit comments Delete comments Lock issue Unlock issue Those are currently in WIP, but in the next devlog they’ll be most probably finished and after everything is done with issues, I will move to Pull Requests!"}, {"post_id": 44672, "ts": "2026-08-10T16:18:14Z", "hours": 9.8836, "text": "Manage Issues, at your service. After a painful development period I am again here, writing devlog! What changed? Good question! Manage Issues is partly done! I still have to finish making the actual actions but displaying is somewhat finished. When you go to ‘Manage Issues’, you will firstly see a list of issues that are on your GitHub repository. From there you can already see some details about the issues such as: Number State Title Labels Comments (number) Updated (time) Above them are filters, currently those are the available filters: All -> All Commented -> Issues has some comments Assigned -> Issues that have some assignees Labels -> Issues that have some labels But that is not all! There are also their counterparts: No comments Unassigned Unlabeled (there’s no inversion of All because why would you need filter None) Yeah, so you can invert your filters… When you select an issue at the very top you will see its number, then you will have a panel with details about the issue with its title and: State Author Opened (time) Labels Assignees Right under these details are all of the comments in chronological order. When it is done, it will also show the whole timeline of each issue. So when this and this label was added/removed… when was this assignee assigned/unassigned… when was this issue closed/opened…. Of course I am going to add actions so you can add a comment, close issue, open issue, etc… When I’ll finish Manage Issues, I will go to work on Manage Pull Requests. It shouldn’t be that different because Pull Requests are by GitHub a kind of Issue but they are also not the same, so different classes, types, etc… Well, wish me luck people… or should I say… Stardancers?? P.S.: Sorry for the grammar in images in comments. I did it very quick for the preview."}, {"post_id": 44020, "ts": "2026-08-09T14:52:22Z", "hours": 9.7869, "text": "Diagnostics done, other stuff too and some changes! Diagnostics are now fully done! When something messes up, it will give you options to fix it! Some time ago I created GitHub Synchronization settings for managing what to sync with GitHub, so what to retrieve and send with those options: Sync status with GitHub repository Sync badges with GitHub repository Fetch GitHub repository topics Fetch GitHub repository stats Use GitHub’s language detection instead of Helyx’s I created a brand new tab called ‘GitHub Actions’ where this setting is. GitHub Actions is meant to contain all of the actions that are mainly linked with GitHub endpoints. I kept few such as Push, Pull, Sync in Git Actions due to how the layout is already created. Also I added when you are rebasing and it fails, it automatically gives you a prompt to cancel it. So repair it… GitHub Actions will contain a new stuff that will come to Helyx! Managing Issues and Pull Requests!! Maybe also workspaces/actions but I will see how difficult that is and how it is needed/useful in Helyx. Another new function is, that when there’s an update for Helyx and I change the GitHub OAuth scope because of new features… Helyx will warn you and tell you to reauthorize to make sure every function will work correctly. Before this change, Helyx was using its folder name as a name of the project and as a repository name for GitHub. Now, when you add a project to Helyx, Helyx will ask you what’s its name and when you will try to use some GitHub function for the first time on your newly added project on Helyx, it will request a GitHub Repository name from you. ;) There’s still a lot of things to add. Honestly I thought that Helyx was at the very end like 50 hours ago and look! There are many more functions to add haha!"}, {"post_id": 43404, "ts": "2026-08-08T17:00:23Z", "hours": 8.0208, "text": "Doctor Git As you may know, right now I am working on Diagnostics. I am almost done with fully displaying all of the health checks about your Git repository. But I still have to finish all of the fixing actions that it will have. Diagnostics will mainly be for a case where something happens in Helyx and it will need to be fixed. The main idea of it is not aimed at resolving issues with your Git repository outside Helyx. But it may resolve some because you may run into the same issue as you had in Helyx of course. In the last devlog I said that I put GitHub Topics off. Well, that did not happen! I finished displaying GitHub Topics!! I think in some devlogs I said that it was for managing GitHub Topics. Managing meant like adding, removing, editing. Well, that wasn’t actually my main point. I just wanted it to show you your currently assigned topics in GitHub. I also didn’t see a big reason in adding Add, Remove, Edit functions for topics. Topics rarely changed, honestly and the most intuitive way would be doing it via GitHub web interface."}, {"post_id": 42869, "ts": "2026-08-07T20:34:12Z", "hours": 3.6694, "text": "More bugs are appearing, and being fixed!! So since Helyx is already far and has many advanced functions, it also has some bugs. Today when I was experimenting with assigning a project and syncing it with GitHub, I found out, that if you try to sync the projects in a wrong way… it will not work. For that reason I added more fail-safes to make sure that this will be eliminated. I can’t confirm yet if those fail-safes work, because I am also working on a new Diagnostics action in Git Actions so if something goes wrong, you can fix it by the error Helyx gives you. Right now my testing project is in a state of “Git corrupted” (no idea what I should call it) where rebase was aborted. Because of this, I had to put the “GitHub Sync Topics” synchronization off until later, so I can focus on fixing these major bugs. Also another bug came to my mind that I fixed… Helyx works on a principle of directory paths. Each project is saved in config file under its own unique GUID and its path. The bug is that when you try to rename the directory, the project won’t be found and it will be removed from Helyx. Now, you can either let Helyx find it automatically (sadly can easily fail) or you can select project manually in explorer (recommended!!!)."}, {"post_id": 42404, "ts": "2026-08-07T02:57:49Z", "hours": 4.2367, "text": "Sync finally done!! It’s 5 AM and I finished “Sync badges with GitHub Repository” and “Sync the status with GitHub repository” (this was already done, but with the enum version of status). I added also a few fail-safes so when you assign some badge or status and then delete it, it will also delete it from GitHub and project. Now it won’t be a ghost that you cannot get rid of haha. This was a little more difficult than I expected to do, the fail-safes because the local changing mechanism and syncing mechanism were written inline in the same function. The only thing that was dividing them was an if statement. It was interesting to make this. To make sure everything will work fine. Even though it didn’t MANY TIMES. Now I will focus on syncing GitHub topics. Wish me luck! P.S.: Forgot to mention, that I have to add this “On Status/Badge Edit, ASAP sync with GitHub” with Edit. I almost forgot lol, just came into my mind. I hope that COPY+PASTE will be enough and I won’t have to create another syncing system specifically for edits…"}, {"post_id": 42259, "ts": "2026-08-06T21:43:48Z", "hours": 8.6897, "text": "Never expected it to be this hard So the last days I was again changing the structure of my solution and trying to get on with it. It took me a while to create one that Claude agrees with and is good for such open-source projects. Anyways, this was the easy part. In my last devlog I said that I completed Custom Statuses & Custom Badges. Well… I did! But then I found out, that my system was bad… and when I say bad I mean it wasn’t thought out. I found out about all of this when I finished the edit action for both. Originally I used Dictionary<string, TagDefinition>. Key was name of the Status/Badge and TagDefinition was the class of one of them which also has name property. But Helyx was not prepared for this, so for the last days I redid the whole system eight times. Once I used Dictionary, once I used List, then HashSet, then Dictionary, then Dictionary with other types and so on. I just couldn’t settle on the correct type for it. Until now, it took so long even though it is so primitive because it simply didn’t come to my mind and when I was asking Claude for suggestions of how could it be made, it didn’t think of using this type. The final type is simply… Dictionary<Guid, TagDefinition> AND A LOT OF CHANGES. Yeah… don’t worry guys! I am totally devastated by doing this over and over even though it was so simple & primitive to do. Well… maybe not really primitive because the changes were also difficult to do. I mainly didn’t want to use the GUID system because I have Custom Statuses but also Built-in Statuses and I was really worried about Built-in statuses having GUID assigned to them. Those sync options with GitHub are still in work, but I finished the GitHub Repository Stats viewer after a lot of experimenting with layouts and designs/effects/colors. I’m looking forward to the next devlog guys! I hope Helyx will be your good coworker that will actually count for something hah! P.S.: I also made that text of colors is grammatically formatted. At least it should be…"}, {"post_id": 40755, "ts": "2026-08-04T14:24:15Z", "hours": 6.5064, "text": "Adding Custom Statuses, Custom Badges and even more! Here we are again! Today I added: Custom Statuses Custom Badges WIP: Sync badges with GitHub repository Sync topics with GitHub repository My original status system for projects was a hardcoded enum with statuses “Active”, “Inactive”, “Paused” and “Archived”. Then I had a lot of switches which determined color of markup based on which enum it is hah. As you may already know, enums cannot be changed in runtime :) What does that mean? That users cannot add their own statuses in Helyx directly… They would have to hardcode into Helyx their own statuses and that’s just impractical, no? That’s why I spent below mentioned amount of hours redoing so many things to make it actually work and I even learned something from this! That JSON Parsers and Colors are NOT huge friends! (genuinely, I HAD NO IDEA why it wasn’t working until AI told me that JSON parsers cannot translate Color structs). Custom Statuses/Badges currently have Add/Delete functions and right now I am going to add also Edit function, so when you accidentally create a status/badge with wrong color, you don’t have to delete it and create it again :) (just saved 10seconds of your life). I also recategorized my whole codebase with help of Claude Code. I told him to review my whole codebase and suggest what classes, enums, interfaces should be in which files and those files in which folders. It was fun, finally something where I did not have to concentrate much and chill and watch something when doing it. Well, now it is not much fun when functions that I was using are in different files and some classes have different names. But at least my codebase looks more professional! (before this I had like 10 files with a bunch of lines where classes were stacked…) Also, about the WIP stuff above… Sync badges with GitHub repository is going to be something like the Sync status with GitHub repository. It will just pop up in your README.md based on where you put the headers which Helyx will give you for that specific badge. Sync topics on the other hand are classic topics of the repository which you can see in top right corner of your repository page. It will mostly show you which topics are assigned to your repository in Helyx but I’ll make it also so you can assign/unassign topics from your repository. I’m thinking of adding more GitHub Synchronization options, but none are currently coming to my mind. Maybe something with actions, no idea yet, or local AI that will explain to you errors given by Helyx when you will be trying to do something. We will see!"}, {"post_id": 40227, "ts": "2026-08-03T17:05:06Z", "hours": 5.3314, "text": "Settings and Git pages are receiving more stuff! I added for Settings page: Notes Settings Updates and for Git page: Undo Commit Redo Commit as the name says, Notes Settings are for changing properties of global Notes on every project. There is only one setting that came to my mind and that is encryption. Some of you might paste into it something personal or confidential. Well, this makes sure that these info CANNOT be taken from raw file, but from Helyx directly. (thinking about adding password mechanism lol) Updates, yeah, it looks for updates for Helyx . Undo Commit is a special one, when you commit something and for some reason you want to go back you just undo it. On the other hand, if you somehow accidentaly clicked on Undo Commit or now you want to redo the undo, you can with Redo Commit. My plan now is to add again more functions, such as Custom Badges, option to sync the Custom Badges with your GitHub repo (it will pop up in README.md) and also add Tags sync, so you can edit your repository’s Tags via Helyx. Oh yeah, also going to add custom project status because some people may say that having statuses such as “Active”, “Inactive”, “Paused”, “Archived” is limiting (custom ones will yes, also be synced with GitHub). :) I also mustn’t forget to add the translations for other languages. I am going to do this at the end due to new text appearing every time I add something new."}, {"post_id": 39660, "ts": "2026-08-02T19:45:40Z", "hours": 6.2036, "text": "Slowly, but surely We are almost at the end (if no other function to add will come to my mind) and I was messing with access modifiers, accessors, refactoring names of variables, Tasks, voids, properties. I was adding exception handling keywords and many ifs to make sure there will be no bugs and that almost every exception will be caught. I was doing this manually so I might have missed some places where the exception handler is needed but yeah we shall see! I also enabled a search bar, so when you will be looking for your project in Helyx and you have many projects added, you can search for yours! I was also changing styles of my old menus and theirs logic because they weren’t done very well in comparison with style that I am using now… Funny story: while I was messing with the access modifiers and accessors I actually bricked the whole Helyx, because functions that were supposed to resolve configuration file and read/write into it couldn’t. I thought I accidentally removed something important but at the end it was just that, that I was changing the access modifiers and accessors."}, {"post_id": 39059, "ts": "2026-08-01T18:54:21Z", "hours": 9.4842, "text": "Added new setting, finished overwrite languages and still working on show stats I have finished the overwrite languages function which uses GitHub’s programming languages detection system over Helyx’s one. I added a setting where you can choose your identity (Git -> local, GitHub -> remote). Local is based on Git’s settings and remote one is accessible after authorization with GitHub. I am currently working on retrieving and displaying the GitHub repository statistics. I am using charts to display it nicely and simply. Currently it is showing only Stars, Watchers, Forks and chart of used languages. I also added a few informative labels that tell you that something is actually happening and the program did not freeze. If I didn’t add this you would be looking at an empty black screen. One of the last things I added is active GitHub Authorization Token checker and resolver. Before this if you revoked your OAuth with Helyx on GitHub page, Helyx would think that it is still authorized to your GitHub account, now it checks it and if you revoke it online, Helyx will disable functions that are only accessible when you are authorized via GitHub."}, {"post_id": 37815, "ts": "2026-07-30T19:23:03Z", "hours": 4.9556, "text": "User Scripts done? What next?? As written above, I have finished User Scripts. Yeah, they don’t have that many functions as before, but I am going to add some, that will actually be useful and will stay in Helyx. Right after that I’d want to move to add more things to GitHub Synchronization settings that are per project. This is mainly to make the Helyx project dashboard look better with more interesting info about your current repository. Be aware that you have to be authorized in Helyx via GitHub to access those settings. This may sound funny, but I was thinking about adding Add-on manager to Helyx. No idea how I would make it yet or what packages would even Helyx have, but I hope that after some brainstorming I will have an answer. Before that, I will again think for a while if it is a good idea and if it is even needed. But surely it sounds cool to me, to someone who has never made an add-on manager for his program. At the end I want to transfer my view to hardening the code. Many checkings, many dialog boxes what’s wrong, and such things, so your Helyx window just doesn’t close after you mess up with configuration file or you do something that no one would ever do in his lifetime. ;)"}, {"post_id": 37545, "ts": "2026-07-30T10:56:21Z", "hours": 10.0053, "text": "Changing my mind over User Scripts So I have finished all of these User Scripts functions and I found out something interesting, that made me remove some of them after I finished them. In the devlog before, I wrote a list of actions that are in Helyx such as… Wait Until, If, Loop, Set/Get Variable, etc… . Well, I found out that making some that I have mentioned would be useless, because I imagined User Scripts mainly as an automatic actions for testing your project, but how could your program get script’s variable from Helyx or set/change it. The same applies for If, If would be also complex to set. With each If Action there would be x^2 (if my calculations are correct) more node pathways and without making some really good UX in TUI environment, it would be difficult to find your way around."}, {"post_id": 36457, "ts": "2026-07-28T16:14:12Z", "hours": 9.1958, "text": "Making User Scripts I am currently working on the User Scripts as I have mentioned in older devlogs. I must say that this is one of my first interactions with interfaces in C# because there was not a huge reason to use it in my code… until now. I must say that User Scripts is the most difficult thing in all Helyx to make because you have to think on everything… how this will work, how shall we display it, how to make it versatile so other actions work with it too, etc… I made the system for adding Blocks (Actions = Blocks) to Scripts and right now I am implementing dialogs to insert properties for each action, such as Duration for Wait Action. These are current actions that are in Helyx (you can suggest new ones in comments) : Wait Wait Until If Loop (should be something like while(), might change the idea of it) End (ends script, so like return/break) Set Variable Get Variable Compare Random Log (logs text) Execute (executes command) Open (opens directory) Create File Create Folder Delete File Delete Folder Right after that I would want to move to make the UI look overall better and function better. Welp, we will see in my next devlog the progress I will make."}, {"post_id": 35822, "ts": "2026-07-27T14:40:58Z", "hours": 5.6561, "text": "Backup system, done!! I finished the Backup system and also had to fix some major issues I had in helper functions due to the “project looking up system” migration… yeah… awkward name, I know. Now that the Backup system is done, let me continue and begin to work on User Scripts. Just realized that I have to come up with how it will work…"}, {"post_id": 34093, "ts": "2026-07-24T15:52:43Z", "hours": 8.3447, "text": "Losing sanity is not fun I honestly think I’ll go insane soon. I have changed the whole system of how Helyx saves Projects to its config file and how every function… EVERY FUNCTION works with it. I just have to say that I’ll try my best to make the code better than the one I am currently editing because 18h spent on redoing the whole codebase (revamping included from devlog before) is 1. crazy and 2. even more crazy. It’s wild how a tiny thing can ruin your whole codebase, I hope I will finish it quickly, because I want to continue working on the Backup system and after that on the User Scripts."}, {"post_id": 31940, "ts": "2026-07-20T19:06:16Z", "hours": 9.93, "text": "Cleanup time! I have completely revamped my code… I removed a lot of unused code that was either used for experimenting or was scrapped and I forgot to remove it. Before removing some of the code, I actually tried something with it… but then I realized that they were commented for some reason. I refactored parts of my code to look overall simpler with lambda expressions and LINQ. Not sure if it is more readable now, but it works so it’s fine. If anything, I’ll just add a comment so I know what it does instead of looking at it and brainstorming what it could be. I decided to mainly work on the Backup system because I think that User Scripts will be more complicated to make."}, {"post_id": 31333, "ts": "2026-07-19T17:11:07Z", "hours": 6.3575, "text": "Local & Remote Repository status I just finished making the status manager, so now you can change your status locally… but also remotely! Remotely means on GitHub, not like via some controller. Because of this, I created a tab called GitHub Synchronization, where you can enable/disable settings that are linked with GitHub and retrieve/push from/to GitHub. Now, I am planning to work on Backup system and User Scripts."}, {"post_id": 29735, "ts": "2026-07-16T20:33:20Z", "hours": 9.7861, "text": "Git Actions family is getting EVEN bigger! I have finally finished a lot of major stuff and also tried to make some additional things that MAY be added in the future. I finally added Stashes, Pull, Push and Sync to the Git Actions, so now they work! Also, all of Git functions have some automatic repair, so if you do something you shouldn’t, it should be alright… but it is not 100% so don’t try your luck! I still have to finish and a bunch of stuff with it so you can do whatever you want with it without editing the code itself! I was thinking of adding some label for your GitHub repository which you can control via Helyx. Like status… yeah… let’s add a badge that will act as a status info of your project!"}, {"post_id": 26717, "ts": "2026-07-11T17:47:55Z", "hours": 12.8578, "text": "Git Actions family is getting bigger! We’ve made a lot of progress! More of the Git Actions are done such as… Status Stage Commit Diff Create Branch Switch Branch Delete Branch Right now I am working on another: Pull Push Sync Stashes I hope they will be done soon! Stay updated!"}, {"post_id": 21798, "ts": "2026-07-03T22:31:34Z", "hours": 45.9456, "text": "Huge updates!! Since it is my first time working with Spectre.Console library, I was trying a lot of stuff with it. When I was somewhat happy with what I learned, I cleaned up the code due to the amount of useless lines and duplicated/not used variables . 1, Updated UI/UX I have updated the UI/UX so it looks more modern-ish. This new UI/UX design is for now only on the main pages of Helyx… but I plan to add it to every page very soon! 2, More actions! (even more will be available in the future) I have added more Git Actions that are still in WIP. I also created templates in code of what actions I’d want to add later. I’ll tell you more about them when they will be finished (SOON). 3, More stuff in Settings! I have added more settings into Settings :D Now you can select Default IDE, see if your IDE was found in your system, if not you can manually select the .exe of it. You can also manage the configuration file, well, reset it. 4, Projects sorting Projects are now sorted based on its status. 5, You can manage the projects for Helyx You can now delete the projects and change the status. 6, Future bugs & lots of if statements My code was completely unsafe up to this point, so I had to add many of try/catch and if statements to make it safe. I was experimenting with Spectre.Console, because I have never worked with it. I made some cool stuff that I will add in the future to Helyx! I understand it now better! All of this was quite difficult for me to do, since as I said, on such project where I am using C# with its basic types… I was mostly a Unity C# Developer, where Unity had its own classes and functions and callers that were standard."}, {"post_id": 10796, "ts": "2026-06-17T18:25:25Z", "hours": 14.0269, "text": "Helyx, the IDE detective I’ve been working on the IDE detection system. This took me a long time because I was testing many different ways of how to detect it and then sort them from most probable to least. At the end I have selected the one that uses points based on what the Project includes in its path… so files, extensions and directories. I was experimenting with the Language system that I will make in the future. I just want to be sure what I am doing so later, I won’t be in panic what now and what was my original plan. I have also refactored the code to some point but it is still not great after all of these things I have done above … so still need to do this. I redesigned the menus and made it more universal and made the menu easier to navigate in. I think my progress is going kinda good so far and it looks promising for me. I also added some basic Git function like “git status” but I am about to add more. I’d appreciate if you would write into comments some functions that I should add to Helyx. Not sure if I already mentioned this but I am also planning to add a feature so you can create your own shortcuts for your projects like… some testing shortcut. For instance, you have some project you want to test and you need to build it, then tweak some settings and at the end you actually test. With this, you can do all of this just by one click… Well, that’s at least my imagination and I am not sure if it will get to such point where you can do such tasks but we’ll see Wish me luck!"}, {"post_id": 9561, "ts": "2026-06-15T22:44:15Z", "hours": 4.0336, "text": "Project handler, done for now I was thinking of adding a translation system for Helyx. I was experimenting with a lot of systems how to do it… well, I might keep this for the end of Helyx so at the end I translate all of the strings. I added the “Add Project” system and some basic detection systems for it such as… Project Name Path Languages (used programming language in project) Used IDE for the project then it will ask you if you really, but REALLY want to add the project and if you proceed it will be added to your Projects menu. After that you can open your Project and see such basic info as… Status Last modified Languages Used IDE Is a GIT Repo I am thinking about adding more, removing some and making it overall more versatile because versatile applications are just the best ones. For now, I created some basic functions for your Projects such as… Open in VS Code Git Status Remove Project (from Helyx) but these are the ones already working, but I am still trying to make them more versatile :p … but there’s more functions that I am currently working on, that I hope won’t be scrapped and I will mention them in next devlog!"}, {"post_id": 9329, "ts": "2026-06-15T17:24:04Z", "hours": 7.76, "text": "Lots of new ideas, lots of scrapped ideas Lately I’ve been working on a way to search for projects automatically but I had to scrap the idea because I didn’t like it at the end… so now I am making it so you can add your own projects and some IDE integrations. I was also trying multiple libraries for TUI interface integration and GUI support with other libraries and input devices. These hours were full of scrapping & making new ideas, but that’s what programming is about!"}, {"post_id": 8639, "ts": "2026-06-14T11:15:51Z", "hours": 1.3039, "text": "The beginning… So I have finally begun to work on this! I was thinking a lot what to create for Stardance and it looks like this might be something I want to create! Originally I wanted to create this in Python but then I really quickly found out that my Python skills wouldn’t be enough to create something like this and I didn’t want this to be a vibe-coding project… SO HERE WE ARE… using C#! So far so good, I guess… Currently I am working on the configuration handler which will have functions for implementing and retrieving info from the configuration file. After that, I am planning to make the interface somewhat versatile, so it is possible to adjust it for yourself or add some new options and such."}]...
|
Title: Helyx by @lix | Stardance
Devlogs:
The beg Title: Helyx by @lix | Stardance
Devlogs:
The beginning… So I have finally begun to work on this! I was thinking a lot what to create for Stardance and it looks like this might be something I want to create! Originally I wanted to create this in Python but then I really quickly found out that my Python skills wouldn’t be enough to create something like this and I didn’t want this to be a vibe-coding project… SO HERE WE ARE… using C#! So far so good, I guess… Currently I am working on the configuration handler which will have functions for implementing and retrieving info from the configuration file. After that, I am planning to make the interface somewhat versatile, so it is possible to adjust it for yourself or add some new options and such.
Lots of new ideas, lots of scrapped ideas Lately I’ve been working on a way to search for projects automatically but I had to scrap the idea because I didn’t like it at the end… so now I am making it so you can add your own projects and some IDE integrations. I was also trying multiple libraries for TUI interface integration and GUI support with other libraries and input devices. These hours were full of scrapping & making new ideas, but that’s what programming is about!
Project handler, done for now I was thinking of adding a translation system for Helyx. I was experimenting with a lot of systems how to do it… well, I might keep this for the end of Helyx so at the end I translate all of the strings. I added the “Add Project” system and some basic detection systems for it such as… Project Name Path Languages (used programming language in project) Used IDE for the project then it will ask you if you really, but REALLY want to add the project and if you proceed it will be added to your Projects menu. After that you can open your Project and see such basic info as… Status Last modified Languages Used IDE Is a GIT Repo I am thinking about adding more, removing some and making it overall more versatile because versatile applications are just the best ones. For now, I created some basic functions for your Projects such as… Open in VS Code Git Status Remove Project (from Helyx) but these are the ones already working, but I am still trying to make them more versatile :p … but there’s more functions that I am currently working on, that I hope won’t be scrapped and I will mention them in next devlog!
Helyx, the IDE detective I’ve been working on the IDE detection system. This took me a long time because I was testing many different ways of how to detect it and then sort them from most probable to least. At the end I have selected the one that uses points based on what the Project includes in its path… so files, extensions and directories. I was experimenting with the Language system that I will make in the future. I just want to be sure what I am doing so later, I won’t be in panic what now and what was my original plan. I have also refactored the code to some point but it is still not great after all of these things I have done above … so still need to do this. I redesigned the menus and made it more universal and made the menu easier to navigate in. I think my progress is going kinda good so far and it looks promising for me. I also added some basic Git function like “git status” but I am about to add more. I’d appreciate if you would write into comments some functions that I should add to Helyx. Not sure if I already mentioned this but I am also planning to add a feature so you can create your own shortcuts for your projects like… some testing shortcut. For instance, you have some project you want to test and you need to build it, then tweak some settings and at the end you actually test. With this, you can do all of this just by one click… Well, that’s at least my imagination and I am not sure if it will get to such point where you can do such tasks but we’ll see Wish me luck!
Huge updates!! Since it is my first time working with Spectre.Console library, I was trying a lot of stuff with it. When I was somewhat happy with what I learned, I cleaned up the code due to the amount of useless lines and duplicated/not used variables . 1, Updated UI/UX I have updated the UI/UX so it looks more modern-ish. This new UI/UX design is for now only on the main pages of Helyx… but I plan to add it to every page very soon! 2, More actions! (even more will be available in the future) I have added more Git Actions that are still in WIP. I also created templates in code of what actions I’d want to add later. I’ll tell you more about them when they will be finished (SOON). 3, More stuff in Settings! I have added more settings into Settings :D Now you can select Default IDE, see if your IDE was found in your system, if not you can manually select the .exe of it. You can also manage the configuration file, well, reset it. 4, Projects sorting Projects are now sorted based on its status. 5, You can manage the projects for Helyx You can now delete the projects and change the status. 6, Future bugs & lots of if statements My code was completely unsafe up to this point, so I had to add many of try/catch and if statements to make it safe. I was experimenting with Spectre.Console, because I have never worked with it. I made some cool stuff that I will add in the future to Helyx! I understand it now better! All of this was quite difficult for me to do, since as I said, on such project where I am using C# with its basic types… I was mostly a Unity C# Developer, where Unity had its own classes and functions and callers that were standard.
Git Actions family is getting bigger! We’ve made a lot of progress! More of the Git Actions are done such as… Status Stage Commit Diff Create Branch Switch Branch Delete Branch Right now I am working on another: Pull Push Sync Stashes I hope they will be done soon! Stay updated!
Git Actions family is getting EVEN bigger! I have finally finished a lot of major stuff and also tried to make some additional things that MAY be added in the future. I finally added Stashes, Pull, Push and Sync to the Git Actions, so now they work! Also, all of Git functions have some automatic repair, so if you do something you shouldn’t, it should be alright… but it is not 100% so don’t try your luck! I still have to finish and a bunch of stuff with it so you can do whatever you want with it without editing the code itself! I was thinking of adding some label for your GitHub repository which you can control via Helyx. Like status… yeah… let’s add a badge that will act as a status info of your project!
Local & Remote Repository status I just finished making the status manager, so now you can change your status locally… but also remotely! Remotely means on GitHub, not like via some controller. Because of this, I created a tab called GitHub Synchronization, where you can enable/disable settings that are linked with GitHub and retrieve/push from/to GitHub. Now, I am planning to work on Backup system and User Scripts.
Cleanup time! I have completely revamped my code… I removed a lot of unused code that was either used for experimenting or was scrapped and I forgot to remove it. Before removing some of the code, I actually tried something with it… but then I realized that they were commented for some reason. I refactored parts of my code to look overall simpler with lambda expressions and LINQ. Not sure if it is more readable now, but it works so it’s fine. If anything, I’ll just add a comment so I know what it does instead of looking at it and brainstorming what it could be. I decided to mainly work on the Backup system because I think that User Scripts will be more complicated to make.
Losing sanity is not fun I honestly think I’ll go insane soon. I have changed the whole system of how Helyx saves Projects to its config file and how every function… EVERY FUNCTION works with it. I just have to say that I’ll try my best to make the code better than the one I am currently editing because 18h spent on redoing the whole codebase (revamping included from devlog before) is 1. crazy and 2. even more crazy. It’s wild how a tiny thing can ruin your whole codebase, I hope I will finish it quickly, because I want to continue working on the Backup system and after that on the User Scripts.
Backup system, done!! I finished the Backup system and also had to fix some major issues I had in helper functions due to the “project looking up system” migration… yeah… awkward name, I know. Now that the Backup system is done, let me continue and begin to work on User Scripts. Just realized that I have to come up with how it will work…
Making User Scripts I am currently working on the User Scripts as I have mentioned in older devlogs. I must say that this is one of my first interactions with interfaces in C# because there was not a huge reason to use it in my code… until now. I must say that User Scripts is the most difficult thing in all Helyx to make because you have to think on everything… how this will work, how shall we display it, how to make it versatile so other actions work with it too, etc… I made the system for adding Blocks (Actions = Blocks) to Scripts and right now I am implementing dialogs to insert properties for each action, such as Duration for Wait Action. These are current actions that are in Helyx (you can suggest new ones in comments) : Wait Wait Until If Loop (should be something like while(), might change the idea of it) End (ends script, so like return/break) Set Variable Get Variable Compare Random Log (logs text) Execute (executes command) Open (opens directory) Create File Create Folder Delete File Delete Folder Right after that I would want to move to make the UI look overall better and function better. Welp, we will see in my next devlog the progress I will make.
Changing my mind over User Scripts So I have finished all of these User Scripts functions and I found out something interesting, that made me remove some of them after I finished them. In the devlog before, I wrote a list of actions that are in Helyx such as… Wait Until, If, Loop, Set/Get Variable, etc… . Well, I found out that making some that I have mentioned would be useless, because I imagined User Scripts mainly as an automatic actions for testing your project, but how could your program get script’s variable from Helyx or set/change it. The same applies for If, If would be also complex to set. With each If Action there would be x^2 (if my calculations are correct) more node pathways and without making some really good UX in TUI environment, it would be difficult to find your way around.
User Scripts done? What next?? As written above, I have finished User Scripts. Yeah, they don’t have that many functions as before, but I am going to add some, that will actually be useful and will stay in Helyx. Right after that I’d want to move to add more things to GitHub Synchronization settings that are per project. This is mainly to make the Helyx project dashboard look better with more interesting info about your current repository. Be aware that you have to be authorized in Helyx via GitHub to access those settings. This may sound funny, but I was thinking about adding Add-on manager to Helyx. No idea how I would make it yet or what packages would even Helyx have, but I hope that after some brainstorming I will have an answer. Before that, I will again think for a while if it is a good idea and if it is even needed. But surely it sounds cool to me, to someone who has never made an add-on manager for his program. At the end I want to transfer my view to hardening the code. Many checkings, many dialog boxes what’s wrong, and such things, so your Helyx window just doesn’t close after you mess up with configuration file or you do something that no one would ever do in his lifetime. ;)
Added new setting, finished overwrite languages and still working on show stats I have finished the overwrite languages function which uses GitHub’s programming languages detection system over Helyx’s one. I added a setting where you can choose your identity (Git -> local, GitHub -> remote). Local is based on Git’s settings and remote one is accessible after authorization with GitHub. I am currently working on retrieving and displaying the GitHub repository statistics. I am using charts to display it nicely and simply. Currently it is showing only Stars, Watchers, Forks and chart of used languages. I also added a few informative labels that tell you that something is actually happening and the program did not freeze. If I didn’t add this you would be looking at an empty black screen. One of the last things I added is active GitHub Authorization Token checker and resolver. Before this if you revoked your OAuth with Helyx on GitHub page, Helyx would think that it is still authorized to your GitHub account, now it checks it and if you revoke it online, Helyx will disable functions that are only accessible when you are authorized via GitHub.
Slowly, but surely We are almost at the end (if no other function to add will come to my mind) and I was messing with access modifiers, accessors, refactoring names of variables, Tasks, voids, properties. I was adding exception handling keywords and many ifs to make sure there will be no bugs and that almost every exception will be caught. I was doing this manually so I might have missed some places where the exception handler is needed but yeah we shall see! I also enabled a search bar, so when you will be looking for your project in Helyx and you have many projects added, you can search for yours! I was also changing styles of my old menus and theirs logic because they weren’t done very well in comparison with style that I am using now… Funny story: while I was messing with the access modifiers and accessors I actually bricked the whole Helyx, because functions that were supposed to resolve configuration file and read/write into it couldn’t. I thought I accidentally removed something important but at the end it was just that, that I was changing the access modifiers and accessors.
Settings and Git pages are receiving more stuff! I added for Settings page: Notes Settings Updates and for Git page: Undo Commit Redo Commit as the name says, Notes Settings are for changing properties of global Notes on every project. There is only one setting that came to my mind and that is encryption. Some of you might paste into it something personal or confidential. Well, this makes sure that these info CANNOT be taken from raw file, but from Helyx directly. (thinking about adding password mechanism lol) Updates, yeah, it looks for updates for Helyx . Undo Commit is a special one, when you commit something and for some reason you want to go back you just undo it. On the other hand, if you somehow accidentaly clicked on Undo Commit or now you want to redo the undo, you can with Redo Commit. My plan now is to add again more functions, such as Custom Badges, option to sync the Custom Badges with your GitHub repo (it will pop up in README.md) and also add Tags sync, so you can edit your repository’s Tags via Helyx. Oh yeah, also going to add custom project status because some people may say that having statuses such as “Active”, “Inactive”, “Paused”, “Archived” is limiting (custom ones will yes, also be synced with GitHub). :) I also mustn’t forget to add the translations for other languages. I am going to do this at the end due to new text appearing every time I add something new.
Adding Custom Statuses, Custom Badges and even more! Here we are again! Today I added: Custom Statuses Custom Badges WIP: Sync badges with GitHub repository Sync topics with GitHub repository My original status system for projects was a hardcoded enum with statuses “Active”, “Inactive”, “Paused” and “Archived”. Then I had a lot of switches which determined color of markup based on which enum it is hah. As you may already know, enums cannot be changed in runtime :) What does that mean? That users cannot add their own statuses in Helyx directly… They would have to hardcode into Helyx their own statuses and that’s just impractical, no? That’s why I spent below mentioned amount of hours redoing so many things to make it actually work and I even learned something from this! That JSON Parsers and Colors are NOT huge friends! (genuinely, I HAD NO IDEA why it wasn’t working until AI told me that JSON parsers cannot translate Color structs). Custom Statuses/Badges currently have Add/Delete functions and right now I am going to add also Edit function, so when you accidentally create a status/badge with wrong color, you don’t have to delete it and create it again :) (just saved 10seconds of your life). I also recategorized my whole codebase with help of Claude Code. I told him to review my whole codebase and suggest what classes, enums, interfaces should be in which files and those files in which folders. It was fun, finally something where I did not have to concentrate much and chill and watch something when doing it. Well, now it is not much fun when functions that I was using are in different files and some classes have different names. But at least my codebase looks more professional! (before this I had like 10 files with a bunch of lines where classes were stacked…) Also, about the WIP stuff above… Sync badges with GitHub repository is going to be something like the Sync status with GitHub repository. It will just pop up in your README.md based on where you put the headers which Helyx will give you for that specific badge. Sync topics on the other hand are classic topics of the repository which you can see in top right corner of your repository page. It will mostly show you which topics are assigned to your repository in Helyx but I’ll make it also so you can assign/unassign topics from your repository. I’m thinking of adding more GitHub Synchronization options, but none are currently coming to my mind. Maybe something with actions, no idea yet, or local AI that will explain to you errors given by Helyx when you will be trying to do something. We will see!
Never expected it to be this hard So the last days I was again changing the structure of my solution and trying to get on with it. It took me a while to create one that Claude agrees with and is good for such open-source projects. Anyways, this was the easy part. In my last devlog I said that I completed Custom Statuses & Custom Badges. Well… I did! But then I found out, that my system was bad… and when I say bad I mean it wasn’t thought out. I found out about all of this when I finished the edit action for both. Originally I used Dictionary<string, TagDefinition>. Key was name of the Status/Badge and TagDefinition was the class of one of them which also has name property. But Helyx was not prepared for this, so for the last days I redid the whole system eight times. Once I used Dictionary, once I used List, then HashSet, then Dictionary, then Dictionary with other types and so on. I just couldn’t settle on the correct type for it. Until now, it took so long even though it is so primitive because it simply didn’t come to my mind and when I was asking Claude for suggestions of how could it be made, it didn’t think of using this type. The final type is simply… Dictionary<Guid, TagDefinition> AND A LOT OF CHANGES. Yeah… don’t worry guys! I am totally devastated by doing this over and over even though it was so simple & primitive to do. Well… maybe not really primitive because the changes were also difficult to do. I mainly didn’t want to use the GUID system because I have Custom Statuses but also Built-in Statuses and I was really worried about Built-in statuses having GUID assigned to them. Those sync options with GitHub are still in work, but I finished the GitHub Repository Stats viewer after a lot of experimenting with layouts and designs/effects/colors. I’m looking forward to the next devlog guys! I hope Helyx will be your good coworker that will actually count for something hah! P.S.: I also made that text of colors is grammatically formatted. At least it should be…
Sync finally done!! It’s 5 AM and I finished “Sync badges with GitHub Repository” and “Sync the status with GitHub repository” (this was already done, but with the enum version of status). I added also a few fail-safes so when you assign some badge or status and then delete it, it will also delete it from GitHub and project. Now it won’t be a ghost that you cannot get rid of haha. This was a little more difficult than I expected to do, the fail-safes because the local changing mechanism and syncing mechanism were written inline in the same function. The only thing that was dividing them was an if statement. It was interesting to make this. To make sure everything will work fine. Even though it didn’t MANY TIMES. Now I will focus on syncing GitHub topics. Wish me luck! P.S.: Forgot to mention, that I have to add this “On Status/Badge Edit, ASAP sync with GitHub” with Edit. I almost forgot lol, just came into my mind. I hope that COPY+PASTE will be enough and I won’t have to create another syncing system specifically for edits…
More bugs are appearing, and being fixed!! So since Helyx is already far and has many advanced functions, it also has some bugs. Today when I was experimenting with assigning a project and syncing it with GitHub, I found out, that if you try to sync the projects in a wrong way… it will not work. For that reason I added more fail-safes to make sure that this will be eliminated. I can’t confirm yet if those fail-safes work, because I am also working on a new Diagnostics action in Git Actions so if something goes wrong, you can fix it by the error Helyx gives you. Right now my testing project is in a state of “Git corrupted” (no idea what I should call it) where rebase was aborted. Because of this, I had to put the “GitHub Sync Topics” synchronization off until later, so I can focus on fixing these major bugs. Also another bug came to my mind that I fixed… Helyx works on a principle of directory paths. Each project is saved in config file under its own unique GUID and its path. The bug is that when you try to rename the directory, the project won’t be found and it will be removed from Helyx. Now, you can either let Helyx find it automatically (sadly can easily fail) or you can select project manually in explorer (recommended!!!).
Doctor Git As you may know, right now I am working on Diagnostics. I am almost done with fully displaying all of the health checks about your Git repository. But I still have to finish all of the fixing actions that it will have. Diagnostics will mainly be for a case where something happens in Helyx and it will need to be fixed. The main idea of it is not aimed at resolving issues with your Git repository outside Helyx. But it may resolve some because you may run into the same issue as you had in Helyx of course. In the last devlog I said that I put GitHub Topics off. Well, that did not happen! I finished displaying GitHub Topics!! I think in some devlogs I said that it was for managing GitHub Topics. Managing meant like adding, removing, editing. Well, that wasn’t actually my main point. I just wanted it to show you your currently assigned topics in GitHub. I also didn’t see a big reason in adding Add, Remove, Edit functions for topics. Topics rarely changed, honestly and the most intuitive way would be doing it via GitHub web interface.
Diagnostics done, other stuff too and some changes! Diagnostics are now fully done! When something messes up, it will give you options to fix it! Some time ago I created GitHub Synchronization settings for managing what to sync with GitHub, so what to retrieve and send with those options: Sync status with GitHub repository Sync badges with GitHub repository Fetch GitHub repository topics Fetch GitHub repository stats Use GitHub’s language detection instead of Helyx’s I created a brand new tab called ‘GitHub Actions’ where this setting is. GitHub Actions is meant to contain all of the actions that are mainly linked with GitHub endpoints. I kept few such as Push, Pull, Sync in Git Actions due to how the layout is already created. Also I added when you are rebasing and it fails, it automatically gives you a prompt to cancel it. So repair it… GitHub Actions will contain a new stuff that will come to Helyx! Managing Issues and Pull Requests!! Maybe also workspaces/actions but I will see how difficult that is and how it is needed/useful in Helyx. Another new function is, that when there’s an update for Helyx and I change the GitHub OAuth scope because of new features… Helyx will warn you and tell you to reauthorize to make sure every function will work correctly. Before this change, Helyx was using its folder name as a name of the project and as a repository name for GitHub. Now, when you add a project to Helyx, Helyx will ask you what’s its name and when you will try to use some GitHub function for the first time on your newly added project on Helyx, it will request a GitHub Repository name from you. ;) There’s still a lot of things to add. Honestly I thought that Helyx was at the very end like 50 hours ago and look! There are many more functions to add haha!
Manage Issues, at your service. After a painful development period I am again here, writing devlog! What changed? Good question! Manage Issues is partly done! I still have to finish making the actual actions but displaying is somewhat finished. When you go to ‘Manage Issues’, you will firstly see a list of issues that are on your GitHub repository. From there you can already see some details about the issues such as: Number State Title Labels Comments (number) Updated (time) Above them are filters, currently those are the available filters: All -> All Commented -> Issues has some comments Assigned -> Issues that have some assignees Labels -> Issues that have some labels But that is not all! There are also their counterparts: No comments Unassigned Unlabeled (there’s no inversion of All because why would you need filter None) Yeah, so you can invert your filters… When you select an issue at the very top you will see its number, then you will have a panel with details about the issue with its title and: State Author Opened (time) Labels Assignees Right under these details are all of the comments in chronological order. When it is done, it will also show the whole timeline of each issue. So when this and this label was added/removed… when was this assignee assigned/unassigned… when was this issue closed/opened…. Of course I am going to add actions so you can add a comment, close issue, open issue, etc… When I’ll finish Manage Issues, I will go to work on Manage Pull Requests. It shouldn’t be that different because Pull Requests are by GitHub a kind of Issue but they are also not the same, so different classes, types, etc… Well, wish me luck people… or should I say… Stardancers?? P.S.: Sorry for the grammar in images in comments. I did it very quick for the preview.
Paging done, functions almost! I finished making the logic for rendering issues. In the last devlog it was just displaying all of the issues at the same time. No paging system so if there was a lot of issues or long issues, they would simply… not appear. It took me a really long time to work this out. I was mainly switching back and forth the rendering logic all the time and it went so far, that I had to use Claude to help me with it. At the end, I ended up with a rendering logic that I am not really keen on, but it is the best one that can be used in Helyx and TUI environment. Main obstacles were the Spectre.Console rendering functions and classes that were under IRenderable interface. And also the limitations of Panels, Grids… Layout had everything I needed . I wanted to cut the part which couldn’t be rendered and it should have looked like, like an unfinished Panel. Well, this was impossible. Without changing the core code of Spectre.Console or creating own system for making Panels it was impossible. Also, I haven’t seen it as something that WOULD NEED an own system that would render comments. So I just made it when a comment cuts, it creates whole Panel with part of the comment that can be rendered and at the bottom is text saying that it continues on the next page… and on the other page at the top there’s text that, hey, it continues here! Let’s finally talk about the Issue functions! I finished some simple one like: Close Reopen and create an issue… But I still have to create a system that can let you: Comment Edit comments Delete comments Lock issue Unlock issue Those are currently in WIP, but in the next devlog they’ll be most probably finished and after everything is done with issues, I will move to Pull Requests!
Manage Issues, completed! PRs, incoming… Manage Issues is now fully completed. I still had a few issues with paging and rendering but now they are fixed. Now you can select a message and delete it & edit it. But also now you can create a comment, lock an issue, unlock an issue and create an issue. I also added a thing that I hope will be appreciated, Helyx renders Markdown from GitHub Issue comment and when you comment via Helyx, Helyx gives you Markdown options such as: Bold Text Italic Text Code Text List Quote Also, when you don’t provide a text to a comment in GitHub, Helyx will say that “No description was provided.” So the same thing as GitHub already does, but in Helyx you must provide text. Why? Because why would you create a comment with no text? So I banned adding a comment with no text. Okay, that would be everything! It was fun to create this because everything was working so well, except the paging system… that was painful to make even with Claude’s help. As I said in past devlogs, after Issues I am going to move to PRs. So yeah, let’s work on PR. I hope it won’t be harder to make, because a PR is a type of Issue in GitHub, so I hope I will use the same function logic and functions and callbacks to make it.
Manage PRs displaying and some logic done After pulling another all-nighter I finished making the Pull Request display functions. List and details about each Pull Request is done and paging also works too (took it from manage issues ;] ). Pull Requests also contain filters such as: Open Drafts Assigned Reviewed and we can’t forget their counterparts either: Closed Ready Unassigned No reviewers Pull Requests now have comment selection and Markdown formatting, but functions to manage Pull Requests are not done yet. The only ones I managed to finish are: Comment Open Browser The biggest problem with PRs is going to be, that their functions and methods for executing those functions are more complex than the ones for Issues. I plan to add these functions for PRs: Delete Comment Merge Review Close PR Reopen PR I am pretty sure that all of this will be done in next devlog, so stay updated! This is going to be very cool, I think. Well, now I am going to sleep so good night everyone!
Manage PRs done! Added few new things… I finally finished making Manage PRs. So now you can: Delete Comment Merge Review Close PR Reopen PR I also had to fix some design flaws and function flaws but now it should be all good. Before doing all of this, there was a bunch of GET requests… now? Now it is also a bunch of PATCH & PUT requests. Also, now when you’ll try to link your GitHub Repository with the local one, you will just select the one that is on your GitHub account. Another thing! When you have conflicts between the local repository and the remote one (GitHub) and you try to sync them, a lot of the time Notepad pops us and tells you to remove the version of the text that you don’t want. Well now Helyx does it too and doesn’t open notepad, but lets you do it directly in TUI interface in my very own notepad. Conflict solver also uses alternate screen for this. (there’s sadly no showoff image for this, because currently I don’t have anything to create a conflict on) I am not sure what to do next in a next devlog, since everything I really wanted to do is already done… well… not everything but everything around the main things is. Maybe I’ll move on another refactoring? Or finishing the language settings? Well, we will see!
Adding new features & fixing bugs I finished making “Analyze Project” which analyzes your whole project and prints stuff such as: Number of files Number of folders Size of the project on disk Number of lines Also you can now see what amount of what programming language makes your project. It also shows you the biggest files in your project directory. And also you can see Git information such as: Branch Number of commits First commit (date) Last commit Working tree .git size So it displays some maybe important and basic information that you may check sometimes or might be interested in. There were like 6 revisions of this because I was testing different styles & designs. I also found a lot of hidden bugs with help of Claude! Before talking about bugs, I will tell you something about new features that I added. Now, when you assign a badge or change a status and you don’t have markers in README.md yet in it, then it will ask you if you want to add them manually or via Helyx. What does that mean? Well, it opens a “text editor” in Helyx which displays README.md and you can insert the badges/statuses where you want instead of opening the file in notepad and inserting the markers manually. Overall it is way quicker to do it now via Helyx. Helyx’s Generic Text Editor is now even better! You can now use all of the arrows, before you could just use Left/Right Arrow to move cursor left or right. Now you can move between lines. Now you can also open your project’s wiki via Helyx. Be aware that it doesn’t check anything, if you have wiki or not. It directly opens the website for the wiki where it should have been for the current linked GitHub Repository. Let’s talk about bugs now! Open an issue called the Markdown handler function and it was accidentally calling GitHub 101 times, when it needed some info. Now it doesn’t. 🆒 Notes have an encryption system, so if you put some sensitive info into it, it couldn’t be directly taken from the file. Only via Helyx. There was a bug, where when you enabled encryption and edit notes of 2 projects, then you turn off encryption globally and open the first project’s notes, it decrypts… but after that you open second project’s notes, it won’t. This was due to having a global bool instead of per project bool when saving if it was encrypted. Fixeddd! Another bug! Sync Status & Sync Badges was deleting staging index. Funny that I was thinking about to restore the staging index whenever using it, but at the end… the logic was wrong 😭 Now it isn’t. Then there was a bug that when you unassigned a badge, it unassigned ALL badges. Fixed! Another bug linked to badges… Unassigning a badge didn’t remove it from GitHub. Yeah… fixed!!
Fixing more bugs I fix bugs mainly with use of Claude Code, because hunting for bugs is not easy and this project is not a small one haha. I had to run MANY code review tools for this, because every time it kept finding new bugs. No idea how but it did. So what we fixed? If a GitHub comment had bold text split across two lines, opening that issue crashed Helyx before it drew anything. A file with a square bracket in its name (e.g. data[1].json) crashed Status, Diff, Commit, Stashes and Log. If anything held config.json open for even a moment, Helyx assumed it was corrupt, reset it, then crashed everywhere that looked for a project. If config.json was missing its Badges section, the startup migration quietly deleted every badge from every project. Committing saved a copy of the project taken before the confirmation prompts, so anything changed in between was silently thrown away. If you linked a GitHub repo during Push, the remote was created with an empty name. Syncing a status that had since been deleted crashed in the middle of a push. A commit message containing a square bracket crashed “View Full Message” (those are just bugs that were missing Markup.Escape() function). Applying a stash said “applied successfully” even when it conflicted. One bad path stored in config.json crashed “Add Project”. This is just a snippet of the amount of fixed bugs. I won’t write all of them here since it would take a lot of text and I am pretty sure that this is enough for you to understand that we fixed a lot of bugs haha. Right now I am going to do the Language System. I am not sure if I mentioned in some devlog, the list of languages that Helyx will support. If not… there it is: English Slovak Spanish French German Russian
Languages almost done, moving onto GitHub & README.md Well guys, Language System is almost done. It is powered by a Resources file that stores all of the translated strings. More bugs were found! But now, all of the bugs should be fixed with also many failsafes! Now, I want to complete the Language System because I am really close to finishing it. I also want to make the README.md for Helyx’s GitHub Repository. Originally I wanted to make it via Obsidian app, but it doesn’t have direct support for Wakatime, so I have to use VS 2026 native Markdown editor with the support of Markdown Editor v2 extension from Mads Kristensen. (not sponsored lol) I also heard that Obsidian app doesn’t use the same Markdown as GitHub does so there would be some things mistyped or not even rendered, but VS 2026 should be fully compatible with GitHub’s Markdown renderer, so we will see!
More bugs fixed, new functions, README & Language System updates! Hello guys, once again at 4 AM! Bugs: As the title says, there are more fixed bugs. Diagnostics crashed Helyx if you ran a rebase in a terminal and hit a conflict. Now it doesn’t! Another fixed bug is that when you opened an issue in Helyx, the footer vanished. At first I was shocked, but it was a simple fix so now your footer doesn’t vanish. Another vanishing bug! The Languages row from the header vanished when you entered a tab where Layout class was being used. Now you will see your sweet programming languages used in your selected project. Guess what! Another vanishing bug! This time the whole header vanished when you exited .Live()! Now it is okay! New behaviour: I unified some color codes with some type of info. E.g. SHA is Dark Orange everywhere, Stash is Yellow, Date is Cadet Blue and Issue Number is Aqua. The README.md editor, when inserting badges/status now has a new keybind: backspace! It is different from DEL! DEL deletes the badges/status but backspace deletes the whole line, including the badge/status that was on that line. README The README is almost done! At least I hope! Claude was a big help here, because I wanted to create an insane README and we really did. Guys, you should be excited about the README file haha! Language System Translations for these languages are already done: English French German Russian Slovak Spanish So basically every language translation is already done. BUT I decided to add even more languages! The new languages that Helyx will support are: Italian Portuguese
New features, new languages, new problems. A new feature that I added is GitHub Actions! It is on the same principle as Manage Issues and Manage PRs, so you have a list of GitHub Actions, you pick one and you can control it, check its log, observe information about it. You can even run an action! I also added a refresh keybind to Manage Issues, Manage PRs and GitHub Actions. Before, you had to go back from the details of an issue/PR/action to the list and then return to the details. Now you don’t have to. You just have to press the keybind displayed in the footer that belongs to refresh. Yes! The Helyx Language System is finally complete! Italian & Portuguese are now available in Helyx! Lately I’ve been working on the README.md file. I was mainly making more GIFs & designing screenshots for it so it will look pretty and futuristic (in my opinion)! As I have mentioned in the title, NEW… PROBLEMS! People… you won’t believe what happened to me today… I use Helyx’s Git & GitHub for testing, so there is no official one yet, and I rarely commit changes or push them. Only when I test something. And it looks like it got back at me. Well… I told Claude Code to remove comments all over my codebase, because they were mainly scrapped code and some temporary information that I had there, that wasn’t used anymore. Okay, so I told it to remove them, and for some reason instead of removing comments, it deleted Helyx’s whole codebase. Thank god README.md was untouched haha. We had to decompile the .dll that was left over from testing Helyx’s latest version, and actually check the diff and rewrite it. We still don’t know if everything was brought back since for some reason Claude Code’s memory got wiped instantly when it realized that it deleted my whole codebase. There were no backups, no restore, no nothing. The only possible thing was to use the forgotten stash that I created and use the .dll as a map to restore Helyx’s outdated codebase and rewrite it again. So that’s what we did. Yeah, so I hope everything was brought back. Claude says it was, but after what it has done I don’t know if I trust it. Just kidding, everything should be back, because it compared the .dll with the rewritten code 1:1 and everything matched.
GitHub done, shipping Helyx today! Today I was messing with the GitHub page for Helyx, fixing the last bugs we found and working on the installer. For the installer I used Inno Setup, because it is the most recognized and the most used one. The point of using an installer is simple: it adds Helyx to PATH. Of course there were other options, but this one seemed like the best fit. We were fighting with the script for a while, because it was doing really weird things, like staying in the background after the installation finished. But those bugs are fixed now! README.md is done, all of those GIFs and screenshots are in it too, and I have to say it looks really good! I was also setting up the GitHub side of things, so the description, the tags, a GitHub Action and so on. With the help of Claude Code, we created the logo and the banner for the installer as well. The installer uses the same logo as Helyx. It’s just a basic H, because nothing else came to mind haha. I also asked Claude Code to review the codebase one last time, and yep, it looks fine! I told it to add the basic documentation comments as well, the <summary> kind. Let’s be real here, nobody does this, and if they do, something else writes it for them, usually an AI, because it understands the function better than the person who wrote it (I know that from my own experience hahaha).
Experimenting with the conflict solver I was thinking about adding a simpler conflict solver, where you wouldn’t have to delete the <<<<<<< , ======= and >>>>>>> markers yourself but would just pick either the first or the second version. But I realized it would be messier than I thought, so in the end I kept it as a basic editor where you remove the version you don’t want by hand.
README.md update I replaced the title in README.md with a banner that contains the text Helyx. I tried a few versions I made and, well, I landed on the one you can see in Helyx’s README.md, or below!
Edited README.md I rewrote the README.md because of the ship review. I also added a couple of recommendations that are worth knowing when you use Helyx. I also removed the <summary> comments that Claude Code wrote for the documentation, I don’t think that anyone would have used them anyway.
Edited README.md, again I was again editing the whole README.md, because reviewers weren’t happy with the current one. Well after spending another hour of editing the whole README.md file, I hope they won’t ask me to rewrite the whole README.md file again, because I don’t even know what else to add/remove/edit.
Added GitHub Issues/PRs events rendering Originally, when you selected Manage GitHub Issues or PRs and opened some issues/PR. You could have only seen messages posted by users, but not when a label was assigned or when the issue/PR was closed. Well… Now you can! Now it displays the exact action that happened and when it happened! Of course, it is also translated to all languages that Helyx supports. Just making sure you didn’t think it wasn’t! I also cleaned up the code a little bit. Removed some useless usings and some files were in the wrong namespace, so that is fixed too.
Replaced hardcoded string colors with Color members for code safety, fixed line breaking while assigning a status/badge Okay so Markup texts (those are the texts with color) were formatted in this format: "[red]Hello World![/]" So it was string-based. And if you accidentally added some character to it for instance: "[redd]Hello World![/]" <- Exception Helyx would crash. I mainly added this, because it is an open-source project. So if someone tried to edit it, they would only have to edit the string and they might have misspelled it. But now, when he goes into the codebase, he will see Color members and he just can’t misspell that, and if he would, compiler would alert him. Basically, now it is like this: $"[{Color.Red}]Hello World![/]" Okay so next I fixed line breaking. What does that mean? Well… In Helyx native README editor, so when you try to assign a status/badge, you’ll get that editor, when you try to add a status/badge to that line, you might have thought that it would be on the same line as the tags above it. But it didn’t… This was happening due to the comment markers for Helyx so Helyx knows where this status/badge is located and which status/badge it is. Now Helyx will put those comment markers in a way that prevents the line from breaking.
Reviewing my codebase and fixing bugs Since all of the features that Helyx was supposed to be finished with are almost all done (maybe even all are done), I will now change my view to another projects for Stardance such as ThetaNexus . But that does not mean that now I will just forget about Helyx. I will be reviewing the codebase sometimes to find some bugs and fix them. You can help me with this, by making an Issue request on Helyx’s GitHub. So what bugs did I fix since the last devlog? I fixed line breaking in badge/status README editor. When you were inserting your badge/status into your README via Helyx’s README editor, it done… messy stuff to the README, not something like really bad what couldn’t be fixed by manually doing it, but it should now insert the badge/status exactly as you see it in the editor. I also introduced a new ‘Found state’ text instead of ‘Found’ text in IDE settings to avoid confusion. To avoid confusion because if an editor was found and you clicked on it… it wrote this: Found Found Found Not Found Found Set by user Now it writes this: Found state Found Found state Not Found Found state Set by user Most of the time, I was reviewing the codebase via Claude Code to actually check everything precisely.
Fixed User Scripts bug So, every path block used Path.GetFullPath(path) instead of Path.GetFullPath(path, script.ProjectPath) . That means it was resolving relative paths against Helyx’s own directory, not your project’s. This is now fixed.
Hackatime integration Hello there! A guy made a feature suggestion on Helyx’s GitHub, that I should add a Hackatime integration into it. So I was thinking… and thinking… and thinking and woah… I ADDED IT! It is not 1:1 like the web interface, that one is better & shows you more things but sadly this was everything that I could request from API (at least I think): Total Seconds Languages Repo URL Total Heartbeats First Heartbeat (DateTime) Last Heartbeat (DateTime) and when combining all of these information, I created a screen where you can see all of this specifically for your project. It works on the principe of authorization. You put in your Hackatime token which authorizes you and then when you go to your project and go on Hackatime Info, it prompts you to select the project from a list of projects that are assigned to your Hackatime account/token.
Ships:
What I made Helyx is a terminal app for Windows that keeps every local Git repository you own in one place and lets you commit, branch, resolve conflicts, repair broken repositories and answer GitHub Issues and Pull Requests without opening anything else. I spent a lot of time thinking about what kind of project I wanted to build. I wanted something that would be genuinely useful to developers in many different ways, and that is how I came up with Helyx, a TUI application that brings many Git and GitHub tasks into one place. What was challenging Learning new libraries, keeping the code organized as it grew, and designing every screen so it looks and feels as polished as I could get it. Deciding what to build next was harder than it sounds, because there was always more that could go in. What I am proud of It has everything I originally planned to include. The diagnostics screen finds what is wrong with a repository and offers the fix instead of just reporting it, the conflict resolver opens the conflicted block in its own editor, and the whole app speaks 8 languages. How to try it Download the latest release from Helyx’s GitHub and run it. It installs into your user folder and adds Helyx to your PATH , so you can start it by typing helyx in any terminal. No administrator rights are needed, and the .NET runtime is bundled inside. Then pick Add project and choose any folder that contains your project. Helyx is open source, so you can also read the code or build it yourself. Just click See source code below....
|
1792810518.606234
|
1792896918.606234
|
|
11169
|
SupplyChains by @Thijmen | Stardance
|
Thijmen
|
1
|
313.73
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-03T19:48:03Z", "hours": 307.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Supply Chains Supply Chains is a game inspired by Transport Fever and Mindustry, centered around building road networks and logistics chains for construction and mining operations. Features Vehicles, trailers and a garage Route system: pick a source, a destination and a resource, then assign it to a vehicle Multi-step production chains Construction sites, trading, generated terrain, and A* pathfinding with road weights Controls: WASD camera, 1-5 build, right click remove, space pause. Everything else is in HELP.md . Known limitations I’m a solo dev, so some things aren’t finished. The full list is in the README. Hope you enjoy it!", "repo": "https://github.com/thijmenb1/roadbalencer", "demo": "https://github.com/thijmenb1/SupplyChains/releases/tag/v0.1.3"}]...
|
[{"post_id": 80746, "ts": "202 [{"post_id": 80746, "ts": "2026-10-18T18:11:49Z", "hours": 6.7261, "text": "Devlog 27: Tutorial: After feadback I have dicided to make a tutorial and made a couple quality of live updates that made the game easier to understand."}, {"post_id": 76500, "ts": "2026-10-03T19:24:02Z", "hours": 16.3356, "text": "Devlog 26: Last devlog I’ve officially finished the game. It’s been an incredible journey, and I’m pretty happy with the end result. excavator The excavator is now fully functional. You can use it to create mines, which automatically convert into factories once placed. a lot of small things I have done a lot of small things to optimse the game and fix things i coudend test till now Release This is the last devlog I’ll be writing for this project. I want to thank you all for the support. I hope you enjoy playing the game."}, {"post_id": 75365, "ts": "2026-09-29T21:04:49Z", "hours": 9.8742, "text": "Devlog 25: Planes and saving! I’ve locked in over the last 2 days and finished the final 2 of the 3 major systems. I’ve completed the planes (which now spawn when you accept an order) and finished the saving system. Planes/order system I’ve finished the order system, when you accept an order, a plane now spawns a couple thousand pixels out. It flies to the airstrip, loads up at the end of the runway, turns around, and flies away. It doesn’t taxi all the way to the terminal because I just don’t have time for that, but it looks good enough for now. Saving You can now save 3 worlds in the game. Everything gets encrypted and saves all the world values. It was pretty difficult converting some of the arrays filled with instances into dictionaries and back again, but it works on both PC and on the web. whats left: The only things left are the excavator and some smaller things. I’m finishing that all tomorrow, and that will be the last devlog for my ship. The main gameplay loop should be finished by end of day tomorrow. If I can’t finish everything, so be it, I dont have time to work on it anymore if I also want to continu in third space, but I’m happy with how it works now and what I have learned along the way."}, {"post_id": 74558, "ts": "2026-09-27T17:07:31Z", "hours": 10.1058, "text": "Devlog 24: Construction finished and start secunce made I’ve finished the construction system and made the start sequence actually playable by adding a resource box containing 10 iron bars needed to build a terminal. It’s been 2 weeks since my last devlog school and commitments to Third Space have kept me busier, so I’m not 100% certain I’ve captured everything that’s changed. Construction system The construction system now generates building routes that you can assign vehicles to. Resources must be delivered to a building site before construction begins, making the resource system meaningful in actual gameplay. Starting secunce The starting secunce now has a couple of steps: Place the resource box Place a runway Place a terminal Conect the runway with the terminal with a taxiway Place 4 base tiles for the vehicle to spawn on What has to be done: Mine/excavator system ~3h Finish trade system ~3h Save system ~2h Documentation ~2h"}, {"post_id": 67659, "ts": "2026-09-13T20:19:08Z", "hours": 10.0428, "text": "Devlog 23: Vehicle pathfinding and construction I have fixed the vehicle pathfinding (mostly) and I have made the construction system. Vehicle pathfinding I have fixed the vehicle pathfinding and it works now mostly. I say mostly because it breaks when a trailer is equipped, but that is a way smaller thing to fix. Construction system It’s almost done. The system makes it so the resources actually have a function and you now need to deliver resources to a building site before the factory can get built. Still not done I know I said it would be done this weekend and it still isn’t, but it’s almost there. What I still have to do: The mine/excavator ~5h Finishing a couple of systems (like the construction and trade system) ~5h Make a savegame system ~5h Small things ~2h Documentation ~2h So 2 devlogs left, and otherwise I will just ship incomplete because I don’t have time anymore."}, {"post_id": 66739, "ts": "2026-09-12T17:07:44Z", "hours": 10.2911, "text": "Devlog 22: Factory UI and Finished base building I’ve finished base building and am now working on the factory UI. Factory UI I’m working on the factory UI, where you can see the factory’s storage and change its recipe. It’s almost finished. Base building Base building is finished you can now make taxiways and build a warehouse. I’ve also put these into a UI like the factory’s, so it only takes one button. Vehicle physics/pathfinding I’ve spent yet another hour on vehicle physics/pathfinding, and I’ve narrowed it down to a bug in the handoff to the prebaked paths of the factories. Timeline I’m pretty sure I am gooing tho finish it this weekend. What’s left: Vehicle physics ~3h Mines/excavators ~5h Building construction (will reuse most of the factory logic) ~2h Random bugs and small things ~5h"}, {"post_id": 65022, "ts": "2026-09-09T20:33:42Z", "hours": 9.9275, "text": "Devlog 21: Trading Finished, but I’m Stuck I’ve finished the trading system! Trading System The trading system is done. Orders are generated, you can accept them, and accepted trades show up in the UI. The only thing left is adding the planes, but that depends on finishing the base-building system first. Base Building I’ve started working on base building. It’s pretty simple and mostly uses systems that already exist, so it should only take around an hour to fully implement. Stuck Development has been going way slower than I hoped because my codebase is currently a bunch of bandaids stacked on top of each other. I also need to ship this week since Thirdspace starts next week, which means I probably won’t have time to add much polish.So I need your opinion: is it worth delaying the game for another week? 😭 Or should I just ship it? Do you think I’ll still be able to afford the Framework 13 if I release it now? My current plan is to focus on getting the core systems working, fix any major bugs, and leave extra polish and construction vehicles for a post-launch update."}, {"post_id": 62429, "ts": "2026-09-05T19:31:29Z", "hours": 9.9097, "text": "Devlog 20: UI and Trading Got the backend for the trading system done and overhauled the UI to go with it. Trading System I made a trading system. It generates contracts with the recipient’s name, the resource being traded, and the price. Basically the foundation for the aircraft system. UI Redesigned the time and date display because it looked kinda rough. Also switched the economy back to money instead of the resource, makes way more sense for trading. Oh, and vehicles now actually speed up when you speed up time, which is pretty cool. What’s Shipping vs Later I’m not including construction vehicles in the initial release because that’s like 40+ more hours of work and I want to actually finish this before Thirdspace starts (I’m gonna compete too). So yeah, that’s going to a post-launch update. Still gotta do: Get the excavators working (mines) ~5h Finish the trading system ~3h Fix vehicle physics again 😭~5h Random bugs and polish ~5h Hope I can get that done this week. Tryna hit at least 14sd/h so I can hopfuly buy that Framework 13 lol"}, {"post_id": 55609, "ts": "2026-08-27T16:01:00Z", "hours": 4.3333, "text": "Devlog 19: Busy School has started again and I have been geting busy and my motivation is also not that high right now because things take alot longer and dont work like i want to. I think I will delay release to septembere 12th."}, {"post_id": 50634, "ts": "2026-08-19T21:45:22Z", "hours": 9.9061, "text": "Devlog 18: Pre-baked docking paths I’ve implemented pre-baked docking paths for factory entrances to solve some pathfinding issues with vehicle physics. Pre-baked paths The A* pathfinding system was struggling to navigate the sharp corners around factory entrances. When the trailer tried to find its own path through these tight spaces, it would instantly jackknife, not ideal. Rather than spend 50+ hours refining the vehicle physics, I decided to pre-bake specific docking paths to each factory. It’s not a perfect solution visually, but it’s functional and gets the job done. I can always refine this for a post-launch update if needed. I’m still wrapping up the final details of the docking path system before moving on. Mines My next major task is implementing mine logic, which includes the excavator logic and ore detection and depletion. Aircraft After the mining logic I will add the last vital gameplay system the aircraft system which will be responsible trade and contracts with other villages. Release I’m currently deciding whether to push construction vehicle implementation to a post-beta update or delay the release by a week to include them. Construction vehicles aren’t vital to core gameplay, but they would add a lot of polish. I’m still on the fence about this one, it depends on how the mine logic implementation goes."}, {"post_id": 49170, "ts": "2026-08-17T20:13:08Z", "hours": 9.9731, "text": "Devlog 17: Factory placement I’ve built a system for placing factories in the world. Factory placement Turns out it’s an absolute pain in the ass to place objects that are multiple tiles big while also having them connect to multiple Godot terrains. So I had to write a whole system that places every tile separately and keeps track of which tiles are occupied. Roads I also had to rework how roads are placed. Originally, every road type was its own terrain, but that doesn’t work if you want them all to connect to factories and to each other. So now they’re all just one terrain, and a script gives each tile the correct color for its road type. This only works because all the road types are identical in shape just different colors. Aircraft sprites I’ve added several new aircraft sprites: the Bo 105, the Twin Otter, the PC-6, and the H225. I’m planning to add the Chinook and the A400M next, which will round out the aircraft lineup for the beta launch. Release It’s going to be close. I’m not sure I’ll hit my self-imposed deadline, since some things took a lot longer than expected but I might still make it. Either way, I’m not going to rush it. I’d rather ship a week late than release something that gets 5 SD/h because it isn’t polished."}, {"post_id": 47570, "ts": "2026-08-15T15:24:06Z", "hours": 9.8719, "text": "Devlog 16: Factorys and aircraft I’ve reworked the factory sprites and added aircraft. Factory sprites I have made new sprites for every factory execpt the concrete mixing plant. the sprites are now 2x2 or larger so vehicles can realisticly unload there. Aircraft I’ve decided to add aircraft, which will serve as a trading terminal so you can trade with other villages, get contracts, and earn money. Aircraft fit well for this since no other villages spawn in the world. they let you trade with other vilages without them needing to exist in the world. I still need to add alot to make this work but currently I have a working runway building mecanic Next: Factories Next, I still need to build out the factory logic. I plan to make them with custom resources, just like vehicles. I made the new sprites first because I needed to know where (un)loading would need to happen before I could design the logic around it."}, {"post_id": 46516, "ts": "2026-08-13T19:56:21Z", "hours": 10.2989, "text": "Devlog #15: Vehicle rework I’ve completely restructured how vehicles work under the hood. The main goal was to break down the code into readable, reusable pieces. Vehicle componentization The vehicle script had become too large to work with, so I split it into five scripts: vehicleBody.gd , drivetrainComponent.gd , path_movement_component.gd , CargoComponent.gd and attachment_component.gd . This makes the code easier to maintain and reduces the chance of bugs when adding new vehicle types. Vehicle data I have converted the nested Dictionaries into custom resources which makes it easier to add vehicles and less error prone. Pathfinding improvements I tweaked how the pathfinding works by chamfering the corners so vehicles navigate them more smoothly. It doesn’t look quite as I want yet, but combined with animations, it should look acceptable for now. This is something I’ll have to find a more permanent solution for later. Release I’m targeting version 1.0.0 for Saturday, August 22nd. There’s still quite a bit to do, but I think I can make it. I set this deadline because I’ll have less time once school starts."}, {"post_id": 45126, "ts": "2026-08-11T12:41:38Z", "hours": 9.745, "text": "Devlog #14.2: Route system The route system is now done Route sytem The route system turned out to be more complicated than initially expected. I restructured it so the route is calculated centrally in the Global script, and every instance using it reads from there. This keeps things synchronized and maintainable. For now, the system has one mode implemented: a ping-pong mode where vehicles travel back and forth between two set points. Vehicle physics There’s a persistent issue with vehicle physics where they cut corners and miss checkpoints, requiring them to turn around. I’ve set this aside for now to focus on other features, but it’s something I’ll need to fix down the line. I realy have no idea how though I cant seem to find the issue. Whats next The last major things before release are: Linking factories to vehicles so they can load and unload cargo Animating the excavators at the mine Building out the construction system"}, {"post_id": 43506, "ts": "2026-08-08T20:31:23Z", "hours": 10.0922, "text": "Devlog #14: Route UI and system I am currently working on the route ui and the route system. Route UI The route UI is almost done I only need to link it to the route system. Route system I am almost finished with the route system I only have to connect it to the vehicle and rewrite the factory system a bit so it works with the route system. there will be multiple modes distribution of one factory based on demand or a ping pong mode where it drives back and forward between 2 set points. You also will be able to assign vehicles to construction projects but this will come later. Trailer UI The trailer UI is finised you can connect trailers to vehicles via it."}, {"post_id": 41554, "ts": "2026-08-05T20:48:09Z", "hours": 9.8542, "text": "Devlog #13: Vehicles in the world I’ve connected the vehicle systems to the world and to the UI. Vehicle manager I’ve made a vehilce manager script. This manager stores and retrieves vehicle data efficiently by ID, making it easy for the UI and other systems to access vehicle information. Vehicle UI I’ve made a UI where you can see the fuel, total weigth, health and engine load of the vehicle by clicking on it. There are also 2 buttons 1 for selecting a route and the other for coupling a trailer. Spauwing When you buy a vehicle it gets assigned a base tile you now need a base tile per vehicle. Last things Next, I need to implement the route selection and trailer coupling buttons to complete the vehicle system integration as far as I can right now."}, {"post_id": 40212, "ts": "2026-08-03T16:52:56Z", "hours": 10.0389, "text": "Devlog #12: Planing I’ve put together a roadmap for the rest of development. Roadmap I’m planning to release the game in 3 weeks and have laid out a plan accordingly. Vehicle physics I’ve spent about half my time since the last devlog tweaking vehicle physics, and I’ve decided to compromise on a few things — for example, when the trailer jackknifes and gets stuck, it’ll just clip through the vehicle. Shop rework I am almost finished with reworking the shop it now displays all the stats that the vehicle uses"}, {"post_id": 38143, "ts": "2026-07-31T11:37:38Z", "hours": 9.9372, "text": "Devlog #11.2: Trailer Logic and Pathfinding I’ve almost finished all the vehicle logic. Pathfinding A working pathfinding system is now in place using AStarGrid2D . This system works with vehicles both with and without trailers, and handles both on-road and off-road navigation. Trailers Trailers can now couple to vehicles with the correct hitch and follow them around in a realistic manner. The coupling mechanics work as they would in real life. Finishing Touches The vehicle logic still needs some fine-tuning, and I haven’t tested it yet with every vehicle type. I still need to implement the articulation system for the articulated dump truck."}, {"post_id": 37056, "ts": "2026-07-29T15:06:21Z", "hours": 9.8997, "text": "Devlog #11: Vehicle logic I am currently working on the vehcile logic Vehicle logic There are alot of variables now that determain the behavier off the vehicles like engine and weight Sprite scaling I have fixed the scaling of the sprites. Last things for the vehicle logic I still need to implement the trailer logic and pathfinding."}, {"post_id": 35794, "ts": "2026-07-27T13:37:20Z", "hours": 8.4642, "text": "Devlog #10: Factory logic Just returnt from vacation, and i forgot to make a devlog before i went so i dont fully know anymore what i changed. Factory logic I have implemented the core factory system. Factories can now receive resources, process them and output the procesed resource. I haven’t fully tested the logic yet since the UI and vehicle systems ( needed for input/output) aren’t complete. More I have probebly done more but i dont know anymore because i have been a way for a week. What is next My next priority is implementing vehicle logic, but first i need to fix vehicle sprite scaling. Currently all vehicles are 11px wide, which makes a dump truck as wide as a car. I want to make everything a consistent scale (probably 5px = 1m) and update all sprites accordingly for a more realistic appearance."}, {"post_id": 29417, "ts": "2026-07-16T11:03:02Z", "hours": 10.1492, "text": "Devlog #9: Supplychain Been working on the supplychain structere last 2 days, including new sprites Factorys I have made new factory sprites. All sprites are new i am not realy happy with how the steel and wire mill look but the rest look prety good i think. Resources I have also added a couple new resources their are 4 resource types now: copper, coal, gold, iron. The resources spauwn in mixed vains on the map determent by a NoiseTexture2D . What next I am now gooing to work on the logic for the factorys and i want to take a nother look at shadows because the didnt work last time but i have found a otherway to do it i want to try."}, {"post_id": 28327, "ts": "2026-07-14T14:40:52Z", "hours": 9.6725, "text": "Devlog #8.1: UI and lighting Today i have been focesing on the inviorment UI I have now linked up the hole UI. In the last devlog I had already shown the ui but now it also linked up properly with the game. Day Night cycle I am currently implementation a dynamic day/night cycle. Right now, the timing and transitions aren’t lining up the way I want them to, so i still need to do some fine tuning . Shaders / shadows This is where I’ve been strugeling. I’ve been trying to figure out how to implement proper 2D shadows. The issue is that the built in directional shadows in Godot aren’t really designed for top-down games. They make the sun’s shadows look infinitely long and completely distort the perspective. Every custom solution I’ve tried so far looks terrible. I’ve easily spent about 5 hours making custom shaders making a static shadow, but I’m still stuck. If you have any experience with top down 2D lighting or custom shadow shaders in Godot, please let me know in the comments! I could really use some help right now. The biggest problem is that the fastNoiseLite texture doesnt calculate the same in the shader as via the cpu which is also the thing that is hindering me in the ovelays."}, {"post_id": 27357, "ts": "2026-07-12T21:00:50Z", "hours": 9.8522, "text": "Devlog #8: Made UI Been working on the UI this weekend. its nothing special yet but it is good enough for now. Garage menu I have made a menu where you can see all your vehicles. It is pretty simple but i need it for programming the vehicles. Shop UI I have made a shop ui where you can buy the actual vehicles. The are sorted by type. You can see the stats and capabilities and you can decide if you want to buy the vehicles or if you want to finance it. Exstended selected tile UI I have also made some improvments and additions to the selected tile ui, you can now choose a variant if the selceted tiles has them like the factory. You can also see what number is connected to what if you hover over the ui. Overlay I am also working on a overlay so you can see the height, temperature and humidity I am doing this with a shader but it is not working how i expected at the moment because the shader doesn’t line up with my terrain."}, {"post_id": 26555, "ts": "2026-07-11T13:18:41Z", "hours": 5.2389, "text": "Devlog #7: Fresh foundation As i mentioned in devlog #6, i am rebuilding the game in godot. I am almost done with the essentials and development has already almost doubled in speed. World generation I have build a biome system using three noise textures to determine temperature, altitude, and humidity. Each tile uses these values to determine which biome gets drawn. This means the world has natural variation and will hopefully look less boring. It also sets up the foundation for biome specific resources and mechanics down the line forcing players to make a bigger network. Road placement System You can now place roads this works with terrainSets which makes it easyer to draw roads. Roads are the only thing you can place for now. Vehicle Pathfinding I’ve also made a simple pathfinding script using the built-in NavigationAgent2D. The destinations are hardcoded for now. I’ve heard AStarGrid2D might be better suited for grid-based pathfinding in my case, so I’ll be researching how to implement that. What i still have to add Before I’m back where I was with the Greenfoot version, I still need to add: The factorys and their system The trailers physics The garage menu A couple small things"}, {"post_id": 25816, "ts": "2026-07-10T08:51:36Z", "hours": 9.5967, "text": "devlog #6.1 Terrain I am almost finnished with the prosidural generation of the map which is gooing to make for way more variation in the game and beter planing were to place youre base."}, {"post_id": 24611, "ts": "2026-07-08T10:10:39Z", "hours": 31.0889, "text": "Develog #6: switching engines Spent the last week trying to fix the UI and physics in Greenfoot, and honestly? It’s just not happening. Greenfoot wasn’t really built for games like this the UI support is basically non-existent, and getting clickable buttons to work properly is way more of a pain than it should be. And i decided it was no longer wordt fighting for. So I’m switching to Godot. I’ve made some prototypes in it before, so at least I know the basics, and it’s way better suited for what I’m trying to build. The downside is development is gonna be paused for about a week while I set everything back up and rewrite some stuff. But after that? Should be able to move way faster, which will hopefully make up for the lost time."}, {"post_id": 20941, "ts": "2026-07-02T17:53:03Z", "hours": 21.3453, "text": "Devlog #5: Major System Overhaul—Resource Economy & Vehicle Expansion it has been a bit since my last devlog i have some major changes this version. It is nowhere near done yet but it is almost playable. here is what changed: Added two new resources I have added sand and gravel that are used in multiple new recipes Changed the economy: from currency to resources I got rid of the money system because it gave the ability of players just focusing on one resource. Now players need to use all the resources like iron ore, copper ore, sulfer ore, sand, gravel and many more. You have to mine all resources and process them This forces the player to actually spent time making a supplychain with diffrent mines and factories. This way it feels less as a idle and more like a managing game. Added new factories I have added new factories using the factory system i made last time these factories all require two or more inputs. Some factories make concrete from gravel and sand, others make PCBs and other compilicated stuff. I plan to add more in the future but for now it is way beter than before. Added a bunch of vehicles I have added multiple new vehicles: Bulk carriers - Can move ore and loose materials Flatbed trucks - Move finished products (pallets ore IBCs) Trailers - These can attach to diffrent vehicles and extend capacity Concrete truck - Transports concrete Construction Vehicles Dozer - Removes the building Excavator - Now needed for quarries Asphalt Paver - Changes roads from gravel to asphalt I am planing to add more construction vehicles so that every building needs a construction vehicle to build instead of the building just appearing out of nowere. Rebuilt the UI The old ui didnt fit anymore there where to many tiles and the route tab did not support construction equipment, so i made a new tile ui that groupes the tiles in road, factory and mines. I have also made a new vehicle ui which i call the garage this shows The vehicles you own The vehicle shop The abilities of the vehicle: It can hook a trailer It can carry bulk cargo It can carry flatbed cargo It can go offroad It can destroy building It can pave roads It can mine it’s way better than before but you currently cant buy the vehicles yet Roads have levels now Roads can be upgraded: gravel -> cement -> asphalt. Gravel roads are cheap but slow, asphalt is fast but expensive. Upgrading is expensive but can speed up your production or reduce the number of vehicles required to keep the factory full. The road level doesnt effect offroad vehicles and some vehicles may get a max speed in the futer What i still need to do It is the same as last time because i had to many new ideas and no motivation to implent mutch backend stuff Levels / progresion - It is just a sand box now Beter end goal - There is not realy a endgoal A tutorial - The game becomes increasingly complicated so hard without any guidance"}, {"post_id": 13898, "ts": "2026-06-22T19:41:09Z", "hours": 3.8419, "text": "Devlog #4 Finised the factory system Finised the factory ui / recipie ui that now tracks input output and procesing time Added new sprites for the vehicles now have 2 types a dumptruck form the drill and a flatbed to the sellpoint Stil need to add Change detection system Levels / progresion Beter end goal A tutorial Known bugs When you edit the route it deletes it self When you delete a route it doesnt delete the vehicles"}, {"post_id": 12159, "ts": "2026-06-19T21:21:22Z", "hours": 3.4008, "text": "Devlog #3 Added a factory system it is not fully done but there is a basic factory system now so you cant just infinatly take recources from the factroy to the sell point"}, {"post_id": 7675, "ts": "2026-06-12T20:25:33Z", "hours": 12.4575, "text": "Devlog #2 Finshed the game I have finnished the main gameplay loop I still want to add: A tutorial Levels / Progresion More recources and factorys / recipes Better end goal there is nothing to save for right now failsave for when you delete the path with vehicle on it"}, {"post_id": 4420, "ts": "2026-06-07T18:55:50Z", "hours": 1.8458, "text": "Devlog #1 I have made some improvements on the game i am curently making in greenfoot (java engine) i am using this engine because i have used it before for school"}]...
|
Title: SupplyChains by @Thijmen | Stardance
Devlo Title: SupplyChains by @Thijmen | Stardance
Devlogs:
Devlog #1 I have made some improvements on the game i am curently making in greenfoot (java engine) i am using this engine because i have used it before for school
Devlog #2 Finshed the game I have finnished the main gameplay loop I still want to add: A tutorial Levels / Progresion More recources and factorys / recipes Better end goal there is nothing to save for right now failsave for when you delete the path with vehicle on it
Devlog #3 Added a factory system it is not fully done but there is a basic factory system now so you cant just infinatly take recources from the factroy to the sell point
Devlog #4 Finised the factory system Finised the factory ui / recipie ui that now tracks input output and procesing time Added new sprites for the vehicles now have 2 types a dumptruck form the drill and a flatbed to the sellpoint Stil need to add Change detection system Levels / progresion Beter end goal A tutorial Known bugs When you edit the route it deletes it self When you delete a route it doesnt delete the vehicles
Devlog #5: Major System Overhaul—Resource Economy & Vehicle Expansion it has been a bit since my last devlog i have some major changes this version. It is nowhere near done yet but it is almost playable. here is what changed: Added two new resources I have added sand and gravel that are used in multiple new recipes Changed the economy: from currency to resources I got rid of the money system because it gave the ability of players just focusing on one resource. Now players need to use all the resources like iron ore, copper ore, sulfer ore, sand, gravel and many more. You have to mine all resources and process them This forces the player to actually spent time making a supplychain with diffrent mines and factories. This way it feels less as a idle and more like a managing game. Added new factories I have added new factories using the factory system i made last time these factories all require two or more inputs. Some factories make concrete from gravel and sand, others make PCBs and other compilicated stuff. I plan to add more in the future but for now it is way beter than before. Added a bunch of vehicles I have added multiple new vehicles: Bulk carriers - Can move ore and loose materials Flatbed trucks - Move finished products (pallets ore IBCs) Trailers - These can attach to diffrent vehicles and extend capacity Concrete truck - Transports concrete Construction Vehicles Dozer - Removes the building Excavator - Now needed for quarries Asphalt Paver - Changes roads from gravel to asphalt I am planing to add more construction vehicles so that every building needs a construction vehicle to build instead of the building just appearing out of nowere. Rebuilt the UI The old ui didnt fit anymore there where to many tiles and the route tab did not support construction equipment, so i made a new tile ui that groupes the tiles in road, factory and mines. I have also made a new vehicle ui which i call the garage this shows The vehicles you own The vehicle shop The abilities of the vehicle: It can hook a trailer It can carry bulk cargo It can carry flatbed cargo It can go offroad It can destroy building It can pave roads It can mine it’s way better than before but you currently cant buy the vehicles yet Roads have levels now Roads can be upgraded: gravel -> cement -> asphalt. Gravel roads are cheap but slow, asphalt is fast but expensive. Upgrading is expensive but can speed up your production or reduce the number of vehicles required to keep the factory full. The road level doesnt effect offroad vehicles and some vehicles may get a max speed in the futer What i still need to do It is the same as last time because i had to many new ideas and no motivation to implent mutch backend stuff Levels / progresion - It is just a sand box now Beter end goal - There is not realy a endgoal A tutorial - The game becomes increasingly complicated so hard without any guidance
Develog #6: switching engines Spent the last week trying to fix the UI and physics in Greenfoot, and honestly? It’s just not happening. Greenfoot wasn’t really built for games like this the UI support is basically non-existent, and getting clickable buttons to work properly is way more of a pain than it should be. And i decided it was no longer wordt fighting for. So I’m switching to Godot. I’ve made some prototypes in it before, so at least I know the basics, and it’s way better suited for what I’m trying to build. The downside is development is gonna be paused for about a week while I set everything back up and rewrite some stuff. But after that? Should be able to move way faster, which will hopefully make up for the lost time.
devlog #6.1 Terrain I am almost finnished with the prosidural generation of the map which is gooing to make for way more variation in the game and beter planing were to place youre base.
Devlog #7: Fresh foundation As i mentioned in devlog #6, i am rebuilding the game in godot. I am almost done with the essentials and development has already almost doubled in speed. World generation I have build a biome system using three noise textures to determine temperature, altitude, and humidity. Each tile uses these values to determine which biome gets drawn. This means the world has natural variation and will hopefully look less boring. It also sets up the foundation for biome specific resources and mechanics down the line forcing players to make a bigger network. Road placement System You can now place roads this works with terrainSets which makes it easyer to draw roads. Roads are the only thing you can place for now. Vehicle Pathfinding I’ve also made a simple pathfinding script using the built-in NavigationAgent2D. The destinations are hardcoded for now. I’ve heard AStarGrid2D might be better suited for grid-based pathfinding in my case, so I’ll be researching how to implement that. What i still have to add Before I’m back where I was with the Greenfoot version, I still need to add: The factorys and their system The trailers physics The garage menu A couple small things
Devlog #8: Made UI Been working on the UI this weekend. its nothing special yet but it is good enough for now. Garage menu I have made a menu where you can see all your vehicles. It is pretty simple but i need it for programming the vehicles. Shop UI I have made a shop ui where you can buy the actual vehicles. The are sorted by type. You can see the stats and capabilities and you can decide if you want to buy the vehicles or if you want to finance it. Exstended selected tile UI I have also made some improvments and additions to the selected tile ui, you can now choose a variant if the selceted tiles has them like the factory. You can also see what number is connected to what if you hover over the ui. Overlay I am also working on a overlay so you can see the height, temperature and humidity I am doing this with a shader but it is not working how i expected at the moment because the shader doesn’t line up with my terrain.
Devlog #8.1: UI and lighting Today i have been focesing on the inviorment UI I have now linked up the hole UI. In the last devlog I had already shown the ui but now it also linked up properly with the game. Day Night cycle I am currently implementation a dynamic day/night cycle. Right now, the timing and transitions aren’t lining up the way I want them to, so i still need to do some fine tuning . Shaders / shadows This is where I’ve been strugeling. I’ve been trying to figure out how to implement proper 2D shadows. The issue is that the built in directional shadows in Godot aren’t really designed for top-down games. They make the sun’s shadows look infinitely long and completely distort the perspective. Every custom solution I’ve tried so far looks terrible. I’ve easily spent about 5 hours making custom shaders making a static shadow, but I’m still stuck. If you have any experience with top down 2D lighting or custom shadow shaders in Godot, please let me know in the comments! I could really use some help right now. The biggest problem is that the fastNoiseLite texture doesnt calculate the same in the shader as via the cpu which is also the thing that is hindering me in the ovelays.
Devlog #9: Supplychain Been working on the supplychain structere last 2 days, including new sprites Factorys I have made new factory sprites. All sprites are new i am not realy happy with how the steel and wire mill look but the rest look prety good i think. Resources I have also added a couple new resources their are 4 resource types now: copper, coal, gold, iron. The resources spauwn in mixed vains on the map determent by a NoiseTexture2D . What next I am now gooing to work on the logic for the factorys and i want to take a nother look at shadows because the didnt work last time but i have found a otherway to do it i want to try.
Devlog #10: Factory logic Just returnt from vacation, and i forgot to make a devlog before i went so i dont fully know anymore what i changed. Factory logic I have implemented the core factory system. Factories can now receive resources, process them and output the procesed resource. I haven’t fully tested the logic yet since the UI and vehicle systems ( needed for input/output) aren’t complete. More I have probebly done more but i dont know anymore because i have been a way for a week. What is next My next priority is implementing vehicle logic, but first i need to fix vehicle sprite scaling. Currently all vehicles are 11px wide, which makes a dump truck as wide as a car. I want to make everything a consistent scale (probably 5px = 1m) and update all sprites accordingly for a more realistic appearance.
Devlog #11: Vehicle logic I am currently working on the vehcile logic Vehicle logic There are alot of variables now that determain the behavier off the vehicles like engine and weight Sprite scaling I have fixed the scaling of the sprites. Last things for the vehicle logic I still need to implement the trailer logic and pathfinding.
Devlog #11.2: Trailer Logic and Pathfinding I’ve almost finished all the vehicle logic. Pathfinding A working pathfinding system is now in place using AStarGrid2D . This system works with vehicles both with and without trailers, and handles both on-road and off-road navigation. Trailers Trailers can now couple to vehicles with the correct hitch and follow them around in a realistic manner. The coupling mechanics work as they would in real life. Finishing Touches The vehicle logic still needs some fine-tuning, and I haven’t tested it yet with every vehicle type. I still need to implement the articulation system for the articulated dump truck.
Devlog #12: Planing I’ve put together a roadmap for the rest of development. Roadmap I’m planning to release the game in 3 weeks and have laid out a plan accordingly. Vehicle physics I’ve spent about half my time since the last devlog tweaking vehicle physics, and I’ve decided to compromise on a few things — for example, when the trailer jackknifes and gets stuck, it’ll just clip through the vehicle. Shop rework I am almost finished with reworking the shop it now displays all the stats that the vehicle uses
Devlog #13: Vehicles in the world I’ve connected the vehicle systems to the world and to the UI. Vehicle manager I’ve made a vehilce manager script. This manager stores and retrieves vehicle data efficiently by ID, making it easy for the UI and other systems to access vehicle information. Vehicle UI I’ve made a UI where you can see the fuel, total weigth, health and engine load of the vehicle by clicking on it. There are also 2 buttons 1 for selecting a route and the other for coupling a trailer. Spauwing When you buy a vehicle it gets assigned a base tile you now need a base tile per vehicle. Last things Next, I need to implement the route selection and trailer coupling buttons to complete the vehicle system integration as far as I can right now.
Devlog #14: Route UI and system I am currently working on the route ui and the route system. Route UI The route UI is almost done I only need to link it to the route system. Route system I am almost finished with the route system I only have to connect it to the vehicle and rewrite the factory system a bit so it works with the route system. there will be multiple modes distribution of one factory based on demand or a ping pong mode where it drives back and forward between 2 set points. You also will be able to assign vehicles to construction projects but this will come later. Trailer UI The trailer UI is finised you can connect trailers to vehicles via it.
Devlog #14.2: Route system The route system is now done Route sytem The route system turned out to be more complicated than initially expected. I restructured it so the route is calculated centrally in the Global script, and every instance using it reads from there. This keeps things synchronized and maintainable. For now, the system has one mode implemented: a ping-pong mode where vehicles travel back and forth between two set points. Vehicle physics There’s a persistent issue with vehicle physics where they cut corners and miss checkpoints, requiring them to turn around. I’ve set this aside for now to focus on other features, but it’s something I’ll need to fix down the line. I realy have no idea how though I cant seem to find the issue. Whats next The last major things before release are: Linking factories to vehicles so they can load and unload cargo Animating the excavators at the mine Building out the construction system
Devlog #15: Vehicle rework I’ve completely restructured how vehicles work under the hood. The main goal was to break down the code into readable, reusable pieces. Vehicle componentization The vehicle script had become too large to work with, so I split it into five scripts: vehicleBody.gd , drivetrainComponent.gd , path_movement_component.gd , CargoComponent.gd and attachment_component.gd . This makes the code easier to maintain and reduces the chance of bugs when adding new vehicle types. Vehicle data I have converted the nested Dictionaries into custom resources which makes it easier to add vehicles and less error prone. Pathfinding improvements I tweaked how the pathfinding works by chamfering the corners so vehicles navigate them more smoothly. It doesn’t look quite as I want yet, but combined with animations, it should look acceptable for now. This is something I’ll have to find a more permanent solution for later. Release I’m targeting version 1.0.0 for Saturday, August 22nd. There’s still quite a bit to do, but I think I can make it. I set this deadline because I’ll have less time once school starts.
Devlog 16: Factorys and aircraft I’ve reworked the factory sprites and added aircraft. Factory sprites I have made new sprites for every factory execpt the concrete mixing plant. the sprites are now 2x2 or larger so vehicles can realisticly unload there. Aircraft I’ve decided to add aircraft, which will serve as a trading terminal so you can trade with other villages, get contracts, and earn money. Aircraft fit well for this since no other villages spawn in the world. they let you trade with other vilages without them needing to exist in the world. I still need to add alot to make this work but currently I have a working runway building mecanic Next: Factories Next, I still need to build out the factory logic. I plan to make them with custom resources, just like vehicles. I made the new sprites first because I needed to know where (un)loading would need to happen before I could design the logic around it.
Devlog 17: Factory placement I’ve built a system for placing factories in the world. Factory placement Turns out it’s an absolute pain in the ass to place objects that are multiple tiles big while also having them connect to multiple Godot terrains. So I had to write a whole system that places every tile separately and keeps track of which tiles are occupied. Roads I also had to rework how roads are placed. Originally, every road type was its own terrain, but that doesn’t work if you want them all to connect to factories and to each other. So now they’re all just one terrain, and a script gives each tile the correct color for its road type. This only works because all the road types are identical in shape just different colors. Aircraft sprites I’ve added several new aircraft sprites: the Bo 105, the Twin Otter, the PC-6, and the H225. I’m planning to add the Chinook and the A400M next, which will round out the aircraft lineup for the beta launch. Release It’s going to be close. I’m not sure I’ll hit my self-imposed deadline, since some things took a lot longer than expected but I might still make it. Either way, I’m not going to rush it. I’d rather ship a week late than release something that gets 5 SD/h because it isn’t polished.
Devlog 18: Pre-baked docking paths I’ve implemented pre-baked docking paths for factory entrances to solve some pathfinding issues with vehicle physics. Pre-baked paths The A* pathfinding system was struggling to navigate the sharp corners around factory entrances. When the trailer tried to find its own path through these tight spaces, it would instantly jackknife, not ideal. Rather than spend 50+ hours refining the vehicle physics, I decided to pre-bake specific docking paths to each factory. It’s not a perfect solution visually, but it’s functional and gets the job done. I can always refine this for a post-launch update if needed. I’m still wrapping up the final details of the docking path system before moving on. Mines My next major task is implementing mine logic, which includes the excavator logic and ore detection and depletion. Aircraft After the mining logic I will add the last vital gameplay system the aircraft system which will be responsible trade and contracts with other villages. Release I’m currently deciding whether to push construction vehicle implementation to a post-beta update or delay the release by a week to include them. Construction vehicles aren’t vital to core gameplay, but they would add a lot of polish. I’m still on the fence about this one, it depends on how the mine logic implementation goes.
Devlog 19: Busy School has started again and I have been geting busy and my motivation is also not that high right now because things take alot longer and dont work like i want to. I think I will delay release to septembere 12th.
Devlog 20: UI and Trading Got the backend for the trading system done and overhauled the UI to go with it. Trading System I made a trading system. It generates contracts with the recipient’s name, the resource being traded, and the price. Basically the foundation for the aircraft system. UI Redesigned the time and date display because it looked kinda rough. Also switched the economy back to money instead of the resource, makes way more sense for trading. Oh, and vehicles now actually speed up when you speed up time, which is pretty cool. What’s Shipping vs Later I’m not including construction vehicles in the initial release because that’s like 40+ more hours of work and I want to actually finish this before Thirdspace starts (I’m gonna compete too). So yeah, that’s going to a post-launch update. Still gotta do: Get the excavators working (mines) ~5h Finish the trading system ~3h Fix vehicle physics again 😭~5h Random bugs and polish ~5h Hope I can get that done this week. Tryna hit at least 14sd/h so I can hopfuly buy that Framework 13 lol
Devlog 21: Trading Finished, but I’m Stuck I’ve finished the trading system! Trading System The trading system is done. Orders are generated, you can accept them, and accepted trades show up in the UI. The only thing left is adding the planes, but that depends on finishing the base-building system first. Base Building I’ve started working on base building. It’s pretty simple and mostly uses systems that already exist, so it should only take around an hour to fully implement. Stuck Development has been going way slower than I hoped because my codebase is currently a bunch of bandaids stacked on top of each other. I also need to ship this week since Thirdspace starts next week, which means I probably won’t have time to add much polish.So I need your opinion: is it worth delaying the game for another week? 😭 Or should I just ship it? Do you think I’ll still be able to afford the Framework 13 if I release it now? My current plan is to focus on getting the core systems working, fix any major bugs, and leave extra polish and construction vehicles for a post-launch update.
Devlog 22: Factory UI and Finished base building I’ve finished base building and am now working on the factory UI. Factory UI I’m working on the factory UI, where you can see the factory’s storage and change its recipe. It’s almost finished. Base building Base building is finished you can now make taxiways and build a warehouse. I’ve also put these into a UI like the factory’s, so it only takes one button. Vehicle physics/pathfinding I’ve spent yet another hour on vehicle physics/pathfinding, and I’ve narrowed it down to a bug in the handoff to the prebaked paths of the factories. Timeline I’m pretty sure I am gooing tho finish it this weekend. What’s left: Vehicle physics ~3h Mines/excavators ~5h Building construction (will reuse most of the factory logic) ~2h Random bugs and small things ~5h
Devlog 23: Vehicle pathfinding and construction I have fixed the vehicle pathfinding (mostly) and I have made the construction system. Vehicle pathfinding I have fixed the vehicle pathfinding and it works now mostly. I say mostly because it breaks when a trailer is equipped, but that is a way smaller thing to fix. Construction system It’s almost done. The system makes it so the resources actually have a function and you now need to deliver resources to a building site before the factory can get built. Still not done I know I said it would be done this weekend and it still isn’t, but it’s almost there. What I still have to do: The mine/excavator ~5h Finishing a couple of systems (like the construction and trade system) ~5h Make a savegame system ~5h Small things ~2h Documentation ~2h So 2 devlogs left, and otherwise I will just ship incomplete because I don’t have time anymore.
Devlog 24: Construction finished and start secunce made I’ve finished the construction system and made the start sequence actually playable by adding a resource box containing 10 iron bars needed to build a terminal. It’s been 2 weeks since my last devlog school and commitments to Third Space have kept me busier, so I’m not 100% certain I’ve captured everything that’s changed. Construction system The construction system now generates building routes that you can assign vehicles to. Resources must be delivered to a building site before construction begins, making the resource system meaningful in actual gameplay. Starting secunce The starting secunce now has a couple of steps: Place the resource box Place a runway Place a terminal Conect the runway with the terminal with a taxiway Place 4 base tiles for the vehicle to spawn on What has to be done: Mine/excavator system ~3h Finish trade system ~3h Save system ~2h Documentation ~2h
Devlog 25: Planes and saving! I’ve locked in over the last 2 days and finished the final 2 of the 3 major systems. I’ve completed the planes (which now spawn when you accept an order) and finished the saving system. Planes/order system I’ve finished the order system, when you accept an order, a plane now spawns a couple thousand pixels out. It flies to the airstrip, loads up at the end of the runway, turns around, and flies away. It doesn’t taxi all the way to the terminal because I just don’t have time for that, but it looks good enough for now. Saving You can now save 3 worlds in the game. Everything gets encrypted and saves all the world values. It was pretty difficult converting some of the arrays filled with instances into dictionaries and back again, but it works on both PC and on the web. whats left: The only things left are the excavator and some smaller things. I’m finishing that all tomorrow, and that will be the last devlog for my ship. The main gameplay loop should be finished by end of day tomorrow. If I can’t finish everything, so be it, I dont have time to work on it anymore if I also want to continu in third space, but I’m happy with how it works now and what I have learned along the way.
Devlog 26: Last devlog I’ve officially finished the game. It’s been an incredible journey, and I’m pretty happy with the end result. excavator The excavator is now fully functional. You can use it to create mines, which automatically convert into factories once placed. a lot of small things I have done a lot of small things to optimse the game and fix things i coudend test till now Release This is the last devlog I’ll be writing for this project. I want to thank you all for the support. I hope you enjoy playing the game.
Devlog 27: Tutorial: After feadback I have dicided to make a tutorial and made a couple quality of live updates that made the game easier to understand.
Ships:
Supply Chains Supply Chains is a game inspired by Transport Fever and Mindustry, centered around building road networks and logistics chains for construction and mining operations. Features Vehicles, trailers and a garage Route system: pick a source, a destination and a resource, then assign it to a vehicle Multi-step production chains Construction sites, trading, generated terrain, and A* pathfinding with road weights Controls: WASD camera, 1-5 build, right click remove, space pause. Everything else is in HELP.md . Known limitations I’m a solo dev, so some things aren’t finished. The full list is in the README. Hope you enjoy it!...
|
1792853836.385709
|
1792940236.385709
|
|
8100
|
Crawssembly by @The_Craw | Stardance
|
The_Craw
|
3
|
310.71
|
5664
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T09:56:51Z", "hours": 137.0, "multiplier": 19.59, "payout": 2622, "blessing": "neutral", "text": "CRAWSSEMBLY - New and Improved! “Programming languages are a lie!” This is Crawssembly, the number 1 project on all of stardance! It’s a project that’s been in production for over a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly. What is new? INTERNET SOCKETS! CRAWOS COMMAND LINES! DYNAMIC LABEL JUMPING! IMPROVED DEVICES! DEDICATED PACKAGE SHARING WEBSITE! AND MORE! Check it out for yourself! (Shipped early due to Fraud Squad limitations, Crawssembly is too powerful for Hack Club)", "repo": "https://github.com/Jonah-Crawford/Crawssembly", "demo": "https://crawssembly.ultimatecraw.xyz/"}, {"ship_num": 2, "ts": "2026-07-02T17:49:35Z", "hours": 33.0, "multiplier": 19.65, "payout": 633, "blessing": "neutral", "text": "Crawssembly v1.1.0 ready to ship! “Programming languages are a lie!” This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.", "repo": "https://github.com/Jonah-Crawford/Crawssembly", "demo": "https://crawssembly.ultimatecraw.xyz/"}, {"ship_num": 3, "ts": "2026-06-26T21:15:26Z", "hours": 134.0, "multiplier": 19.78, "payout": 2409, "blessing": "neutral", "text": "Crawssembly: The beginner’s gateway to low-level thinking. \"Programming languages are a lie!\" This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.", "repo": "https://github.com/Jonah-Crawford/Crawssembly", "demo": "https://crawssembly.ultimatecraw.xyz/"}]...
|
[{"post_id": 79047, "ts": "202 [{"post_id": 79047, "ts": "2026-10-12T14:17:02Z", "hours": 5.8211, "text": "idk where these extra hours are coming from, but as long as I don’t ship them, they won’t count towards stardust so I’ll be fine. In the meantime, enjoy craw slop"}, {"post_id": 73135, "ts": "2026-09-24T13:36:27Z", "hours": 0.8872, "text": "It has come to my attention that not everyone who has followed Crawssembly has starred it on GitHub! Please, if you like my project, star it on GitHub at https://github.com/Jonah-Crawford/Crawssembly Thank you."}, {"post_id": 62476, "ts": "2026-09-05T20:43:32Z", "hours": 1.1861, "text": "I’m back! Fraud Squad unbanned me so WE are all having a party at my house Although I can’t use nano apparently anymore… so Crawssembly will be having it’s final ship very very soon"}, {"post_id": 53379, "ts": "2026-08-23T22:12:14Z", "hours": 4.7478, "text": "I’ve been doing much more testing and implementing the network device. Specifically testing the following commands: io net ip , io net addr , io net connect , io net socket , io net port , io net listen , io net accept , io net send , io net protocol , io net block , and io net recv ."}, {"post_id": 52283, "ts": "2026-08-22T12:07:09Z", "hours": 0.5569, "text": "HTTP requests working 🔥 ts is so peak icl"}, {"post_id": 51913, "ts": "2026-08-21T20:28:29Z", "hours": 4.2456, "text": "I’VE ACTUALLY DONE IT 🔥 Networking is now officially part of Crawssembly. Alpha tests on localhost have all passed"}, {"post_id": 51556, "ts": "2026-08-21T10:23:09Z", "hours": 0.3189, "text": "I’ve brought run back from the dead. You can now use run rXX to run a binary value inside the input register as a Crawssembly instruction"}, {"post_id": 51201, "ts": "2026-08-20T18:32:01Z", "hours": 0.4944, "text": "stardance"}, {"post_id": 50613, "ts": "2026-08-19T20:41:05Z", "hours": 1.6864, "text": "I’m finally getting somewhere with the editor, however I’m now having issues with character deletion, and adding characters inside empty newlines"}, {"post_id": 49579, "ts": "2026-08-18T13:50:02Z", "hours": 4.3281, "text": "Still no clue why characters aren’t being saved to memory in my free heap block Slow day today fr"}, {"post_id": 48745, "ts": "2026-08-17T08:45:08Z", "hours": 2.36, "text": "For some reason, I’ve been banned on slack. I don’t know why, since no one will tell me. This is not good news, but luckily it doesn’t seem to be a stardance-wide ban, so I can still do the hackathon."}, {"post_id": 48355, "ts": "2026-08-16T17:45:02Z", "hours": 8.0639, "text": "Lots of work today, sorry for the . I’ve been struggling with the text editor, heap buffers, cursor allocation, character addresses, etc etc… ad infinitum. However, I’m getting close. Rendering is outputting something, although I don’t know why typing doesn’t seem to add anything…"}, {"post_id": 47504, "ts": "2026-08-15T13:39:53Z", "hours": 4.2456, "text": "I’ve added io keyboard mod to create a bitfield of modification key presses for the keyboard device, so now keys like CTRL and TAB can be handled, which lays the foundation for my next project which is making a basic file editor in casm"}, {"post_id": 46783, "ts": "2026-08-14T09:10:12Z", "hours": 4.3825, "text": "Sorry for the but it’s been a hectic couple of days. I got into University! I’ve also been busy taking a look at a CGOL implementation, truly amazing stuff! Go check it out: https://github.com/srxcode/game-of-life-crawssembly"}, {"post_id": 45634, "ts": "2026-08-12T08:01:02Z", "hours": 1.1425, "text": "I’ve separated the old sleep command into sleepms for millisecond waits and sleepus for microsecond waits. Although, microsecond precision is highly dependent on the OS, so it won’t be as accurate as sleepms for smaller values (Say, n<50)"}, {"post_id": 45230, "ts": "2026-08-11T15:52:21Z", "hours": 1.3411, "text": "I’ve merged the new fgo rules to the project, so now fgo points to labels similar to jmp , but fgo 0 now jumps to the label defined in r01 I was having some issues with using git but I got them sorted"}, {"post_id": 45046, "ts": "2026-08-11T09:08:16Z", "hours": 0.8819, "text": "I’m back from camping! (RIP my 60+ day streak) My plans going forward immediately is improving program counter modifications to allow for higher-level concepts to be bootstrapped onto Crawssembly instruction sets. (Image unrelated)"}, {"post_id": 40794, "ts": "2026-08-04T15:32:01Z", "hours": 1.0728, "text": "I’ve been working with @BetterClient to inprove the program counter and bringing back fgo from casm beta. This is also a reminder that I’ll be OOO until next Monday."}, {"post_id": 40209, "ts": "2026-08-03T16:48:57Z", "hours": 1.4692, "text": "I’ve made publishing packages super easy now, all you need to do is craw init to create the package, and then craw pkg publish . As long as you’re signed into CPM and gh, it’ll just work"}, {"post_id": 40094, "ts": "2026-08-03T14:12:19Z", "hours": 1.1475, "text": "I’ve added Markdown support for CPM packages 🔥"}, {"post_id": 40004, "ts": "2026-08-03T11:00:47Z", "hours": 2.5797, "text": "@imakebloatedcode Thank you for your pr for CPM to include OpenAPI scemata, another great addition from the Craw Systems community Most of my time has been reviewing it and making small edits to include the security auth headers for API keys Official Announcement I’m not going to be online through the 5th August to the 10th August, I’ll be camping for those 5* days in a very low-data spot, and I’m almost certainly not taking my laptop. I might be able to get a tiny amount of code on my phone to keep my streak but certainly not enough to engage in my normal conversation on slack or post devlogs"}, {"post_id": 39500, "ts": "2026-08-02T14:31:42Z", "hours": 1.0703, "text": "Package creation and accounts are now working (theoretically) from the command line 🔥"}, {"post_id": 38989, "ts": "2026-08-01T16:48:04Z", "hours": 2.2369, "text": "The account page is looking better, and it’s survived some user testing 🙏 I need to add some boring stuff though like API key listing and said key management"}, {"post_id": 38863, "ts": "2026-08-01T12:58:59Z", "hours": 3.1425, "text": "I’ve been back working on CPM, focused on user accounts."}, {"post_id": 38130, "ts": "2026-07-31T10:56:08Z", "hours": 1.39, "text": "The Crawssembly community is real 🙏 I’ve been reviewing a PR on the GitHub to improve the multiplication script in the CSL ( std/math/multiply.craw )"}, {"post_id": 37274, "ts": "2026-07-29T21:10:18Z", "hours": 0.7014, "text": "I’ve been messing around with --input tag which seems to mess around a bit in the rust vm, but I think I’m getting closer to the cause"}, {"post_id": 36468, "ts": "2026-07-28T16:32:48Z", "hours": 1.0483, "text": "Hack Club seems to have updated the rules on banner images, claiming it has to be an image of your project working. This is no issue for Crawssembly. The new banner is now the output of one of my programs, creating the banner pixel for pixel. This both compiles with the new rule, as it demonstrates Crawssembly functioning, while maintaining its identity."}, {"post_id": 36310, "ts": "2026-07-28T10:47:11Z", "hours": 2.2539, "text": "I’ve discovered that the input file mechanism is broken, so that’s great. I’ve also been adding more commands to CrawOS"}, {"post_id": 35823, "ts": "2026-07-27T14:42:16Z", "hours": 1.9103, "text": "I’ve been adding some very basic commands, such as exit , help , and clear"}, {"post_id": 34854, "ts": "2026-07-25T21:54:23Z", "hours": 2.7158, "text": "Once you get 1 command working, many more will follow! That’s right, a command line written 100% in Crawssembly code 🔥"}, {"post_id": 34296, "ts": "2026-07-24T21:36:54Z", "hours": 0.505, "text": "icl I’ve not done much today, mostly testing the allocation code and it looks up to spec tbh, not much to say"}, {"post_id": 33496, "ts": "2026-07-23T14:28:32Z", "hours": 1.4308, "text": "Stack allocation and freeing appear to work, but I need to do more testing to prove it"}, {"post_id": 32893, "ts": "2026-07-22T10:59:17Z", "hours": 4.3922, "text": "I’m still working on stack allocation, the complex parts are walking the stack properly to get the headers, along with making sure I don’t corrupt any data. The image attached shows the maximum heap block size in blue, with the data taken up by the header of that block in red (top corner)"}, {"post_id": 32353, "ts": "2026-07-21T13:52:27Z", "hours": 1.4989, "text": "I’m going ahead with this schema for heap blocks, the reserved bits can be used for extra features that I might want to add in later versions"}, {"post_id": 32254, "ts": "2026-07-21T09:37:22Z", "hours": 12.9831, "text": "Staff, please remove the time on this devlog, I accidentally left nano open all night. Sorry!"}, {"post_id": 31982, "ts": "2026-07-20T20:21:19Z", "hours": 1.13, "text": "Reading user input isn’t that easy compared to a language like Python, where you can just do input() . Each character has to be processed as soon as the keyboard records a press, and then saved to memory. I’m currently working on a block method that takes every 16 character you type, and allocates a small block on the heap for each press. This is going to be used for my big project"}, {"post_id": 31817, "ts": "2026-07-20T14:36:29Z", "hours": 1.2011, "text": "I’ve decided to add a heap library to complement the stack library. Doing this should make my next idea easier"}, {"post_id": 31759, "ts": "2026-07-20T12:24:31Z", "hours": 0.7053, "text": "Please also star my actual github page! It’s more important than stardance followers 😤😤 https://github.com/Jonah-Crawford/Crawssembly"}, {"post_id": 31691, "ts": "2026-07-20T09:37:05Z", "hours": 1.4242, "text": "Since IEEE 754 single precision can encode much larger numbers than a standard 32-bit binary number, you can use the library to approximate much larger values for computation"}, {"post_id": 31320, "ts": "2026-07-19T16:50:46Z", "hours": 3.3533, "text": "I’ve been working on a IEEE 754 single precision 32-bit floating point number library for CSL, it turns out it’s more difficult than I expected!"}, {"post_id": 31143, "ts": "2026-07-19T09:51:00Z", "hours": 0.7642, "text": "I realised that my documentation had some issues and unfinished sections, so I touched them up"}, {"post_id": 30931, "ts": "2026-07-18T22:37:22Z", "hours": 0.9317, "text": "Added a simple stack library for function calls and other uses, along with some smaller graphics programs such as screen/rectangle_fill.craw This is also my official announcement that I’ll be doing much less programming, due to summer holiday starting now. This is because I can’t program during family time, camping weeks, and other events. In addition, I have University after summer holidays, so this reduced productivity will continue throughout the rest of Stardance. Thank you all for making Crawssembly the number 1 project on stardance!"}, {"post_id": 29811, "ts": "2026-07-16T23:06:00Z", "hours": 0.5503, "text": "67 followers"}, {"post_id": 29415, "ts": "2026-07-16T11:01:49Z", "hours": 0.8972, "text": "I’m currently focusing on adding new functions to the screen library, such as rectangles, using the line program as a primitive"}, {"post_id": 28832, "ts": "2026-07-15T10:34:49Z", "hours": 2.9103, "text": "The initial line algo only works for the 0-octant, but now my new and improved version works for every line angle!"}, {"post_id": 27711, "ts": "2026-07-13T14:37:24Z", "hours": 1.2111, "text": "We have proper line segments working 🔥"}, {"post_id": 27105, "ts": "2026-07-12T11:30:09Z", "hours": 2.2058, "text": "I’ve been adding line functions at the moment, to be honest it’s harder than the circle! Getting the angles right is the hardest"}, {"post_id": 26637, "ts": "2026-07-11T15:56:48Z", "hours": 1.8617, "text": "Circle made 🔥"}, {"post_id": 26568, "ts": "2026-07-11T14:04:16Z", "hours": 2.7844, "text": "Taking a break from CPM to work on some graphics libraries, drawing lines, circles etc…"}, {"post_id": 25954, "ts": "2026-07-10T14:03:02Z", "hours": 2.3158, "text": "Accounts are going to be tricky, more front-end stuff and some complex security back-end is going to make this tricky"}, {"post_id": 25201, "ts": "2026-07-09T09:27:17Z", "hours": 0.7178, "text": "Thinking about user login for the CPM, might implement this soon"}, {"post_id": 24627, "ts": "2026-07-08T10:43:46Z", "hours": 0.66, "text": "Thanks to @Keyboard1000n17 for making the CPM website!"}, {"post_id": 24593, "ts": "2026-07-08T09:25:31Z", "hours": 0.6333, "text": "I won’t be as active over the next couple of days so don’t expect many updates"}, {"post_id": 24123, "ts": "2026-07-07T14:18:16Z", "hours": 3.4186, "text": "I’m not good at css, but I’m trying to make the CPM website simple and easy to use. It’ll take a while but it’s slowly coming together"}, {"post_id": 23750, "ts": "2026-07-06T21:31:52Z", "hours": 0.2561, "text": "It turns out I was way closer than I thought! Publishing your own Crawssembly projects is now out of alpha, into beta (Because only I have an API key atm!)"}, {"post_id": 23730, "ts": "2026-07-06T20:59:27Z", "hours": 1.5481, "text": "Still not too much progress on CPM, but I’m still confident I can get it working"}, {"post_id": 23656, "ts": "2026-07-06T19:20:07Z", "hours": 4.075, "text": "CPM is being difficult, I’ve gone through multiple iterations now of the craw pkg publish command, but I feel like I’m getting close."}, {"post_id": 23514, "ts": "2026-07-06T15:13:35Z", "hours": 1.2278, "text": "I’ve been fighting with my server for a while now, the connection keeps on interrupting. As votes are currently coming in for Crawssembly v1.1.0, I suspect my score will be lower than expected due to the demo and doc websites coming offline randomly."}, {"post_id": 23449, "ts": "2026-07-06T13:09:35Z", "hours": 2.1969, "text": "My issues at the moment are about getting a command, craw pkg pack to create a CPM ready tarball of your project from the command line. That and my server is having a couple of internet issues at the moment which are hindering my progress. This devlog is also an official announcement that I won’t be as active as normal over the next week. I have family coming around so my time programming will be limited. In addition, when summer holiday starts this will continue, which is why most of my time programming is in the June and early July, the rest of stardance will have fewer updates and less time spent on casm."}, {"post_id": 23401, "ts": "2026-07-06T10:39:43Z", "hours": 2.2703, "text": "CPM officially works! The pipeline of Crawssembly Source -> Tarball -> Github -> CPM -> craw pkg install -> executestd functions!"}, {"post_id": 22937, "ts": "2026-07-05T16:19:57Z", "hours": 0.6922, "text": "I forgot to add on the hackatime projects of my time spent on the CPM and tests, mb"}, {"post_id": 22902, "ts": "2026-07-05T15:21:06Z", "hours": 4.3764, "text": "I’ve registered the Crawssembly Package Manager website, some SQLite problems caused some issues but I’m getting there."}, {"post_id": 22103, "ts": "2026-07-04T11:47:12Z", "hours": 0.8486, "text": "I’ve been having some internet issues with my server recently, so my productivity has slowed. However I’m at the final testing stages of linking github repos to get craw install <package> to work. The test is done on a simple repo but it should be enough to see if it works"}, {"post_id": 22080, "ts": "2026-07-04T10:27:02Z", "hours": 1.33, "text": "Compiling from a local tarball works! I’ll be working on the database soon so users can search and download. My plan is that the program is stored as a github repo, similar to cargo ."}, {"post_id": 21459, "ts": "2026-07-03T12:44:46Z", "hours": 2.6692, "text": "Package manager is coming along… slowly. I’m still working on getting a local package to install into the global executestd file inside the home folder, but it’s taking it’s time!"}, {"post_id": 21375, "ts": "2026-07-03T08:43:14Z", "hours": 2.1081, "text": "v1.2.0 is already underway! I’ve spent some time constructing a cargo crate for Crawssembly to allow other rust programs to use Crawssembly’s logic. So now YOU can add Crawssembly to your programs!"}, {"post_id": 20935, "ts": "2026-07-02T17:47:58Z", "hours": 4.0467, "text": "After helping figure out the Stardance bug with projects, Crawssembly v1.1.0 is ready to ship!"}, {"post_id": 20147, "ts": "2026-07-01T18:08:54Z", "hours": 1.3117, "text": "I’ve added the compare branch, for number checks. == , != , > , >= , < , and <= all included"}, {"post_id": 20079, "ts": "2026-07-01T16:25:10Z", "hours": 1.3397, "text": "I’ve added more CSL files, such as math/power.craw , math/abs.craw , and math/modulo.craw"}, {"post_id": 19299, "ts": "2026-06-30T15:54:10Z", "hours": 1.4808, "text": "Basic multiplication and division are the first to enter the CSL! I focused on making them memory efficient rather than time efficient, because using fewer registers makes it easier for beginners to use them in normal programs. And because Crawssembly is very very quick (Almost C level speeds) a couple extra thousand ticks won’t be missed for these first programs"}, {"post_id": 19219, "ts": "2026-06-30T14:16:39Z", "hours": 1.9419, "text": "File execution is now working! You can insert programs using execute path/to/program.craw , this leads to the Crawssembly Standard Library, a collection of useful programs that can be accessed using executestd program.craw , such as multiply or division code."}, {"post_id": 19106, "ts": "2026-06-30T10:40:13Z", "hours": 1.1736, "text": "I’m going to confess here, I was a bit lazy. I decided that, because I could create the time program, I rewarded myself by adding a native ISO 8601 time output command io text iso rXX . Elegant? Yes. Low-Level? Not as much as I would like. But the choice was either make a single line of code to simplify programs like this massively, or wire in a tediously made, messy 350 line program that doesn’t fully account for the 400 leap year rule or leap seconds. Hmm… TLDR; I caved to simplicity. But CrawFS file listing from boot now display file genesis time!"}, {"post_id": 18658, "ts": "2026-06-29T20:58:53Z", "hours": 1.0361, "text": "The time program finally works! I wrapped it in a loop so it reloads every 200ms to make a real-time clock. Soon I’ll port it to the CrawFS system to read file creation dates"}, {"post_id": 18592, "ts": "2026-06-29T19:40:11Z", "hours": 4.485, "text": "It turns out that time resolution is much harder than I thought! It’s taken me a while but I’ve got the program working for CCYY-MM-DD"}, {"post_id": 18335, "ts": "2026-06-29T13:20:35Z", "hours": 3.6708, "text": "CrawFS reading is almost done, but I need to program a way to take a raw Unix timestamp and convert it into a nice iso 8601 format ( CCYY-MM-DD HH:MM:SS ) for the ‘Time created’ field"}, {"post_id": 17965, "ts": "2026-06-28T22:33:13Z", "hours": 1.9408, "text": "Reading a specific file is clearly much harder than reading the boot sector. It turns out that parsing user input is a devious task itself!"}, {"post_id": 17863, "ts": "2026-06-28T20:03:06Z", "hours": 6.4758, "text": "Did someone say boot sectors? That’s right, Crawssembly can now read CrawFS boot sectors and output the file table data! This took a surprisingly long time, as the binary boot sector is very delicate."}, {"post_id": 17529, "ts": "2026-06-28T10:56:52Z", "hours": 2.0917, "text": "I’ve been working on a basic file system, CrawFS , used as a stepping stone towards real ones like FAT16 , FAT32 , and NTFS ."}, {"post_id": 16918, "ts": "2026-06-27T14:08:58Z", "hours": 1.6475, "text": "No time to waste after v1.0.0 is released! I’ve added raw disk sector editing for Crawssembly; an opt-in way of reading and writing to your real disk, rather than a VM. ! THIS COULD DESTROY YOUR COMPUTER ! So only do it if you know what you’re doing, as a single bit change will probably brick your entire machine if you use the --raw-disk option"}, {"post_id": 16497, "ts": "2026-06-26T20:53:01Z", "hours": 0.2767, "text": "The final updates have been made, the github is ready to ship!"}, {"post_id": 16387, "ts": "2026-06-26T17:43:02Z", "hours": 0.4742, "text": "THIS IS IT! The moment I’ve been waiting for almost a year, the first stable release of Crawssembly v1.0.0 ! And what fortune that I get to share it with you people on Stardance!"}, {"post_id": 16247, "ts": "2026-06-26T11:58:09Z", "hours": 2.7383, "text": "Crawssembly is soon to be shipped on version 1.0.0 ! A massive milestone for a project I started ~11 months ago. The raffle discs have been burned, and final preparations are underway for release."}, {"post_id": 15925, "ts": "2026-06-25T21:28:53Z", "hours": 2.8969, "text": "Basic syntax highlighting for nano ! Simply run craw install-nano to gain access to these beautiful new colours when editing .craw files."}, {"post_id": 15761, "ts": "2026-06-25T17:09:48Z", "hours": 3.3403, "text": "RAFFLE UPDATE! The 3 discs have been completed. Soon, Crawssembly will be shipped on it’s first release! Remember to follow Crawssembly before the 1st July 00:00 UTC for your chance to win one of these beautiful pieces of computing history!"}, {"post_id": 15622, "ts": "2026-06-25T12:32:33Z", "hours": 2.0561, "text": "I’ve been working on fixing up the activities in the README.md, and providing possible solutions for each. The image below is a possible output of the activity “Smiling Screen”"}, {"post_id": 15555, "ts": "2026-06-25T09:06:54Z", "hours": 0.6672, "text": "Adding the last features for pong was quite simple, making the computer lag behind a random amount utilises the current millisecond UNIX timestamp, with the least significant 2 bits being used as the ‘reaction time’, along with a per-frame flag to increase this reaction time to solve for repeating loops. The scoring system at this point is just the number of pixels in the top corner, unlike the real pong which used numbers. Perhaps for a later version?"}, {"post_id": 15542, "ts": "2026-06-25T08:21:44Z", "hours": 6.6775, "text": "PONG is very almost finished, all that needs to be done is to fine-tune the computer movement and finish displaying the score."}, {"post_id": 15086, "ts": "2026-06-24T14:51:07Z", "hours": 1.7008, "text": "I’m now moving onto some game examples. I’m working on a basic version of the popular game PONG, the hardest part is going to be the graphics syncing up with the mathematical logic"}, {"post_id": 14404, "ts": "2026-06-23T14:59:26Z", "hours": 1.9525, "text": "The structure of the compiler is complete, but getting it to work is another beast of debugging. I think this is the first program of its kind; the first program where no one, not even me, can understand it fully. A true milestone for Crawssembly"}, {"post_id": 14331, "ts": "2026-06-23T12:57:06Z", "hours": 3.1389, "text": "Integer parsing requires multiplication by 10, which in Base-10 is easy as you can just add a zero at the end. But in binary you can’t do this, as that would be multiplying by 2. So you need to get a bit more creative when multiplying by a known amount in binary. The code below shows how a number, ‘abc’ can be expressed as 100a + 10b + c. This is real code from my Crawssembly compiler written in Crawssembly."}, {"post_id": 13936, "ts": "2026-06-22T21:21:17Z", "hours": 2.0808, "text": "I’ve done a little experiment with a reduced branch of Crawssembly made for tiny ISA’s, with instructions only a single byte wide! An image of what the CPU’s core might look like is shown below."}, {"post_id": 13603, "ts": "2026-06-22T09:14:02Z", "hours": 5.5197, "text": "The trie is complete! Although I’ve still much to do for the compiler, such as per-character parsing, storage of label elements, calculation of register codes, etc…"}, {"post_id": 12777, "ts": "2026-06-20T21:47:41Z", "hours": 1.7731, "text": "7/24 trie branches have been added to the compiler, totalling just under 1000 lines of Crawssembly code, the longest hand-written .craw program ever made!"}, {"post_id": 12486, "ts": "2026-06-20T12:09:00Z", "hours": 6.3061, "text": "Adding branches still takes a while, but it’s much more efficient than testing every character for every instruction. So far I’ve mapped 17 out of ~64 command strings."}, {"post_id": 12022, "ts": "2026-06-19T16:40:42Z", "hours": 7.6139, "text": "I’ll be taking a break over the weekend, as I’ve just completed my final exams and I’m celebrating. I’ll be back proper on Monday. Today I worked on creating a trie for Crawssembly’s commands, which can be used to increase efficiency in my compiler to parse instructions faster. Rather than checking every char for every instruction like cal add -65 r01 ; if r01 = 65, this will be 0 ifz 10 ; continue if 0 cal add -70 r02 ; if r02 = 65, this will be 0 ifz 20 ; continue if 0 etc... I can split each branch into separate instructions, reducing line count and time-to-compile"}, {"post_id": 11550, "ts": "2026-06-18T20:54:02Z", "hours": 1.8203, "text": "Basic structures are coming together for the compiler"}, {"post_id": 11465, "ts": "2026-06-18T18:55:47Z", "hours": 3.2833, "text": "The C emitter function now works to the same standard as Crawssembly Online! In other news, I’m starting to write a Crawssembly compiler in Crawssembly ! This is a big step and proves that Crawssembly’s language is comprehensive enough to take on this task."}, {"post_id": 11201, "ts": "2026-06-18T10:23:03Z", "hours": 4.2258, "text": "I’m working on a way to convert Crawssembly into native ASM language, by writing to a C file and compiling that output."}, {"post_id": 9958, "ts": "2026-06-16T14:20:14Z", "hours": 0.7653, "text": "ATTENTION! The moment has arrived; The CRAWSSEMBLY Raffle! Get the chance to win a LIMITED-EDITION installer and collectable Crawssembly Disc! The disc contains the official compiler, virtual machine, and documentation. Also included are un-released legacy files from development. Simply follow Crawssembly on Stardance to enter your name! Shipping may vary depending on the UK Postal service. There are 3 physical First Edition discs available worldwide. If you’re outside the UK, I may ask you to contribute towards postage if shipping costs are high. The 3 winners will be announced on the 1st of July! So get your entry in before 23:59 UTC 30th June! Don’t miss this opportunity! Follow Crawssembly today and support open-source learning!"}, {"post_id": 9903, "ts": "2026-06-16T12:33:41Z", "hours": 0.4594, "text": "I want to thank the Stardance devs for my Super Star tag! Peak staff fr"}, {"post_id": 9210, "ts": "2026-06-15T13:50:37Z", "hours": 1.9831, "text": "Random number generator has been added to the example group, I used XOR and bit shifts with the new command io time milli , which extracts the current UNIX timestamp in milliseconds, as the seed. Basic, but quite random from a human perspective."}, {"post_id": 9153, "ts": "2026-06-15T10:18:06Z", "hours": 5.0008, "text": "I’ve been working on some examples, the biggest one being a simple calculator."}, {"post_id": 8769, "ts": "2026-06-14T16:05:49Z", "hours": 2.1869, "text": "Graphics bug fixed! Crawssembly for macOS is officially working!"}, {"post_id": 8694, "ts": "2026-06-14T13:21:09Z", "hours": 0.2944, "text": "File input now works for macOS Crawssembly! Run craw myprogram.craw --file myinputs.file to run! (The image is from Linux, not from my Mac because it’s too old for me to log in to stardance and post a ss from it, but I can assure you it works!)"}, {"post_id": 8685, "ts": "2026-06-14T13:00:13Z", "hours": 1.8931, "text": "macOS can now do everything windows can except use the speakers, scan-line free graphics, and access files. These will be the largest source of my time."}, {"post_id": 8634, "ts": "2026-06-14T11:02:36Z", "hours": 1.2475, "text": "I’m currently working on getting macOS support running. At the moment, macOS is only confirmed to work to the same level as Crawssembly Online. Hopefully I can get it to the same standard as Linux and Dos systems!"}, {"post_id": 8214, "ts": "2026-06-13T17:40:18Z", "hours": 1.2083, "text": "My respect to real CPU designers, this is tricky work! The most difficult thing is working with the 256 different registers, that’s lots of wiring to get done."}, {"post_id": 8022, "ts": "2026-06-13T11:56:22Z", "hours": 0.4569, "text": "Dedicated documentation website created, and the new demo is live at https://crawssembly.ultimatecraw.xyz/"}, {"post_id": 8011, "ts": "2026-06-13T11:23:53Z", "hours": 0.9736, "text": "Demo and README in working order, for real this time! The final things to do before shipping: Full macOS functionality: Maybe Add documentation to demo: Yes Add syntax highlighting to demo: Maybe Final Cleanup: Yes"}, {"post_id": 7748, "ts": "2026-06-12T22:53:22Z", "hours": 0.7378, "text": "I don’t usually work with frontend, so the demo won’t look anywhere near as nice as some of the other projects on Stardance, but as long as it’s usable then I’m happy."}, {"post_id": 7722, "ts": "2026-06-12T21:43:33Z", "hours": 0.8628, "text": "Crawssembly demo now working! Luckily it wasn’t as hard as I expected. I’ve tied it to an old URL for now, and it’s basic, but it works. https://demo.ultimatecraw.xyz/"}, {"post_id": 7681, "ts": "2026-06-12T20:38:11Z", "hours": 4.555, "text": "README.md Complete! The final steps is creating the demo! (And maybe getting MacOS working)"}, {"post_id": 7517, "ts": "2026-06-12T15:35:42Z", "hours": 2.0622, "text": "Many thanks to Koy Camerini-Yachdav , who tested Crawssembly on Mac OS! Their efforts go towards helping more people understand how computers actually work. ❤️ In other news, Crawssembly is soon ready for the first official release. I estimate <2 weeks before a ship fully working on both Linux and Windows systems will be made!"}, {"post_id": 7381, "ts": "2026-06-12T09:39:51Z", "hours": 0.5978, "text": "File inputs are finally ready, I think craw now has all it needs for the first release. Exciting times!"}, {"post_id": 7124, "ts": "2026-06-11T22:07:29Z", "hours": 2.2083, "text": "README.md now has documentation about all commands that will be in the first release. I’m yet to make the live demo and the documentation about machine codes though!"}, {"post_id": 7034, "ts": "2026-06-11T19:54:59Z", "hours": 3.0742, "text": "Crawssembly Programs can now be force-quit by pressing CRTL+C. I should have added this long ago, but I added it in the end."}, {"post_id": 6771, "ts": "2026-06-11T10:45:07Z", "hours": 5.2019, "text": "I’ve been doing some user testing, and have made changes to the documentation and program, such as adding craw myfile.craw --dump-decoded and craw myfile.craw --tui commands easy to use and run."}, {"post_id": 6180, "ts": "2026-06-10T11:48:41Z", "hours": 21.6656, "text": "Dynamic graphic size achieved! You can now set the screen size of the Crawssembly program by running craw myfile.craw --screen WIDTHxHEIGHT using the –screen argument."}, {"post_id": 5582, "ts": "2026-06-09T13:09:25Z", "hours": 4.1789, "text": "README.md now contains enough information about Crawssembly to make it Turing Complete. The rest involves storage, input devices, and output service commands."}, {"post_id": 5471, "ts": "2026-06-09T08:19:39Z", "hours": 0.3619, "text": "Crawssembly is officially clear for Windows & Linux OS releases! Mac OS support will hopefully come soon. There may be some linux distros that are special and cause some weird and wonderful problems, but for the generic versions (Think Ubuntu) I’m confident that Crawssembly is compatible."}, {"post_id": 5456, "ts": "2026-06-09T07:45:58Z", "hours": 4.5339, "text": "Never understood what binary actually is? Why is it important, and why are binary skills becoming less important? All this, and more, is revealed in the Crawssembly Project; the ultimate guide to learning the fundamentals of real computer design, and assembly-like languages."}, {"post_id": 4930, "ts": "2026-06-08T15:11:03Z", "hours": 3.2828, "text": "More work done on the docs today. I’m assuming near-zero knowledge about computing to allow all to access the Crawssembly Project"}, {"post_id": 4319, "ts": "2026-06-07T16:05:58Z", "hours": 3.4303, "text": "Most of my efforts today are going to the README.md file, helping beginners get their heads around Assembly-like languages"}, {"post_id": 3567, "ts": "2026-06-06T15:47:13Z", "hours": 1.5453, "text": "Currently working on adding logical branching (‘if’ statements) to CRISP, my high-level language to compile into Crawssembly"}, {"post_id": 2869, "ts": "2026-06-05T18:56:50Z", "hours": 0.5139, "text": "Crawssembly - Initial Post"}]...
|
Title: Crawssembly by @The_Craw | Stardance
Devlo Title: Crawssembly by @The_Craw | Stardance
Devlogs:
Crawssembly - Initial Post
Currently working on adding logical branching (‘if’ statements) to CRISP, my high-level language to compile into Crawssembly
Most of my efforts today are going to the README.md file, helping beginners get their heads around Assembly-like languages
More work done on the docs today. I’m assuming near-zero knowledge about computing to allow all to access the Crawssembly Project
Never understood what binary actually is? Why is it important, and why are binary skills becoming less important? All this, and more, is revealed in the Crawssembly Project; the ultimate guide to learning the fundamentals of real computer design, and assembly-like languages.
Crawssembly is officially clear for Windows & Linux OS releases! Mac OS support will hopefully come soon. There may be some linux distros that are special and cause some weird and wonderful problems, but for the generic versions (Think Ubuntu) I’m confident that Crawssembly is compatible.
README.md now contains enough information about Crawssembly to make it Turing Complete. The rest involves storage, input devices, and output service commands.
Dynamic graphic size achieved! You can now set the screen size of the Crawssembly program by running craw myfile.craw --screen WIDTHxHEIGHT using the –screen argument.
I’ve been doing some user testing, and have made changes to the documentation and program, such as adding craw myfile.craw --dump-decoded and craw myfile.craw --tui commands easy to use and run.
Crawssembly Programs can now be force-quit by pressing CRTL+C. I should have added this long ago, but I added it in the end.
README.md now has documentation about all commands that will be in the first release. I’m yet to make the live demo and the documentation about machine codes though!
File inputs are finally ready, I think craw now has all it needs for the first release. Exciting times!
Many thanks to Koy Camerini-Yachdav , who tested Crawssembly on Mac OS! Their efforts go towards helping more people understand how computers actually work. ❤️ In other news, Crawssembly is soon ready for the first official release. I estimate <2 weeks before a ship fully working on both Linux and Windows systems will be made!
README.md Complete! The final steps is creating the demo! (And maybe getting MacOS working)
Crawssembly demo now working! Luckily it wasn’t as hard as I expected. I’ve tied it to an old URL for now, and it’s basic, but it works. https://demo.ultimatecraw.xyz/
I don’t usually work with frontend, so the demo won’t look anywhere near as nice as some of the other projects on Stardance, but as long as it’s usable then I’m happy.
Demo and README in working order, for real this time! The final things to do before shipping: Full macOS functionality: Maybe Add documentation to demo: Yes Add syntax highlighting to demo: Maybe Final Cleanup: Yes
Dedicated documentation website created, and the new demo is live at https://crawssembly.ultimatecraw.xyz/
My respect to real CPU designers, this is tricky work! The most difficult thing is working with the 256 different registers, that’s lots of wiring to get done.
I’m currently working on getting macOS support running. At the moment, macOS is only confirmed to work to the same level as Crawssembly Online. Hopefully I can get it to the same standard as Linux and Dos systems!
macOS can now do everything windows can except use the speakers, scan-line free graphics, and access files. These will be the largest source of my time.
File input now works for macOS Crawssembly! Run craw myprogram.craw --file myinputs.file to run! (The image is from Linux, not from my Mac because it’s too old for me to log in to stardance and post a ss from it, but I can assure you it works!)
Graphics bug fixed! Crawssembly for macOS is officially working!
I’ve been working on some examples, the biggest one being a simple calculator.
Random number generator has been added to the example group, I used XOR and bit shifts with the new command io time milli , which extracts the current UNIX timestamp in milliseconds, as the seed. Basic, but quite random from a human perspective.
I want to thank the Stardance devs for my Super Star tag! Peak staff fr
ATTENTION! The moment has arrived; The CRAWSSEMBLY Raffle! Get the chance to win a LIMITED-EDITION installer and collectable Crawssembly Disc! The disc contains the official compiler, virtual machine, and documentation. Also included are un-released legacy files from development. Simply follow Crawssembly on Stardance to enter your name! Shipping may vary depending on the UK Postal service. There are 3 physical First Edition discs available worldwide. If you’re outside the UK, I may ask you to contribute towards postage if shipping costs are high. The 3 winners will be announced on the 1st of July! So get your entry in before 23:59 UTC 30th June! Don’t miss this opportunity! Follow Crawssembly today and support open-source learning!
I’m working on a way to convert Crawssembly into native ASM language, by writing to a C file and compiling that output.
The C emitter function now works to the same standard as Crawssembly Online! In other news, I’m starting to write a Crawssembly compiler in Crawssembly ! This is a big step and proves that Crawssembly’s language is comprehensive enough to take on this task.
Basic structures are coming together for the compiler
I’ll be taking a break over the weekend, as I’ve just completed my final exams and I’m celebrating. I’ll be back proper on Monday. Today I worked on creating a trie for Crawssembly’s commands, which can be used to increase efficiency in my compiler to parse instructions faster. Rather than checking every char for every instruction like cal add -65 r01 ; if r01 = 65, this will be 0 ifz 10 ; continue if 0 cal add -70 r02 ; if r02 = 65, this will be 0 ifz 20 ; continue if 0 etc... I can split each branch into separate instructions, reducing line count and time-to-compile
Adding branches still takes a while, but it’s much more efficient than testing every character for every instruction. So far I’ve mapped 17 out of ~64 command strings.
7/24 trie branches have been added to the compiler, totalling just under 1000 lines of Crawssembly code, the longest hand-written .craw program ever made!
The trie is complete! Although I’ve still much to do for the compiler, such as per-character parsing, storage of label elements, calculation of register codes, etc…
I’ve done a little experiment with a reduced branch of Crawssembly made for tiny ISA’s, with instructions only a single byte wide! An image of what the CPU’s core might look like is shown below.
Integer parsing requires multiplication by 10, which in Base-10 is easy as you can just add a zero at the end. But in binary you can’t do this, as that would be multiplying by 2. So you need to get a bit more creative when multiplying by a known amount in binary. The code below shows how a number, ‘abc’ can be expressed as 100a + 10b + c. This is real code from my Crawssembly compiler written in Crawssembly.
The structure of the compiler is complete, but getting it to work is another beast of debugging. I think this is the first program of its kind; the first program where no one, not even me, can understand it fully. A true milestone for Crawssembly
I’m now moving onto some game examples. I’m working on a basic version of the popular game PONG, the hardest part is going to be the graphics syncing up with the mathematical logic
PONG is very almost finished, all that needs to be done is to fine-tune the computer movement and finish displaying the score.
Adding the last features for pong was quite simple, making the computer lag behind a random amount utilises the current millisecond UNIX timestamp, with the least significant 2 bits being used as the ‘reaction time’, along with a per-frame flag to increase this reaction time to solve for repeating loops. The scoring system at this point is just the number of pixels in the top corner, unlike the real pong which used numbers. Perhaps for a later version?
I’ve been working on fixing up the activities in the README.md, and providing possible solutions for each. The image below is a possible output of the activity “Smiling Screen”
RAFFLE UPDATE! The 3 discs have been completed. Soon, Crawssembly will be shipped on it’s first release! Remember to follow Crawssembly before the 1st July 00:00 UTC for your chance to win one of these beautiful pieces of computing history!
Basic syntax highlighting for nano ! Simply run craw install-nano to gain access to these beautiful new colours when editing .craw files.
Crawssembly is soon to be shipped on version 1.0.0 ! A massive milestone for a project I started ~11 months ago. The raffle discs have been burned, and final preparations are underway for release.
THIS IS IT! The moment I’ve been waiting for almost a year, the first stable release of Crawssembly v1.0.0 ! And what fortune that I get to share it with you people on Stardance!
The final updates have been made, the github is ready to ship!
No time to waste after v1.0.0 is released! I’ve added raw disk sector editing for Crawssembly; an opt-in way of reading and writing to your real disk, rather than a VM. ! THIS COULD DESTROY YOUR COMPUTER ! So only do it if you know what you’re doing, as a single bit change will probably brick your entire machine if you use the --raw-disk option
I’ve been working on a basic file system, CrawFS , used as a stepping stone towards real ones like FAT16 , FAT32 , and NTFS .
Did someone say boot sectors? That’s right, Crawssembly can now read CrawFS boot sectors and output the file table data! This took a surprisingly long time, as the binary boot sector is very delicate.
Reading a specific file is clearly much harder than reading the boot sector. It turns out that parsing user input is a devious task itself!
CrawFS reading is almost done, but I need to program a way to take a raw Unix timestamp and convert it into a nice iso 8601 format ( CCYY-MM-DD HH:MM:SS ) for the ‘Time created’ field
It turns out that time resolution is much harder than I thought! It’s taken me a while but I’ve got the program working for CCYY-MM-DD
The time program finally works! I wrapped it in a loop so it reloads every 200ms to make a real-time clock. Soon I’ll port it to the CrawFS system to read file creation dates
I’m going to confess here, I was a bit lazy. I decided that, because I could create the time program, I rewarded myself by adding a native ISO 8601 time output command io text iso rXX . Elegant? Yes. Low-Level? Not as much as I would like. But the choice was either make a single line of code to simplify programs like this massively, or wire in a tediously made, messy 350 line program that doesn’t fully account for the 400 leap year rule or leap seconds. Hmm… TLDR; I caved to simplicity. But CrawFS file listing from boot now display file genesis time!
File execution is now working! You can insert programs using execute path/to/program.craw , this leads to the Crawssembly Standard Library, a collection of useful programs that can be accessed using executestd program.craw , such as multiply or division code.
Basic multiplication and division are the first to enter the CSL! I focused on making them memory efficient rather than time efficient, because using fewer registers makes it easier for beginners to use them in normal programs. And because Crawssembly is very very quick (Almost C level speeds) a couple extra thousand ticks won’t be missed for these first programs
I’ve added more CSL files, such as math/power.craw , math/abs.craw , and math/modulo.craw
I’ve added the compare branch, for number checks. == , != , > , >= , < , and <= all included
After helping figure out the Stardance bug with projects, Crawssembly v1.1.0 is ready to ship!
v1.2.0 is already underway! I’ve spent some time constructing a cargo crate for Crawssembly to allow other rust programs to use Crawssembly’s logic. So now YOU can add Crawssembly to your programs!
Package manager is coming along… slowly. I’m still working on getting a local package to install into the global executestd file inside the home folder, but it’s taking it’s time!
Compiling from a local tarball works! I’ll be working on the database soon so users can search and download. My plan is that the program is stored as a github repo, similar to cargo .
I’ve been having some internet issues with my server recently, so my productivity has slowed. However I’m at the final testing stages of linking github repos to get craw install <package> to work. The test is done on a simple repo but it should be enough to see if it works
I’ve registered the Crawssembly Package Manager website, some SQLite problems caused some issues but I’m getting there.
I forgot to add on the hackatime projects of my time spent on the CPM and tests, mb
CPM officially works! The pipeline of Crawssembly Source -> Tarball -> Github -> CPM -> craw pkg install -> executestd functions!
My issues at the moment are about getting a command, craw pkg pack to create a CPM ready tarball of your project from the command line. That and my server is having a couple of internet issues at the moment which are hindering my progress. This devlog is also an official announcement that I won’t be as active as normal over the next week. I have family coming around so my time programming will be limited. In addition, when summer holiday starts this will continue, which is why most of my time programming is in the June and early July, the rest of stardance will have fewer updates and less time spent on casm.
I’ve been fighting with my server for a while now, the connection keeps on interrupting. As votes are currently coming in for Crawssembly v1.1.0, I suspect my score will be lower than expected due to the demo and doc websites coming offline randomly.
CPM is being difficult, I’ve gone through multiple iterations now of the craw pkg publish command, but I feel like I’m getting close.
Still not too much progress on CPM, but I’m still confident I can get it working
It turns out I was way closer than I thought! Publishing your own Crawssembly projects is now out of alpha, into beta (Because only I have an API key atm!)
I’m not good at css, but I’m trying to make the CPM website simple and easy to use. It’ll take a while but it’s slowly coming together
I won’t be as active over the next couple of days so don’t expect many updates
Thanks to @Keyboard1000n17 for making the CPM website!
Thinking about user login for the CPM, might implement this soon
Accounts are going to be tricky, more front-end stuff and some complex security back-end is going to make this tricky
Taking a break from CPM to work on some graphics libraries, drawing lines, circles etc…
Circle made 🔥
I’ve been adding line functions at the moment, to be honest it’s harder than the circle! Getting the angles right is the hardest
We have proper line segments working 🔥
The initial line algo only works for the 0-octant, but now my new and improved version works for every line angle!
I’m currently focusing on adding new functions to the screen library, such as rectangles, using the line program as a primitive
67 followers
Added a simple stack library for function calls and other uses, along with some smaller graphics programs such as screen/rectangle_fill.craw This is also my official announcement that I’ll be doing much less programming, due to summer holiday starting now. This is because I can’t program during family time, camping weeks, and other events. In addition, I have University after summer holidays, so this reduced productivity will continue throughout the rest of Stardance. Thank you all for making Crawssembly the number 1 project on stardance!
I realised that my documentation had some issues and unfinished sections, so I touched them up
I’ve been working on a IEEE 754 single precision 32-bit floating point number library for CSL, it turns out it’s more difficult than I expected!
Since IEEE 754 single precision can encode much larger numbers than a standard 32-bit binary number, you can use the library to approximate much larger values for computation
Please also star my actual github page! It’s more important than stardance followers 😤😤 https://github.com/Jonah-Crawford/Crawssembly
I’ve decided to add a heap library to complement the stack library. Doing this should make my next idea easier
Reading user input isn’t that easy compared to a language like Python, where you can just do input() . Each character has to be processed as soon as the keyboard records a press, and then saved to memory. I’m currently working on a block method that takes every 16 character you type, and allocates a small block on the heap for each press. This is going to be used for my big project
Staff, please remove the time on this devlog, I accidentally left nano open all night. Sorry!
I’m going ahead with this schema for heap blocks, the reserved bits can be used for extra features that I might want to add in later versions
I’m still working on stack allocation, the complex parts are walking the stack properly to get the headers, along with making sure I don’t corrupt any data. The image attached shows the maximum heap block size in blue, with the data taken up by the header of that block in red (top corner)
Stack allocation and freeing appear to work, but I need to do more testing to prove it
icl I’ve not done much today, mostly testing the allocation code and it looks up to spec tbh, not much to say
Once you get 1 command working, many more will follow! That’s right, a command line written 100% in Crawssembly code 🔥
I’ve been adding some very basic commands, such as exit , help , and clear
I’ve discovered that the input file mechanism is broken, so that’s great. I’ve also been adding more commands to CrawOS
Hack Club seems to have updated the rules on banner images, claiming it has to be an image of your project working. This is no issue for Crawssembly. The new banner is now the output of one of my programs, creating the banner pixel for pixel. This both compiles with the new rule, as it demonstrates Crawssembly functioning, while maintaining its identity.
I’ve been messing around with --input tag which seems to mess around a bit in the rust vm, but I think I’m getting closer to the cause
The Crawssembly community is real 🙏 I’ve been reviewing a PR on the GitHub to improve the multiplication script in the CSL ( std/math/multiply.craw )
I’ve been back working on CPM, focused on user accounts.
The account page is looking better, and it’s survived some user testing 🙏 I need to add some boring stuff though like API key listing and said key management
Package creation and accounts are now working (theoretically) from the command line 🔥
@imakebloatedcode Thank you for your pr for CPM to include OpenAPI scemata, another great addition from the Craw Systems community Most of my time has been reviewing it and making small edits to include the security auth headers for API keys Official Announcement I’m not going to be online through the 5th August to the 10th August, I’ll be camping for those 5* days in a very low-data spot, and I’m almost certainly not taking my laptop. I might be able to get a tiny amount of code on my phone to keep my streak but certainly not enough to engage in my normal conversation on slack or post devlogs
I’ve added Markdown support for CPM packages 🔥
I’ve made publishing packages super easy now, all you need to do is craw init to create the package, and then craw pkg publish . As long as you’re signed into CPM and gh, it’ll just work
I’ve been working with @BetterClient to inprove the program counter and bringing back fgo from casm beta. This is also a reminder that I’ll be OOO until next Monday.
I’m back from camping! (RIP my 60+ day streak) My plans going forward immediately is improving program counter modifications to allow for higher-level concepts to be bootstrapped onto Crawssembly instruction sets. (Image unrelated)
I’ve merged the new fgo rules to the project, so now fgo points to labels similar to jmp , but fgo 0 now jumps to the label defined in r01 I was having some issues with using git but I got them sorted
I’ve separated the old sleep command into sleepms for millisecond waits and sleepus for microsecond waits. Although, microsecond precision is highly dependent on the OS, so it won’t be as accurate as sleepms for smaller values (Say, n<50)
Sorry for the but it’s been a hectic couple of days. I got into University! I’ve also been busy taking a look at a CGOL implementation, truly amazing stuff! Go check it out: https://github.com/srxcode/game-of-life-crawssembly
I’ve added io keyboard mod to create a bitfield of modification key presses for the keyboard device, so now keys like CTRL and TAB can be handled, which lays the foundation for my next project which is making a basic file editor in casm
Lots of work today, sorry for the . I’ve been struggling with the text editor, heap buffers, cursor allocation, character addresses, etc etc… ad infinitum. However, I’m getting close. Rendering is outputting something, although I don’t know why typing doesn’t seem to add anything…
For some reason, I’ve been banned on slack. I don’t know why, since no one will tell me. This is not good news, but luckily it doesn’t seem to be a stardance-wide ban, so I can still do the hackathon.
Still no clue why characters aren’t being saved to memory in my free heap block Slow day today fr
I’m finally getting somewhere with the editor, however I’m now having issues with character deletion, and adding characters inside empty newlines
stardance
I’ve brought run back from the dead. You can now use run rXX to run a binary value inside the input register as a Crawssembly instruction
I’VE ACTUALLY DONE IT 🔥 Networking is now officially part of Crawssembly. Alpha tests on localhost have all passed
HTTP requests working 🔥 ts is so peak icl
I’ve been doing much more testing and implementing the network device. Specifically testing the following commands: io net ip , io net addr , io net connect , io net socket , io net port , io net listen , io net accept , io net send , io net protocol , io net block , and io net recv .
I’m back! Fraud Squad unbanned me so WE are all having a party at my house Although I can’t use nano apparently anymore… so Crawssembly will be having it’s final ship very very soon
It has come to my attention that not everyone who has followed Crawssembly has starred it on GitHub! Please, if you like my project, star it on GitHub at https://github.com/Jonah-Crawford/Crawssembly Thank you.
idk where these extra hours are coming from, but as long as I don’t ship them, they won’t count towards stardust so I’ll be fine. In the meantime, enjoy craw slop
Ships:
Crawssembly: The beginner’s gateway to low-level thinking. "Programming languages are a lie!" This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.
Crawssembly v1.1.0 ready to ship! “Programming languages are a lie!” This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.
CRAWSSEMBLY - New and Improved! “Programming languages are a lie!” This is Crawssembly, the number 1 project on all of stardance! It’s a project that’s been in production for over a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly. What is new? INTERNET SOCKETS! CRAWOS COMMAND LINES! DYNAMIC LABEL JUMPING! IMPROVED DEVICES! DEDICATED PACKAGE SHARING WEBSITE! AND MORE! Check it out for yourself! (Shipped early due to Fraud Squad limitations, Crawssembly is too powerful for Hack Club)...
|
1792839280.3425412
|
1792925680.3425412
|
|
32703
|
ASTRA by @AustinB | Stardance
|
AustinB
|
0
|
304.57
|
0
|
[]
|
[{"post_id": 80388, "ts": "202 [{"post_id": 80388, "ts": "2026-10-17T14:09:45Z", "hours": 1.2028, "text": "Devlog 29 Made mission planner UI. Starting to get pretty fast at these(although they still look questionable sometimes)"}, {"post_id": 80193, "ts": "2026-10-16T17:22:07Z", "hours": 11.0283, "text": "Devlog 28 OK ive fixed/implemented three major things. 1: camera finally logarithmically zooms and moves in a way that i am happy with. There is only one problem left now, and that is that it cant follow a moving point yet, however this shouldn’t be too bad i hope 2: ive changed my data so that the planets are now aligned with the XY plane(this is not a hardcoded fix so it it still possible to import your own data and it work completely fine) 3: ive made the grid follow the camera(as the camera stays at 0,0 and moves objects around it) and scale logorymetrly too which looks very professional im my opinion Now onto finishing up the misson planning side of this. ive got a ‘working’ state of it atm but it is quite tempramental so we shall seee"}, {"post_id": 79163, "ts": "2026-10-12T20:57:29Z", "hours": 8.3697, "text": "Devlog 27 Yooo Im back. Thank god the deadline has been extended broo. Done mostly boring stuff tbh. Ive begun on working on adding a grid that scales with the camera and im like 60% there. Shaders haven’t really clicked for me yet so im still kinda joining random things to other random things and hoping it looks correct tbh. Also begun work on making the mission planner automatically sort and setup lambart test cases for my solver to solve(ive actually done this already, however its really hard to validate if my resluts are anywhere near correct, they look correct but i have no numerical way of knowing, so ima go with the ignore it untill something else goes wrong and hope its fine idk) devlogs will prolly be focused on fixing the camera movement(zooming is a massive pain as its really hard to know when you want to zoom massivly or small - like you want to be zooming out fast if you want to go between planets, but if you want to go between moons or something its hard:( ) and misson planner aspects of this project for this week or so. So boring devlogs. cant wait till i can finially ship this and you can all have a go."}, {"post_id": 73265, "ts": "2026-09-24T18:18:17Z", "hours": 6.7578, "text": "Devlog 26 yo guys horrible news 😭 ive gone and done it, boken my finger(if for the dumbest reason every too bro). Which means that i generally cannot type anywhere near as fast as usahll. Dw your still gonna get your ushall yap sesh tho. Im hoping that this dosent afect the timeline or anything of my project, but i have been busy. First ive started adding sound effects which are generrally a bigger pain than i thought. But now every button/ui action has an effect. however there is not music/ambiant noise. IDk weather im going to add any music but i think a low rocket engine would be cool(lets pretend you can hear sound in space). Done a bit on the code side, but really most of it has been UI. ive cahnged the hitboxes of the buttons to fit them, which was a pain as i have like 50 at this point. Ive made them hilight when you hover over them and things like that. But one thing im really confused on is when the deadline for this is? Like i got an emial saying oct 31 as they extened it but now theres this think with bukubuks or something and im not sure what that means? if you know can you leave a comment or something pelasee."}, {"post_id": 72384, "ts": "2026-09-22T20:02:52Z", "hours": 3.6989, "text": "Devlog 25 Added a main menu. This was actually a massive pain as i had no like localised start function. So this meant that scripts and objects were doing things they weren’t meant to. So had a minor architectural overhaul. but now it works. Also ive added a way to quit the game too, in both the sim and the main menu. Also yes that it the orion capsule thing, why? Its the only textured model i could find for free. (Kinda, i had to download a 3d print 3mf or something, and i wish i was kidding but spend a few hours a few weeks ago literally assembling the model in unity, so this may just beat garten of banban for the most optimised topology of the year) Only 8 days left and i am so screwed, this entire menu was a massive procrastination from fixing the physics(it keeps slowing down the timestep to like 1e-9 seconds and i cannot figure out why, i have literally almost rewritten my physics at this point and i have had minimal difference - also the cameras bugged as hell when its following a moving object)"}, {"post_id": 71920, "ts": "2026-09-21T19:34:47Z", "hours": 3.3044, "text": "Devlog 24 Ok one section has been finished. Its a small one but its done. This was m first time working with files and making documents so icl the code is like 85% spaghetti unassisted mess, but it works. It allows you to export data for planets/moons that you want in either JSON or CSV format. Also the ui is fully wokring with this one for once. Sorry for the most boring devlog of the year here but their prolly gonna get worse as i start doing more boring things to finish off this project. I promise you tho the final project is gonna so cool so follow me if you want to see it. Omg im tired bro, ive caught whatever is going around at sixth form and i am generally on teh brink of death, generally json/csv files may be the most boring thing possible to do this felt like so much more than 3h. Anyway see you next devlog. (sorry for boring picture, this is pretty much all code tbh)"}, {"post_id": 71473, "ts": "2026-09-20T21:51:20Z", "hours": 7.6158, "text": "Devlog 23 Yo short one today as its 10 45 atm and i have homework for tmorro 😭. This had been a bit of everything today so im just gonna list it out. 1: fleshoed out the help menues 2: made the info chip work(bottom right), im really porud of this one as it usesa que system so you can just keep on adding notifications/warnings and it will show them all (fun fact this is the only thign so far that has worked first try so thats why i love it so much) 3: started adding a way to export the data (so far ive only gone as far as making ui and auto generating teh directory) 4: almost fixed the camera controller(this is so close to working, but ive spend like 3h on it already so im not touching it for a bit) 5: a few other code things only 10 days left now 😬, so i need to be finishes up features pretty soon (im hoping to get the mission planning element of this findied by the weekend/sunday, and then spend the rest of the time making it presentable and usable)"}, {"post_id": 70632, "ts": "2026-09-19T14:16:58Z", "hours": 12.4422, "text": "Devlog 22 Yooo. Things are looking up. Ive implemented the lambert solver fully so you can do a controlled burn to jump orbits (shown in the vid below). And ive managed to add in accurate date/time tracking at the bottom of the screen (however there are a few bugs that you will defiantly be able to spot). Only 11 days till this needs to be done and i have much more than 11 worth of things i need to do(and im already skipping out on alot of stuff for my A-levels for this so once i finished this ive got about 3 weeks of stuff to relearn 😭). I think im going to get the physics and spacecraft stuff done within like 4 days i hope and just do quality stuff from then. One thing though, optimisation has not gone as well as i had hoped (topping out at about 20 fps on my laptop, so if you have a decent pc that has a gpu with more than like 5 cores you would prolly be fine but idk yet), but i am hoping to get this running on my laptop at a usable rate. but we shall see. Also like the post 🙏🙏. Last thing, in the vid the sim speed up and down, it wont do that in the build i just got impatient and manually forced it to go faster 😭. Last last thing, you can move the camera, i just didn’t in this vid."}, {"post_id": 66565, "ts": "2026-09-12T12:25:21Z", "hours": 6.6917, "text": "Devlog 21 Its been a while (18 days), but its been a pretty busy two weeks tbh (A-Levels started on the 4th and ive got 4 to worry about 😬😭). But i have done a bit of progress. Ive managed to implement a fully working lambert solver into the project, you can pick two objects and a time of flight and boom you get a start/end velocity . If you depart from your body at the specific velocity that you can calculated then after your set time you will be at your target destination - kinda. This is a very simple algorithm that only accounts for the sun’s mass(sometimes) and the two points you want to reach, so there can be ‘noise’ from other planets and gravitational fields that can cause drift. How am i gonana fix this? Idk this is only the first layer of the misson planner so maybe it will go away once i add course correction using my already implemented IAS15 solver 🙏🙏. Also i have added in the orion crew modle as my first spacecraft (this is going to be theoretical misson planneing so the modle is really only for looks, as there i no way i can get anything remotly close to something like ksp, nor do i want to, this is more of a ‘is this possible and if ti is what path should i take’ kina misson planner yk?) idk. Delogs may speedup or slow down depending on how school goes tbh, i really want to get this done by sep 30th so i may have to sacifice some ui deicision and posilse to get it working. so be nice when u guys take a look at it please 🙏🙏🙏🙏🙏🙏🙏."}, {"post_id": 54383, "ts": "2026-08-25T11:20:56Z", "hours": 7.5542, "text": "Devlog 20 OK added a new feature. So atm my code on startup was taking the current date and finding the closeted date that i have provided data for(pos/vel). This was working fine but if you wanted to jump from now to next year you would have to have waited ages. So ive fixed that. This is also the fist ui i’ve made entirely in unity instead o figma, and i wont lie i really like how it looks. But as you can see the ui took 7h to get fully working (i hate ui so much dude 😭) there was like a bajillion edge cases and flags and things i needed to setup, not fun tbh. But im really proud of how it works and looks. Up next is not optimisation😭, im gonna start looking into implementing a lambert solver and a bacis spacecraft controller as this project is going to turn into a mission planner hopefully very soon (i hope, sep 30th is too close bro)"}, {"post_id": 52255, "ts": "2026-08-22T11:00:52Z", "hours": 11.1983, "text": "Devlog 19 Optimise❌. Add and fix features ✅. Yup more procrasonation, but i have a massive list of changes. The planet Preview in the UI no longer shows missing textures when there is no texture for the object, this is done with a deterministic shader i made using the moons id to color it in game and in the UI. I’ve added a taskbar at the top that i’m really proud of tbh, its easily expandable and easy to use now Fixed the labelling issue with the moons, as unused labels were not being dealt with correctly and would just stay on screen(this was actually a massive pain to do 😭) +50 other small anoying fixes What i still need to do tho is fix the fittery nature of the orbits, its because the orbits update their position before the camera updates its world position(the cameras stays at 0, 0 and a script updates the positions of everything within range accordingly, however this code runs at the start of the frame and the camera updates at the end, this shouldn’t be a difficult fix but i remember coding the camera to update late in the frame for a reason so this may be harder than i think)"}, {"post_id": 49827, "ts": "2026-08-18T19:36:16Z", "hours": 10.0983, "text": "Devlog 18 ITS WOKRING. Ive attached a vid below(sorry for quality idk why its like that) and i will admit there are a few issues. Main one rn is optimisation, however that should be fine this is all being run on one thread and there are like 5 separate opportunities for parrailation, im not too worried about that. However, ive encountered one issue, in this i have forced the simulation to run faster than it wants to. The integrator i am using has a dynamic time step, so if two objects get close or get to fast the simulation slows down to more accurately simulate this. For the last few days my timestep ahs been stuck at 10^-9 of a second 😭, i have manged to fix this a small amount but i think the problem is in my data. Atm i have ~100 objs and i only just realise that i have two asteroids in a binary orbit within 2500km of each other, which is almost certainly causing the issue. idk what to do tbh, i think my only option woul be to delete one fo them from the data(not too hard if im being honest), but ima do a final check tomorro. but apart from that im so happy i finally got a semi working project now."}, {"post_id": 48808, "ts": "2026-08-17T10:53:59Z", "hours": 10.0875, "text": "Devlog 17 Major update, physics is working. However it is 100% wrong atm, marse flyes out of the system at supersonic speeds and neputne starts to fall towards the sun(pic below😭). I have no idea what could be causing this as i have spend so long looking at the code. I was hoping i would have this finished much faster than this tbh but yeah. My best guess is a div by zero or a verry small number causeing problems, but that can only happen if there are two bodys extreemly close together so idk. Anyways I hopw to get this fixed within the week so i can finnaly start working on what i want to work on(like this was meant to be the easy first step of waht i want)."}, {"post_id": 47055, "ts": "2026-08-14T17:38:50Z", "hours": 10.5603, "text": "Devlog 16 Ok, physics is fully implemented, kinda. Ive got the logic down, but i haven’t managed to simulate even one step yet 😬. Theres like 20 reasons why, but the majority of them are NaNs so far which suprised me tbh. After a while i gave up and began working on the UI a bit more, it only took me a hour or two to setup but i think it looks good, you are able to input the wanted speed of the sim, and eventually it will show you the speed its running at (as the integrator i am implementing does not take uniform steps and adapts its step size the simulation speed will fluctuate like 100%). But i think tomorrow or atleast in the next few days the physics will be working, as i can feel that it is so close. but once this is done i can finally move onto the thing that im much more well researched in, mission planning(more in the projects bio if you want to see what i mean)"}, {"post_id": 45958, "ts": "2026-08-12T19:39:33Z", "hours": 6.8783, "text": "Devlog 15 Did it, i’ve managed to get the labels to work. There are still a few visual things i want to fix (like they look horrible atm). And they dont resent properly yet, however ik why its just gonna be a pain to fix. I think ima decrease the font size a bit and add some deterministic colors? But one thing is that you can click on these labels like you can with the much eaiser to code planet ones and it will show you a popup of the object/calc its kep data and allow you to fly to it automatically which im pretty proud of."}, {"post_id": 45142, "ts": "2026-08-11T13:21:08Z", "hours": 6.0072, "text": "Devlog 14 Ok still putting off physics atm, butttt ive done some stuff. Ive done a bit of optimisation, like ive split up the rendering into layers, so there a camera that renders the background, there a cam that renders the planets and a cam that renders the orbits. Because of this i can have separate scales for each camera, so whist the planets/moons are scaled down by 10000x, the orbits are done by 10000000x. meaning i can reader eve pluto in a single frame with a semi useable clipping plane. Ive also made it so you can click on a planet and it will automatically update everything, which i have been wanting to do for ages as i now do not need to use the inspector anymore to update what planet we are looking at. However there is still one issue, this only works for the 9 objects that have a dedicated label, the other 100 moons/asteroids are innecesable. I want to make it so once you zoom far in enough to a moon its label will show, however for planets like jupiter they will all overlap and look bad, but i dont really want to add anymore overhead to the UI rn and idk what to do, like if you have two that overlap which one do you hide? But hopefully once i finally decide to finish the IAS15 ill move onto phase 2 which is implementing mission planning(this is what im better at so it should hopefully pick up soon). Also one thing do the orbits look better when their full or when they taper off? I prefer full but idk"}, {"post_id": 43976, "ts": "2026-08-09T13:33:24Z", "hours": 9.6619, "text": "Devlog 13 Ok major update. I have managed to implement thee and a half things rn. 1: the UI is fully working and scales and moves with the window if you resize it. 2: the Ui calculates the keplarna elements of any body using no hardcoaded info. 3: i am able to use these elements to do a crude simulation of one orbit allowing me to visulise the orbits. 3.5: I half implemented IAS15 got stuck and decided to do steps 1-3. However as you can see its running at 39 fps which is just not going to happen. Annoyngly my code only takes up like 2ms however the way i have set it up means the camera is incredibly resource intetive(i had an issue with not being able to see the orbits so i just made the clipping plane of the camera a stupidly large number. I think theres a way to make a Ui shader or smthin to visulise the orbits, however i aint that smart and i hate hlsl so much bro 😭) If i made the clipping plane smaller and optimised my end a bit i could prolly push this to like 100 as thats where i was at before idk tho."}, {"post_id": 41347, "ts": "2026-08-05T14:36:01Z", "hours": 11.8044, "text": "Devlog 12 Ok, tbh physics hasn’t been too bad so far. Ive spent a few days on it and its almost there, not much to add on that - next devlog or two will be finishing it up and making it multithreaded. In the meantime ive been working on some UI and im pretty proud of it. Like it could be better but its the first Ui ive ever made and it took like 2h to setup so its staying. (whats really cool is that you can change the size of the game window and it will automatically resize itself). However ive run into a weird issue. So for the UI im rendering a preview of the planet. And i have done everything that i can think of to optimise this but this camera is tanking the entire project by about 20-30fps(its worse rn as i have deep profiling on atm) and i have no clue why. Like if you can think of a optimisation ive prolly already done it. But anyways its prolly something simple that i keep on missing. A preview of the porject is below - ignore the numbers about earth they are wrong."}, {"post_id": 39435, "ts": "2026-08-02T11:59:14Z", "hours": 18.6333, "text": "Devlog 11 Ok major update. I’ve rewritten the core code from the base up as I had so many unnecessary lists/arrays/variables etc. Also ive rewritten the camera controller to be smoother and easier to use. Yes this is still procrastination before implementing physics. I promise that in the next devlog I will have the physics working. (or atlest partially)"}, {"post_id": 37901, "ts": "2026-07-30T21:50:46Z", "hours": 9.7206, "text": "Devlog 10 Before I implement physics i decided to procrastonate with optimisations. Good news: its now running at 200fps(used to be like 150ish). Bad news: Ive got to athually implent the physics. Ive been reading up on it and i understand a two body 2d form of IAS15, but ~100 ish body and 3D not so much. So the next few days may just be devlogs of planets moving hopefully where they should. Oh i also started to implent a trail that follows the planets, but its proving diffucult as ‘planet-space’ and ‘world space’ are complete diffrent local tranforms and for some reason i just cant figue out a fast way of converting between them (I have one solution but it does an unnesasay amount of divs per frame, which is eating up processing power that should go to physics). But so far this is it, oh i also added a ring that goes around the planet but ive not got a screenshot of it and im not waiting 5m for unity to open so js imagine rings next to the labels in the same color as the label"}, {"post_id": 37091, "ts": "2026-07-29T15:57:52Z", "hours": 9.5636, "text": "Devlog 9 I finally did it!!! So ive spend the last like week trying to use SPICE data (a fancy way of getting data avout planets like pos, vel ect - and like so much more) in my unity project. Ive managed to write a python script (as there is no good wrapper for C#) that converts the ~10gb of data i have into about 25mb of data i need in my own format(spanning from 2000-2030, i want to update this to 2100, however data for some asteroids only go to 2030). This is absolutely overkill, but so far its the only option i have, but the good news is i can ship the porject with this data and avoid the trouble with trying to compress 10gb of data as there is no way im shipping a project that is 90% useless data. Ive prolly explained what ive done really badly but idk its finally done. (attached below is proof that ive got the data - ignore the horrible color choices and lack of visible planets plz). Next up: implementing IAS15."}, {"post_id": 36017, "ts": "2026-07-27T20:45:28Z", "hours": 11.5667, "text": "Devlog 8 Been working on implementing IAS15(a physics solver for space sims, its not as bad as it sounds although the paper is soo confusing bro). So far its going ok. But i think im going to have to do an entire overhaul of my architecture, as i think i have redundant arrays and variables taking up memory (IAS15 calls on variables like thousands of times per frame and i want to minimise cache misses). Also I still havent managed to get SPICE to work in C# yet either. I think over the next few days i will focus on refining the architexture insted of logic. So far this has taken me much longer than i thought it would 😭. I think my scope may be a tad ambitios to put it lightly as this is meant to be the core of the final project. (also yes this is the same image as last time, all the updates have been code, idk what to put)"}, {"post_id": 35056, "ts": "2026-07-26T07:24:15Z", "hours": 18.5667, "text": "BIg things comming"}, {"post_id": 33752, "ts": "2026-07-23T22:19:35Z", "hours": 9.1667, "text": "Not really a devlog, js messing aroind wih optimasations n other stuff tbh (its like 11:30pm for me rn i just wanna get the time logef fir the last two days)"}, {"post_id": 32962, "ts": "2026-07-22T13:35:40Z", "hours": 10.0647, "text": "Devlog 7 Massive change from last time. So for context atm I am building a solar system sim as a core for this project. And ive been trying to create some sort of method to simulate the moons without any heavy computation, as I assumed physically simulating ~500 objects would not be feasible. To put it lightly, ive wasted my time. Ive done a bit more research into the integrator i am planning to implement (IAS15), and turns out it can handle 1000 ish object just fine (even on a laptop) at only a few milliseconds per loop. So Now the next few days I will probably be spending on research on IAS15 and optimisation tricks for it. Something i need to decide soon is if this is going to be c# or hslsl as its alot of computation (so good for gpu) but its lots of complex computation (better for CPU). IDK tbh im larping CS atm, i have no idea what’s slow for a computer to run."}, {"post_id": 30812, "ts": "2026-07-18T18:51:57Z", "hours": 10.5664, "text": "Short one today. Ive sorta got about 5 diff things om activity workig on for this project atm, so i thought ill finally explain what this is. So the bameof this projct is Astra Labs (Still a work in progress rn) and its a mission planer. What im working on atm is the soalr system simulation and accurate inital data. But at the end of this you will be able to select a start/end pos and (this ive not figures out yet) be able to test oit hypothetical spacecrafts/routes. Im not selling it well tbh. Tryst me tho in like 3 months this is finna be 👌"}, {"post_id": 28861, "ts": "2026-07-15T12:49:38Z", "hours": 8.0831, "text": "Devlog 6 The past few days I’ve been looking into NASA’s spice database, which is an incredibly powerful tool to get data about the solar system. I’m not sure if I’ve mentioned yet but the core of this project is a solar system sim, which I’m hoping to be accurate to about 100yrs or so (probably less in the end, but I will push it as far as my computer can handle). To do this I’m using the RKF54 integrator(sounds scary but it’s just a glorified mean (kinda)), which is incredibly powerful and can be incredibly precise. But it still requires initial precise data, which I will use spice to generate. Now, spice is an incredibly well documented program, but from what i can find, its strength is python and C; neither of which unity supports (tbh i havent tried yet, but i assume). So at the moment ive tried like 50 different wrappers and plugins, and so far no luck. But its almost 100% on my end as I do not follow the website very well 😅. I’ve done a few other things in the meantime though, like ive finished my object shader(and my earth one too) and finally imported all the planet/dwarf planet textures. Once ive got spice to work, progress should hopefully start to take off."}, {"post_id": 27956, "ts": "2026-07-13T21:59:36Z", "hours": 10.3636, "text": "Devlog 5 Today I managed to finally get the camera working. Its not fully there yet, like I want to add logarithmic zooming and other minor things, but the core is working. The camera stays contently at the orgin, with objects moving around it. This gives me two main benefits, 1: i can store the cameras ‘real’ position as a double3, which removes all jittering due to floating point errors. and 2: culling objects is much easier as as part of the update loop on moving the objects involves calculating the distance between the objects, allowing us to cull all objects at a certain distance with virulently no more expense. Ive also began working on the UI, but its more of a ‘just making it work’ UI than a ‘looking nice’ UI atm and graphic design will come much later."}, {"post_id": 26784, "ts": "2026-07-11T19:39:04Z", "hours": 8.3925, "text": "Devlog 4 OK stepped back from shaders. I’ve spent the last 3 days working on my camera movement script. I got the initial movement down on the first day. However, this project is using massive scales, so a float vector three isn’t enough precision. So (and im not fully done yet) but i’ve spent the last few days doing two things: 1: updating everything to doubles, 2:keeping the camera at the origin, and moving the scene around it (this way means we only work with objects around the origin) There is still lots to do tho but ill be back once ive managed to make the camera script to work."}, {"post_id": 25246, "ts": "2026-07-09T11:46:22Z", "hours": 0.6378, "text": "Devlog 3 Shaders are the best bro I went into this thinking that i would hate learning hlsl and all of that. But to my surprise unity has a visual scripting system that works similar to scratch. I just wrote my first lighting shader ever in like 20m. 20 minutes is crazy, it took me 30m to make a hlsl shader that turns an object orange. ve attached what it looks like down below"}, {"post_id": 25213, "ts": "2026-07-09T10:20:29Z", "hours": 0.7314, "text": "Devlog 2 Short Devlog today. But I made my first shader!! Its extremely simple right now literally creating a coloured material, but tis something. But I think i’m going to stick to C# for the while being"}, {"post_id": 25181, "ts": "2026-07-09T07:38:19Z", "hours": 33.5492, "text": "Devlog 1 Ok this is my first devlog of Astra. I wish i had more to show for 30h of work but sadly I corrupted my entire project about 20h in 😭 loosing about 2-3 days of progress. Luckily Most of this time was spent on building the architecture and importing/creating textures. I still have the google docs that I’m writing my notes down and thats got most of my ideas for the architecture. (by architecture i mean setting up scripts and gameobjects like ‘physicsSolver’ or ‘simManager’, this is probably not what architecture is but idk). However I had spent so long on my cameraColtroller script which was lowkey really cool. Like it had complete freedom in the scene and could move anywhere, you could select an object and the camera would smoothly ‘fly’ to the object and you could orbit around it. And this is the one thing i haven’t rebuilt yet. But ill see you in the next one when it should hopefully be rebuilt?"}]...
|
Title: ASTRA by @AustinB | Stardance
Devlogs:
Dev Title: ASTRA by @AustinB | Stardance
Devlogs:
Devlog 1 Ok this is my first devlog of Astra. I wish i had more to show for 30h of work but sadly I corrupted my entire project about 20h in 😭 loosing about 2-3 days of progress. Luckily Most of this time was spent on building the architecture and importing/creating textures. I still have the google docs that I’m writing my notes down and thats got most of my ideas for the architecture. (by architecture i mean setting up scripts and gameobjects like ‘physicsSolver’ or ‘simManager’, this is probably not what architecture is but idk). However I had spent so long on my cameraColtroller script which was lowkey really cool. Like it had complete freedom in the scene and could move anywhere, you could select an object and the camera would smoothly ‘fly’ to the object and you could orbit around it. And this is the one thing i haven’t rebuilt yet. But ill see you in the next one when it should hopefully be rebuilt?
Devlog 2 Short Devlog today. But I made my first shader!! Its extremely simple right now literally creating a coloured material, but tis something. But I think i’m going to stick to C# for the while being
Devlog 3 Shaders are the best bro I went into this thinking that i would hate learning hlsl and all of that. But to my surprise unity has a visual scripting system that works similar to scratch. I just wrote my first lighting shader ever in like 20m. 20 minutes is crazy, it took me 30m to make a hlsl shader that turns an object orange. ve attached what it looks like down below
Devlog 4 OK stepped back from shaders. I’ve spent the last 3 days working on my camera movement script. I got the initial movement down on the first day. However, this project is using massive scales, so a float vector three isn’t enough precision. So (and im not fully done yet) but i’ve spent the last few days doing two things: 1: updating everything to doubles, 2:keeping the camera at the origin, and moving the scene around it (this way means we only work with objects around the origin) There is still lots to do tho but ill be back once ive managed to make the camera script to work.
Devlog 5 Today I managed to finally get the camera working. Its not fully there yet, like I want to add logarithmic zooming and other minor things, but the core is working. The camera stays contently at the orgin, with objects moving around it. This gives me two main benefits, 1: i can store the cameras ‘real’ position as a double3, which removes all jittering due to floating point errors. and 2: culling objects is much easier as as part of the update loop on moving the objects involves calculating the distance between the objects, allowing us to cull all objects at a certain distance with virulently no more expense. Ive also began working on the UI, but its more of a ‘just making it work’ UI than a ‘looking nice’ UI atm and graphic design will come much later.
Devlog 6 The past few days I’ve been looking into NASA’s spice database, which is an incredibly powerful tool to get data about the solar system. I’m not sure if I’ve mentioned yet but the core of this project is a solar system sim, which I’m hoping to be accurate to about 100yrs or so (probably less in the end, but I will push it as far as my computer can handle). To do this I’m using the RKF54 integrator(sounds scary but it’s just a glorified mean (kinda)), which is incredibly powerful and can be incredibly precise. But it still requires initial precise data, which I will use spice to generate. Now, spice is an incredibly well documented program, but from what i can find, its strength is python and C; neither of which unity supports (tbh i havent tried yet, but i assume). So at the moment ive tried like 50 different wrappers and plugins, and so far no luck. But its almost 100% on my end as I do not follow the website very well 😅. I’ve done a few other things in the meantime though, like ive finished my object shader(and my earth one too) and finally imported all the planet/dwarf planet textures. Once ive got spice to work, progress should hopefully start to take off.
Short one today. Ive sorta got about 5 diff things om activity workig on for this project atm, so i thought ill finally explain what this is. So the bameof this projct is Astra Labs (Still a work in progress rn) and its a mission planer. What im working on atm is the soalr system simulation and accurate inital data. But at the end of this you will be able to select a start/end pos and (this ive not figures out yet) be able to test oit hypothetical spacecrafts/routes. Im not selling it well tbh. Tryst me tho in like 3 months this is finna be 👌
Devlog 7 Massive change from last time. So for context atm I am building a solar system sim as a core for this project. And ive been trying to create some sort of method to simulate the moons without any heavy computation, as I assumed physically simulating ~500 objects would not be feasible. To put it lightly, ive wasted my time. Ive done a bit more research into the integrator i am planning to implement (IAS15), and turns out it can handle 1000 ish object just fine (even on a laptop) at only a few milliseconds per loop. So Now the next few days I will probably be spending on research on IAS15 and optimisation tricks for it. Something i need to decide soon is if this is going to be c# or hslsl as its alot of computation (so good for gpu) but its lots of complex computation (better for CPU). IDK tbh im larping CS atm, i have no idea what’s slow for a computer to run.
Not really a devlog, js messing aroind wih optimasations n other stuff tbh (its like 11:30pm for me rn i just wanna get the time logef fir the last two days)
BIg things comming
Devlog 8 Been working on implementing IAS15(a physics solver for space sims, its not as bad as it sounds although the paper is soo confusing bro). So far its going ok. But i think im going to have to do an entire overhaul of my architecture, as i think i have redundant arrays and variables taking up memory (IAS15 calls on variables like thousands of times per frame and i want to minimise cache misses). Also I still havent managed to get SPICE to work in C# yet either. I think over the next few days i will focus on refining the architexture insted of logic. So far this has taken me much longer than i thought it would 😭. I think my scope may be a tad ambitios to put it lightly as this is meant to be the core of the final project. (also yes this is the same image as last time, all the updates have been code, idk what to put)
Devlog 9 I finally did it!!! So ive spend the last like week trying to use SPICE data (a fancy way of getting data avout planets like pos, vel ect - and like so much more) in my unity project. Ive managed to write a python script (as there is no good wrapper for C#) that converts the ~10gb of data i have into about 25mb of data i need in my own format(spanning from 2000-2030, i want to update this to 2100, however data for some asteroids only go to 2030). This is absolutely overkill, but so far its the only option i have, but the good news is i can ship the porject with this data and avoid the trouble with trying to compress 10gb of data as there is no way im shipping a project that is 90% useless data. Ive prolly explained what ive done really badly but idk its finally done. (attached below is proof that ive got the data - ignore the horrible color choices and lack of visible planets plz). Next up: implementing IAS15.
Devlog 10 Before I implement physics i decided to procrastonate with optimisations. Good news: its now running at 200fps(used to be like 150ish). Bad news: Ive got to athually implent the physics. Ive been reading up on it and i understand a two body 2d form of IAS15, but ~100 ish body and 3D not so much. So the next few days may just be devlogs of planets moving hopefully where they should. Oh i also started to implent a trail that follows the planets, but its proving diffucult as ‘planet-space’ and ‘world space’ are complete diffrent local tranforms and for some reason i just cant figue out a fast way of converting between them (I have one solution but it does an unnesasay amount of divs per frame, which is eating up processing power that should go to physics). But so far this is it, oh i also added a ring that goes around the planet but ive not got a screenshot of it and im not waiting 5m for unity to open so js imagine rings next to the labels in the same color as the label
Devlog 11 Ok major update. I’ve rewritten the core code from the base up as I had so many unnecessary lists/arrays/variables etc. Also ive rewritten the camera controller to be smoother and easier to use. Yes this is still procrastination before implementing physics. I promise that in the next devlog I will have the physics working. (or atlest partially)
Devlog 12 Ok, tbh physics hasn’t been too bad so far. Ive spent a few days on it and its almost there, not much to add on that - next devlog or two will be finishing it up and making it multithreaded. In the meantime ive been working on some UI and im pretty proud of it. Like it could be better but its the first Ui ive ever made and it took like 2h to setup so its staying. (whats really cool is that you can change the size of the game window and it will automatically resize itself). However ive run into a weird issue. So for the UI im rendering a preview of the planet. And i have done everything that i can think of to optimise this but this camera is tanking the entire project by about 20-30fps(its worse rn as i have deep profiling on atm) and i have no clue why. Like if you can think of a optimisation ive prolly already done it. But anyways its prolly something simple that i keep on missing. A preview of the porject is below - ignore the numbers about earth they are wrong.
Devlog 13 Ok major update. I have managed to implement thee and a half things rn. 1: the UI is fully working and scales and moves with the window if you resize it. 2: the Ui calculates the keplarna elements of any body using no hardcoaded info. 3: i am able to use these elements to do a crude simulation of one orbit allowing me to visulise the orbits. 3.5: I half implemented IAS15 got stuck and decided to do steps 1-3. However as you can see its running at 39 fps which is just not going to happen. Annoyngly my code only takes up like 2ms however the way i have set it up means the camera is incredibly resource intetive(i had an issue with not being able to see the orbits so i just made the clipping plane of the camera a stupidly large number. I think theres a way to make a Ui shader or smthin to visulise the orbits, however i aint that smart and i hate hlsl so much bro 😭) If i made the clipping plane smaller and optimised my end a bit i could prolly push this to like 100 as thats where i was at before idk tho.
Devlog 14 Ok still putting off physics atm, butttt ive done some stuff. Ive done a bit of optimisation, like ive split up the rendering into layers, so there a camera that renders the background, there a cam that renders the planets and a cam that renders the orbits. Because of this i can have separate scales for each camera, so whist the planets/moons are scaled down by 10000x, the orbits are done by 10000000x. meaning i can reader eve pluto in a single frame with a semi useable clipping plane. Ive also made it so you can click on a planet and it will automatically update everything, which i have been wanting to do for ages as i now do not need to use the inspector anymore to update what planet we are looking at. However there is still one issue, this only works for the 9 objects that have a dedicated label, the other 100 moons/asteroids are innecesable. I want to make it so once you zoom far in enough to a moon its label will show, however for planets like jupiter they will all overlap and look bad, but i dont really want to add anymore overhead to the UI rn and idk what to do, like if you have two that overlap which one do you hide? But hopefully once i finally decide to finish the IAS15 ill move onto phase 2 which is implementing mission planning(this is what im better at so it should hopefully pick up soon). Also one thing do the orbits look better when their full or when they taper off? I prefer full but idk
Devlog 15 Did it, i’ve managed to get the labels to work. There are still a few visual things i want to fix (like they look horrible atm). And they dont resent properly yet, however ik why its just gonna be a pain to fix. I think ima decrease the font size a bit and add some deterministic colors? But one thing is that you can click on these labels like you can with the much eaiser to code planet ones and it will show you a popup of the object/calc its kep data and allow you to fly to it automatically which im pretty proud of.
Devlog 16 Ok, physics is fully implemented, kinda. Ive got the logic down, but i haven’t managed to simulate even one step yet 😬. Theres like 20 reasons why, but the majority of them are NaNs so far which suprised me tbh. After a while i gave up and began working on the UI a bit more, it only took me a hour or two to setup but i think it looks good, you are able to input the wanted speed of the sim, and eventually it will show you the speed its running at (as the integrator i am implementing does not take uniform steps and adapts its step size the simulation speed will fluctuate like 100%). But i think tomorrow or atleast in the next few days the physics will be working, as i can feel that it is so close. but once this is done i can finally move onto the thing that im much more well researched in, mission planning(more in the projects bio if you want to see what i mean)
Devlog 17 Major update, physics is working. However it is 100% wrong atm, marse flyes out of the system at supersonic speeds and neputne starts to fall towards the sun(pic below😭). I have no idea what could be causing this as i have spend so long looking at the code. I was hoping i would have this finished much faster than this tbh but yeah. My best guess is a div by zero or a verry small number causeing problems, but that can only happen if there are two bodys extreemly close together so idk. Anyways I hopw to get this fixed within the week so i can finnaly start working on what i want to work on(like this was meant to be the easy first step of waht i want).
Devlog 18 ITS WOKRING. Ive attached a vid below(sorry for quality idk why its like that) and i will admit there are a few issues. Main one rn is optimisation, however that should be fine this is all being run on one thread and there are like 5 separate opportunities for parrailation, im not too worried about that. However, ive encountered one issue, in this i have forced the simulation to run faster than it wants to. The integrator i am using has a dynamic time step, so if two objects get close or get to fast the simulation slows down to more accurately simulate this. For the last few days my timestep ahs been stuck at 10^-9 of a second 😭, i have manged to fix this a small amount but i think the problem is in my data. Atm i have ~100 objs and i only just realise that i have two asteroids in a binary orbit within 2500km of each other, which is almost certainly causing the issue. idk what to do tbh, i think my only option woul be to delete one fo them from the data(not too hard if im being honest), but ima do a final check tomorro. but apart from that im so happy i finally got a semi working project now.
Devlog 19 Optimise❌. Add and fix features ✅. Yup more procrasonation, but i have a massive list of changes. The planet Preview in the UI no longer shows missing textures when there is no texture for the object, this is done with a deterministic shader i made using the moons id to color it in game and in the UI. I’ve added a taskbar at the top that i’m really proud of tbh, its easily expandable and easy to use now Fixed the labelling issue with the moons, as unused labels were not being dealt with correctly and would just stay on screen(this was actually a massive pain to do 😭) +50 other small anoying fixes What i still need to do tho is fix the fittery nature of the orbits, its because the orbits update their position before the camera updates its world position(the cameras stays at 0, 0 and a script updates the positions of everything within range accordingly, however this code runs at the start of the frame and the camera updates at the end, this shouldn’t be a difficult fix but i remember coding the camera to update late in the frame for a reason so this may be harder than i think)
Devlog 20 OK added a new feature. So atm my code on startup was taking the current date and finding the closeted date that i have provided data for(pos/vel). This was working fine but if you wanted to jump from now to next year you would have to have waited ages. So ive fixed that. This is also the fist ui i’ve made entirely in unity instead o figma, and i wont lie i really like how it looks. But as you can see the ui took 7h to get fully working (i hate ui so much dude 😭) there was like a bajillion edge cases and flags and things i needed to setup, not fun tbh. But im really proud of how it works and looks. Up next is not optimisation😭, im gonna start looking into implementing a lambert solver and a bacis spacecraft controller as this project is going to turn into a mission planner hopefully very soon (i hope, sep 30th is too close bro)
Devlog 21 Its been a while (18 days), but its been a pretty busy two weeks tbh (A-Levels started on the 4th and ive got 4 to worry about 😬😭). But i have done a bit of progress. Ive managed to implement a fully working lambert solver into the project, you can pick two objects and a time of flight and boom you get a start/end velocity . If you depart from your body at the specific velocity that you can calculated then after your set time you will be at your target destination - kinda. This is a very simple algorithm that only accounts for the sun’s mass(sometimes) and the two points you want to reach, so there can be ‘noise’ from other planets and gravitational fields that can cause drift. How am i gonana fix this? Idk this is only the first layer of the misson planner so maybe it will go away once i add course correction using my already implemented IAS15 solver 🙏🙏. Also i have added in the orion crew modle as my first spacecraft (this is going to be theoretical misson planneing so the modle is really only for looks, as there i no way i can get anything remotly close to something like ksp, nor do i want to, this is more of a ‘is this possible and if ti is what path should i take’ kina misson planner yk?) idk. Delogs may speedup or slow down depending on how school goes tbh, i really want to get this done by sep 30th so i may have to sacifice some ui deicision and posilse to get it working. so be nice when u guys take a look at it please 🙏🙏🙏🙏🙏🙏🙏.
Devlog 22 Yooo. Things are looking up. Ive implemented the lambert solver fully so you can do a controlled burn to jump orbits (shown in the vid below). And ive managed to add in accurate date/time tracking at the bottom of the screen (however there are a few bugs that you will defiantly be able to spot). Only 11 days till this needs to be done and i have much more than 11 worth of things i need to do(and im already skipping out on alot of stuff for my A-levels for this so once i finished this ive got about 3 weeks of stuff to relearn 😭). I think im going to get the physics and spacecraft stuff done within like 4 days i hope and just do quality stuff from then. One thing though, optimisation has not gone as well as i had hoped (topping out at about 20 fps on my laptop, so if you have a decent pc that has a gpu with more than like 5 cores you would prolly be fine but idk yet), but i am hoping to get this running on my laptop at a usable rate. but we shall see. Also like the post 🙏🙏. Last thing, in the vid the sim speed up and down, it wont do that in the build i just got impatient and manually forced it to go faster 😭. Last last thing, you can move the camera, i just didn’t in this vid.
Devlog 23 Yo short one today as its 10 45 atm and i have homework for tmorro 😭. This had been a bit of everything today so im just gonna list it out. 1: fleshoed out the help menues 2: made the info chip work(bottom right), im really porud of this one as it usesa que system so you can just keep on adding notifications/warnings and it will show them all (fun fact this is the only thign so far that has worked first try so thats why i love it so much) 3: started adding a way to export the data (so far ive only gone as far as making ui and auto generating teh directory) 4: almost fixed the camera controller(this is so close to working, but ive spend like 3h on it already so im not touching it for a bit) 5: a few other code things only 10 days left now 😬, so i need to be finishes up features pretty soon (im hoping to get the mission planning element of this findied by the weekend/sunday, and then spend the rest of the time making it presentable and usable)
Devlog 24 Ok one section has been finished. Its a small one but its done. This was m first time working with files and making documents so icl the code is like 85% spaghetti unassisted mess, but it works. It allows you to export data for planets/moons that you want in either JSON or CSV format. Also the ui is fully wokring with this one for once. Sorry for the most boring devlog of the year here but their prolly gonna get worse as i start doing more boring things to finish off this project. I promise you tho the final project is gonna so cool so follow me if you want to see it. Omg im tired bro, ive caught whatever is going around at sixth form and i am generally on teh brink of death, generally json/csv files may be the most boring thing possible to do this felt like so much more than 3h. Anyway see you next devlog. (sorry for boring picture, this is pretty much all code tbh)
Devlog 25 Added a main menu. This was actually a massive pain as i had no like localised start function. So this meant that scripts and objects were doing things they weren’t meant to. So had a minor architectural overhaul. but now it works. Also ive added a way to quit the game too, in both the sim and the main menu. Also yes that it the orion capsule thing, why? Its the only textured model i could find for free. (Kinda, i had to download a 3d print 3mf or something, and i wish i was kidding but spend a few hours a few weeks ago literally assembling the model in unity, so this may just beat garten of banban for the most optimised topology of the year) Only 8 days left and i am so screwed, this entire menu was a massive procrastination from fixing the physics(it keeps slowing down the timestep to like 1e-9 seconds and i cannot figure out why, i have literally almost rewritten my physics at this point and i have had minimal difference - also the cameras bugged as hell when its following a moving object)
Devlog 26 yo guys horrible news 😭 ive gone and done it, boken my finger(if for the dumbest reason every too bro). Which means that i generally cannot type anywhere near as fast as usahll. Dw your still gonna get your ushall yap sesh tho. Im hoping that this dosent afect the timeline or anything of my project, but i have been busy. First ive started adding sound effects which are generrally a bigger pain than i thought. But now every button/ui action has an effect. however there is not music/ambiant noise. IDk weather im going to add any music but i think a low rocket engine would be cool(lets pretend you can hear sound in space). Done a bit on the code side, but really most of it has been UI. ive cahnged the hitboxes of the buttons to fit them, which was a pain as i have like 50 at this point. Ive made them hilight when you hover over them and things like that. But one thing im really confused on is when the deadline for this is? Like i got an emial saying oct 31 as they extened it but now theres this think with bukubuks or something and im not sure what that means? if you know can you leave a comment or something pelasee.
Devlog 27 Yooo Im back. Thank god the deadline has been extended broo. Done mostly boring stuff tbh. Ive begun on working on adding a grid that scales with the camera and im like 60% there. Shaders haven’t really clicked for me yet so im still kinda joining random things to other random things and hoping it looks correct tbh. Also begun work on making the mission planner automatically sort and setup lambart test cases for my solver to solve(ive actually done this already, however its really hard to validate if my resluts are anywhere near correct, they look correct but i have no numerical way of knowing, so ima go with the ignore it untill something else goes wrong and hope its fine idk) devlogs will prolly be focused on fixing the camera movement(zooming is a massive pain as its really hard to know when you want to zoom massivly or small - like you want to be zooming out fast if you want to go between planets, but if you want to go between moons or something its hard:( ) and misson planner aspects of this project for this week or so. So boring devlogs. cant wait till i can finially ship this and you can all have a go.
Devlog 28 OK ive fixed/implemented three major things. 1: camera finally logarithmically zooms and moves in a way that i am happy with. There is only one problem left now, and that is that it cant follow a moving point yet, however this shouldn’t be too bad i hope 2: ive changed my data so that the planets are now aligned with the XY plane(this is not a hardcoded fix so it it still possible to import your own data and it work completely fine) 3: ive made the grid follow the camera(as the camera stays at 0,0 and moves objects around it) and scale logorymetrly too which looks very professional im my opinion Now onto finishing up the misson planning side of this. ive got a ‘working’ state of it atm but it is quite tempramental so we shall seee
Devlog 29 Made mission planner UI. Starting to get pretty fast at these(although they still look questionable sometimes)...
|
1792478995.0222642
|
1793083795.0222642
|
|
12513
|
Papertrail - Receipt manager by @Andy | Stardance
|
Andy
|
0
|
303.6
|
0
|
[]
|
[{"post_id": 47238, "ts": "202 [{"post_id": 47238, "ts": "2026-08-15T00:59:45Z", "hours": 13.5511, "text": "Just getting ready to deploy. All 800 tests passing. CI workflow passing. Next, gotta buy a vps, or server or smt, and launch."}, {"post_id": 44267, "ts": "2026-08-09T22:08:19Z", "hours": 3.2869, "text": "Big change! Im allowing external recipeints (no accounts) to pay reimbursements, after verifying their emails"}, {"post_id": 43682, "ts": "2026-08-09T02:46:24Z", "hours": 1.9833, "text": "Added more recents to the dashboard. Added infinite scroll. and colaborative records."}, {"post_id": 43525, "ts": "2026-08-08T20:58:46Z", "hours": 4.9936, "text": "Fully redesigned the search pages. I felt that the search pages were too monolithic so I introduced infinite scroll, with a new, Stripe inspired design."}, {"post_id": 43030, "ts": "2026-08-08T02:31:00Z", "hours": 3.4111, "text": "Completely redesigned the record detail viewer AND added shareable records, for collaboration."}, {"post_id": 42537, "ts": "2026-08-07T10:35:08Z", "hours": 15.1425, "text": "fully migrated to dramatiq with rabbit mq"}, {"post_id": 40603, "ts": "2026-08-04T08:09:38Z", "hours": 5.8611, "text": "I finallyyyyyyy got billing working, with storage plans! this took forever, and had soooo many hiccups, but its finally working, and is so satisfying!"}, {"post_id": 40312, "ts": "2026-08-03T19:00:19Z", "hours": 9.5583, "text": "I added my accent color over my dashbaord. Im also trying to get biling working, but its such a pain. Pretty close tho:"}, {"post_id": 39228, "ts": "2026-08-02T01:55:27Z", "hours": 1.5169, "text": "Added gated features. Also considering switching to dramatiq, for better performance and reliability, before production. Though, i might do that via ci/cd."}, {"post_id": 39203, "ts": "2026-08-02T00:14:24Z", "hours": 12.1572, "text": "Yet again, new dashboard designs."}, {"post_id": 37370, "ts": "2026-07-30T01:14:47Z", "hours": 16.1444, "text": "Improved reimbursment views templates - and fixed edge cases."}, {"post_id": 34913, "ts": "2026-07-26T00:38:31Z", "hours": 3.8969, "text": "Finalized and styled the reimbursements system."}, {"post_id": 34450, "ts": "2026-07-25T05:31:27Z", "hours": 6.5217, "text": "Created the peer to peer reimbusrements system that is evidence backed and MOVES REAL MONEY! At this point, Ive also had the website penetration tested. The website at this stage also has IRS/IRD audit compliancy."}, {"post_id": 33820, "ts": "2026-07-24T01:56:22Z", "hours": 10.5292, "text": "New dashboard designs."}, {"post_id": 32719, "ts": "2026-07-22T01:28:36Z", "hours": 9.2058, "text": "Added IRS compliance - ie, 7 year mandatory retention period, plus entire change log. Its basically git for your expenses now."}, {"post_id": 31631, "ts": "2026-07-20T05:58:10Z", "hours": 4.8464, "text": "Added merging support. Now, records pulled from plaid can be matched with a scanned record if one is availble, increasing security for the future reimbursement system."}, {"post_id": 31027, "ts": "2026-07-19T02:37:56Z", "hours": 5.0464, "text": "Big update - I added plaid for automatic transaction intake - and made the App automatically create folders, and organize records into them."}, {"post_id": 30477, "ts": "2026-07-18T02:37:37Z", "hours": 7.8897, "text": "Created folder system, that OCR can autocategorize in."}, {"post_id": 29859, "ts": "2026-07-17T00:40:39Z", "hours": 1.665, "text": "Allow users to choose to receive notifications."}, {"post_id": 29795, "ts": "2026-07-16T22:24:39Z", "hours": 4.41, "text": "Added push notifications to the app"}, {"post_id": 29315, "ts": "2026-07-16T05:09:42Z", "hours": 16.1822, "text": "Added email reminders for expiring records, that match my styling of the auth emails."}, {"post_id": 27432, "ts": "2026-07-13T00:06:31Z", "hours": 12.3369, "text": "Added orphaned file cleanup cycle and pagination. Also cache more data so faster experience for the user."}, {"post_id": 26356, "ts": "2026-07-11T03:11:00Z", "hours": 2.1206, "text": "Today, I did a lot of work in the background. Now - document processing occurs in a background process - users immediately are redirected to a skeleton loader, and then the add_record form when the data is ready. Furthermore, ocr results are cached for 15 mins so any page reloads, or tab closes prevent api rate limits being prematurely hit. The logs show this. the consistent get requests are the same add_record form being loaded with prepopulated data, after multiple reloads and tab reopens."}, {"post_id": 26220, "ts": "2026-07-10T21:41:23Z", "hours": 1.0217, "text": "I optimized the dashboard and records list view. I realized cards were good for only a few records, but the moment they start piling up - it gets claustrophobic. So, i made the results appear as rows, like search results from google, or firefox."}, {"post_id": 25840, "ts": "2026-07-10T10:00:22Z", "hours": 10.8506, "text": "I just did some small optimizations today. I realized that anybody could just “url-hop” to get to a password view and create a password - so I fully locked down all password views securely."}, {"post_id": 23985, "ts": "2026-07-07T07:52:44Z", "hours": 13.2497, "text": "Over the past few days - i worked a bit more on micro interactions. I fixed a few bugs and added persistance for things like the sidebar and accordian state. I also added loading states for most other things as well (like the active search, auth pages…)"}, {"post_id": 22610, "ts": "2026-07-05T05:01:08Z", "hours": 3.8322, "text": "Today, I implemented HTMX in my records home view to create an active search, with the dateparser library for natural language date support. I also added it in the sidebar so no reloads are required for filtering records, changing pages…"}, {"post_id": 22105, "ts": "2026-07-04T11:50:11Z", "hours": 9.7197, "text": "Today, I created the system to upload multiple supporting files to a single record. So currently, the record creation process is a multi step process. Upload file –> OCR –> record validation and creation –> supporting files addition"}, {"post_id": 20679, "ts": "2026-07-02T10:30:32Z", "hours": 8.0081, "text": "Further improved the user dashboard, and added some more links."}, {"post_id": 19846, "ts": "2026-07-01T07:44:16Z", "hours": 4.1394, "text": "Made a nice looking user interface dashboard that shows recent documents and usefull stats, with quick links. as features are added, they will populate this."}, {"post_id": 19059, "ts": "2026-06-30T07:46:04Z", "hours": 4.0472, "text": "I created a simple user dashboard. Its still far from complete, but better than the generic list view I was using before. Also added more document types for greater coverage."}, {"post_id": 18257, "ts": "2026-06-29T10:38:49Z", "hours": 6.0269, "text": "Styled the form upload pages."}, {"post_id": 17461, "ts": "2026-06-28T07:48:49Z", "hours": 6.7481, "text": "Today, I created a system where (in one step) - a document can be scanned, uploaded to cloudflare storage, and used to pre-populate a form. the pipline so far looks like: Scan doc –> OCR + llm –> prepopulate form –> user validation –> create record. Or you can create a record manually. The entire process is extremely secure. Documents are only interacted with via signed urls, all authentications are passwordless, and all uploads occur client side for fastest speed possible."}, {"post_id": 16667, "ts": "2026-06-27T03:01:36Z", "hours": 7.4625, "text": "Today, I created the document storage system. Users can securely add, delete and read documents from cloudflare using temporary signed urls. The next step is to create a record system, that can be related to many documents."}, {"post_id": 15988, "ts": "2026-06-25T23:22:42Z", "hours": 13.2717, "text": "Polished up user interface"}, {"post_id": 13990, "ts": "2026-06-22T23:15:19Z", "hours": 6.4078, "text": "Storing files now saves to google cloud storage."}, {"post_id": 12452, "ts": "2026-06-20T09:50:47Z", "hours": 4.1767, "text": "I decided to ditch the colourfull theme for a monochromatic one."}, {"post_id": 12222, "ts": "2026-06-19T23:02:02Z", "hours": 4.5556, "text": "Added dark and light mode support for all the other auth and account related pages (like email changing…). This was lots of fun (and quick) because much of the base work was completed because of django templating inheritance."}, {"post_id": 11786, "ts": "2026-06-19T05:39:53Z", "hours": 5.3311, "text": "Today, I completed styling the auth pages. Now all match the light and dark theme of the landing page. This was wayy more time consuming than it ought to be, but, its finished now."}, {"post_id": 11156, "ts": "2026-06-18T07:34:04Z", "hours": 9.0336, "text": "Styling the authentication forms. Django allauth makes this quite difficult, but its a work in progress."}, {"post_id": 8575, "ts": "2026-06-14T08:11:36Z", "hours": 6.5511, "text": "Made dark mode for the landing page. I created a simple user interface design on figma (light and dark mode), to move away from notions image."}, {"post_id": 7940, "ts": "2026-06-13T07:51:24Z", "hours": 3.8217, "text": "Today, I created a basic landing page for the project with tailwind and alpine js. It uses the notion interface as the hero image (since my interface isn’t even built yet!) but that will change soon…"}, {"post_id": 7802, "ts": "2026-06-13T00:51:06Z", "hours": 2.1431, "text": "I finally added Tailwind CSS and Alpine js to the project. For the longest time, Tailwind has always caused issues, but I finally got it working and it feels like magic - not having long css files. Here is a simple h1 element that changes from blue to red on hover."}, {"post_id": 5470, "ts": "2026-06-09T08:19:19Z", "hours": 0.4386, "text": "Integrated Authentication (Local and OAuth). Authentication is probably my favouite part of making a website - but also the most sensitive. Today, I integrated Django Allauth with Google and Github OAuth (and local sign in/up). The process was A LOT easier, quicker, and more secure than my previous “default” (default django auth), simply due its level of sophistication. I’m really excited about the progress today! Next step - styling."}, {"post_id": 4818, "ts": "2026-06-08T10:05:28Z", "hours": 0.5072, "text": "Initialized Django project."}]...
|
Title: Papertrail - Receipt manager by @Andy | Sta Title: Papertrail - Receipt manager by @Andy | Stardance
Devlogs:
Initialized Django project.
Integrated Authentication (Local and OAuth). Authentication is probably my favouite part of making a website - but also the most sensitive. Today, I integrated Django Allauth with Google and Github OAuth (and local sign in/up). The process was A LOT easier, quicker, and more secure than my previous “default” (default django auth), simply due its level of sophistication. I’m really excited about the progress today! Next step - styling.
I finally added Tailwind CSS and Alpine js to the project. For the longest time, Tailwind has always caused issues, but I finally got it working and it feels like magic - not having long css files. Here is a simple h1 element that changes from blue to red on hover.
Today, I created a basic landing page for the project with tailwind and alpine js. It uses the notion interface as the hero image (since my interface isn’t even built yet!) but that will change soon…
Made dark mode for the landing page. I created a simple user interface design on figma (light and dark mode), to move away from notions image.
Styling the authentication forms. Django allauth makes this quite difficult, but its a work in progress.
Today, I completed styling the auth pages. Now all match the light and dark theme of the landing page. This was wayy more time consuming than it ought to be, but, its finished now.
Added dark and light mode support for all the other auth and account related pages (like email changing…). This was lots of fun (and quick) because much of the base work was completed because of django templating inheritance.
I decided to ditch the colourfull theme for a monochromatic one.
Storing files now saves to google cloud storage.
Polished up user interface
Today, I created the document storage system. Users can securely add, delete and read documents from cloudflare using temporary signed urls. The next step is to create a record system, that can be related to many documents.
Today, I created a system where (in one step) - a document can be scanned, uploaded to cloudflare storage, and used to pre-populate a form. the pipline so far looks like: Scan doc –> OCR + llm –> prepopulate form –> user validation –> create record. Or you can create a record manually. The entire process is extremely secure. Documents are only interacted with via signed urls, all authentications are passwordless, and all uploads occur client side for fastest speed possible.
Styled the form upload pages.
I created a simple user dashboard. Its still far from complete, but better than the generic list view I was using before. Also added more document types for greater coverage.
Made a nice looking user interface dashboard that shows recent documents and usefull stats, with quick links. as features are added, they will populate this.
Further improved the user dashboard, and added some more links.
Today, I created the system to upload multiple supporting files to a single record. So currently, the record creation process is a multi step process. Upload file –> OCR –> record validation and creation –> supporting files addition
Today, I implemented HTMX in my records home view to create an active search, with the dateparser library for natural language date support. I also added it in the sidebar so no reloads are required for filtering records, changing pages…
Over the past few days - i worked a bit more on micro interactions. I fixed a few bugs and added persistance for things like the sidebar and accordian state. I also added loading states for most other things as well (like the active search, auth pages…)
I just did some small optimizations today. I realized that anybody could just “url-hop” to get to a password view and create a password - so I fully locked down all password views securely.
I optimized the dashboard and records list view. I realized cards were good for only a few records, but the moment they start piling up - it gets claustrophobic. So, i made the results appear as rows, like search results from google, or firefox.
Today, I did a lot of work in the background. Now - document processing occurs in a background process - users immediately are redirected to a skeleton loader, and then the add_record form when the data is ready. Furthermore, ocr results are cached for 15 mins so any page reloads, or tab closes prevent api rate limits being prematurely hit. The logs show this. the consistent get requests are the same add_record form being loaded with prepopulated data, after multiple reloads and tab reopens.
Added orphaned file cleanup cycle and pagination. Also cache more data so faster experience for the user.
Added email reminders for expiring records, that match my styling of the auth emails.
Added push notifications to the app
Allow users to choose to receive notifications.
Created folder system, that OCR can autocategorize in.
Big update - I added plaid for automatic transaction intake - and made the App automatically create folders, and organize records into them.
Added merging support. Now, records pulled from plaid can be matched with a scanned record if one is availble, increasing security for the future reimbursement system.
Added IRS compliance - ie, 7 year mandatory retention period, plus entire change log. Its basically git for your expenses now.
New dashboard designs.
Created the peer to peer reimbusrements system that is evidence backed and MOVES REAL MONEY! At this point, Ive also had the website penetration tested. The website at this stage also has IRS/IRD audit compliancy.
Finalized and styled the reimbursements system.
Improved reimbursment views templates - and fixed edge cases.
Yet again, new dashboard designs.
Added gated features. Also considering switching to dramatiq, for better performance and reliability, before production. Though, i might do that via ci/cd.
I added my accent color over my dashbaord. Im also trying to get biling working, but its such a pain. Pretty close tho:
I finallyyyyyyy got billing working, with storage plans! this took forever, and had soooo many hiccups, but its finally working, and is so satisfying!
fully migrated to dramatiq with rabbit mq
Completely redesigned the record detail viewer AND added shareable records, for collaboration.
Fully redesigned the search pages. I felt that the search pages were too monolithic so I introduced infinite scroll, with a new, Stripe inspired design.
Added more recents to the dashboard. Added infinite scroll. and colaborative records.
Big change! Im allowing external recipeints (no accounts) to pay reimbursements, after verifying their emails
Just getting ready to deploy. All 800 tests passing. CI workflow passing. Next, gotta buy a vps, or server or smt, and launch....
|
1792705968.9037504
|
1793310768.9037504
|
|
7165
|
Eve by @Light | Stardance
|
Light
|
1
|
294.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:53:22Z", "hours": 294.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time.", "repo": "https://github.com/SonoUnBot09/Eve", "demo": "https://github.com/SonoUnBot09/Eve/releases/tag/v1.0.0"}]...
|
[{"post_id": 71422, "ts": "202 [{"post_id": 71422, "ts": "2026-09-20T19:52:09Z", "hours": 8.8461, "text": "DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine."}, {"post_id": 70544, "ts": "2026-09-19T10:27:28Z", "hours": 8.0992, "text": "DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!"}, {"post_id": 69366, "ts": "2026-09-16T22:11:41Z", "hours": 2.8144, "text": "DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment."}, {"post_id": 68288, "ts": "2026-09-14T21:13:02Z", "hours": 4.0392, "text": "DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu."}, {"post_id": 67640, "ts": "2026-09-13T19:52:38Z", "hours": 7.8861, "text": "DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines."}, {"post_id": 65309, "ts": "2026-09-10T11:36:28Z", "hours": 0.2975, "text": "DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc."}, {"post_id": 64811, "ts": "2026-09-09T14:20:04Z", "hours": 5.6439, "text": "DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS"}, {"post_id": 63615, "ts": "2026-09-07T15:19:57Z", "hours": 8.0778, "text": "DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…"}, {"post_id": 61817, "ts": "2026-09-04T22:10:27Z", "hours": 10.2261, "text": "DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it."}, {"post_id": 59920, "ts": "2026-09-01T23:02:30Z", "hours": 7.4931, "text": "DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting"}, {"post_id": 58517, "ts": "2026-08-30T23:07:29Z", "hours": 4.8986, "text": "DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package."}, {"post_id": 57455, "ts": "2026-08-29T16:33:40Z", "hours": 7.1736, "text": "DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC."}, {"post_id": 55554, "ts": "2026-08-27T14:10:22Z", "hours": 4.5942, "text": "DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…"}, {"post_id": 54816, "ts": "2026-08-25T23:26:03Z", "hours": 3.9353, "text": "DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw."}, {"post_id": 54096, "ts": "2026-08-24T21:43:20Z", "hours": 10.5117, "text": "DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder."}, {"post_id": 51727, "ts": "2026-08-21T15:40:39Z", "hours": 10.1514, "text": "DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else"}, {"post_id": 48967, "ts": "2026-08-17T15:28:34Z", "hours": 5.8128, "text": "DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them."}, {"post_id": 47136, "ts": "2026-08-14T20:10:25Z", "hours": 9.8778, "text": "DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/"}, {"post_id": 44624, "ts": "2026-08-10T14:56:52Z", "hours": 10.0239, "text": "DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)"}, {"post_id": 41971, "ts": "2026-08-06T14:41:01Z", "hours": 11.1292, "text": "DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)"}, {"post_id": 39763, "ts": "2026-08-02T22:53:53Z", "hours": 9.9536, "text": "DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders."}, {"post_id": 37211, "ts": "2026-07-29T19:14:02Z", "hours": 10.0533, "text": "DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…"}, {"post_id": 34710, "ts": "2026-07-25T17:18:03Z", "hours": 9.9128, "text": "DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized."}, {"post_id": 32449, "ts": "2026-07-21T17:21:23Z", "hours": 10.0289, "text": "DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed."}, {"post_id": 30667, "ts": "2026-07-18T13:14:32Z", "hours": 9.9683, "text": "DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures."}, {"post_id": 28272, "ts": "2026-07-14T12:58:23Z", "hours": 10.2439, "text": "DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights."}, {"post_id": 25895, "ts": "2026-07-10T11:55:09Z", "hours": 11.2272, "text": "DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while."}, {"post_id": 21085, "ts": "2026-07-02T21:28:10Z", "hours": 4.3578, "text": "DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class."}, {"post_id": 20319, "ts": "2026-07-01T21:44:13Z", "hours": 9.6286, "text": "DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry."}, {"post_id": 18339, "ts": "2026-06-29T13:31:38Z", "hours": 6.0772, "text": "DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users"}, {"post_id": 15067, "ts": "2026-06-24T14:08:55Z", "hours": 28.5411, "text": "DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me."}, {"post_id": 9873, "ts": "2026-06-16T10:28:19Z", "hours": 4.6411, "text": "DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…"}, {"post_id": 8166, "ts": "2026-06-13T16:39:12Z", "hours": 4.5819, "text": "DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility."}, {"post_id": 7178, "ts": "2026-06-11T23:53:28Z", "hours": 2.3814, "text": "DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures."}, {"post_id": 6502, "ts": "2026-06-10T22:34:52Z", "hours": 9.0367, "text": "DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others."}, {"post_id": 5182, "ts": "2026-06-08T21:32:27Z", "hours": 11.6153, "text": "DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts."}]...
|
Title: Eve by @Light | Stardance
Devlogs:
DEVLOG Title: Eve by @Light | Stardance
Devlogs:
DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts.
DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others.
DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures.
DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility.
DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…
DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me.
DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users
DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry.
DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class.
DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while.
DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights.
DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures.
DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed.
DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized.
DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…
DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders.
DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)
DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)
DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/
DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them.
DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else
DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder.
DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw.
DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…
DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC.
DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package.
DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting
DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it.
DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…
DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS
DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc.
DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines.
DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu.
DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment.
DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!
DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine.
Ships:
Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time....
|
1792856920.7067
|
1792943320.7067
|
|
136
|
Clientwarden by @CT5 | Stardance
|
CT5
|
0
|
282.93
|
0
|
[]
|
[{"post_id": 80638, "ts": "202 [{"post_id": 80638, "ts": "2026-10-18T11:24:17Z", "hours": 9.7372, "text": "BitWarden Vendor Architecture - Part 5 I kinda hoped that Sync would be easier but its pretty much as hard as Orchestrator, despite looking at the sync logic before hand and having to do less. I also rushed a ton of the stuff, so I need to have another look over the whole codebase and add comments and stuff before I continue again. I also need to handle all the todos and stuff. Tomorrow Im going to work on a lot of the bugs and errors with the runtime, sync and orchestrator because I did rush a lot of it."}, {"post_id": 79747, "ts": "2026-10-15T08:37:16Z", "hours": 9.7283, "text": "BitWarden Vendor Architecture - Part 4 I forgot to devlog today, so consider this 8h and 30mins and add 30mins to the next devlog. I finally finished Orchestrator which took waaaay too much time (almost 5 days) and I had to fix my plan a bit as well because of the roadblocks. Finishing off the rest of it was pretty easy and starting on the Sync class was much easier due to the massive amount of time it took for me to think of a solution to the syncing issue in the midst of the Orchestrator issues. Ill be posting a Sync finished devlog soon, probably tmrw, so stay tuned!"}, {"post_id": 78954, "ts": "2026-10-12T05:37:12Z", "hours": 8.7328, "text": "BitWarden Vendor Architecture - Part 3 Making the orchestrator is pretty difficult because tying everything together is soo difficult, especially with the attachment stuff. BitWarden has some weird concepts on how it works. When creating an item and pushing it to the server, the server generates the id for you and sends the whole cipher back. However, if the network request fails halfway through, then it can create it online, without giving you the id. There are 3 solutions to this. One, is to just re-push, which creates a duplicate. Another way to fix this, is to leave it and fail, which is not a good idea. The best way to combat this situation, is to pull the items from the server, and find the one that was created by comparing the key from the local and remote vaults. The issue, is that sometimes, there is no key, so we have to rely on comparing the fields alone, which isnt the best, but its the only way. This is pretty difficult to think of on the spot and to resolve quickly, so thats why it took me so long. The other issue, is that I’ve faced a roadblock. I didnt think of attachments when designing the runtime class, so I have to add more funcs to help with offline attachments. Another issue, is that the runtime class is getting kinda messy now, since there are like 5 of the same type of funcs so I have to clean that up too. And then, I have the largest issue that I have to fix. Syncing. Syncing is a pretty weird concept on BitWarden. If you update an item offline, you dont change the revision Date, the version changes it. However, if the server’s item was changed as well, then it gets complicated because you need to handle it yourself. The first thing you can do, is to merge the individual fields, like if the name was changed on the server, and the username was changed on the client, then merge both. However if the name was changed on the server and the client, then you can create a new item with (conflict X) and then push that. All this is pretty complicated, and its probably going to get even more complicated soon."}, {"post_id": 77766, "ts": "2026-10-08T06:17:11Z", "hours": 8.2647, "text": "BitWarden Vendor Architecture - Part 2 So I was able to finish off the BitWarden Network part which was somewhat hard, but it was just mainly repetitive stuff. I also got started on the BitWarden Runtime which wasnt too hard, although its sorta difficult to wrap your head around. After I finish off the runtime, I should be able to get started on the orchestrator and sync and versioning parts. For the Bitwarden Network I decided to integrate some stuff from the previous orchestrator that was wouldve been better to have in the Network and the same thing with Runtime as well."}, {"post_id": 76359, "ts": "2026-10-03T09:26:49Z", "hours": 9.3314, "text": "BitWarden Vendor Architecture - Part 1 Now that I’ve completed the Generic Base classes and stuff, I decided to work on the Vendor stuff. The main goal of the Architecturing is to make the architecture loose enough to work with BitWarden and 1Password, since if I focused solely on BitWarden again, it would have ended up being less abstract and I wanted it to be as abstract as possible without complicating things too much. Anyway, so I was able to finish off the crypto class and get started on the network class which pretty good progress. I did think of some additional ways to make it abstract, like making the UI call the Network class to get a list of all the URLs needed. Im hoping to get all the vendor classes finished by the end of next week and then start fixing the UI and UI Bridge in the following week."}, {"post_id": 74276, "ts": "2026-09-27T03:34:58Z", "hours": 9.3614, "text": "Finishing off the New Architecture So I was able to finish off the Architecture Implementations and add a few more classes, like the Thread and Utils files. I also added a ton of comments (one per func & one per class/struct) as per the style guidelines that I wrote. Writing the comments took me waaay too long, since some funcs were pretty generic and I couldnt think of what comment to put for that func. I still have a ton more to do, like the Generic Item Stuff which is really really confusing and I havent even gotten to that part yet. After all that, I need to start on the BitWarden Vendor stuff and then integrate all that into the UI Bridge which shouldnt be too hard."}, {"post_id": 72964, "ts": "2026-09-24T03:54:04Z", "hours": 8.3058, "text": "Vault Re-Architecturing - Part 2 So I started working on the architecture and it was pretty difficult. I was able to add the crypto, netowrk, orchestrator, profile, runtime, settings, sync and versioning. So currently, I’ve decieded to expose only the orchestrator, settings and versioning because those are the only essential features that the UI requires, and exposing any more would re-create a God Class. Essentially, this time I decided to abstract it enough so that it would work with 1Pass and Bitwarden as a guide so that it would be abstract enough, even though I’m probably never going to support another password manager API. One thing I didn’t account for was the fact that BitWarden has an Organisation thing where the Organisation has its own keys and stuff, which pretty much requires me to re-architecture it again. Im probably not going to implement the organisation thing any time soon, so I should be fine for now. I’m hoping to finish with the structure today and start on the implementations tmrw."}, {"post_id": 71612, "ts": "2026-09-21T05:03:56Z", "hours": 8.0961, "text": "Vault Re-Architecturing (again) So I again noticed a few bugs like last time, and had a think about the Vault itself. I noticed that its getting kinda complicated and things are getting intertwined and there are funcs that arent used, and func of which I dont even know what they do. So unlike last time, where I just asked claude how to structure things, I decided to do some proper professional re-archtecturing. I already had an overall plan on how things were going to be structured, but it was pretty hard. The doc format I decided to use was ARC42 which is a guide on how to make a proper software architecture doc. I did skip a few things, but those werent really relevant in my case so thats fine. I also decided to make a style guide since things were getting kinda messy. I havent fully finished the style guide yet, but its a start and I really need to get this new vault finished before Stardance ends. If you want to look at the doc, its on my GitHub Wiki and its pretty straightforward and extensive. It did take me quite a while to think of everything in depth, so I will be spending a ton more time since software architecturing is pretty difficult."}, {"post_id": 69611, "ts": "2026-09-17T12:42:56Z", "hours": 8.3583, "text": "Bug Fixes + Code Cleanup + Documentation Since I didn’t really have much to do, I decided to prepare my app for release. Currently there are quite a few things wrong with Clientwarden. First, it has tons of bugs, and the code is sorta messy, and the architecture is also kinda borked. The whole point of the past revamp was to prevent a God Class like last time where Vault held pretty much everything. Its much better now, but its far from perfect. This time, Im actually going to make a whole style guide and an architecture plan/guide which should be good. After that, I can actually implement the new architecture and then fix the remaining bugs. Tomorrow, ill probably do a more in depth test of the app and then fix them and repeat before actually trying to re-architecture."}, {"post_id": 68022, "ts": "2026-09-14T12:09:27Z", "hours": 8.3717, "text": "New Bitwarden Fields (Passport, Drivers License, Bank Account) So I was just looking at the vault.json in ClientWarden to check something, and I noticed that the data field was missing, which was pretty weird since Bitwarden or VaultWarden will not accept or respond with a json without a data field. When I looked closer, they had also added new fields like passport , bankAccount and driversLicense which means they added new Item Types. These Item Types aren’t supported yet, but I might as well implement them so that Clientwarden supports them early. Right now, you can create and see the new Item Types, but I havent implemented support to view or edit these new types."}, {"post_id": 65866, "ts": "2026-09-11T09:26:44Z", "hours": 8.0503, "text": "Mac OS 27 Support + Tests I recently switched to Mac OS 27 Public Beta, which turned out to a very bad idea, as I hated the new icons and especially the new lighter glass. I was hoping that when MacOS 27 actually releases it would be fixed. Well, it released, and it wasn’t fixed. So I had to fix the UI for MacOS 27 and it was kinda pending anyway since it was sorta against Apple’s UI guidelines, but it looked amazing. The new one doesnt look as good, but its ok. Ill be fixing it in the days to come. I’m also working on more tests, specifically for the network part, since the network part is an important part of the vault."}, {"post_id": 64675, "ts": "2026-09-09T08:18:01Z", "hours": 8.6503, "text": "Finished Android UI So I was able to finally finish off the Android UI, and I was able to finish it off dramatically faster than I spent on the Mac OS UI. Mainly because, with the Mac OS UI, I had to spend a lot more time on the architecture and I had to revamp the Vault itself. My favorite part about making the UI is the About Screen, where I can hide tons of really cool effects and easter egg. If you download the Android App and go to Settings and about, you will see an App Icon which if you click 3 times, will spin around, kinda like the chrome easter egg."}, {"post_id": 62728, "ts": "2026-09-06T07:07:08Z", "hours": 8.6769, "text": "Android UI - Details Screen I was able to implement the Password History Screen as well as the Reprompt UI and the Clientwarden Image class so that I can use an Image, Icon or App Resource. I still need to add a progress bar to the Attachment Item, Add callbacks for the top bar, add multi select support (tbh i dont really know how Im going to implement this) and do the rest of the stuff from the readme. I do want to focus more on the Mac OS side as well, bc I want to support Golden Gate and add a few features. The Main features that need to be implemented are the Sign Up support, Offline Vault support, and a ton more. If you want to help with the project, dm me at @CT5 on slack."}, {"post_id": 60174, "ts": "2026-09-02T12:01:52Z", "hours": 9.1489, "text": "Android Support So I decided to work mainly on Android UI Support for now and then move onto Iced on Linux. I was able to work on the Details Screen as well as finish the Items Screen and fix some main stuff for the Nav Screen like adding Folder support and stuff. I also started work on getting the Android UI to compile on CMake and it looks like its going to be way harder than I thought it would be initially. Tbh it looks like Apple’s XCode Swift UI combo is generally the best, since they have a declarative style UI and things are pretty easy to Implement. With Windows, its XAML which wouldn’t fit in my situation, and for Android its almost perfect, except gradle is a pain and there a hundred types of everything, like the IconButton , Button , FilledTonalButton , TextButton , etc, and those are just the ones I learnt rn. Unlike Android, SwiftUI just has one type of button which can do everything which is pretty good for beginners and advanced ppl. And the best part, Swift UI can have negative padding, which is genuinaly PEAK!"}, {"post_id": 57922, "ts": "2026-08-30T08:01:03Z", "hours": 8.9831, "text": "Linux + Android Support I was able to do a ton of work for the past few days. I was working on Linux Support in Rust using Iced but it was pretty difficult to use to look good since it didn’t have any native nav panel elements and required me to make my own. So I decided to go to the Android side. Working with Android Kotlin was a bit difficult at first, but then it became much much easier. It was kinda annoying that I have to import literally everything, including the conversion things. By the end of the day, my imports were basically half the file. Either way, I decided to work on the Nav Screen first, and then the Items Panel which went pretty well. I think it turned out pretty well, but if you have any feedback, share it in the comments."}, {"post_id": 54965, "ts": "2026-08-26T12:19:21Z", "hours": 6.1822, "text": "Bug Fixes + Linux UI Ok, so I added an easter egg (see if you can find it), and I also switched to the list type Nav Panel which I had implemented but stashed before. I decided to restore it because it looked better and was a bit more organised, code-wise, and I thought it would help remove the shadows to fix light mode. I also had to change the folder button to glass and I also did a bit of work on the wiki. I decided to restart with the Windows UI, and I was planning on having a NavPanel, ItemsPanel and SidePanel with GenericItem’s which could perform the role of the TOTP Field, Text Field, Password Field, etc. However, I couldn’t do that bc WinUI isn’t declaritive like SwiftUI so I had to either create a bunch of xaml files and types, or just hide and show elements. Now that I think of it, I could’ve also populated it via C++, but I already moved on to the Linux side. For Linux, I was thinking of using QT with a catppuccin theme, since I’m very very bad at making color palette’s and stuff and the palette is pretty important. Anyway, after battling with QT with QML to work on MacOS and to even configure, bc it couldn’t find the deps from Conan, I was finally able to get it to work. I’m going to start working on the NavPanel tmrw. For now, Im going to have to develop the Linux UI on Mac, but after I finish the UI, ill move onto linux to finish it off."}, {"post_id": 52140, "ts": "2026-08-22T07:17:36Z", "hours": 5.7122, "text": "Adding Tests Since I wanted to revamp the old crypto stuff to support Argon2ID, I decided to create some tests to know if I’ve implemented it correctly or if I mess smth up. It took me waaay too long to figure this out. I had to fix a lot of stuff like adding a fake Clipboard, Storage and UI Bridge just so that I could link the backend, but in the end it was worth it."}, {"post_id": 50062, "ts": "2026-08-19T03:12:28Z", "hours": 5.2053, "text": "Autofill Support Ok, so it took me a while to figure out how to implement Autofill support. I dont have the Apple Dev License yet, so unfortunatly I couldn’t test it and the only thing I could do is see compiler errors and fix them. So the way it works, is that it has a notification thing, and the extension notifies the vault app, asking for all the logins that match the website, it then puts the website in the keychain so that the app can access it and then the app checks the keychain, writes the result to the same keychain and notifies the extension. I also made this cool screenshots of it infront of a really cool bg and it looks sooo cool."}, {"post_id": 47492, "ts": "2026-08-15T13:17:45Z", "hours": 2.8094, "text": "Drag and Drop Support Usually if I want to implement a new feature, I would ask Claude how I would do it and what APIs I should use, note that Im not just vibe coding everything, Im just asking it how to do smth. This time tho, I decided not to do that and to directly look at Apple Docs, and it was pretty helpful. I was able to figure out how to implement more animations and figure out how to implement drag and drop support which was kinda hard but I was able to implement it. I also fixed a folder bug and did some stuff for the wiki."}, {"post_id": 46202, "ts": "2026-08-13T08:27:22Z", "hours": 4.7533, "text": "Multi Select Support I added a multi-select support thing so that you can press shift and select all the items you want to delete, restore, perm delete, archive or un archive. I also made it so that there would be a biometric button on the autofill unlock window and I also made it shake when the password is incorrect, its kinda fun to just press unlock 100 times to see it shake. Next, Im going to add animation and add support for device unlock."}, {"post_id": 44485, "ts": "2026-08-10T08:48:11Z", "hours": 2.1506, "text": "Archive Support Ok, so Im still waiting for the Apple Developer License so until then I can’t implement a lot of the really good features. Currently I’ve just implemented Archive Support and some fixes like to Check for missing Websocket Events . Im going to be doing a full test soon, once I finish all the features for v1.1.0. I also added a networking page for the wiki."}, {"post_id": 43171, "ts": "2026-08-08T09:09:12Z", "hours": 5.3011, "text": "Passkey + Biometric Support + Security Updates So I was talking to @/Darren and they told me that I shouldn’t store auth keys in plaintext. I didn’t think that storing the keys would be a big issue since you needed a master Password to use them, but I decided to be safe anyway and I stored them in Keychain. Currently I can’t really implement most of the Keychain stuff because I don’t have an Apple Developer License yet. I also implemented broken passkey login support and also broken biometric support. They are broken bc I can’t really use them without a dev license"}, {"post_id": 41214, "ts": "2026-08-05T09:22:47Z", "hours": 7.8433, "text": "AutoFill Unlock Window So while waiting to get the Apple Developer License for the App Group Setup and Code Signing Setup, I decided to work on AutoLock Support for v1.1.0 and the tiny AutoFill unlock window. I also tried to add support for logging in via passkeys, until I realised that I can’t since I need the dev license and I need to add my app bundle name to my vaultwarden instance for it to work. I also implemented support for clientwarden to stay open in the background. The second screenshot is just a cool little failure bc I forgot to give it a liquid glass background."}, {"post_id": 38651, "ts": "2026-08-01T04:51:47Z", "hours": 0.9225, "text": "Crypto Docs Currently Im working on the Wiki, but after that, Ill work on v1.1.0 and the security stuff for v1.0.0. There really isn’t much so say here, bc its mostly just adding more stuff so docs."}, {"post_id": 38617, "ts": "2026-08-01T03:18:13Z", "hours": 8.1911, "text": "First Release Candidate - Functionality So I was able to fix quite a few bugs and implement a bunch of the last features I needed to add for the first release candidate. So I changed the network timeout, fixed the annoying padding on some generic items, fix sync, remove duplicate ciphers, fix race conditions, fix item duplication when offline, login view exceptions, change the title placeholder to value, prevent click to copy when editing, prevent sshKey and note from creating linked field, add delete folder message and make the button red, add a custom item for identity so that there arent 4 different fields for the name, add the remove field button, create the codeql thing and fix some stuff so that clientwarden would work with the official Bitwarden servers."}, {"post_id": 36280, "ts": "2026-07-28T08:52:43Z", "hours": 5.9608, "text": "Icon + Password Generator I fixed the SSH Key Cannot decrypt error and I also finished off a few things for the beta release. I designed an icon in Icon Composer, which is a really great app btw, why can’t windows have a proper UI app like that, and fixed the cmake so that it would show up. I also changed the about page to have a uniform height. The only issue is that there is a ton of blank space, so Im probably going to have to make some art for it myself. I also made a really cool password generator UI for passwords and stuff in the Login Item. I still need to make an ssh key thing, although I might do that on the next release."}, {"post_id": 34497, "ts": "2026-07-25T08:09:36Z", "hours": 7.5661, "text": "Clipboard + Screenshot Support & Settings UI I’ve pretty much fixed most of the larger bugs so I’m currently just working on the essential missing features that ClientWarden needs. I was able to add clipboard support, settings bridge, screenshot option, finish off websocket stuff, a proper versioning system and a much better settings UI, as well as proper folder support and a reprompt window for those sensitive notes. I’m probably going to make a cool graphic for the about window soon, so stay tuned."}, {"post_id": 32232, "ts": "2026-07-21T08:36:22Z", "hours": 3.9908, "text": "Bug Fixes Currently Im just focusing on making bug fixes and then working on new features. Because I’d rather fix it and then work on new features, rather than work on new features and fix a bunch of them later. A bunch of the bugs were caused by the vault rewrite or just me forgetting to finish implementing it. Anyway, so I fixed the Upload, Remove and Download Attachment, as well as the Add Website Button, invalid password vault unlock crash, I also made it to preserve the current tab (Bitwarden or Custom Server), refresh items panel every 5s, remove password after login and unlock, edit when creating an item, show deletion date and show password history date. I also noticed that when I create an empty ssh key and edit it with bitwarden, it fails, making a [cannot decrypt] error."}, {"post_id": 31048, "ts": "2026-07-19T04:02:54Z", "hours": 6.5961, "text": "Bug Fixes So I’ve done a lot of stuff. I just finished porting the Vault UI Bridge to the new Vault API which requires you to get an item from Vault. I also forgot to implement saving support for Card, Identity, Note and SSH Key, so I implemented that too. Also I fixed the favorites issue. I also fixed the TOTP field, bc when it was empty it would just have no code and would still show. The only other bugs I have left to fix are the add website bug, attachment bug and password preservation bug. Then I can get started on the other features like folder support, password gen support, pfp support, folder tree view support and clipboard support."}, {"post_id": 27540, "ts": "2026-07-13T06:03:33Z", "hours": 9.4325, "text": "Vault Rewrite The Vault rewrite is going pretty well so far. I’ve already finished the Vault Rewrite, but the only thing I have left is porting the old GenericItem stuff to the new Vault. At first, I was just fixing stuff that ended up in the error log, which was a bad idea, so I decided to skim through all the files and fix them as I saw them, which went pretty well. @/Dexrn suggested that I should make builders like Generic Item from the Vault and to have all the other Login Item and stuff a derived class from Generic Item using templates so that GenericItem would still output a LoginItem*. So I decided to have the normal Generic Item and then an Impl one based on Generic Item with all the Implementation functions in a protected part in Generic Item. Then Generic Item has its own GenericItem* ones, but the derived ones have their own LoginItem* ones from GenericItem Impl. Its pretty confusing but its easier to understand once you have a look. There is just a bit code that I need to fix, mainly CW Thread and then I should be done"}, {"post_id": 25053, "ts": "2026-07-09T00:31:15Z", "hours": 9.2058, "text": "Vault Rewrite So I’ve faced a couple of vault bugs over the past few days like [error could not decrypt] which is a serious error that could destroy anyone’s Bitwarden vault. The other issue that I’d been delaying for a while was the Vault Revamp, since the vault was incredibly messy and held stuff for networking, crypto and session, so I decided to start from scratch and copy and fix the code as I went. When I started from scratch, my mind went blank, I didn’t even know where to start, since the Network stuff needed session stuff and the crypto stuff, so I was beyond confused. I spent a day or two figuring it out, with no success. Then I asked ChatGPT because my Claude credits had just expired, and the second it gave me an answer, I knew I was cooked. I then asked Gemini, with the same results. Afterward I asked Claude, and the solution it gave me didn’t really work. It did tell me that it was a good idea to separate it into a Network, Session and Crypto class. Then I asked @/dexrn and they helped me figure out how to separate it. Essentially, what I ended up with is Vault does the CreateItem stuff which calls funcs in the Network and Session classes. The crypto class only holds the funcs and so does the Networking class. The session class holds all the vaultData and secret data."}, {"post_id": 22899, "ts": "2026-07-05T15:17:31Z", "hours": 5.5311, "text": "Attachment Support + Bug Fixes I was able to clean up the messy bridge code and add attachment support. I also fixed some bugs, like when you enter an incorrect email or password, it would crash the whole app in the login view, and also I added an error toast for each of the errors. I still need to implement a ton more stuff, like the freezing issue with the vault and the random signouts as well as making the vault faster."}, {"post_id": 21377, "ts": "2026-07-03T08:49:22Z", "hours": 3.5994, "text": "Login Item Support - SidePane I was able to finish the login viewer part of the SidePane which is the hardest part since it needs to show not only the username and password, but the totp code and the websites part. The only other part I need to work on, is the attachments callback and the card, identity, note and sshKey parts. I also fixed the padding for the details on the bottom which were touching the very bottom. I also had to add a few funcs into the backend to get the creation, modification and deletion date."}, {"post_id": 20630, "ts": "2026-07-02T08:35:03Z", "hours": 1.6858, "text": "Bug Fixes I was able to fix a few things in the Nav Panel Bridge, mainly renaming support. I also implemented Items Panel and a bit of the SidePanel. The Sidepanel is the hardest part, especially the part where it needs to save and the part where it needs to be populated. I also made items to automatically open when they are created. The only other things that I need to do are PFP support, make the vault faster, implement the bridge for the settings menu, add an option to allow screenshotting in settings and fix the random signouts in the vault."}, {"post_id": 19834, "ts": "2026-07-01T07:09:40Z", "hours": 2.8203, "text": "Finish up Nav Panel Bridge So I was able to finish building the Nav Panel Bridge. It was a bit difficult since I needed to fix a few things in the UI code, so that it could map the callbacks correctly. For some reason, Objective-C doesn’t have any syntax highlighting and it doesn’t check for errors at compile time, so you just end up with it breaking at runtime. I also forgot to add a UI element to rename the folder and the Vault is kinda slow to open. I also need to highlight the selected Item and add an animation for when the window extends."}, {"post_id": 19089, "ts": "2026-06-30T09:19:54Z", "hours": 4.2778, "text": "Start on the UI Bridge I was able to wire up the Vault and the UI today. I haven’t finished adding callbacks for the NavPanel or the Items Panel or the SidePanel, which is pretty much the whole vault, but I was able to do the Login, Unlock and ClientwardenApp callbacks. I had to make these callbacks in objective c, and it was soo hard, bc there wasn’t any good syntax highlighting and if there was an error, I had to wait for it to build and then look through the messy build logs and figure out what was wrong. I also noticed that the password field was a normal text field so I changed that and I also made it so that you can’t screenshot the vault. The login and unlock buttons also behaved kinda weird, so I fixed that. The only part of the Login Page that I haven’t done yet is the profile picture. I also added a loading screen btw."}, {"post_id": 18212, "ts": "2026-06-29T08:45:08Z", "hours": 2.1806, "text": "Cleaning Up Item Classes I decided to clean up my backend Vault Code since the item management code was pretty much the same copy pasted thing, so I decided to make all item classes, LoginItem, CardItem, IdentityItem, NoteItem, SSHKeyItem, a derived class from GenericItem. This was pretty difficult tho, because GenericItem returns GenericItem, and LoginItem and all the rest need GenericItem to return their class. I asked @dexrn , and they told me about covariant returns, where basically you can return GenericItem but then override it in LoginItem and return a LoginItem by calling the the GenericItem func and then converting it to LoginItem. I also noticed that the attachment code in the individual Item classes were out of date, so this helped organise them. There isn’t really much so show so Ill just post a scrshot of the build."}, {"post_id": 18120, "ts": "2026-06-29T04:02:19Z", "hours": 2.7272, "text": "Settings Page + Lock Support + Attachment Item So I was able to finish off some simple tasks as well as adding a settings page, a lock button on the menu bar under Vault and making the trash tool bar icons. I also added an Attachment Item with a progress bar. I also fixed added a proper roadmap in the readme for Mac OS, Windows and Linux Support. After I get MacOS working, ill probably replace the Windows image with a Mac OS one."}, {"post_id": 17487, "ts": "2026-06-28T09:13:47Z", "hours": 2.6439, "text": "UI States So I was able to finish off the UI by adding a Login and Unlock Page and adding states so that when the app runs, a getState callback func is run to know if the vault should present the Login Page or the Unlock Page. Once the vault is Unlocked or Logged into, the state will be switched to VaultUI. I also made the Unlock page fixed to a small window since it doesn’t really present much info."}, {"post_id": 17336, "ts": "2026-06-28T02:31:50Z", "hours": 1.5056, "text": "Unfortunatly, just as I was going to push my changes after the last devlog, I wanted to remove some files, so I ran git-filter-repo and it removed all my staged files. So basically, pretty much all the work I did for the past 4h yesterday were gone. I tried using reflog and even Disk Drill, but I wasn’t able to get it back. Thankfully, while I was trying to figure out how animations worked yesterday by asking claude, some of my code was there. It wasn’t a lot but I was able to reconstruct the rest from memory. I did remember some things today as well so I fixed those too. There will be another devlog today so stay tuned."}, {"post_id": 16805, "ts": "2026-06-27T09:05:03Z", "hours": 3.9606, "text": "Finish off Item Panel + Bug Fixes I was able to finish off the Items Panel by making the search bar and the new item button. I also fixed the animation issue that was present before. I also added some content things where it says No Items and stuff so that it doesnt look incomplete and blank. I was able to also get it to run in CMake and get it built into an app. There is still much to do, like changing the icon and making a github actions thing, and the UI Bridge. The UI Bridge should be pretty easy, hopefully."}, {"post_id": 16250, "ts": "2026-06-26T12:17:21Z", "hours": 7.1319, "text": "Finish off SidePanel + Nav Panel + Items Panel I spent wayy too long getting animations to work and it still doesnt work. Anyway, so I was able to finish off the SidePanel and the Navigation Panel as well as the Items Panel. The Navigation Panel now has a callback which passes the Items which are then passed to ItemsPanel to display them. The issue is that I can’t create an animation because of Swift States or smth. If I go to another navigation tab and then go back, the animation doesnt apply. I also added a mininum window width and height. I almost forgot, I was also able to add edit support which involved rewriting a bunch of code."}, {"post_id": 15581, "ts": "2026-06-25T10:44:28Z", "hours": 5.0989, "text": "Finished Generic Item + Field Item Ok, so I got a lot done. I was able to finish creating Generic Item and FieldItem. I decided to combine Websites in the Generic Item struct since it was going to be grouped together anyway, but maybe I should make a derived struct or class or smth next time. I might try and clean it up tho, because I’d rather clean it up now rather than never. I also added the TOTP and Websites Editable thing which were the hardest parts to add. Here are a couple of screenshots of all the stuff I’ve added."}, {"post_id": 14310, "ts": "2026-06-23T12:12:27Z", "hours": 3.505, "text": "Sidepane Stuff I was able to get most of the sidepane working. The only thing I have left is the custom fields and the bottom dates and attachment stuff. I used an array of a data struct which is used to store the fields that need to be displayed. This way I can separate the UI from the Vault UI code and the Vault. The VaultUI just bridges the Vault and UI code. I think it looks good so far, and I even added a nice glow effect when you reveal a password or item."}, {"post_id": 13657, "ts": "2026-06-22T12:38:01Z", "hours": 6.0439, "text": "UI Design So I made a lot of progress in designing the UI for the native MacOS version. It was really fun to design a UI with liquid glass. Usually I don’t like liquid glass on phones, but on a computer it really looks good. But when I try and close the nav menu, it has this sliding animation where it goes underneath the other icons with the border which looks kinda off. Im not too sure how to disable the collapse button, but it should be fine for now. Ive implemented an error modal as well to notify the user of errors instead of making them read the log files. The font kinda looks off and the sizing as well, but Im not sure how to fix it. If you know how to improve it, tell me in the comments. Next devlog, Im going to try and get it to work with cmake or ill just keep developing the UI."}, {"post_id": 12945, "ts": "2026-06-21T05:50:19Z", "hours": 1.4514, "text": "Switch to MacOS tbh the WinUI code is insanely messy and needs to be fixed, so I’ll be fixing it later. I think it would be good for me to start on the mac os side of things because it would allow me to work on less messy code. I think it would be much better to work on new code rather than fixing old code. There are still a ton of random bugs where sometimes editing will not work and some things will fail randomly."}, {"post_id": 12353, "ts": "2026-06-20T04:48:39Z", "hours": 2.2797, "text": "Getting ClientWarden Working Again! After almost 2 weeks of setting up my mac, I was finally able to create a windows VM and get Clientwarden to build on ARM64. Although it was a bit difficult. First I needed to get all the vcpkg dependencies, so I did vcpkg install. One of the dependencies was boost which needed to build some python library. For some reason it was giving me a heap error stating that it didn’t have enough heap space. I looked at task manager and it did indeed use up all my 8GB of ram. I tried increasing my windows swap but it didn’t work, so I had to increase the ram on the vm to 64GB, even though I had 16GB of ram. Mac OS was able to speedily transfer and compress all that memory to its swap, and after a while, it finally built the lib taking about ~30GB of memory"}, {"post_id": 3375, "ts": "2026-06-06T08:29:39Z", "hours": 1.6608, "text": "Bug Fixes I finally got the bugs fixed and after a long time of debugging I was able to fix the folder error. I still have a ton of bugs to fix, but the folder one was the hardest one so far."}, {"post_id": 192, "ts": "2026-06-01T07:02:56Z", "hours": 1.2086, "text": "Quality Checks + Documentation I just finished quality checking the whole app and it is kinda buggy in some places so I decided to write it all down. I want to address these bugs before I work on more features, as well as documenting the code and the Bitwarden/Vaultwarden API. Vaultwarden API is a mess of the old and new Bitwarden API. Anyway I caught a ton of bugs that I will address before finishing off WebSockets."}]...
|
Title: Clientwarden by @CT5 | Stardance
Devlogs:
Title: Clientwarden by @CT5 | Stardance
Devlogs:
Quality Checks + Documentation I just finished quality checking the whole app and it is kinda buggy in some places so I decided to write it all down. I want to address these bugs before I work on more features, as well as documenting the code and the Bitwarden/Vaultwarden API. Vaultwarden API is a mess of the old and new Bitwarden API. Anyway I caught a ton of bugs that I will address before finishing off WebSockets.
Bug Fixes I finally got the bugs fixed and after a long time of debugging I was able to fix the folder error. I still have a ton of bugs to fix, but the folder one was the hardest one so far.
Getting ClientWarden Working Again! After almost 2 weeks of setting up my mac, I was finally able to create a windows VM and get Clientwarden to build on ARM64. Although it was a bit difficult. First I needed to get all the vcpkg dependencies, so I did vcpkg install. One of the dependencies was boost which needed to build some python library. For some reason it was giving me a heap error stating that it didn’t have enough heap space. I looked at task manager and it did indeed use up all my 8GB of ram. I tried increasing my windows swap but it didn’t work, so I had to increase the ram on the vm to 64GB, even though I had 16GB of ram. Mac OS was able to speedily transfer and compress all that memory to its swap, and after a while, it finally built the lib taking about ~30GB of memory
Switch to MacOS tbh the WinUI code is insanely messy and needs to be fixed, so I’ll be fixing it later. I think it would be good for me to start on the mac os side of things because it would allow me to work on less messy code. I think it would be much better to work on new code rather than fixing old code. There are still a ton of random bugs where sometimes editing will not work and some things will fail randomly.
UI Design So I made a lot of progress in designing the UI for the native MacOS version. It was really fun to design a UI with liquid glass. Usually I don’t like liquid glass on phones, but on a computer it really looks good. But when I try and close the nav menu, it has this sliding animation where it goes underneath the other icons with the border which looks kinda off. Im not too sure how to disable the collapse button, but it should be fine for now. Ive implemented an error modal as well to notify the user of errors instead of making them read the log files. The font kinda looks off and the sizing as well, but Im not sure how to fix it. If you know how to improve it, tell me in the comments. Next devlog, Im going to try and get it to work with cmake or ill just keep developing the UI.
Sidepane Stuff I was able to get most of the sidepane working. The only thing I have left is the custom fields and the bottom dates and attachment stuff. I used an array of a data struct which is used to store the fields that need to be displayed. This way I can separate the UI from the Vault UI code and the Vault. The VaultUI just bridges the Vault and UI code. I think it looks good so far, and I even added a nice glow effect when you reveal a password or item.
Finished Generic Item + Field Item Ok, so I got a lot done. I was able to finish creating Generic Item and FieldItem. I decided to combine Websites in the Generic Item struct since it was going to be grouped together anyway, but maybe I should make a derived struct or class or smth next time. I might try and clean it up tho, because I’d rather clean it up now rather than never. I also added the TOTP and Websites Editable thing which were the hardest parts to add. Here are a couple of screenshots of all the stuff I’ve added.
Finish off SidePanel + Nav Panel + Items Panel I spent wayy too long getting animations to work and it still doesnt work. Anyway, so I was able to finish off the SidePanel and the Navigation Panel as well as the Items Panel. The Navigation Panel now has a callback which passes the Items which are then passed to ItemsPanel to display them. The issue is that I can’t create an animation because of Swift States or smth. If I go to another navigation tab and then go back, the animation doesnt apply. I also added a mininum window width and height. I almost forgot, I was also able to add edit support which involved rewriting a bunch of code.
Finish off Item Panel + Bug Fixes I was able to finish off the Items Panel by making the search bar and the new item button. I also fixed the animation issue that was present before. I also added some content things where it says No Items and stuff so that it doesnt look incomplete and blank. I was able to also get it to run in CMake and get it built into an app. There is still much to do, like changing the icon and making a github actions thing, and the UI Bridge. The UI Bridge should be pretty easy, hopefully.
Unfortunatly, just as I was going to push my changes after the last devlog, I wanted to remove some files, so I ran git-filter-repo and it removed all my staged files. So basically, pretty much all the work I did for the past 4h yesterday were gone. I tried using reflog and even Disk Drill, but I wasn’t able to get it back. Thankfully, while I was trying to figure out how animations worked yesterday by asking claude, some of my code was there. It wasn’t a lot but I was able to reconstruct the rest from memory. I did remember some things today as well so I fixed those too. There will be another devlog today so stay tuned.
UI States So I was able to finish off the UI by adding a Login and Unlock Page and adding states so that when the app runs, a getState callback func is run to know if the vault should present the Login Page or the Unlock Page. Once the vault is Unlocked or Logged into, the state will be switched to VaultUI. I also made the Unlock page fixed to a small window since it doesn’t really present much info.
Settings Page + Lock Support + Attachment Item So I was able to finish off some simple tasks as well as adding a settings page, a lock button on the menu bar under Vault and making the trash tool bar icons. I also added an Attachment Item with a progress bar. I also fixed added a proper roadmap in the readme for Mac OS, Windows and Linux Support. After I get MacOS working, ill probably replace the Windows image with a Mac OS one.
Cleaning Up Item Classes I decided to clean up my backend Vault Code since the item management code was pretty much the same copy pasted thing, so I decided to make all item classes, LoginItem, CardItem, IdentityItem, NoteItem, SSHKeyItem, a derived class from GenericItem. This was pretty difficult tho, because GenericItem returns GenericItem, and LoginItem and all the rest need GenericItem to return their class. I asked @dexrn , and they told me about covariant returns, where basically you can return GenericItem but then override it in LoginItem and return a LoginItem by calling the the GenericItem func and then converting it to LoginItem. I also noticed that the attachment code in the individual Item classes were out of date, so this helped organise them. There isn’t really much so show so Ill just post a scrshot of the build.
Start on the UI Bridge I was able to wire up the Vault and the UI today. I haven’t finished adding callbacks for the NavPanel or the Items Panel or the SidePanel, which is pretty much the whole vault, but I was able to do the Login, Unlock and ClientwardenApp callbacks. I had to make these callbacks in objective c, and it was soo hard, bc there wasn’t any good syntax highlighting and if there was an error, I had to wait for it to build and then look through the messy build logs and figure out what was wrong. I also noticed that the password field was a normal text field so I changed that and I also made it so that you can’t screenshot the vault. The login and unlock buttons also behaved kinda weird, so I fixed that. The only part of the Login Page that I haven’t done yet is the profile picture. I also added a loading screen btw.
Finish up Nav Panel Bridge So I was able to finish building the Nav Panel Bridge. It was a bit difficult since I needed to fix a few things in the UI code, so that it could map the callbacks correctly. For some reason, Objective-C doesn’t have any syntax highlighting and it doesn’t check for errors at compile time, so you just end up with it breaking at runtime. I also forgot to add a UI element to rename the folder and the Vault is kinda slow to open. I also need to highlight the selected Item and add an animation for when the window extends.
Bug Fixes I was able to fix a few things in the Nav Panel Bridge, mainly renaming support. I also implemented Items Panel and a bit of the SidePanel. The Sidepanel is the hardest part, especially the part where it needs to save and the part where it needs to be populated. I also made items to automatically open when they are created. The only other things that I need to do are PFP support, make the vault faster, implement the bridge for the settings menu, add an option to allow screenshotting in settings and fix the random signouts in the vault.
Login Item Support - SidePane I was able to finish the login viewer part of the SidePane which is the hardest part since it needs to show not only the username and password, but the totp code and the websites part. The only other part I need to work on, is the attachments callback and the card, identity, note and sshKey parts. I also fixed the padding for the details on the bottom which were touching the very bottom. I also had to add a few funcs into the backend to get the creation, modification and deletion date.
Attachment Support + Bug Fixes I was able to clean up the messy bridge code and add attachment support. I also fixed some bugs, like when you enter an incorrect email or password, it would crash the whole app in the login view, and also I added an error toast for each of the errors. I still need to implement a ton more stuff, like the freezing issue with the vault and the random signouts as well as making the vault faster.
Vault Rewrite So I’ve faced a couple of vault bugs over the past few days like [error could not decrypt] which is a serious error that could destroy anyone’s Bitwarden vault. The other issue that I’d been delaying for a while was the Vault Revamp, since the vault was incredibly messy and held stuff for networking, crypto and session, so I decided to start from scratch and copy and fix the code as I went. When I started from scratch, my mind went blank, I didn’t even know where to start, since the Network stuff needed session stuff and the crypto stuff, so I was beyond confused. I spent a day or two figuring it out, with no success. Then I asked ChatGPT because my Claude credits had just expired, and the second it gave me an answer, I knew I was cooked. I then asked Gemini, with the same results. Afterward I asked Claude, and the solution it gave me didn’t really work. It did tell me that it was a good idea to separate it into a Network, Session and Crypto class. Then I asked @/dexrn and they helped me figure out how to separate it. Essentially, what I ended up with is Vault does the CreateItem stuff which calls funcs in the Network and Session classes. The crypto class only holds the funcs and so does the Networking class. The session class holds all the vaultData and secret data.
Vault Rewrite The Vault rewrite is going pretty well so far. I’ve already finished the Vault Rewrite, but the only thing I have left is porting the old GenericItem stuff to the new Vault. At first, I was just fixing stuff that ended up in the error log, which was a bad idea, so I decided to skim through all the files and fix them as I saw them, which went pretty well. @/Dexrn suggested that I should make builders like Generic Item from the Vault and to have all the other Login Item and stuff a derived class from Generic Item using templates so that GenericItem would still output a LoginItem*. So I decided to have the normal Generic Item and then an Impl one based on Generic Item with all the Implementation functions in a protected part in Generic Item. Then Generic Item has its own GenericItem* ones, but the derived ones have their own LoginItem* ones from GenericItem Impl. Its pretty confusing but its easier to understand once you have a look. There is just a bit code that I need to fix, mainly CW Thread and then I should be done
Bug Fixes So I’ve done a lot of stuff. I just finished porting the Vault UI Bridge to the new Vault API which requires you to get an item from Vault. I also forgot to implement saving support for Card, Identity, Note and SSH Key, so I implemented that too. Also I fixed the favorites issue. I also fixed the TOTP field, bc when it was empty it would just have no code and would still show. The only other bugs I have left to fix are the add website bug, attachment bug and password preservation bug. Then I can get started on the other features like folder support, password gen support, pfp support, folder tree view support and clipboard support.
Bug Fixes Currently Im just focusing on making bug fixes and then working on new features. Because I’d rather fix it and then work on new features, rather than work on new features and fix a bunch of them later. A bunch of the bugs were caused by the vault rewrite or just me forgetting to finish implementing it. Anyway, so I fixed the Upload, Remove and Download Attachment, as well as the Add Website Button, invalid password vault unlock crash, I also made it to preserve the current tab (Bitwarden or Custom Server), refresh items panel every 5s, remove password after login and unlock, edit when creating an item, show deletion date and show password history date. I also noticed that when I create an empty ssh key and edit it with bitwarden, it fails, making a [cannot decrypt] error.
Clipboard + Screenshot Support & Settings UI I’ve pretty much fixed most of the larger bugs so I’m currently just working on the essential missing features that ClientWarden needs. I was able to add clipboard support, settings bridge, screenshot option, finish off websocket stuff, a proper versioning system and a much better settings UI, as well as proper folder support and a reprompt window for those sensitive notes. I’m probably going to make a cool graphic for the about window soon, so stay tuned.
Icon + Password Generator I fixed the SSH Key Cannot decrypt error and I also finished off a few things for the beta release. I designed an icon in Icon Composer, which is a really great app btw, why can’t windows have a proper UI app like that, and fixed the cmake so that it would show up. I also changed the about page to have a uniform height. The only issue is that there is a ton of blank space, so Im probably going to have to make some art for it myself. I also made a really cool password generator UI for passwords and stuff in the Login Item. I still need to make an ssh key thing, although I might do that on the next release.
First Release Candidate - Functionality So I was able to fix quite a few bugs and implement a bunch of the last features I needed to add for the first release candidate. So I changed the network timeout, fixed the annoying padding on some generic items, fix sync, remove duplicate ciphers, fix race conditions, fix item duplication when offline, login view exceptions, change the title placeholder to value, prevent click to copy when editing, prevent sshKey and note from creating linked field, add delete folder message and make the button red, add a custom item for identity so that there arent 4 different fields for the name, add the remove field button, create the codeql thing and fix some stuff so that clientwarden would work with the official Bitwarden servers.
Crypto Docs Currently Im working on the Wiki, but after that, Ill work on v1.1.0 and the security stuff for v1.0.0. There really isn’t much so say here, bc its mostly just adding more stuff so docs.
AutoFill Unlock Window So while waiting to get the Apple Developer License for the App Group Setup and Code Signing Setup, I decided to work on AutoLock Support for v1.1.0 and the tiny AutoFill unlock window. I also tried to add support for logging in via passkeys, until I realised that I can’t since I need the dev license and I need to add my app bundle name to my vaultwarden instance for it to work. I also implemented support for clientwarden to stay open in the background. The second screenshot is just a cool little failure bc I forgot to give it a liquid glass background.
Passkey + Biometric Support + Security Updates So I was talking to @/Darren and they told me that I shouldn’t store auth keys in plaintext. I didn’t think that storing the keys would be a big issue since you needed a master Password to use them, but I decided to be safe anyway and I stored them in Keychain. Currently I can’t really implement most of the Keychain stuff because I don’t have an Apple Developer License yet. I also implemented broken passkey login support and also broken biometric support. They are broken bc I can’t really use them without a dev license
Archive Support Ok, so Im still waiting for the Apple Developer License so until then I can’t implement a lot of the really good features. Currently I’ve just implemented Archive Support and some fixes like to Check for missing Websocket Events . Im going to be doing a full test soon, once I finish all the features for v1.1.0. I also added a networking page for the wiki.
Multi Select Support I added a multi-select support thing so that you can press shift and select all the items you want to delete, restore, perm delete, archive or un archive. I also made it so that there would be a biometric button on the autofill unlock window and I also made it shake when the password is incorrect, its kinda fun to just press unlock 100 times to see it shake. Next, Im going to add animation and add support for device unlock.
Drag and Drop Support Usually if I want to implement a new feature, I would ask Claude how I would do it and what APIs I should use, note that Im not just vibe coding everything, Im just asking it how to do smth. This time tho, I decided not to do that and to directly look at Apple Docs, and it was pretty helpful. I was able to figure out how to implement more animations and figure out how to implement drag and drop support which was kinda hard but I was able to implement it. I also fixed a folder bug and did some stuff for the wiki.
Autofill Support Ok, so it took me a while to figure out how to implement Autofill support. I dont have the Apple Dev License yet, so unfortunatly I couldn’t test it and the only thing I could do is see compiler errors and fix them. So the way it works, is that it has a notification thing, and the extension notifies the vault app, asking for all the logins that match the website, it then puts the website in the keychain so that the app can access it and then the app checks the keychain, writes the result to the same keychain and notifies the extension. I also made this cool screenshots of it infront of a really cool bg and it looks sooo cool.
Adding Tests Since I wanted to revamp the old crypto stuff to support Argon2ID, I decided to create some tests to know if I’ve implemented it correctly or if I mess smth up. It took me waaay too long to figure this out. I had to fix a lot of stuff like adding a fake Clipboard, Storage and UI Bridge just so that I could link the backend, but in the end it was worth it.
Bug Fixes + Linux UI Ok, so I added an easter egg (see if you can find it), and I also switched to the list type Nav Panel which I had implemented but stashed before. I decided to restore it because it looked better and was a bit more organised, code-wise, and I thought it would help remove the shadows to fix light mode. I also had to change the folder button to glass and I also did a bit of work on the wiki. I decided to restart with the Windows UI, and I was planning on having a NavPanel, ItemsPanel and SidePanel with GenericItem’s which could perform the role of the TOTP Field, Text Field, Password Field, etc. However, I couldn’t do that bc WinUI isn’t declaritive like SwiftUI so I had to either create a bunch of xaml files and types, or just hide and show elements. Now that I think of it, I could’ve also populated it via C++, but I already moved on to the Linux side. For Linux, I was thinking of using QT with a catppuccin theme, since I’m very very bad at making color palette’s and stuff and the palette is pretty important. Anyway, after battling with QT with QML to work on MacOS and to even configure, bc it couldn’t find the deps from Conan, I was finally able to get it to work. I’m going to start working on the NavPanel tmrw. For now, Im going to have to develop the Linux UI on Mac, but after I finish the UI, ill move onto linux to finish it off.
Linux + Android Support I was able to do a ton of work for the past few days. I was working on Linux Support in Rust using Iced but it was pretty difficult to use to look good since it didn’t have any native nav panel elements and required me to make my own. So I decided to go to the Android side. Working with Android Kotlin was a bit difficult at first, but then it became much much easier. It was kinda annoying that I have to import literally everything, including the conversion things. By the end of the day, my imports were basically half the file. Either way, I decided to work on the Nav Screen first, and then the Items Panel which went pretty well. I think it turned out pretty well, but if you have any feedback, share it in the comments.
Android Support So I decided to work mainly on Android UI Support for now and then move onto Iced on Linux. I was able to work on the Details Screen as well as finish the Items Screen and fix some main stuff for the Nav Screen like adding Folder support and stuff. I also started work on getting the Android UI to compile on CMake and it looks like its going to be way harder than I thought it would be initially. Tbh it looks like Apple’s XCode Swift UI combo is generally the best, since they have a declarative style UI and things are pretty easy to Implement. With Windows, its XAML which wouldn’t fit in my situation, and for Android its almost perfect, except gradle is a pain and there a hundred types of everything, like the IconButton , Button , FilledTonalButton , TextButton , etc, and those are just the ones I learnt rn. Unlike Android, SwiftUI just has one type of button which can do everything which is pretty good for beginners and advanced ppl. And the best part, Swift UI can have negative padding, which is genuinaly PEAK!
Android UI - Details Screen I was able to implement the Password History Screen as well as the Reprompt UI and the Clientwarden Image class so that I can use an Image, Icon or App Resource. I still need to add a progress bar to the Attachment Item, Add callbacks for the top bar, add multi select support (tbh i dont really know how Im going to implement this) and do the rest of the stuff from the readme. I do want to focus more on the Mac OS side as well, bc I want to support Golden Gate and add a few features. The Main features that need to be implemented are the Sign Up support, Offline Vault support, and a ton more. If you want to help with the project, dm me at @CT5 on slack.
Finished Android UI So I was able to finally finish off the Android UI, and I was able to finish it off dramatically faster than I spent on the Mac OS UI. Mainly because, with the Mac OS UI, I had to spend a lot more time on the architecture and I had to revamp the Vault itself. My favorite part about making the UI is the About Screen, where I can hide tons of really cool effects and easter egg. If you download the Android App and go to Settings and about, you will see an App Icon which if you click 3 times, will spin around, kinda like the chrome easter egg.
Mac OS 27 Support + Tests I recently switched to Mac OS 27 Public Beta, which turned out to a very bad idea, as I hated the new icons and especially the new lighter glass. I was hoping that when MacOS 27 actually releases it would be fixed. Well, it released, and it wasn’t fixed. So I had to fix the UI for MacOS 27 and it was kinda pending anyway since it was sorta against Apple’s UI guidelines, but it looked amazing. The new one doesnt look as good, but its ok. Ill be fixing it in the days to come. I’m also working on more tests, specifically for the network part, since the network part is an important part of the vault.
New Bitwarden Fields (Passport, Drivers License, Bank Account) So I was just looking at the vault.json in ClientWarden to check something, and I noticed that the data field was missing, which was pretty weird since Bitwarden or VaultWarden will not accept or respond with a json without a data field. When I looked closer, they had also added new fields like passport , bankAccount and driversLicense which means they added new Item Types. These Item Types aren’t supported yet, but I might as well implement them so that Clientwarden supports them early. Right now, you can create and see the new Item Types, but I havent implemented support to view or edit these new types.
Bug Fixes + Code Cleanup + Documentation Since I didn’t really have much to do, I decided to prepare my app for release. Currently there are quite a few things wrong with Clientwarden. First, it has tons of bugs, and the code is sorta messy, and the architecture is also kinda borked. The whole point of the past revamp was to prevent a God Class like last time where Vault held pretty much everything. Its much better now, but its far from perfect. This time, Im actually going to make a whole style guide and an architecture plan/guide which should be good. After that, I can actually implement the new architecture and then fix the remaining bugs. Tomorrow, ill probably do a more in depth test of the app and then fix them and repeat before actually trying to re-architecture.
Vault Re-Architecturing (again) So I again noticed a few bugs like last time, and had a think about the Vault itself. I noticed that its getting kinda complicated and things are getting intertwined and there are funcs that arent used, and func of which I dont even know what they do. So unlike last time, where I just asked claude how to structure things, I decided to do some proper professional re-archtecturing. I already had an overall plan on how things were going to be structured, but it was pretty hard. The doc format I decided to use was ARC42 which is a guide on how to make a proper software architecture doc. I did skip a few things, but those werent really relevant in my case so thats fine. I also decided to make a style guide since things were getting kinda messy. I havent fully finished the style guide yet, but its a start and I really need to get this new vault finished before Stardance ends. If you want to look at the doc, its on my GitHub Wiki and its pretty straightforward and extensive. It did take me quite a while to think of everything in depth, so I will be spending a ton more time since software architecturing is pretty difficult.
Vault Re-Architecturing - Part 2 So I started working on the architecture and it was pretty difficult. I was able to add the crypto, netowrk, orchestrator, profile, runtime, settings, sync and versioning. So currently, I’ve decieded to expose only the orchestrator, settings and versioning because those are the only essential features that the UI requires, and exposing any more would re-create a God Class. Essentially, this time I decided to abstract it enough so that it would work with 1Pass and Bitwarden as a guide so that it would be abstract enough, even though I’m probably never going to support another password manager API. One thing I didn’t account for was the fact that BitWarden has an Organisation thing where the Organisation has its own keys and stuff, which pretty much requires me to re-architecture it again. Im probably not going to implement the organisation thing any time soon, so I should be fine for now. I’m hoping to finish with the structure today and start on the implementations tmrw.
Finishing off the New Architecture So I was able to finish off the Architecture Implementations and add a few more classes, like the Thread and Utils files. I also added a ton of comments (one per func & one per class/struct) as per the style guidelines that I wrote. Writing the comments took me waaay too long, since some funcs were pretty generic and I couldnt think of what comment to put for that func. I still have a ton more to do, like the Generic Item Stuff which is really really confusing and I havent even gotten to that part yet. After all that, I need to start on the BitWarden Vendor stuff and then integrate all that into the UI Bridge which shouldnt be too hard.
BitWarden Vendor Architecture - Part 1 Now that I’ve completed the Generic Base classes and stuff, I decided to work on the Vendor stuff. The main goal of the Architecturing is to make the architecture loose enough to work with BitWarden and 1Password, since if I focused solely on BitWarden again, it would have ended up being less abstract and I wanted it to be as abstract as possible without complicating things too much. Anyway, so I was able to finish off the crypto class and get started on the network class which pretty good progress. I did think of some additional ways to make it abstract, like making the UI call the Network class to get a list of all the URLs needed. Im hoping to get all the vendor classes finished by the end of next week and then start fixing the UI and UI Bridge in the following week.
BitWarden Vendor Architecture - Part 2 So I was able to finish off the BitWarden Network part which was somewhat hard, but it was just mainly repetitive stuff. I also got started on the BitWarden Runtime which wasnt too hard, although its sorta difficult to wrap your head around. After I finish off the runtime, I should be able to get started on the orchestrator and sync and versioning parts. For the Bitwarden Network I decided to integrate some stuff from the previous orchestrator that was wouldve been better to have in the Network and the same thing with Runtime as well.
BitWarden Vendor Architecture - Part 3 Making the orchestrator is pretty difficult because tying everything together is soo difficult, especially with the attachment stuff. BitWarden has some weird concepts on how it works. When creating an item and pushing it to the server, the server generates the id for you and sends the whole cipher back. However, if the network request fails halfway through, then it can create it online, without giving you the id. There are 3 solutions to this. One, is to just re-push, which creates a duplicate. Another way to fix this, is to leave it and fail, which is not a good idea. The best way to combat this situation, is to pull the items from the server, and find the one that was created by comparing the key from the local and remote vaults. The issue, is that sometimes, there is no key, so we have to rely on comparing the fields alone, which isnt the best, but its the only way. This is pretty difficult to think of on the spot and to resolve quickly, so thats why it took me so long. The other issue, is that I’ve faced a roadblock. I didnt think of attachments when designing the runtime class, so I have to add more funcs to help with offline attachments. Another issue, is that the runtime class is getting kinda messy now, since there are like 5 of the same type of funcs so I have to clean that up too. And then, I have the largest issue that I have to fix. Syncing. Syncing is a pretty weird concept on BitWarden. If you update an item offline, you dont change the revision Date, the version changes it. However, if the server’s item was changed as well, then it gets complicated because you need to handle it yourself. The first thing you can do, is to merge the individual fields, like if the name was changed on the server, and the username was changed on the client, then merge both. However if the name was changed on the server and the client, then you can create a new item with (conflict X) and then push that. All this is pretty complicated, and its probably going to get even more complicated soon.
BitWarden Vendor Architecture - Part 4 I forgot to devlog today, so consider this 8h and 30mins and add 30mins to the next devlog. I finally finished Orchestrator which took waaaay too much time (almost 5 days) and I had to fix my plan a bit as well because of the roadblocks. Finishing off the rest of it was pretty easy and starting on the Sync class was much easier due to the massive amount of time it took for me to think of a solution to the syncing issue in the midst of the Orchestrator issues. Ill be posting a Sync finished devlog soon, probably tmrw, so stay tuned!
BitWarden Vendor Architecture - Part 5 I kinda hoped that Sync would be easier but its pretty much as hard as Orchestrator, despite looking at the sync logic before hand and having to do less. I also rushed a ton of the stuff, so I need to have another look over the whole codebase and add comments and stuff before I continue again. I also need to handle all the todos and stuff. Tomorrow Im going to work on a lot of the bugs and errors with the runtime, sync and orchestrator because I did rush a lot of it....
|
1792504296.8145175
|
1793109096.8145175
|
|
25673
|
Observatory by @Gerafftes | Stardance
|
Gerafftes
|
0
|
264.57
|
0
|
[]
|
[{"post_id": 80706, "ts": "202 [{"post_id": 80706, "ts": "2026-10-18T15:55:28Z", "hours": 10.1042, "text": "DEVLOG #42 RX3 and RX4 have passed their individual checks on the latest firmware. A complete OTA update, the LED pattern test and ten minutes of stability monitoring each, with no errors recorded. The false SOS warning on RX1 is also fixed and verified on the board now. I corrected concurrent access in the shared UDP sender and transport statistics, too. Those are real software fixes, but I still can’t claim they explain the original RX3 heap corruption or watchdog resets. I also improved CAD profile handling. Profiles can use a separate store, the UI shows which revision is loaded, and refreshing no longer overwrites unsaved edits or brings back an older saved version. The rollout isn’t finished, though. The next RX1 update stopped because its device identity couldn’t be confirmed, so RX2’s update to this latest version hasn’t started either. Next: resolve that binding, finish updating RX1 and RX2, then move on to the actual two-way peer comparison. Tracking acceptance is still open."}, {"post_id": 80452, "ts": "2026-10-17T17:48:17Z", "hours": 9.9825, "text": "DEVLOG #41 RX1 finally passed a full three-minute TX1→RX1 test. 6,407 qualified CSI frames, around 35.6 per second, and all 173 measurement windows passed. The firmware had been rejecting our setup because TX1 is also the Wi-Fi access point. That’s corrected and installed now. SOS is the warning for missing or stale usable CSI from TX1. It doesn’t automatically mean the board is broken. Ironically, the warning itself had a bug, RX1 reported stale data even though a matching frame had arrived just 8.7 milliseconds earlier. A timing race between the LED task and CSI reception caused the false alarm. The fix is built and tested offline, but isn’t installed yet. Host startup and recording also work now. RX2 is still a problem, though: its upload timed out while CSI kept arriving, and the cause isn’t confirmed. Next: install and verify the LED fix on RX1 before continuing with the other receivers. The actual two-way peer comparison and tracking acceptance are still open."}, {"post_id": 80208, "ts": "2026-10-16T19:06:18Z", "hours": 10.01, "text": "DEVLOG #40 I cut the recording footprint from 4.54 to 2.67 GB in the full synthetic test, about 41% less. The saving comes mainly from removing duplicate exports, not throwing away raw data or evidence. I also corrected timing and CSI rate-limit bugs offline, plus a cleanup issue that could prevent the recorder from stopping its own processes when disk space got tight. The frustrating part is that the peer comparison still hasn’t recorded anything. One attempt stopped on the timing bug, after that was fixed, the next hit a missing signing key during host startup. No peer firmware was uploaded and no capture started in either attempt. Next: fix host startup and prepare a separate 35-minute pilot. The actual peer comparison and tracking acceptance are still open."}, {"post_id": 79987, "ts": "2026-10-15T19:13:06Z", "hours": 10.2558, "text": "DEVLOG #39 All four receivers finally made it through a full 30-minute CSI run together. RX1, RX3 and RX4 are now on C1, while RX2 stays on C. Each delivered around 17–20 matching frames per second, and 99.61% of the shared measurement windows passed the CSI checks. The RX1↔RX4 peer firmware and recording workflow are also implemented and tested offline now. The actual radio comparison hasn’t happened yet, so I still don’t know whether those extra links will improve positioning. One annoying bug kept rejecting good data after a 128→64→128 format change. That’s fixed in the offline analysis, along with separate format rules for TX1 and peer links and a recorder completion check. I also added RX and radar exports that keep raw data, timing and recording boundaries together. That path works in offline tests; it isn’t a new live hardware result. Next: check both mmWave sensors individually and then together at known points. The shared CSI run is a milestone, but tracking and full-system acceptance are still open."}, {"post_id": 79381, "ts": "2026-10-13T18:55:19Z", "hours": 9.4147, "text": "DEVLOG #38 RX2 is finally delivering a lot more matching CSI data. After installing the new firmware, the rate went from about 1.9 to 31.9 frames per second. A longer, half-hour capture averaged around 30. The firmware now fixes Wi-Fi bandwidth at 20 MHz and guards against invalid CSI callbacks. One annoying catch: the long capture only recorded RX2 because some device endpoints were outdated or mixed up. I’ve prepared a stricter preflight so an incomplete group can’t silently become a four-receiver test again. I also corrected the offline window analysis. A valid frame with a different format no longer ruins an entire otherwise usable window. The UI code now separates format exclusions from unexplained sequence gaps instead of calling everything “loss”. The host fixes are tested locally, but aren’t active on the running server yet. Next: complete a proper simultaneous four-RX capture, then implement the RX1 <-> RX4 peer profile for testing. Tracking and full-system acceptance are still open."}, {"post_id": 78806, "ts": "2026-10-11T17:42:21Z", "hours": 9.8042, "text": "DEVLOG #37 I narrowed down the RX2 and mmWave2 issues from the failed run. Still no hardware fix, but the picture is getting clearer. The surprising part is that RX2 was still sending valid CSI packets during its apparent dropout. They just weren’t the 128-subcarrier frames the current evaluation needs. mmWave2, on the other hand, really did have gaps in packets reaching the host. I’m looking into its send-and-acknowledgement path, but haven’t proven the cause yet. I also found a parser mistake. A supposedly damaged RX packet was actually a valid warning message. That’s corrected in the isolated diagnostic tools, which now also distinguish device timeouts from requests the collector skipped or cancelled. New diagnostic firmware candidates for TX1, RX2 and mmWave2 are built locally to help trace where things stop moving. They aren’t installed yet, and the TX send errors are still unresolved. The UI is less misleading now, too: an ESP being reachable doesn’t mean radar data is arriving, and old readings no longer keep disconnected devices looking active. Next: review the diagnostic candidates, then use a short, controlled hardware run to investigate the remaining errors. The last full acceptance is still a FAIL."}, {"post_id": 78171, "ts": "2026-10-09T21:04:22Z", "hours": 9.5261, "text": "DEVLOG #36 The first full TX1 acceptance run is done now and it failed, but at least I finally have a much clearer picture of what is still going wrong… The common setup passed: all seven expected participants were visible, and 22 complete snapshots kept the shared basis valid for more than 20 seconds. Then Scope A ran its three 120-second windows. All three failed. There were 14 new TX send errors, and the diagnostic counters placed them in the wifi_handoff ENOMEM stage. That tells me where the error was recorded, but not yet why it happens or whether it is fixed. MMWAVE2 also became stale in parts of the run, and several RX requests were missing, so none of the historical comparisons could count as a valid PASS. Scope B stopped itself at the safety gate when the source binding became inconsistent and RX2 was already 5.044 seconds old. This is frustrating, but the guard did exactly what it was supposed to do, it refused to turn an incomplete 120-second window into a result. Next: decide how to continue the ENOMEM and source-binding issues before starting another acceptance run."}, {"post_id": 77864, "ts": "2026-10-08T16:16:06Z", "hours": 10.1556, "text": "DEVLOG #35 I fixed two concrete TX1 firmware bugs. An authentication check that ran too late and an HTTP task with too little stack space. The status endpoint could lose the request headers before checking authorization. I moved that check ahead of the response. I also increased the HTTP task’s stack from 4 KB to 8 KB after confirming that some call paths could exceed the old limit. Two independent builds matched byte for byte. After taking fresh backups, I installed the candidate and verified the complete 16 MiB flash against the expected image. That part passed. The UDP/ENOMEM errors are not yet proven fixed. Next: investigate the reset path, complete a clean controlled boot, then check the matching server setup, authentication, all participants, and the measurement windows."}, {"post_id": 77133, "ts": "2026-10-05T19:02:41Z", "hours": 10.1275, "text": "DEVLOG #34 The TX1 migration is now 100% verified , but the project is still only around ≈ 70% complete. The third and final boot attempt did not give me the clean result I was hoping for. Recovery happened within the allowed time, but UART0 showed two app starts. After the first start, an RTC_SW_CPU_RST appeared and the app started again. It eventually reached BOOT_OK , but because of the duplicate start I still cannot accept the boot trace or move on to server activation and measurements. I am currently documenting the exact restart sequence and trying to figure out what caused it. I also put together a source collection about Wi-Fi sensing and RF-based person detection. GitHub The separate mmWave freshness test did not reproduce the old MMWAVE2 delay problem, but that does not prove it is fixed. Next: get one clean TX1 boot, then activate the server and start collecting real measurements."}, {"post_id": 76667, "ts": "2026-10-04T09:40:44Z", "hours": 10.0744, "text": "DEVLOG #33 The TX1 finally made it all the way to BOOT_OK . After the CHECK_COUNTRY problem from the last update, the new candidate passed the Country20/Power44 and Wi-Fi checks, booted into test mode, and passed the local TX/RX4 checks. I also confirmed the amber LED and both mmWave transport paths. The previous candidate had stopped because one sampling gap grew to 10.2 seconds. I traced that back to the timing bookkeeping and changed the sampler to schedule from the last real sample completion. The corrected run stayed within the sampling limits. That is a real improvement, but it is not the final acceptance yet. The full coverage result is still blocked by the clock-binding requirement, and the radar window only showed no_target , not a position result. I also switched to the new diagnostic server in a controlled run. It stayed ready and a separate 61-second capture passed the coverage gate, but the active CSI position setup is still missing, so this does not count as a complete TX-7B or system pass. The CAD UI got a pretty big upgrade too. MMWAVE1 and MMWAVE2 can now be edited as separate sensors with their own colors, 6 m fields of view, direction arrows, and yaw handles. I added a button to aim them at each other, plus a wall-angle tool that draws the real beam/wall intersection and lets me set the angle directly. Marker labels also move out of the way automatically, and the snap setting survives a refresh. Next: fix the remaining coverage and clock evidence, activate the sealed CAD/CSI setup, and complete the full TX-7B validation."}, {"post_id": 76233, "ts": "2026-10-02T19:45:23Z", "hours": 10.1567, "text": "DEVLOG #32 I still do not really have a final result to show, but it has been another ten hours, so I did not want to skip the devlog. The latest TX1 boot attempt did at least narrow things down. The new firmware now passes the Wi-Fi channel checks: channel 6, HT40 with the secondary channel below, AP-only mode, and the other radio checks all matched the expected profile. It then stops at CHECK_COUNTRY , before reaching BOOT_OK . The TX1 migration is therefore still not accepted, but the failure is much more specific now. The confusing part is that the Wi-Fi power values do not line up cleanly. The country structure reports a different power field than expected, while the separate power API returns the expected value. This may be an SDK representation or comparison issue rather than a real transmit-power problem, but there is not enough evidence to call it fixed yet. I also corrected related checks for the country bytes, SSID representation, and status getters, and prepared another reproducible candidate offline. With the move to Python 3.15, I also added the new lazy-import implementation. The official Python documentation describes the new syntax. Eligible imports now use explicit lazy import and lazy from syntax, with a local verifier to keep the behavior consistent. After the failed candidate boot, I restored the original 16 MiB image and verified the return path. The historical firmware is running again, and RX4 plus both mmWave sensors are sending data. Next: resolve the country/power comparison, then attempt the candidate boot again under the existing safety gates."}, {"post_id": 74540, "ts": "2026-09-27T16:25:38Z", "hours": 9.8731, "text": "DEVLOG #31 The mmWave2 connection problem is finally understood. It was caused by a reproducible dependency on the WLAN transmit power: at around 19.5 dBm, the ESP kept running and received probe requests, but its test AP could not be found and connections failed. At 10 dBm, the AP worked immediately, csi-test connected again, and 360/360 pings succeeded without a disconnect. Raising the limit reproduced the issue, confirming the dependency. Both mmWave sensors now work reliably. The TX1 migration is also complete. I verified the candidate firmware and baseline, created two identical 16 MiB backups. The new app was written to app1 together with the NVS merge and OTA selection. A complete readback of all 16,777,216 bytes matched the expected flash image exactly. Next: Boot the candidate under the existing safety gates, check that TX1 comes up properly, and run the full comparison."}, {"post_id": 74078, "ts": "2026-09-26T17:07:07Z", "hours": 9.0633, "text": "DEVLOG #30 The replacement ESP for mmWave2 is now soldered and mounted on the previously working breadboard setup. The connection problem has not disappeared, however WiFi still fails, so I uploaded a minimal WiFi test script to isolate the radio and network path before testing the radar or UDP transport. The mmWave firmware now distinguishes MMWAVE1 and MMWAVE2 with separate build and upload paths, uses 55010 as the default UDP port, and logs the WiFi disconnect reason. These changes are prepared locally; the test image is not yet a confirmed fix, and the complete mmWave2 path is still unvalidated. In parallel, the TX1 replacement reached a stronger local checkpoint. Reproducible builds from fresh and isolated source copies are byte-identical, and the local test suite passed. The 7A TX1/RX4 baseline still produced no usable measurement data, so the migration remains blocked and 7B is NO-GO . Next: resolve the WiFi connection on the replacement ESP, verify mmWave2 communication, and continue with two-sensor validation and RX3 calibration."}, {"post_id": 73272, "ts": "2026-09-24T18:35:00Z", "hours": 7.6919, "text": "DEVLOG #29 The local RX work has expanded, but the two-sensor setup is currently blocked by a connection problem with mmWave2. RX-04 to RX-12 add bounded capture and queue handling, stale-frame rejection, corrected CSI parsing, clearer UDP/server counters, and timing and synchronization metadata. The firmware host tests, standard and raw ESP32-S3 builds, and targeted server checks pass. These are still software and build results. No live RX measurement has yet proven lower frame loss or data age. :( The 3D-printed part now fits. While investigating the mmWave2 connection, I tried to desolder its ESP, but it could not be removed cleanly. Since the connection problem is not resolved, I ordered a replacement ESP, a new mmWave sensor, and an FH/Fenghua 1206X106K160NT SMD component. The exact cause is still open, and the replacement parts have not been installed or tested yet. The existing TX1 replacement also remains locally tested but unflashed. Next: rebuild mmWave2 with the replacement parts, identify the connection fault, validate both sensor paths, and continue with RX3 calibration."}, {"post_id": 72260, "ts": "2026-09-22T15:24:39Z", "hours": 10.1567, "text": "DEVLOG #28 I prepared and locally verified an ESP-IDF replacement candidate for TX1. The firmware builds successfully, and the host-side checks for packet handling, scheduling, boot/OTA variants, and negative compile guards pass. This is still a software-only result. Nothing has been flashed, and TX1 has not been validated on hardware. Before replacing the existing TX1, the old TX1/RX4 baseline and network pre-check must still be completed. I also tightened the RX data path. Incoming frames are now checked for valid input and correct TX binding before passing through one jitter-tolerant 20 ms admission gate. Invalid or foreign frames no longer consume the timing budget. Callback, queue, UDP, and server-side counters are tracked separately, making it possible to see where loss or delay occurs. The deterministic fixtures and local ESP32-S3 build pass, but no live RX measurement has yet shown an actual reduction in frame loss or data age. The new 3D print exposed a mechanical error: it is approximately 1 mm too small and does not fit. It needs to be adjusted and printed again. Next: complete the read-only TX1/RX4 baseline, adjust and reprint the part, then continue with RX3 calibration and validation of both mmWave sensor paths."}, {"post_id": 71302, "ts": "2026-09-20T16:26:13Z", "hours": 9.9056, "text": "DEVLOG #27 I soldered a second PCB from revision 3, making the hardware for two mmWave sensors available. The software now keeps MMWAVE1 and MMWAVE2 separate through stable node identities and independent sequence, transform, and calibration state. The mmWave transport also crossed an important milestone. Because best-effort UDP was not enough, firmware 0.1.6 now uses ACK-based retransmission. In a controlled 60-second comparison, sequence loss reached 0.00% and the radar_sequence_loss_free gate passed, compared with 0.70% loss and 84 full ACK timeouts on firmware 0.1.5. The Tauri desktop shell has been replaced in the active build by a loopback control helper for discovery, provisioning, flashing, OTA, and WASM. I also created a new 3D-print file, which is currently being printed; the mechanical result is not finished yet. Next: validate both sensor paths together, resolve the RX3 Phase 1 offset, and repeat the full radar preflight."}, {"post_id": 70187, "ts": "2026-09-18T17:19:24Z", "hours": 5.8228, "text": "DEVLOG #26 I have completed, soldered, and tested the third and hopefully final PCB revision. Everything works, but the ground plane made soldering significantly more difficult than expected. Even with thermal reliefs around the solder pads, the plane acted like a heat sink, dissipating heat across the entire board. The shift to a browser-centric approach is progressing: the Tauri desktop app and its associated release pipeline are being removed, while hardware control is being moved to a standalone “loopback crate.” This crate handles tasks such as device discovery, serial access, provisioning, flashing, OTA updates, and WASM integration. This work is currently ongoing. The server now protects the /api/field and /ws/field endpoints using Bearer authentication and keeps auto mode offline until real data is available. An explicit simulated source is required for simulation. mmWave transmission has been improved but still exhibits a sequence loss rate of 13.1%, causing the radar preflight to remain blocked. The causes of the remaining loss still need to be investigated, particularly regarding channel conditions, the startup process/ARP, and Wi-Fi airtime and scheduling. The calibration offset for “Phase 1” on RX3 also remains unresolved. Next steps: fixing the RX3 offset, completing the migration to the browser/control setup, and re-running the radar preflight."}, {"post_id": 69194, "ts": "2026-09-16T15:53:57Z", "hours": 9.0253, "text": "DEVLOG #25 I measured and optimized the mmWave UDP transport, but the radar path still fails the lossless-transmission test (image 1) . The new firmware and server path use one UDP copy without artificial delay, disable Wi-Fi power saving on the mains-powered node, persist the collector target and CAD transform, and separate socket reads from processing. Reordering, sequence validation, deduplication, and rolling metrics expose failures instead of hiding them. Across three 60-second runs, unique arrivals improved by 11.2%, sequence loss fell from 20.6% to 13.1%, duplicates dropped to zero, and arrival P95 improved by 27.8%. Two copies did not reduce loss and only added duplicates, so one copy remains the default. The transport is better, but not lossless: 13.1% sequence loss still blocks the radar preflight. The 50 ms interval is not the bottleneck; LD2450 frames arrive in bursts and the bridge emits about 2.64 measurements per second, not 20 independent frames per second. Next I will investigate RSSI and channel conditions, ARP and startup behaviour, Wi-Fi retries and airtime, and packet scheduling. RX/CSI stayed offline, so this is not a full Wi-Fi validation. The server refactor from DEVLOG #24 is now integrated: routes, state, runtime, calibration, recording, model, and system responsibilities moved out of main.rs , with active, legacy, and unavailable-training contracts separated. Desktop-interface removal remains in progress. Hardware-control modules are moving to a standalone control crate, while loopback-only browser server controls with origin checks are being added. Phase 1 calibration is also getting a longer measurement window and persisted evidence. RX3 currently lands roughly two to three metres from its expected fixed point. I will not consider the calibration valid until the transform, profile binding, or target association causing this offset is understood and corrected. Next: resolve the RX3 Phase 1 offset (seen in image 2) , then repeat the full fixed-point calibration and re-verify the radar preflight."}, {"post_id": 66738, "ts": "2026-09-12T17:07:38Z", "hours": 7.1744, "text": "DEVLOG #24 I strengthened security for live-sensor operation and started aligning the Observatory UI with backend functionality that actually exists. Live WebSockets now require Bearer authentication along with strict Origin and Host checks. Browser and Python clients no longer send tokens in the URL. Regression tests cover missing, invalid, and duplicate requests as well as cross-origin access. The complete CAD geometry document is now persisted in SQLite and survives a server restart. Another issue was in the browser catalog: it listed routes that the active Rust server did not provide. I am separating active routes from legacy compatibility routes, adding the missing model-details contract, and returning unavailable or HTTP 501 when browser-triggered training is not available instead of falsely reporting that it started. Next: finish and commit the route extraction, then repeat the live mmWave preflight, including calibration."}, {"post_id": 62834, "ts": "2026-09-06T11:19:03Z", "hours": 4.7731, "text": "DEVLOG #23 The issue encountered during initial startup was a design error: the LD2450 had been mounted rotated by 180°. The UART routing itself was correct. After rotating the sensor and reflashing the ESP32-C3, everything worked again, though the physical setup doesn’t look very tidy. I designed PCB-03 based on PCB-02. The LD2450 connector and its wiring have been rotated by 180°. Everything else remains unchanged. I also added ground planes. Until the PCB arrives, the breadboard setup will continue to serve as a temporary mmWave configuration. Next steps: order PCB-03, mount the LD2450 in the marked orientation, and repeat the live radar verification. Continue using the breadboard setup until delivery."}, {"post_id": 61621, "ts": "2026-09-04T16:40:26Z", "hours": 6.7853, "text": "DEVLOG #22 I fixed the last browser security gap found in the local security review: a page on one local port can no longer reach an unauthenticated service on another local port by default. The review contained 13 entries. Entries 8 and 11, and entries 12 and 13, were duplicates, leaving 11 unique findings. The old check trusted the hostname alone, so every localhost port was accepted. I separated browser Origin validation from the existing Host /DNS-rebinding protection. WebSockets and state-changing /api/v1/* requests now require an exact scheme, host, and port. By default, only http://localhost:<http_port> , http://127.0.0.1:<http_port> , and http://[::1]:<http_port> are allowed. Repeatable --allowed-origin values or the comma-separated SENSING_ALLOWED_ORIGINS variable explicitly replace these defaults. Host-only values, wildcards, null , paths, userinfo, and invalid ports are rejected. The protection covers /ws/* and /api/v1/stream/pose on both the HTTP and dedicated WebSocket ports. CLI clients without an Origin header remain compatible. The regression test now returns 403 for an unlisted cross-port UI, while an explicitly allowlisted cross-port UI still works. All 24/24 Origin/Host tests, 471 sensing-server tests ( 1 ignored), HomeCore server/API/auth/WebSocket tests ( 18 + 18 + 6 + 5 ), and 7 Python/firmware security-boundary tests passed. Binary checks, targeted rustfmt, and git diff --check also passed. No flash or OTA action was performed. The ESP-IDF v5.4 build matrix is still inconclusive: the native ARM64 image is missing a containerd layer, while the AMD64 fallback crashes in the emulated Xtensa compiler inside MbedTLS. I therefore do not count the three firmware builds as passed. Next: Solder PCB-02 first, then mount the mmWave sensor in the corner."}, {"post_id": 58478, "ts": "2026-08-30T21:57:05Z", "hours": 2.7247, "text": "DEVLOG #21 The 65-second empty-room calibration failed before it could collect a usable baseline. The UI showed Samples 0 when I returned, so no calibration ID or context hash was created. The failure exposed a design problem in the run itself. A recoverable outside-room radar target could stop the entire measurement. I’m changing the workflow so the run always reaches its configured end and evaluates the evidence afterwards. The final report will mark it valid or invalid with concrete reasons instead of hiding the failure behind an early stop. This behavior change is planned, but not yet implemented or validated. No successful calibration, restored baseline, 10/10 acceptance, position index, guided room walk, or blind-test result is claimed. Next: implement and test the non-interrupting run plus the post-run validity report"}, {"post_id": 57699, "ts": "2026-08-29T22:49:17Z", "hours": 5.3125, "text": "DEVLOG #20 Today I finally found why the four RX streams kept disagreeing: the server was fusing packets from different transmitter moments. The old path had already reached 98,126 engine errors with a timestamp spread of about 710 ms . The first timing fix exposed the deeper problem. The server was simply taking the latest packet from each receiver, even when those packets did not belong to the same event. I replaced that with bounded per-RX queues and approximate-time matching. The existing 60 ms guard stays fail-closed, so an incoherent quartet is discarded instead of becoming a fake D6 input. The new tests cover packet loss, reboots, sequence wrap, clock jumps, queue matching, and host-time fallback. 484/485 tests passed in the sandbox,. Next: restart the server and verify a stable, error-free 25-second preflight. But for now, time to sleep."}, {"post_id": 56909, "ts": "2026-08-28T22:30:41Z", "hours": 4.6578, "text": "DEVLOG #19 I activated the new mmWave firmware and got the live 25-second preflight to pass once, but the first empty-room recording did not complete. The main work was hardening the transport: the firmware now sends redundant radar packets, while the server handles reordering, duplicates, short CSI gaps, and recent diagnostics instead of relying on cumulative counters. The UI also gained a controlled empty-room countdown. The remaining failure is intermittent: the sensor stays online and reports no local UDP send errors, but the server still recorded packets_lost=10 and packets_rejected=324 . The empty-room capture lasted only 4.8 s for radar and 5.1 s for CSI, so it is not a valid calibration reference. No calibration, training, or blind position result is claimed yet. Next: expose the exact reject reason and sequence-gap timing, fix the remaining transport problem, and repeat the complete empty-room measurement."}, {"post_id": 56202, "ts": "2026-08-27T21:07:33Z", "hours": 3.7439, "text": "DEVLOG #18 Since the LD2450 first worked, I connected TX, RX1–RX4, and Wi-Fi, positioned the sensor, sealed setup-v2 , and added a calibration preparation phase with a countdown and a minimum duration of 60 seconds . The real hardware UI is running on port 8080 ; port 3002 still shows the simulation. I started the workflow, but it currently stops at step 4, the empty-room Wi-Fi baseline , because radar packets are being lost. I improved server-side packet sorting and built a new 10 Hz firmware. The OTA update started, but the device still boots the old firmware from ota_0 at about 20.6 Hz . The sensor is online, but calibration is not ready. 63 UI tests pass; one Rust test mismatch remains. No real D6 calibration or blind validation has been completed yet. Next: activate the 10 Hz firmware, resolve the packet-loss blocker, and rerun the preflight and empty-room baseline."}, {"post_id": 55631, "ts": "2026-08-27T16:22:32Z", "hours": 3.55, "text": "DEVLOG #17 I finally verified the complete breadboard mmWave data path with the HLK-LD2450. After flashing the known firmware to a new ESP32-C3, it joined csi-test , received 192.168.4.2 , and exposed /ota/status on port 8032 . The status confirmed the expected UART mapping: GPIO20 RX, GPIO21 TX, and 256000 baud in calibration mode. The important test was a read-only UDP capture: 224 valid LD2450 datagrams in 20 seconds, followed by 222 more while the setup was powered only from the normal power supply. Every packet matched ruview.mmwave.ld2450.v1 and contained a recognized target. This proves that the breadboard wiring, UART parser, ESP Wi-Fi connection, and UDP transport work together. The reported coordinates are still sensor-frame data, not a validated room position. The permanent PCB-02 is still pending. Next I will validate the radar transform with known room marks, connect the CSI receivers, and continue with D6 calibration, training, blind tests, and the quality gates."}, {"post_id": 54003, "ts": "2026-08-24T18:57:34Z", "hours": 1.6292, "text": "DEVLOG #16 The ESP was not the problem After the original PCB failed during WLAN authentication, I redesigned the mmWave carrier as PCB-02 and isolated the ESP to find the real cause. PCB-02 replaces the too-small ESP contact pads with proper through-hole header rows, keeps the case-compatible outline, protects the antenna area, and retains the SMD capacitors. The routing and electrical checks passed, and the Gerbers are ready to order. The important experiment came next. I unsoldered the suspect ESP from the old PCB and powered it by itself. It joined csi-test , answered every ping, and returned HTTP 200 from /ota/status . A second ESP did exactly the same without any PCB attached. This was the key finding: both ESPs work outside the PCB. The earlier auth → init failure is therefore very unlikely to be a dead ESP. The likely cause is the old PCB assembly, its soldered fly-wires, power delivery, or the antenna/contact area. The LD2450 UART and radar path are still unverified. Next: as an interim solution, continue on a breadboard with one known-good ESP and the LD2450 before moving to manufactured PCB-02."}, {"post_id": 53168, "ts": "2026-08-23T16:42:54Z", "hours": 1.9047, "text": "DEVLOG #15 D4/D5/D6 evidence package I consolidated every archived D4/D5/D6 recording into one reproducible technical report and a 25-run CSV inventory. I kept historical A/G captures separate because their sample rate and guard settings do not support a direct percentage comparison. The result is clear: pooled D4 retained 88.4% still recall but produced 75.2% empty-room false presence. Historical D5 replay looked strong at 0.0% false presence and 89.3% recall, but the real D5 live run and D5-abs still-person run both collapsed to 0% recall. D5-abs therefore reduced false presence only by making still presence unusable. I also audited all five D6 raw CSI files against their sidecars. Every file is complete, has zero recorder drops, includes RX1–RX4, and uses one 2.437 GHz / 1-antenna / 64-subcarrier grid. The current empty-neutral-02 capture is a valid same-setup baseline candidate; the older setup and discovery capture remain separate. This is technical evidence, not an accuracy claim. No phase yet has independent mmWave ground truth, blind position validation, or a proven live localization path. Next I will install the heat-set thread inserts in the mmWave case and then check whether everything works as intended before deciding how to proceed."}, {"post_id": 51926, "ts": "2026-08-21T20:58:54Z", "hours": 2.4314, "text": "DEVLOG #14 Since the last devlog, I published a new Observatory Control Center and a guided calibration workflow for the D6 experiment. The setup now includes a CAD-style room editor for the TX and RX1–RX4 positions. It validates room boundaries, duplicate receiver positions, and the canonical node IDs. The continuous mmWave calibration route is now the primary workflow; the manual P01–P09 grid remains only as a legacy fallback. Experiment profiles, run phases, setup hashes, and prediction/truth artifact hashes are persisted in SQLite. The UI also makes READY , RUNNING , PASS , OFFLINE , and SOFTWARE-ONLY / UNVALIDATED states explicit, so a simulated workflow cannot be mistaken for a real sensor result. I ran 41 UI/Observatory tests and 4 targeted Rust workflow tests ; all passed. This validates the software workflow, but not the real CSI stream, LD2450 UART/UDP path, calibration data, or position accuracy. Next: connect the LD2450 to the working ESP on the breadboard, verify UART bytes and valid radar frames, and then continue with the sealed hardware workflow and real blind tests."}, {"post_id": 51771, "ts": "2026-08-21T16:41:39Z", "hours": 1.8486, "text": "DEVLOG #13 I narrowed the Wi-Fi authentication problem down to the original ESP32-C3 . A second ESP running the same firmware connected to csi-test , received an IP address, and started its HTTP server successfully. This shows that the TX, credentials, and firmware work in principle—and that the LD2450 is not causing the current Wi-Fi failure. The original ESP ( ac:a7:04:c2:71:f4 ) is now the main suspect, possibly because of its Wi-Fi hardware, power stability, flash state, or an access-point client entry. I also planned a breadboard-compatible power setup for testing without the SMD capacitors: a through-hole 100 nF ceramic capacitor and 10 µF electrolytic capacitor across 5 V and GND, placed close to the ESP and radar connections. The radar itself has not passed a UART test yet . Next, I will connect the unpowered LD2450 to the working ESP and check whether UART bytes and valid radar frames increase."}, {"post_id": 49852, "ts": "2026-08-18T20:01:28Z", "hours": 3.3072, "text": "DEVLOG #12 I built a new Observatory Control Center that guides the experiment through all ten phases—from creating and sealing the setup to calibration, blind tests, evaluation, and the final report. Run metadata, setup profiles, phase history, and artifact hashes are now stored persistently in SQLite, while the raw recordings remain separate files. The UI shows clear READY , RUNNING , PASS , OFFLINE , and UNVALIDATED states and keeps software-only demonstrations separate from real measurements. I also made continuous mmWave-guided calibration the main workflow. The manual P01–P09 capture grid remains available only as a legacy fallback. All 29 UI tests and all 4 targeted SQLite/workflow tests pass. This verifies the software workflow, but does not yet validate the real sensors or position accuracy . Next: connect the finished hardware and run the guided workflow with real data ."}, {"post_id": 48977, "ts": "2026-08-17T15:47:15Z", "hours": 3.4047, "text": "DEVLOG #11 I started assembling the reference-sensor PCB and soldered the available parts. The SMD capacitors have not arrived yet, and the ESP pads turned out to be too small for reliable soldering, so I have started connecting the ESP with wires instead. On the software side, I added diagnostics for UART bytes, valid radar frames, UDP transmissions, and errors. The server and UI now display these values and detect connection or network problems. I also tested the complete software path synthetically—from radar input through calibration, position indexing, blind-test gates, and the UI. All relevant tests passed, including 10/10 UI tests. This confirms the software path, but not the final live hardware setup. A read-only CSI check currently receives no RX packets. The last discovery did find TX and RX1–RX4 with a stable 64-subcarrier grid, although sequence gaps were around 5–6% . Next: finish the wiring, add the capacitors, and restore live CSI reception ."}, {"post_id": 46851, "ts": "2026-08-14T11:44:53Z", "hours": 1.2353, "text": "DEVLOG #10 I completed the calibration and evaluation pipeline for WiFi positioning with an HLK-LD2450 reference sensor. The new system includes: ESP32-C3 firmware with UART parsing, room coordinates, operating modes, Wi-Fi transmission, and protected configuration; persistent coordinate transformation with origin, rotation, and optional mirroring; synchronization of mmWave and RX1–RX4 CSI data within 150 ms ; a 65-second empty-room reference; automatic room coverage with nine reachable zones ( P01–P09 ) and six training blocks per zone; a position index that uses only CSI after calibration ; blind evaluation with separated WiFi predictions and mmWave reference data; fixed quality thresholds with automatic acceptance or rejection; and a guided German calibration assistant in the UI. The PCB has also arrived. I am checking it carefully before soldering and starting the first complete hardware tests. Next: verify the PCB, solder the components, and test the full system ."}, {"post_id": 46000, "ts": "2026-08-12T21:00:12Z", "hours": 1.3247, "text": "DEVLOG #09 I 3D-printed the case and a PCB mockup to test the fit. The IKEA Skådis mount and the retaining posts were slightly too large, possibly because supports were placed in the wrong areas. I have already updated the 3D model and will print the revised version tomorrow."}, {"post_id": 45443, "ts": "2026-08-11T21:51:23Z", "hours": 0.6469, "text": "DEVLOG #08 I finished the firmware and flashed it onto the ESP32-C3 SuperMini for the mmWave reference sensor. It uses the correct UART pins ( GPIO20 RX , GPIO21 TX , 256000 baud ), parses all three LD2450 targets using the official protocol , and sends timestamped UDP JSON data. It also separates calibration and reference recordings, supports protected A/B OTA, detects ambiguous multi-person measurements, and allows configurable radar placement. The firmware is ready, but the final PCB still needs to arrive. I then need to solder it before any complete hardware testing can begin. I will also finish the IKEA-board mount, print the case, and check the PCB fit—especially the retaining posts . Next: receive and solder the PCB, print the case, and test everything together ."}, {"post_id": 45318, "ts": "2026-08-11T18:12:17Z", "hours": 1.1956, "text": "DEVLOG #07 I added small retaining posts to hold the PCB securely inside the mmWave sensor case. I also designed a holder for mounting the enclosure to an IKEA board. These details should keep both the electronics and the finished case in place, but they still need to be printed and tested for fit. Next: print the parts and check the tolerances ."}, {"post_id": 45185, "ts": "2026-08-11T14:38:53Z", "hours": 1.9669, "text": "DEVLOG #06 I continued redesigning the mmWave reference sensor case and replaced the honeycomb pattern with cleaner parallel openings. I also refined the inside of the enclosure by adding two posts and a rectangular internal feature. The case now has a much cleaner shape, but it is still a CAD design and has not been printed or tested yet . Next: check the component fit and prepare the case for printing ."}, {"post_id": 44901, "ts": "2026-08-10T23:16:59Z", "hours": 1.9811, "text": "DEVLOG #05 Redesigning the mmWave reference sensor case Today Redesigned the 3D-printed enclosure for the mmWave reference sensor. Finish the enclosure and prepare it for printing. Current Challenge I am currently working on the honeycomb pattern. The new case is taking shape, but the pattern still needs to be fixed before the design is complete. Status: Redesigned , NOT FINISHED , currently focused on the pattern ."}, {"post_id": 44167, "ts": "2026-08-09T18:58:20Z", "hours": 2.1736, "text": "DEVLOG #04 D6 setup and calibration Today Sealed the 1TX/4RX setup and identified the TX without flashing. Passed the 25-second preflight and recorded 65 seconds of empty-room data. UI Fix Camera rotation was replaced with a display-only X-axis mirror: x_display = room_length - x Next Record training data at P01–P09 Build the position fingerprint index Run blind tests and evaluate both quality thresholds Complete all nine training positions. Build the fingerprint model. Validate before enabling live positioning. Status: Connected , UNCALIBRATED , setup sealed and unchanged"}, {"post_id": 43483, "ts": "2026-08-08T19:35:11Z", "hours": 1.7147, "text": "DEVLOG #03 Today I finished the 3D-printed case for the reference sensor (mmWave). Its purpose is to measure how accurate the WiFi CSI-based positioning actually is."}, {"post_id": 42271, "ts": "2026-08-06T22:02:29Z", "hours": 0.5714, "text": "DEVLOG #02 So, I had a big issue today. I finished my PCB after five hours of work and recorded the entire process as a timelapse in Lookout . Then I accidentally clicked Discard . Fortunately, I was able to recover the video on my Mac, including all of its metadata. Getting the logged time restored now depends on the incredible team at Hack Club/Laps . I have already asked for help on Slack and sent an email. The PCB Is Finished Despite the timelapse issue, the PCB shown below is finished and already ordered . Its purpose is to provide reference data for evaluating how accurately the Wi-Fi-based tracking system works. The board includes: an ESP32-C3 SuperMini ; and an mmWave radar sensor."}, {"post_id": 40866, "ts": "2026-08-04T17:44:34Z", "hours": 27.3636, "text": "DEVLOG #01 Hi, long time no see. Over the past few weeks, I have been developing two new approaches to presence detection. The main issue was that the system could not reliably distinguish between an empty room and a room with me standing inside :(. To solve this, I first developed D5 and then D6 . D5 is already available on GitHub . D6 is not available yet because it is still under development and has not been fully validated with real measurements and blind tests. D5 — Presence Detection D5 was designed to determine whether a room is empty or occupied. It compares current CSI measurements with a previously recorded empty-room reference. However, D5 mainly evaluated changes in one direction. In practice, a person’s presence can cause CSI values to either increase or decrease, depending on the receiver and propagation path. As a result, D5 behaved more like a motion detector and could miss a person who remained still. While it significantly improved presence detection, it was not robust enough for reliable real-world use. D6 — Presence Detection and Position Classification D6 builds on D5 by evaluating deviations from the empty-room reference in both directions , making it much more effective at detecting people who remain stationary. Once a person has been detected, D6 attempts to classify their position. Instead of calculating arbitrary coordinates, it identifies one of nine predefined locations ( P01–P09 ) that were previously trained using CSI recordings. A position is only reported if: the hardware setup is valid and sealed; all receivers provide fresh and valid CSI data; the correct transmitter has been verified; a person has been detected; a valid position index is available; and the classification result is sufficiently confident. If any of these conditions are not met, D6 deliberately reports no position instead of inventing one. The software pipeline is largely complete, but the system still needs to be validated using a new sealed setup, fresh training recordings, and independent blind tests before D6 can be released on GitHub. New Interface I also redesigned the standard RuView interface as a clean, white, Samaritan-inspired UI based on the AI system from the TV series Person of Interest ."}]...
|
Title: Observatory by @Gerafftes | Stardance
Devl Title: Observatory by @Gerafftes | Stardance
Devlogs:
DEVLOG #01 Hi, long time no see. Over the past few weeks, I have been developing two new approaches to presence detection. The main issue was that the system could not reliably distinguish between an empty room and a room with me standing inside :(. To solve this, I first developed D5 and then D6 . D5 is already available on GitHub . D6 is not available yet because it is still under development and has not been fully validated with real measurements and blind tests. D5 — Presence Detection D5 was designed to determine whether a room is empty or occupied. It compares current CSI measurements with a previously recorded empty-room reference. However, D5 mainly evaluated changes in one direction. In practice, a person’s presence can cause CSI values to either increase or decrease, depending on the receiver and propagation path. As a result, D5 behaved more like a motion detector and could miss a person who remained still. While it significantly improved presence detection, it was not robust enough for reliable real-world use. D6 — Presence Detection and Position Classification D6 builds on D5 by evaluating deviations from the empty-room reference in both directions , making it much more effective at detecting people who remain stationary. Once a person has been detected, D6 attempts to classify their position. Instead of calculating arbitrary coordinates, it identifies one of nine predefined locations ( P01–P09 ) that were previously trained using CSI recordings. A position is only reported if: the hardware setup is valid and sealed; all receivers provide fresh and valid CSI data; the correct transmitter has been verified; a person has been detected; a valid position index is available; and the classification result is sufficiently confident. If any of these conditions are not met, D6 deliberately reports no position instead of inventing one. The software pipeline is largely complete, but the system still needs to be validated using a new sealed setup, fresh training recordings, and independent blind tests before D6 can be released on GitHub. New Interface I also redesigned the standard RuView interface as a clean, white, Samaritan-inspired UI based on the AI system from the TV series Person of Interest .
DEVLOG #02 So, I had a big issue today. I finished my PCB after five hours of work and recorded the entire process as a timelapse in Lookout . Then I accidentally clicked Discard . Fortunately, I was able to recover the video on my Mac, including all of its metadata. Getting the logged time restored now depends on the incredible team at Hack Club/Laps . I have already asked for help on Slack and sent an email. The PCB Is Finished Despite the timelapse issue, the PCB shown below is finished and already ordered . Its purpose is to provide reference data for evaluating how accurately the Wi-Fi-based tracking system works. The board includes: an ESP32-C3 SuperMini ; and an mmWave radar sensor.
DEVLOG #03 Today I finished the 3D-printed case for the reference sensor (mmWave). Its purpose is to measure how accurate the WiFi CSI-based positioning actually is.
DEVLOG #04 D6 setup and calibration Today Sealed the 1TX/4RX setup and identified the TX without flashing. Passed the 25-second preflight and recorded 65 seconds of empty-room data. UI Fix Camera rotation was replaced with a display-only X-axis mirror: x_display = room_length - x Next Record training data at P01–P09 Build the position fingerprint index Run blind tests and evaluate both quality thresholds Complete all nine training positions. Build the fingerprint model. Validate before enabling live positioning. Status: Connected , UNCALIBRATED , setup sealed and unchanged
DEVLOG #05 Redesigning the mmWave reference sensor case Today Redesigned the 3D-printed enclosure for the mmWave reference sensor. Finish the enclosure and prepare it for printing. Current Challenge I am currently working on the honeycomb pattern. The new case is taking shape, but the pattern still needs to be fixed before the design is complete. Status: Redesigned , NOT FINISHED , currently focused on the pattern .
DEVLOG #06 I continued redesigning the mmWave reference sensor case and replaced the honeycomb pattern with cleaner parallel openings. I also refined the inside of the enclosure by adding two posts and a rectangular internal feature. The case now has a much cleaner shape, but it is still a CAD design and has not been printed or tested yet . Next: check the component fit and prepare the case for printing .
DEVLOG #07 I added small retaining posts to hold the PCB securely inside the mmWave sensor case. I also designed a holder for mounting the enclosure to an IKEA board. These details should keep both the electronics and the finished case in place, but they still need to be printed and tested for fit. Next: print the parts and check the tolerances .
DEVLOG #08 I finished the firmware and flashed it onto the ESP32-C3 SuperMini for the mmWave reference sensor. It uses the correct UART pins ( GPIO20 RX , GPIO21 TX , 256000 baud ), parses all three LD2450 targets using the official protocol , and sends timestamped UDP JSON data. It also separates calibration and reference recordings, supports protected A/B OTA, detects ambiguous multi-person measurements, and allows configurable radar placement. The firmware is ready, but the final PCB still needs to arrive. I then need to solder it before any complete hardware testing can begin. I will also finish the IKEA-board mount, print the case, and check the PCB fit—especially the retaining posts . Next: receive and solder the PCB, print the case, and test everything together .
DEVLOG #09 I 3D-printed the case and a PCB mockup to test the fit. The IKEA Skådis mount and the retaining posts were slightly too large, possibly because supports were placed in the wrong areas. I have already updated the 3D model and will print the revised version tomorrow.
DEVLOG #10 I completed the calibration and evaluation pipeline for WiFi positioning with an HLK-LD2450 reference sensor. The new system includes: ESP32-C3 firmware with UART parsing, room coordinates, operating modes, Wi-Fi transmission, and protected configuration; persistent coordinate transformation with origin, rotation, and optional mirroring; synchronization of mmWave and RX1–RX4 CSI data within 150 ms ; a 65-second empty-room reference; automatic room coverage with nine reachable zones ( P01–P09 ) and six training blocks per zone; a position index that uses only CSI after calibration ; blind evaluation with separated WiFi predictions and mmWave reference data; fixed quality thresholds with automatic acceptance or rejection; and a guided German calibration assistant in the UI. The PCB has also arrived. I am checking it carefully before soldering and starting the first complete hardware tests. Next: verify the PCB, solder the components, and test the full system .
DEVLOG #11 I started assembling the reference-sensor PCB and soldered the available parts. The SMD capacitors have not arrived yet, and the ESP pads turned out to be too small for reliable soldering, so I have started connecting the ESP with wires instead. On the software side, I added diagnostics for UART bytes, valid radar frames, UDP transmissions, and errors. The server and UI now display these values and detect connection or network problems. I also tested the complete software path synthetically—from radar input through calibration, position indexing, blind-test gates, and the UI. All relevant tests passed, including 10/10 UI tests. This confirms the software path, but not the final live hardware setup. A read-only CSI check currently receives no RX packets. The last discovery did find TX and RX1–RX4 with a stable 64-subcarrier grid, although sequence gaps were around 5–6% . Next: finish the wiring, add the capacitors, and restore live CSI reception .
DEVLOG #12 I built a new Observatory Control Center that guides the experiment through all ten phases—from creating and sealing the setup to calibration, blind tests, evaluation, and the final report. Run metadata, setup profiles, phase history, and artifact hashes are now stored persistently in SQLite, while the raw recordings remain separate files. The UI shows clear READY , RUNNING , PASS , OFFLINE , and UNVALIDATED states and keeps software-only demonstrations separate from real measurements. I also made continuous mmWave-guided calibration the main workflow. The manual P01–P09 capture grid remains available only as a legacy fallback. All 29 UI tests and all 4 targeted SQLite/workflow tests pass. This verifies the software workflow, but does not yet validate the real sensors or position accuracy . Next: connect the finished hardware and run the guided workflow with real data .
DEVLOG #13 I narrowed the Wi-Fi authentication problem down to the original ESP32-C3 . A second ESP running the same firmware connected to csi-test , received an IP address, and started its HTTP server successfully. This shows that the TX, credentials, and firmware work in principle—and that the LD2450 is not causing the current Wi-Fi failure. The original ESP ( ac:a7:04:c2:71:f4 ) is now the main suspect, possibly because of its Wi-Fi hardware, power stability, flash state, or an access-point client entry. I also planned a breadboard-compatible power setup for testing without the SMD capacitors: a through-hole 100 nF ceramic capacitor and 10 µF electrolytic capacitor across 5 V and GND, placed close to the ESP and radar connections. The radar itself has not passed a UART test yet . Next, I will connect the unpowered LD2450 to the working ESP and check whether UART bytes and valid radar frames increase.
DEVLOG #14 Since the last devlog, I published a new Observatory Control Center and a guided calibration workflow for the D6 experiment. The setup now includes a CAD-style room editor for the TX and RX1–RX4 positions. It validates room boundaries, duplicate receiver positions, and the canonical node IDs. The continuous mmWave calibration route is now the primary workflow; the manual P01–P09 grid remains only as a legacy fallback. Experiment profiles, run phases, setup hashes, and prediction/truth artifact hashes are persisted in SQLite. The UI also makes READY , RUNNING , PASS , OFFLINE , and SOFTWARE-ONLY / UNVALIDATED states explicit, so a simulated workflow cannot be mistaken for a real sensor result. I ran 41 UI/Observatory tests and 4 targeted Rust workflow tests ; all passed. This validates the software workflow, but not the real CSI stream, LD2450 UART/UDP path, calibration data, or position accuracy. Next: connect the LD2450 to the working ESP on the breadboard, verify UART bytes and valid radar frames, and then continue with the sealed hardware workflow and real blind tests.
DEVLOG #15 D4/D5/D6 evidence package I consolidated every archived D4/D5/D6 recording into one reproducible technical report and a 25-run CSV inventory. I kept historical A/G captures separate because their sample rate and guard settings do not support a direct percentage comparison. The result is clear: pooled D4 retained 88.4% still recall but produced 75.2% empty-room false presence. Historical D5 replay looked strong at 0.0% false presence and 89.3% recall, but the real D5 live run and D5-abs still-person run both collapsed to 0% recall. D5-abs therefore reduced false presence only by making still presence unusable. I also audited all five D6 raw CSI files against their sidecars. Every file is complete, has zero recorder drops, includes RX1–RX4, and uses one 2.437 GHz / 1-antenna / 64-subcarrier grid. The current empty-neutral-02 capture is a valid same-setup baseline candidate; the older setup and discovery capture remain separate. This is technical evidence, not an accuracy claim. No phase yet has independent mmWave ground truth, blind position validation, or a proven live localization path. Next I will install the heat-set thread inserts in the mmWave case and then check whether everything works as intended before deciding how to proceed.
DEVLOG #16 The ESP was not the problem After the original PCB failed during WLAN authentication, I redesigned the mmWave carrier as PCB-02 and isolated the ESP to find the real cause. PCB-02 replaces the too-small ESP contact pads with proper through-hole header rows, keeps the case-compatible outline, protects the antenna area, and retains the SMD capacitors. The routing and electrical checks passed, and the Gerbers are ready to order. The important experiment came next. I unsoldered the suspect ESP from the old PCB and powered it by itself. It joined csi-test , answered every ping, and returned HTTP 200 from /ota/status . A second ESP did exactly the same without any PCB attached. This was the key finding: both ESPs work outside the PCB. The earlier auth → init failure is therefore very unlikely to be a dead ESP. The likely cause is the old PCB assembly, its soldered fly-wires, power delivery, or the antenna/contact area. The LD2450 UART and radar path are still unverified. Next: as an interim solution, continue on a breadboard with one known-good ESP and the LD2450 before moving to manufactured PCB-02.
DEVLOG #17 I finally verified the complete breadboard mmWave data path with the HLK-LD2450. After flashing the known firmware to a new ESP32-C3, it joined csi-test , received 192.168.4.2 , and exposed /ota/status on port 8032 . The status confirmed the expected UART mapping: GPIO20 RX, GPIO21 TX, and 256000 baud in calibration mode. The important test was a read-only UDP capture: 224 valid LD2450 datagrams in 20 seconds, followed by 222 more while the setup was powered only from the normal power supply. Every packet matched ruview.mmwave.ld2450.v1 and contained a recognized target. This proves that the breadboard wiring, UART parser, ESP Wi-Fi connection, and UDP transport work together. The reported coordinates are still sensor-frame data, not a validated room position. The permanent PCB-02 is still pending. Next I will validate the radar transform with known room marks, connect the CSI receivers, and continue with D6 calibration, training, blind tests, and the quality gates.
DEVLOG #18 Since the LD2450 first worked, I connected TX, RX1–RX4, and Wi-Fi, positioned the sensor, sealed setup-v2 , and added a calibration preparation phase with a countdown and a minimum duration of 60 seconds . The real hardware UI is running on port 8080 ; port 3002 still shows the simulation. I started the workflow, but it currently stops at step 4, the empty-room Wi-Fi baseline , because radar packets are being lost. I improved server-side packet sorting and built a new 10 Hz firmware. The OTA update started, but the device still boots the old firmware from ota_0 at about 20.6 Hz . The sensor is online, but calibration is not ready. 63 UI tests pass; one Rust test mismatch remains. No real D6 calibration or blind validation has been completed yet. Next: activate the 10 Hz firmware, resolve the packet-loss blocker, and rerun the preflight and empty-room baseline.
DEVLOG #19 I activated the new mmWave firmware and got the live 25-second preflight to pass once, but the first empty-room recording did not complete. The main work was hardening the transport: the firmware now sends redundant radar packets, while the server handles reordering, duplicates, short CSI gaps, and recent diagnostics instead of relying on cumulative counters. The UI also gained a controlled empty-room countdown. The remaining failure is intermittent: the sensor stays online and reports no local UDP send errors, but the server still recorded packets_lost=10 and packets_rejected=324 . The empty-room capture lasted only 4.8 s for radar and 5.1 s for CSI, so it is not a valid calibration reference. No calibration, training, or blind position result is claimed yet. Next: expose the exact reject reason and sequence-gap timing, fix the remaining transport problem, and repeat the complete empty-room measurement.
DEVLOG #20 Today I finally found why the four RX streams kept disagreeing: the server was fusing packets from different transmitter moments. The old path had already reached 98,126 engine errors with a timestamp spread of about 710 ms . The first timing fix exposed the deeper problem. The server was simply taking the latest packet from each receiver, even when those packets did not belong to the same event. I replaced that with bounded per-RX queues and approximate-time matching. The existing 60 ms guard stays fail-closed, so an incoherent quartet is discarded instead of becoming a fake D6 input. The new tests cover packet loss, reboots, sequence wrap, clock jumps, queue matching, and host-time fallback. 484/485 tests passed in the sandbox,. Next: restart the server and verify a stable, error-free 25-second preflight. But for now, time to sleep.
DEVLOG #21 The 65-second empty-room calibration failed before it could collect a usable baseline. The UI showed Samples 0 when I returned, so no calibration ID or context hash was created. The failure exposed a design problem in the run itself. A recoverable outside-room radar target could stop the entire measurement. I’m changing the workflow so the run always reaches its configured end and evaluates the evidence afterwards. The final report will mark it valid or invalid with concrete reasons instead of hiding the failure behind an early stop. This behavior change is planned, but not yet implemented or validated. No successful calibration, restored baseline, 10/10 acceptance, position index, guided room walk, or blind-test result is claimed. Next: implement and test the non-interrupting run plus the post-run validity report
DEVLOG #22 I fixed the last browser security gap found in the local security review: a page on one local port can no longer reach an unauthenticated service on another local port by default. The review contained 13 entries. Entries 8 and 11, and entries 12 and 13, were duplicates, leaving 11 unique findings. The old check trusted the hostname alone, so every localhost port was accepted. I separated browser Origin validation from the existing Host /DNS-rebinding protection. WebSockets and state-changing /api/v1/* requests now require an exact scheme, host, and port. By default, only http://localhost:<http_port> , http://127.0.0.1:<http_port> , and http://[::1]:<http_port> are allowed. Repeatable --allowed-origin values or the comma-separated SENSING_ALLOWED_ORIGINS variable explicitly replace these defaults. Host-only values, wildcards, null , paths, userinfo, and invalid ports are rejected. The protection covers /ws/* and /api/v1/stream/pose on both the HTTP and dedicated WebSocket ports. CLI clients without an Origin header remain compatible. The regression test now returns 403 for an unlisted cross-port UI, while an explicitly allowlisted cross-port UI still works. All 24/24 Origin/Host tests, 471 sensing-server tests ( 1 ignored), HomeCore server/API/auth/WebSocket tests ( 18 + 18 + 6 + 5 ), and 7 Python/firmware security-boundary tests passed. Binary checks, targeted rustfmt, and git diff --check also passed. No flash or OTA action was performed. The ESP-IDF v5.4 build matrix is still inconclusive: the native ARM64 image is missing a containerd layer, while the AMD64 fallback crashes in the emulated Xtensa compiler inside MbedTLS. I therefore do not count the three firmware builds as passed. Next: Solder PCB-02 first, then mount the mmWave sensor in the corner.
DEVLOG #23 The issue encountered during initial startup was a design error: the LD2450 had been mounted rotated by 180°. The UART routing itself was correct. After rotating the sensor and reflashing the ESP32-C3, everything worked again, though the physical setup doesn’t look very tidy. I designed PCB-03 based on PCB-02. The LD2450 connector and its wiring have been rotated by 180°. Everything else remains unchanged. I also added ground planes. Until the PCB arrives, the breadboard setup will continue to serve as a temporary mmWave configuration. Next steps: order PCB-03, mount the LD2450 in the marked orientation, and repeat the live radar verification. Continue using the breadboard setup until delivery.
DEVLOG #24 I strengthened security for live-sensor operation and started aligning the Observatory UI with backend functionality that actually exists. Live WebSockets now require Bearer authentication along with strict Origin and Host checks. Browser and Python clients no longer send tokens in the URL. Regression tests cover missing, invalid, and duplicate requests as well as cross-origin access. The complete CAD geometry document is now persisted in SQLite and survives a server restart. Another issue was in the browser catalog: it listed routes that the active Rust server did not provide. I am separating active routes from legacy compatibility routes, adding the missing model-details contract, and returning unavailable or HTTP 501 when browser-triggered training is not available instead of falsely reporting that it started. Next: finish and commit the route extraction, then repeat the live mmWave preflight, including calibration.
DEVLOG #25 I measured and optimized the mmWave UDP transport, but the radar path still fails the lossless-transmission test (image 1) . The new firmware and server path use one UDP copy without artificial delay, disable Wi-Fi power saving on the mains-powered node, persist the collector target and CAD transform, and separate socket reads from processing. Reordering, sequence validation, deduplication, and rolling metrics expose failures instead of hiding them. Across three 60-second runs, unique arrivals improved by 11.2%, sequence loss fell from 20.6% to 13.1%, duplicates dropped to zero, and arrival P95 improved by 27.8%. Two copies did not reduce loss and only added duplicates, so one copy remains the default. The transport is better, but not lossless: 13.1% sequence loss still blocks the radar preflight. The 50 ms interval is not the bottleneck; LD2450 frames arrive in bursts and the bridge emits about 2.64 measurements per second, not 20 independent frames per second. Next I will investigate RSSI and channel conditions, ARP and startup behaviour, Wi-Fi retries and airtime, and packet scheduling. RX/CSI stayed offline, so this is not a full Wi-Fi validation. The server refactor from DEVLOG #24 is now integrated: routes, state, runtime, calibration, recording, model, and system responsibilities moved out of main.rs , with active, legacy, and unavailable-training contracts separated. Desktop-interface removal remains in progress. Hardware-control modules are moving to a standalone control crate, while loopback-only browser server controls with origin checks are being added. Phase 1 calibration is also getting a longer measurement window and persisted evidence. RX3 currently lands roughly two to three metres from its expected fixed point. I will not consider the calibration valid until the transform, profile binding, or target association causing this offset is understood and corrected. Next: resolve the RX3 Phase 1 offset (seen in image 2) , then repeat the full fixed-point calibration and re-verify the radar preflight.
DEVLOG #26 I have completed, soldered, and tested the third and hopefully final PCB revision. Everything works, but the ground plane made soldering significantly more difficult than expected. Even with thermal reliefs around the solder pads, the plane acted like a heat sink, dissipating heat across the entire board. The shift to a browser-centric approach is progressing: the Tauri desktop app and its associated release pipeline are being removed, while hardware control is being moved to a standalone “loopback crate.” This crate handles tasks such as device discovery, serial access, provisioning, flashing, OTA updates, and WASM integration. This work is currently ongoing. The server now protects the /api/field and /ws/field endpoints using Bearer authentication and keeps auto mode offline until real data is available. An explicit simulated source is required for simulation. mmWave transmission has been improved but still exhibits a sequence loss rate of 13.1%, causing the radar preflight to remain blocked. The causes of the remaining loss still need to be investigated, particularly regarding channel conditions, the startup process/ARP, and Wi-Fi airtime and scheduling. The calibration offset for “Phase 1” on RX3 also remains unresolved. Next steps: fixing the RX3 offset, completing the migration to the browser/control setup, and re-running the radar preflight.
DEVLOG #27 I soldered a second PCB from revision 3, making the hardware for two mmWave sensors available. The software now keeps MMWAVE1 and MMWAVE2 separate through stable node identities and independent sequence, transform, and calibration state. The mmWave transport also crossed an important milestone. Because best-effort UDP was not enough, firmware 0.1.6 now uses ACK-based retransmission. In a controlled 60-second comparison, sequence loss reached 0.00% and the radar_sequence_loss_free gate passed, compared with 0.70% loss and 84 full ACK timeouts on firmware 0.1.5. The Tauri desktop shell has been replaced in the active build by a loopback control helper for discovery, provisioning, flashing, OTA, and WASM. I also created a new 3D-print file, which is currently being printed; the mechanical result is not finished yet. Next: validate both sensor paths together, resolve the RX3 Phase 1 offset, and repeat the full radar preflight.
DEVLOG #28 I prepared and locally verified an ESP-IDF replacement candidate for TX1. The firmware builds successfully, and the host-side checks for packet handling, scheduling, boot/OTA variants, and negative compile guards pass. This is still a software-only result. Nothing has been flashed, and TX1 has not been validated on hardware. Before replacing the existing TX1, the old TX1/RX4 baseline and network pre-check must still be completed. I also tightened the RX data path. Incoming frames are now checked for valid input and correct TX binding before passing through one jitter-tolerant 20 ms admission gate. Invalid or foreign frames no longer consume the timing budget. Callback, queue, UDP, and server-side counters are tracked separately, making it possible to see where loss or delay occurs. The deterministic fixtures and local ESP32-S3 build pass, but no live RX measurement has yet shown an actual reduction in frame loss or data age. The new 3D print exposed a mechanical error: it is approximately 1 mm too small and does not fit. It needs to be adjusted and printed again. Next: complete the read-only TX1/RX4 baseline, adjust and reprint the part, then continue with RX3 calibration and validation of both mmWave sensor paths.
DEVLOG #29 The local RX work has expanded, but the two-sensor setup is currently blocked by a connection problem with mmWave2. RX-04 to RX-12 add bounded capture and queue handling, stale-frame rejection, corrected CSI parsing, clearer UDP/server counters, and timing and synchronization metadata. The firmware host tests, standard and raw ESP32-S3 builds, and targeted server checks pass. These are still software and build results. No live RX measurement has yet proven lower frame loss or data age. :( The 3D-printed part now fits. While investigating the mmWave2 connection, I tried to desolder its ESP, but it could not be removed cleanly. Since the connection problem is not resolved, I ordered a replacement ESP, a new mmWave sensor, and an FH/Fenghua 1206X106K160NT SMD component. The exact cause is still open, and the replacement parts have not been installed or tested yet. The existing TX1 replacement also remains locally tested but unflashed. Next: rebuild mmWave2 with the replacement parts, identify the connection fault, validate both sensor paths, and continue with RX3 calibration.
DEVLOG #30 The replacement ESP for mmWave2 is now soldered and mounted on the previously working breadboard setup. The connection problem has not disappeared, however WiFi still fails, so I uploaded a minimal WiFi test script to isolate the radio and network path before testing the radar or UDP transport. The mmWave firmware now distinguishes MMWAVE1 and MMWAVE2 with separate build and upload paths, uses 55010 as the default UDP port, and logs the WiFi disconnect reason. These changes are prepared locally; the test image is not yet a confirmed fix, and the complete mmWave2 path is still unvalidated. In parallel, the TX1 replacement reached a stronger local checkpoint. Reproducible builds from fresh and isolated source copies are byte-identical, and the local test suite passed. The 7A TX1/RX4 baseline still produced no usable measurement data, so the migration remains blocked and 7B is NO-GO . Next: resolve the WiFi connection on the replacement ESP, verify mmWave2 communication, and continue with two-sensor validation and RX3 calibration.
DEVLOG #31 The mmWave2 connection problem is finally understood. It was caused by a reproducible dependency on the WLAN transmit power: at around 19.5 dBm, the ESP kept running and received probe requests, but its test AP could not be found and connections failed. At 10 dBm, the AP worked immediately, csi-test connected again, and 360/360 pings succeeded without a disconnect. Raising the limit reproduced the issue, confirming the dependency. Both mmWave sensors now work reliably. The TX1 migration is also complete. I verified the candidate firmware and baseline, created two identical 16 MiB backups. The new app was written to app1 together with the NVS merge and OTA selection. A complete readback of all 16,777,216 bytes matched the expected flash image exactly. Next: Boot the candidate under the existing safety gates, check that TX1 comes up properly, and run the full comparison.
DEVLOG #32 I still do not really have a final result to show, but it has been another ten hours, so I did not want to skip the devlog. The latest TX1 boot attempt did at least narrow things down. The new firmware now passes the Wi-Fi channel checks: channel 6, HT40 with the secondary channel below, AP-only mode, and the other radio checks all matched the expected profile. It then stops at CHECK_COUNTRY , before reaching BOOT_OK . The TX1 migration is therefore still not accepted, but the failure is much more specific now. The confusing part is that the Wi-Fi power values do not line up cleanly. The country structure reports a different power field than expected, while the separate power API returns the expected value. This may be an SDK representation or comparison issue rather than a real transmit-power problem, but there is not enough evidence to call it fixed yet. I also corrected related checks for the country bytes, SSID representation, and status getters, and prepared another reproducible candidate offline. With the move to Python 3.15, I also added the new lazy-import implementation. The official Python documentation describes the new syntax. Eligible imports now use explicit lazy import and lazy from syntax, with a local verifier to keep the behavior consistent. After the failed candidate boot, I restored the original 16 MiB image and verified the return path. The historical firmware is running again, and RX4 plus both mmWave sensors are sending data. Next: resolve the country/power comparison, then attempt the candidate boot again under the existing safety gates.
DEVLOG #33 The TX1 finally made it all the way to BOOT_OK . After the CHECK_COUNTRY problem from the last update, the new candidate passed the Country20/Power44 and Wi-Fi checks, booted into test mode, and passed the local TX/RX4 checks. I also confirmed the amber LED and both mmWave transport paths. The previous candidate had stopped because one sampling gap grew to 10.2 seconds. I traced that back to the timing bookkeeping and changed the sampler to schedule from the last real sample completion. The corrected run stayed within the sampling limits. That is a real improvement, but it is not the final acceptance yet. The full coverage result is still blocked by the clock-binding requirement, and the radar window only showed no_target , not a position result. I also switched to the new diagnostic server in a controlled run. It stayed ready and a separate 61-second capture passed the coverage gate, but the active CSI position setup is still missing, so this does not count as a complete TX-7B or system pass. The CAD UI got a pretty big upgrade too. MMWAVE1 and MMWAVE2 can now be edited as separate sensors with their own colors, 6 m fields of view, direction arrows, and yaw handles. I added a button to aim them at each other, plus a wall-angle tool that draws the real beam/wall intersection and lets me set the angle directly. Marker labels also move out of the way automatically, and the snap setting survives a refresh. Next: fix the remaining coverage and clock evidence, activate the sealed CAD/CSI setup, and complete the full TX-7B validation.
DEVLOG #34 The TX1 migration is now 100% verified , but the project is still only around ≈ 70% complete. The third and final boot attempt did not give me the clean result I was hoping for. Recovery happened within the allowed time, but UART0 showed two app starts. After the first start, an RTC_SW_CPU_RST appeared and the app started again. It eventually reached BOOT_OK , but because of the duplicate start I still cannot accept the boot trace or move on to server activation and measurements. I am currently documenting the exact restart sequence and trying to figure out what caused it. I also put together a source collection about Wi-Fi sensing and RF-based person detection. GitHub The separate mmWave freshness test did not reproduce the old MMWAVE2 delay problem, but that does not prove it is fixed. Next: get one clean TX1 boot, then activate the server and start collecting real measurements.
DEVLOG #35 I fixed two concrete TX1 firmware bugs. An authentication check that ran too late and an HTTP task with too little stack space. The status endpoint could lose the request headers before checking authorization. I moved that check ahead of the response. I also increased the HTTP task’s stack from 4 KB to 8 KB after confirming that some call paths could exceed the old limit. Two independent builds matched byte for byte. After taking fresh backups, I installed the candidate and verified the complete 16 MiB flash against the expected image. That part passed. The UDP/ENOMEM errors are not yet proven fixed. Next: investigate the reset path, complete a clean controlled boot, then check the matching server setup, authentication, all participants, and the measurement windows.
DEVLOG #36 The first full TX1 acceptance run is done now and it failed, but at least I finally have a much clearer picture of what is still going wrong… The common setup passed: all seven expected participants were visible, and 22 complete snapshots kept the shared basis valid for more than 20 seconds. Then Scope A ran its three 120-second windows. All three failed. There were 14 new TX send errors, and the diagnostic counters placed them in the wifi_handoff ENOMEM stage. That tells me where the error was recorded, but not yet why it happens or whether it is fixed. MMWAVE2 also became stale in parts of the run, and several RX requests were missing, so none of the historical comparisons could count as a valid PASS. Scope B stopped itself at the safety gate when the source binding became inconsistent and RX2 was already 5.044 seconds old. This is frustrating, but the guard did exactly what it was supposed to do, it refused to turn an incomplete 120-second window into a result. Next: decide how to continue the ENOMEM and source-binding issues before starting another acceptance run.
DEVLOG #37 I narrowed down the RX2 and mmWave2 issues from the failed run. Still no hardware fix, but the picture is getting clearer. The surprising part is that RX2 was still sending valid CSI packets during its apparent dropout. They just weren’t the 128-subcarrier frames the current evaluation needs. mmWave2, on the other hand, really did have gaps in packets reaching the host. I’m looking into its send-and-acknowledgement path, but haven’t proven the cause yet. I also found a parser mistake. A supposedly damaged RX packet was actually a valid warning message. That’s corrected in the isolated diagnostic tools, which now also distinguish device timeouts from requests the collector skipped or cancelled. New diagnostic firmware candidates for TX1, RX2 and mmWave2 are built locally to help trace where things stop moving. They aren’t installed yet, and the TX send errors are still unresolved. The UI is less misleading now, too: an ESP being reachable doesn’t mean radar data is arriving, and old readings no longer keep disconnected devices looking active. Next: review the diagnostic candidates, then use a short, controlled hardware run to investigate the remaining errors. The last full acceptance is still a FAIL.
DEVLOG #38 RX2 is finally delivering a lot more matching CSI data. After installing the new firmware, the rate went from about 1.9 to 31.9 frames per second. A longer, half-hour capture averaged around 30. The firmware now fixes Wi-Fi bandwidth at 20 MHz and guards against invalid CSI callbacks. One annoying catch: the long capture only recorded RX2 because some device endpoints were outdated or mixed up. I’ve prepared a stricter preflight so an incomplete group can’t silently become a four-receiver test again. I also corrected the offline window analysis. A valid frame with a different format no longer ruins an entire otherwise usable window. The UI code now separates format exclusions from unexplained sequence gaps instead of calling everything “loss”. The host fixes are tested locally, but aren’t active on the running server yet. Next: complete a proper simultaneous four-RX capture, then implement the RX1 <-> RX4 peer profile for testing. Tracking and full-system acceptance are still open.
DEVLOG #39 All four receivers finally made it through a full 30-minute CSI run together. RX1, RX3 and RX4 are now on C1, while RX2 stays on C. Each delivered around 17–20 matching frames per second, and 99.61% of the shared measurement windows passed the CSI checks. The RX1↔RX4 peer firmware and recording workflow are also implemented and tested offline now. The actual radio comparison hasn’t happened yet, so I still don’t know whether those extra links will improve positioning. One annoying bug kept rejecting good data after a 128→64→128 format change. That’s fixed in the offline analysis, along with separate format rules for TX1 and peer links and a recorder completion check. I also added RX and radar exports that keep raw data, timing and recording boundaries together. That path works in offline tests; it isn’t a new live hardware result. Next: check both mmWave sensors individually and then together at known points. The shared CSI run is a milestone, but tracking and full-system acceptance are still open.
DEVLOG #40 I cut the recording footprint from 4.54 to 2.67 GB in the full synthetic test, about 41% less. The saving comes mainly from removing duplicate exports, not throwing away raw data or evidence. I also corrected timing and CSI rate-limit bugs offline, plus a cleanup issue that could prevent the recorder from stopping its own processes when disk space got tight. The frustrating part is that the peer comparison still hasn’t recorded anything. One attempt stopped on the timing bug, after that was fixed, the next hit a missing signing key during host startup. No peer firmware was uploaded and no capture started in either attempt. Next: fix host startup and prepare a separate 35-minute pilot. The actual peer comparison and tracking acceptance are still open.
DEVLOG #41 RX1 finally passed a full three-minute TX1→RX1 test. 6,407 qualified CSI frames, around 35.6 per second, and all 173 measurement windows passed. The firmware had been rejecting our setup because TX1 is also the Wi-Fi access point. That’s corrected and installed now. SOS is the warning for missing or stale usable CSI from TX1. It doesn’t automatically mean the board is broken. Ironically, the warning itself had a bug, RX1 reported stale data even though a matching frame had arrived just 8.7 milliseconds earlier. A timing race between the LED task and CSI reception caused the false alarm. The fix is built and tested offline, but isn’t installed yet. Host startup and recording also work now. RX2 is still a problem, though: its upload timed out while CSI kept arriving, and the cause isn’t confirmed. Next: install and verify the LED fix on RX1 before continuing with the other receivers. The actual two-way peer comparison and tracking acceptance are still open.
DEVLOG #42 RX3 and RX4 have passed their individual checks on the latest firmware. A complete OTA update, the LED pattern test and ten minutes of stability monitoring each, with no errors recorded. The false SOS warning on RX1 is also fixed and verified on the board now. I corrected concurrent access in the shared UDP sender and transport statistics, too. Those are real software fixes, but I still can’t claim they explain the original RX3 heap corruption or watchdog resets. I also improved CAD profile handling. Profiles can use a separate store, the UI shows which revision is loaded, and refreshing no longer overwrites unsaved edits or brings back an older saved version. The rollout isn’t finished, though. The next RX1 update stopped because its device identity couldn’t be confirmed, so RX2’s update to this latest version hasn’t started either. Next: resolve that binding, finish updating RX1 and RX2, then move on to the actual two-way peer comparison. Tracking acceptance is still open....
|
1792572487.707279
|
1793177287.707279
|
|
37669
|
STELLA by @Loibo_2 | Stardance
|
Loibo_2
|
0
|
249.54
|
0
|
[]
|
[{"post_id": 65363, "ts": "202 [{"post_id": 65363, "ts": "2026-09-10T13:33:28Z", "hours": 10.0181, "text": "New Devlog :D It’s finally almost done… a working orbit system. I had sooo many problems with the different velocities, coordinates, and a lot of other things. But now it’s finally starting to look like something. Of course, it’s not perfect right now and still needs some adjustments, but the basic principle is done. For the next devlog, I’ll try to polish it and fully complete the system. I also want to give it a better look with some custom graphics and add a few more orbit lines without making it too laggy. Hope you like it :)"}, {"post_id": 63453, "ts": "2026-09-07T09:54:44Z", "hours": 9.6464, "text": "New Devlog :D I’m finally getting somewhere! After a lot of fixing and debugging, I now have an orbit line system that doesn’t behave weirdly when the time is set to a high value. I can now also project escape trajectories, elliptical orbits, and more. The next few things I want to work on are SOIs and collisions with them, as well as some other things like multiple planets, moons, and more rockets. Hope you like it"}, {"post_id": 60120, "ts": "2026-09-02T09:05:23Z", "hours": 9.8636, "text": "Sadly, I didn’t get much done this time :/ I did sooo much debugging on the physics system, but nothing was really working. I had so many issues with acceleration, different systems using different values, and multiple problems with ground detection. So I started all over again… Right now, I’ve removed all the physics and ground collision parts from the code, and I’ll try again. This time, I want to use one variable for each value and build an improved and more realistic engine instead of just guessing values and parameters. I also drew a few new parts. Hope you like it (:"}, {"post_id": 58390, "ts": "2026-08-30T19:57:55Z", "hours": 10.3636, "text": "New Devlog :D OMG I did it. The orbit line rendering is finally done, and it took sooo much debbugging. I spend most of the time converting the map coordinates to the planet coordinates, that are used in the physics system. I also had soo many small issues, like missing minus signs or just bad or old weird code that was causing problems. But now it is mostly working. The only think that still needs fixing is the transistion when going above 120km in altitude. Once that and a few other small things are fixed, most of the physics stuff should be finisched. I also got the time warp working in the planet view so that isn´t a problem anymore. The current max is x10 below 120km and x100 below 600km. Hope you like it :)"}, {"post_id": 57249, "ts": "2026-08-29T11:11:52Z", "hours": 9.9744, "text": "New Devlog :D The first thing I did was to remove the orbit line system. I noticed that it was full of bugs, and the different x, y, vx and vy values in the map, the game and depending on whether the rocket was in the planet´s orthe sun´s sphere of influence were becoming to complicated. SO i scrapped thewhole system. Then i stated over by deleting everything related too physics from the maps code and moving it into the games physics code. After that, I divided the pysics system into muliple sections: physics on the ground, in the air, in an orbit around the planet and in an orbit aroun the sun. By doing this, I can get better results for each part of the game and make the system easier to manage. I also added a new function, and now the rocket accelerates whn pressing W. For the next devlog, I´ll try to get at least some parts of the orbit system working so I can move on to another part of the game. Hope you like it"}, {"post_id": 56501, "ts": "2026-08-28T09:25:19Z", "hours": 7.7267, "text": "New Devlog :D Spend most of the time working on the new system to show the orbital lines. The first step was to add a Sphere of Influence (SOI), so the rocket isn´t pulled constantly by two or more bodies at the same time. Next I somehow got the pysics to work so that the orbit line stops when it would enter a SOI. It´s very buggy right now, though. The white orbit is sometimes glitching, and after entering the SOI the rocket just gets teleportet to the ground. Also addet two markers to show the Apogee and the Periapsis. I will keep working on it, because this is such an importent feature. Hope you like it"}, {"post_id": 55217, "ts": "2026-08-26T20:02:34Z", "hours": 10.275, "text": "New Devlog :D Puhhh, another big one. Most of the time, I spent trying to somehow turn the flat map of the game into a sphere. This took sooooo long, and it still isn’t quite right. I don’t know why, but the terrain isn’t fully the same. Also, the rocket is now a dot on the map that shows its coordinates. It also has a simple orbit line and can be centered. The planet now has the correct dimensions and radius, based on the other values. A big problem I had was that the 32-bit values were too small for the scale at which the pixels were being rendered. Hope you like it :)"}, {"post_id": 54441, "ts": "2026-08-25T13:45:19Z", "hours": 10.17, "text": "New Devlog :D Addet soooo much new stuff. Some features were really big, and I didn´t have the motivation to finish them completely, so a few thinks are a bit buggy right now. New stuff: Biggest point: Fixed the physics system. Before the fix, all rockets were just spinning around when sitting on a slope. They also glitched into the gorund or just fell in infinitly. Now both probles are fixed. The first one by using a point system to determie if the rocket is on a slope and should slide, as well as a lever arm that uses the mass to rotate the craft. For the second problem, I introduced a new outline system that now uses a convex hull. The only problem is that parts like the engine aren´t drawn accurately. Sooo thats one think i need to fix. New 0x time warp to stop the whole think and get a closer look. The planet now has its actural terrain height when viewed p close, instead of just beeing a cricle. It is terrabil right now and only a fist try. A new marker to show, where the rocket is on the map. Thinks to do next: Fix the convex hull New system for when the planet is viewed up close in the map view Fix everything in the map view around the planet Hope you like it :)"}, {"post_id": 53620, "ts": "2026-08-24T08:34:16Z", "hours": 9.035, "text": "New Devlog :D I´m not completely done with the terrain system, but i´m gonna stop working on it for now. It looks okay, until you zoom out to far and I´m not really making any progress anymore. Right now, it uses a simplex Noise with some other noise types in layers on top, aswell as some plateu logic and corosion. Also a biome system, that is in a okay shape right now, wich gives each section a unique color. Next i will focus more on thinks like physic, propulsion and the map. Hope you like it :)"}, {"post_id": 52897, "ts": "2026-08-23T08:55:01Z", "hours": 9.7747, "text": "New Devlog :D Did sooooo much work on the terrain system… For the most part , I looked online for some code snippets and tried to get them working with javascript. In the previous devlog, I showed the different colors for the biome system. I build around that, so each biome has it´s different amount of octaves, roughness and amplitude. Roughness in this case just says how smooth the different Simplex noise points should be between each other. This worked fine until you zoomed out. Especially in mointain areas, the waves from the sin and cos funtions were noticeable. So i tried a few things… Using a warp funtion to stretch high waves Terracing points, which wee a complety failure Stacking more functions on top of each other But everyting had its ownsides and nothing worekd fine… While trying those things, I wrote somecode that now lts you zoom out as far as you want by removing more and more lines so it doesn´t get laggy. Right now it looks terrible, but i have a final idea. For evey point above a given threshold, I´m gonna randomly choose two points and randomly flatten everything bewteen them. If you have any ideas how to get better terrain, please write it down in the comments. Hope you like it :)"}, {"post_id": 51582, "ts": "2026-08-21T11:03:54Z", "hours": 7.5636, "text": "Devlog time :D Last time, I showed a terrain geration system where the main factor was different biomes that were more or less hardcoded. - I scrubbed all of that and startet over. The new system is based on a simplex/perlin noise with a 8 layers of octaves. This took so long and i still don´t fully understand the code i put together using different websites. The noise generates random height nosies that are a few pixels apart and the rest is calculatet in between. next I added the biome overlay. Right now it´s just a prototype, but it uses the same noise technique with the pixels spaced further apart and gives each sector a random color. The problem right now is that everything is roughly the same height and the biomes are way to small and with way to clean fades between them. I will keep working on the terrain sytsem. Hope you like it :)"}, {"post_id": 50470, "ts": "2026-08-19T17:11:57Z", "hours": 7.0219, "text": "New Develog I never thought that terrain generation would be that hard Dx. I tried to generate the map pixel by pixel using a custom seed and many differt parameters. For now, I got a simple biome system working, but it still doesn´t looks quiet right. The biomes are stored in an array with a few parameters like height, roughness and the chances of craters, etc. This workes kinda okay, but the normal tarrein is not in a good shape right now. I will try to work on that and get a more realistic landscape. Also, I want to make a better system to randomly place craters, rocks and other stuff. Hope you like it :)"}, {"post_id": 49878, "ts": "2026-08-18T20:34:22Z", "hours": 9.3578, "text": "New Devlog :D First of all, this took bit longer because I had to switch on my androit tablet… I got visual studio code running bey installing termux and running it via an ubuntu extension. Worked a lot on the physics system. It now has collision and uses the exact same code for calculating the planet height. The rocket can´t go blow the ground height. It´s not perfect but okay. Some problems are still present, especially with falling over and beeing to slippery. Still good progress. Hope you like it :)"}, {"post_id": 48171, "ts": "2026-08-16T13:49:56Z", "hours": 8.9831, "text": "Devlog time :D It´s not completly done but her is the first version of the pyhsics part. Right now there is no atmosphere or a solid ground, but it is something and it took way to long, especially calculating some of the turning math. The craft is turned with ‘E’ and ‘Q’ and turns around the command pod wich is the onle part that can turn right now. And I still haven´t fixed the build menu. I also noticed that the parts placed in the ame now look off and I don´t know why. Hope you like it :)"}, {"post_id": 47440, "ts": "2026-08-15T11:28:06Z", "hours": 7.8667, "text": "Devlog time :D Worked on a lot of thinks: The new timewarp system. It is not completly done and 1x is not the real time right now. You can now click and still follow the same object while beeing in the map view. Improved the orbit lines. (not as wobbly as before) Tried to fix the build menu… and failed. It´s now worse then before urgh. For the next devlog the menu issues will hopefully be fixed. Hope you like it :)"}, {"post_id": 46269, "ts": "2026-08-13T12:07:46Z", "hours": 8.9306, "text": "New develog :D Worked a lot on the map viewof my space game. Features addet: Improved the view of the planet and the sun. In this example, I used the proportions of the sun and mars. Addet a button to switch the currect object the camera ist locked onto. Addet a line that shows the orbit of each object, but it´s not finished yet.. the closer you are, the more wobbly it get´s. Changed the color of the locked objct. Hope you like it :)"}, {"post_id": 44567, "ts": "2026-08-10T12:33:20Z", "hours": 7.9642, "text": "Devlog time :D Worked on the map menu. It does not look like much but the smaller circle is in an orbit around the big one. Not in the right scale and far from beeing realstic, but i´m getting there. Hope i can finish it soon :)"}, {"post_id": 43339, "ts": "2026-08-08T15:17:11Z", "hours": 3.4517, "text": "Small devlog :D Added the rocket to the actual game. No physics or collision yet, but that will be my next task. Also addet weight to every part. The yellow rect is the center of mass. Hope you like it :)"}, {"post_id": 42933, "ts": "2026-08-07T22:24:58Z", "hours": 6.4756, "text": "New Devlog :D Right now it doesn´t look like much, but this is the technique I´m going to use to rander planets. The idea is that if you´re close enough, every planet or moon looks flat on the surface. So instead of rendering a full sqhere, i´m using an finite strip with a thousends of pixels. Each pixel gets his height trough a seed, so it should look the exact same everytime. This way, I dont have to bend pixels and can stay with the pixelized look. Hope you like it :)"}, {"post_id": 42511, "ts": "2026-08-07T09:40:03Z", "hours": 7.2953, "text": "New devlog :) It´s not much to look at, but got a lot of thinks working: added a new file structure to change the sceen to other modes like the main menu createt 7 new files for all the different modes and structure and state files hours of debugging… those canva lines are not easy That´s all for now, hope you like it :)"}, {"post_id": 41840, "ts": "2026-08-06T09:32:24Z", "hours": 7.3692, "text": "Finished a major part of the building system: you can now select and drag parts or entire structures. I had some trouble figuring out how to store each part so I could identify all parts below it. Also fixed: the rendering of the build menu some big array structures Hope you like it :)"}, {"post_id": 41236, "ts": "2026-08-05T09:52:06Z", "hours": 4.1428, "text": "Omg i did it… took way to much work and isn´t 100% done, but now it´s just fixing some points and remaking some texures :) Next things to do are: Fix the engines More Parts and inner tanks Smaller Tanks and parts Part moving system"}, {"post_id": 40718, "ts": "2026-08-04T13:09:12Z", "hours": 9.6061, "text": "Sadly didn´t get much done :/ I had way to much debugging and couldn´t really find teh errors. But I will trying to fix it :) The Idea is to have large empty structual components where you can deside what to put into them. right now there are only two types of tanks (oxigen and liquid propellant) but more will come, like hydrogen, helium and other stuff like batteries or life support system."}, {"post_id": 39436, "ts": "2026-08-02T12:00:33Z", "hours": 6.3542, "text": "Lots of small technical things fixed. New detection System for different parts and a new mode for building tanks. Also some new textures, because 58 is not divisible by 4… Next update probabyl gonna be big :)"}, {"post_id": 38703, "ts": "2026-08-01T07:30:37Z", "hours": 7.7958, "text": "Did some progress on the menu and added some new parts :) Also a lot of debugging…"}, {"post_id": 38131, "ts": "2026-07-31T10:59:29Z", "hours": 7.4672, "text": "Finished the overlap system today and also a few new parts. :)"}, {"post_id": 37582, "ts": "2026-07-30T12:36:09Z", "hours": 8.8811, "text": "Sooooo, new update :D I did a lot of work on the system for how parts are stored and the overlap detection. I also worked on detecting, when two different rockets are connectet (though that part isn´t finished yet). This took and still will tage a lot of work. Dx In the video, you can see the new detection system. It uses points stored in a array to draw a “hitbox” around each object. The last thing I improved was how teh parts are rendered on screen. I´m now useing a function that efficently calculates the correct coordinates. Next, I´ll try to further improve the code, remove as many unnecessary lines as possible, and finally design some new txtuers and parts. Hope you like it :)"}, {"post_id": 36583, "ts": "2026-07-28T19:56:10Z", "hours": 6.9833, "text": "Puhhh finally did it. Took a lot of time, but here it the working Snap System :)"}, {"post_id": 35965, "ts": "2026-07-27T19:09:10Z", "hours": 9.8314, "text": "In the last 9 hours, I made some really good progress on the building system of my space game. A big part of the work was figuring out how to properly store all the data of the individual pieces in arrays, and how to link them together so they can form larger structures. This turned out to be more challenging than expected, especially when trying to keep everything flexible and organized. I also spent some time improving the overall logic behind placimg parts, so it feels more consistent. There’s still a lot to do, but the core system is starting to come together now. Next, I’m planning to finish the building system by adding more features, including a snap-in-place system to make building smoother and more intuitive. I’ll also start working on visuals soon, since everything is still pretty basic at the moment. Hope you enjoy it :)"}, {"post_id": 33633, "ts": "2026-07-23T18:25:19Z", "hours": 9.3525, "text": "I’m working on my first project in JavaScript. It’s going to be a small space simulator. I didn’t get much done in the first 10 hours, but so far I’ve created a build menu where you can choose, scroll, and select parts (though there are no images yet). That’s it for now, but more will come, and the graphics are far from finished :)"}]...
|
Title: STELLA by @Loibo_2 | Stardance
Devlogs:
I’ Title: STELLA by @Loibo_2 | Stardance
Devlogs:
I’m working on my first project in JavaScript. It’s going to be a small space simulator. I didn’t get much done in the first 10 hours, but so far I’ve created a build menu where you can choose, scroll, and select parts (though there are no images yet). That’s it for now, but more will come, and the graphics are far from finished :)
In the last 9 hours, I made some really good progress on the building system of my space game. A big part of the work was figuring out how to properly store all the data of the individual pieces in arrays, and how to link them together so they can form larger structures. This turned out to be more challenging than expected, especially when trying to keep everything flexible and organized. I also spent some time improving the overall logic behind placimg parts, so it feels more consistent. There’s still a lot to do, but the core system is starting to come together now. Next, I’m planning to finish the building system by adding more features, including a snap-in-place system to make building smoother and more intuitive. I’ll also start working on visuals soon, since everything is still pretty basic at the moment. Hope you enjoy it :)
Puhhh finally did it. Took a lot of time, but here it the working Snap System :)
Sooooo, new update :D I did a lot of work on the system for how parts are stored and the overlap detection. I also worked on detecting, when two different rockets are connectet (though that part isn´t finished yet). This took and still will tage a lot of work. Dx In the video, you can see the new detection system. It uses points stored in a array to draw a “hitbox” around each object. The last thing I improved was how teh parts are rendered on screen. I´m now useing a function that efficently calculates the correct coordinates. Next, I´ll try to further improve the code, remove as many unnecessary lines as possible, and finally design some new txtuers and parts. Hope you like it :)
Finished the overlap system today and also a few new parts. :)
Did some progress on the menu and added some new parts :) Also a lot of debugging…
Lots of small technical things fixed. New detection System for different parts and a new mode for building tanks. Also some new textures, because 58 is not divisible by 4… Next update probabyl gonna be big :)
Sadly didn´t get much done :/ I had way to much debugging and couldn´t really find teh errors. But I will trying to fix it :) The Idea is to have large empty structual components where you can deside what to put into them. right now there are only two types of tanks (oxigen and liquid propellant) but more will come, like hydrogen, helium and other stuff like batteries or life support system.
Omg i did it… took way to much work and isn´t 100% done, but now it´s just fixing some points and remaking some texures :) Next things to do are: Fix the engines More Parts and inner tanks Smaller Tanks and parts Part moving system
Finished a major part of the building system: you can now select and drag parts or entire structures. I had some trouble figuring out how to store each part so I could identify all parts below it. Also fixed: the rendering of the build menu some big array structures Hope you like it :)
New devlog :) It´s not much to look at, but got a lot of thinks working: added a new file structure to change the sceen to other modes like the main menu createt 7 new files for all the different modes and structure and state files hours of debugging… those canva lines are not easy That´s all for now, hope you like it :)
New Devlog :D Right now it doesn´t look like much, but this is the technique I´m going to use to rander planets. The idea is that if you´re close enough, every planet or moon looks flat on the surface. So instead of rendering a full sqhere, i´m using an finite strip with a thousends of pixels. Each pixel gets his height trough a seed, so it should look the exact same everytime. This way, I dont have to bend pixels and can stay with the pixelized look. Hope you like it :)
Small devlog :D Added the rocket to the actual game. No physics or collision yet, but that will be my next task. Also addet weight to every part. The yellow rect is the center of mass. Hope you like it :)
Devlog time :D Worked on the map menu. It does not look like much but the smaller circle is in an orbit around the big one. Not in the right scale and far from beeing realstic, but i´m getting there. Hope i can finish it soon :)
New develog :D Worked a lot on the map viewof my space game. Features addet: Improved the view of the planet and the sun. In this example, I used the proportions of the sun and mars. Addet a button to switch the currect object the camera ist locked onto. Addet a line that shows the orbit of each object, but it´s not finished yet.. the closer you are, the more wobbly it get´s. Changed the color of the locked objct. Hope you like it :)
Devlog time :D Worked on a lot of thinks: The new timewarp system. It is not completly done and 1x is not the real time right now. You can now click and still follow the same object while beeing in the map view. Improved the orbit lines. (not as wobbly as before) Tried to fix the build menu… and failed. It´s now worse then before urgh. For the next devlog the menu issues will hopefully be fixed. Hope you like it :)
Devlog time :D It´s not completly done but her is the first version of the pyhsics part. Right now there is no atmosphere or a solid ground, but it is something and it took way to long, especially calculating some of the turning math. The craft is turned with ‘E’ and ‘Q’ and turns around the command pod wich is the onle part that can turn right now. And I still haven´t fixed the build menu. I also noticed that the parts placed in the ame now look off and I don´t know why. Hope you like it :)
New Devlog :D First of all, this took bit longer because I had to switch on my androit tablet… I got visual studio code running bey installing termux and running it via an ubuntu extension. Worked a lot on the physics system. It now has collision and uses the exact same code for calculating the planet height. The rocket can´t go blow the ground height. It´s not perfect but okay. Some problems are still present, especially with falling over and beeing to slippery. Still good progress. Hope you like it :)
New Develog I never thought that terrain generation would be that hard Dx. I tried to generate the map pixel by pixel using a custom seed and many differt parameters. For now, I got a simple biome system working, but it still doesn´t looks quiet right. The biomes are stored in an array with a few parameters like height, roughness and the chances of craters, etc. This workes kinda okay, but the normal tarrein is not in a good shape right now. I will try to work on that and get a more realistic landscape. Also, I want to make a better system to randomly place craters, rocks and other stuff. Hope you like it :)
Devlog time :D Last time, I showed a terrain geration system where the main factor was different biomes that were more or less hardcoded. - I scrubbed all of that and startet over. The new system is based on a simplex/perlin noise with a 8 layers of octaves. This took so long and i still don´t fully understand the code i put together using different websites. The noise generates random height nosies that are a few pixels apart and the rest is calculatet in between. next I added the biome overlay. Right now it´s just a prototype, but it uses the same noise technique with the pixels spaced further apart and gives each sector a random color. The problem right now is that everything is roughly the same height and the biomes are way to small and with way to clean fades between them. I will keep working on the terrain sytsem. Hope you like it :)
New Devlog :D Did sooooo much work on the terrain system… For the most part , I looked online for some code snippets and tried to get them working with javascript. In the previous devlog, I showed the different colors for the biome system. I build around that, so each biome has it´s different amount of octaves, roughness and amplitude. Roughness in this case just says how smooth the different Simplex noise points should be between each other. This worked fine until you zoomed out. Especially in mointain areas, the waves from the sin and cos funtions were noticeable. So i tried a few things… Using a warp funtion to stretch high waves Terracing points, which wee a complety failure Stacking more functions on top of each other But everyting had its ownsides and nothing worekd fine… While trying those things, I wrote somecode that now lts you zoom out as far as you want by removing more and more lines so it doesn´t get laggy. Right now it looks terrible, but i have a final idea. For evey point above a given threshold, I´m gonna randomly choose two points and randomly flatten everything bewteen them. If you have any ideas how to get better terrain, please write it down in the comments. Hope you like it :)
New Devlog :D I´m not completely done with the terrain system, but i´m gonna stop working on it for now. It looks okay, until you zoom out to far and I´m not really making any progress anymore. Right now, it uses a simplex Noise with some other noise types in layers on top, aswell as some plateu logic and corosion. Also a biome system, that is in a okay shape right now, wich gives each section a unique color. Next i will focus more on thinks like physic, propulsion and the map. Hope you like it :)
New Devlog :D Addet soooo much new stuff. Some features were really big, and I didn´t have the motivation to finish them completely, so a few thinks are a bit buggy right now. New stuff: Biggest point: Fixed the physics system. Before the fix, all rockets were just spinning around when sitting on a slope. They also glitched into the gorund or just fell in infinitly. Now both probles are fixed. The first one by using a point system to determie if the rocket is on a slope and should slide, as well as a lever arm that uses the mass to rotate the craft. For the second problem, I introduced a new outline system that now uses a convex hull. The only problem is that parts like the engine aren´t drawn accurately. Sooo thats one think i need to fix. New 0x time warp to stop the whole think and get a closer look. The planet now has its actural terrain height when viewed p close, instead of just beeing a cricle. It is terrabil right now and only a fist try. A new marker to show, where the rocket is on the map. Thinks to do next: Fix the convex hull New system for when the planet is viewed up close in the map view Fix everything in the map view around the planet Hope you like it :)
New Devlog :D Puhhh, another big one. Most of the time, I spent trying to somehow turn the flat map of the game into a sphere. This took sooooo long, and it still isn’t quite right. I don’t know why, but the terrain isn’t fully the same. Also, the rocket is now a dot on the map that shows its coordinates. It also has a simple orbit line and can be centered. The planet now has the correct dimensions and radius, based on the other values. A big problem I had was that the 32-bit values were too small for the scale at which the pixels were being rendered. Hope you like it :)
New Devlog :D Spend most of the time working on the new system to show the orbital lines. The first step was to add a Sphere of Influence (SOI), so the rocket isn´t pulled constantly by two or more bodies at the same time. Next I somehow got the pysics to work so that the orbit line stops when it would enter a SOI. It´s very buggy right now, though. The white orbit is sometimes glitching, and after entering the SOI the rocket just gets teleportet to the ground. Also addet two markers to show the Apogee and the Periapsis. I will keep working on it, because this is such an importent feature. Hope you like it
New Devlog :D The first thing I did was to remove the orbit line system. I noticed that it was full of bugs, and the different x, y, vx and vy values in the map, the game and depending on whether the rocket was in the planet´s orthe sun´s sphere of influence were becoming to complicated. SO i scrapped thewhole system. Then i stated over by deleting everything related too physics from the maps code and moving it into the games physics code. After that, I divided the pysics system into muliple sections: physics on the ground, in the air, in an orbit around the planet and in an orbit aroun the sun. By doing this, I can get better results for each part of the game and make the system easier to manage. I also added a new function, and now the rocket accelerates whn pressing W. For the next devlog, I´ll try to get at least some parts of the orbit system working so I can move on to another part of the game. Hope you like it
New Devlog :D OMG I did it. The orbit line rendering is finally done, and it took sooo much debbugging. I spend most of the time converting the map coordinates to the planet coordinates, that are used in the physics system. I also had soo many small issues, like missing minus signs or just bad or old weird code that was causing problems. But now it is mostly working. The only think that still needs fixing is the transistion when going above 120km in altitude. Once that and a few other small things are fixed, most of the physics stuff should be finisched. I also got the time warp working in the planet view so that isn´t a problem anymore. The current max is x10 below 120km and x100 below 600km. Hope you like it :)
Sadly, I didn’t get much done this time :/ I did sooo much debugging on the physics system, but nothing was really working. I had so many issues with acceleration, different systems using different values, and multiple problems with ground detection. So I started all over again… Right now, I’ve removed all the physics and ground collision parts from the code, and I’ll try again. This time, I want to use one variable for each value and build an improved and more realistic engine instead of just guessing values and parameters. I also drew a few new parts. Hope you like it (:
New Devlog :D I’m finally getting somewhere! After a lot of fixing and debugging, I now have an orbit line system that doesn’t behave weirdly when the time is set to a high value. I can now also project escape trajectories, elliptical orbits, and more. The next few things I want to work on are SOIs and collisions with them, as well as some other things like multiple planets, moons, and more rockets. Hope you like it
New Devlog :D It’s finally almost done… a working orbit system. I had sooo many problems with the different velocities, coordinates, and a lot of other things. But now it’s finally starting to look like something. Of course, it’s not perfect right now and still needs some adjustments, but the basic principle is done. For the next devlog, I’ll try to polish it and fully complete the system. I also want to give it a better look with some custom graphics and add a few more orbit lines without making it too laggy. Hope you like it :)...
|
1791825926.2448518
|
1792689926.2448518
|
|
34181
|
INDEMNITY by @ilfattorino | Stardance
|
ilfattorino
|
0
|
249.28
|
0
|
[]
|
[{"post_id": 62466, "ts": "202 [{"post_id": 62466, "ts": "2026-09-05T20:24:58Z", "hours": 10.1272, "text": "renamed game + launcher for this update i renamed the game and all the functions with the new chosen name, i also added where needed the logo in place of the old “decimation” red text and it looks really good now. i also made the window a fixed size so it looks always good. added also the logo for the app that was previous the default empty logo."}, {"post_id": 61740, "ts": "2026-09-04T19:56:55Z", "hours": 9.2, "text": "new name + logo i choose to change the name of the game to “Indemnity” i believe that it suits the game really well and im working rn on remaking the site. these are the new logos and graphics i also kept working on the mod like usual, it takes ages. !!please tell me what you think about these logos and how they could be better!!"}, {"post_id": 61262, "ts": "2026-09-04T03:29:51Z", "hours": 9.5453, "text": "changed the name + kept working i choose to officially change the name into another one the ti will share in the next devlog, i bought the new domain, set up the server, configured the domain with cloud flare and now it works perfectly. i need to still finish building the site but it works very well. Go now it just says test because i only put an h1 with that word but i will replace it soon with the site. After all this i kept also working on the mod continuing renaming functions and cleaning up the code"}, {"post_id": 60549, "ts": "2026-09-02T23:24:11Z", "hours": 10.0283, "text": "kept working on cleaning up code for this devlog i kept working on and cleaning up the code, there isn’t much left and i think that in 3-4 devlogs the code for the mod should be completly readable and ready to be shipped, wth it there will be also the open source launcher and other things like the network"}, {"post_id": 59965, "ts": "2026-09-02T01:23:15Z", "hours": 10.1897, "text": "worked on the mod a lot & other For this devlog, I spent many hours on the mod, resolving issues that caused occasional lag or crashes. A decompiled block of code had turned into gibberish yet still compiled; once isolated, it revealed the entire file was failing because of that section. I also corrected a minor problem in the email client from the previous dev logs where login worked only with a passkey and not with the password, and it is now resolved."}, {"post_id": 59304, "ts": "2026-09-01T00:54:31Z", "hours": 10.8267, "text": "Optimized email client + mod debugging For this devlog i optimized the email client to make it work as intedend, there were some issues with the html formatting of emails and many many issues with creating the email client like the passkeys not actually allowing to access the account and similiar things but now it works as intended and i don’t think additional modifications are required. From now on i will only work on the mod and i’m going to rebrand it to something else different, i don’t like the community that is left of this mod, it’s too much toxic and i don’t want to have to handle all of that childish behavior"}, {"post_id": 58542, "ts": "2026-08-30T23:49:15Z", "hours": 10.0103, "text": "Added offline status + fixed issue with profile For this devlog i added a full screen alert that says when the client is disconnected from the network and prevents the launching of the game. I also fixed an issue where when closing the launcher, disconnecting from the network and then reopening the launcher it would display a dummy profile in place of the logged in one I also spent a lot of time like all the other devlogs debugging the mod code and functions"}, {"post_id": 57774, "ts": "2026-08-30T02:09:38Z", "hours": 9.935, "text": "Created Mail Server, Client, and SMTP Server For this devlog, I built the mail server and client to handle, manage, view, and send emails for the game and foundation. I initially tried running everything locally, but AWS blocked me, they toughtI was using port 25 for malicious activity and refused to unlock it. After that, I attempted to use AWS SES, but it was a nightmare: overly complex, required a ton of verification, and cost more than other options, so I scrapped it.While searching for a better solution, everything else was already working well, though I did spend a lot of time debugging with ChatGPT. Eventually, I found a free SMTP service that provided exactly what I needed. I integrated it with the server, and now everything runs smoothly."}, {"post_id": 56865, "ts": "2026-08-28T20:44:52Z", "hours": 10.9875, "text": "Worked on the server part of the mod I worked on making the server part of the mod work, now the servers work perfectly fine and I’m working on optimizing the code to make it run even smoother"}, {"post_id": 55700, "ts": "2026-08-27T17:44:31Z", "hours": 10.8569, "text": "kept working on the mod in these days i just kept working on the mod, cleaning up code and rewriting functions, nothing much but time intensive. Also i fixed the mobs that didn’t worked before, now they are functional."}, {"post_id": 53844, "ts": "2026-08-24T15:24:32Z", "hours": 10.2333, "text": "making logos + kept working on the mod I’ve been working on the logos of the foundation and the game that i didn’t like the old ones, and also I’m thinking about changing the name of this mod because it doesn’t make sense with all the hate received to keep working on this and as soon as it gets available to get ddosed and harassed. I’ve also been working like usual on the mod fixing bugs and more."}, {"post_id": 52030, "ts": "2026-08-22T02:11:47Z", "hours": 10.62, "text": "kept deobfuscating the game + kept modifying the foundation site i gave a new look to the foundation site with a new logo and kept working on the mod and maps"}, {"post_id": 50992, "ts": "2026-08-20T14:12:26Z", "hours": 10.7794, "text": "encountered e-gangsters, little edit on the launcher and kept modifying the client I had the pleasure to encounter e-ganster and they promised to search for exploits and to “disgust” the playerbase, how tuff.. They also said that the foundation registered with hcb is not real, lol After this little encounter i also kept modifying the launcher and the game. i kept debugging and fixed a little issue that was brought up by a kind person that the play button was bad, really bad, now it’s looking alright."}, {"post_id": 50004, "ts": "2026-08-19T01:09:18Z", "hours": 10.9497, "text": "I kept modifying the site + deobfuscating the mod and editing the launcher 1 ) I kept editing the site for the foundation that is still not looking professional enough and serious (I believe at least). Please share your opinion, what’s missing and what should I change: https://iidastemfoundation.org 2 ) I kept working on deobfuscating the mod (in fact all the hours counted for this devlog came from doing it) that is extremely hard to do and I don’t have any more tokens to use for this month so I guess I just have to keep working manually (feeling like in a coal mine rn). 3 ) I kept also working a bit on the launcher but nothing much for this update."}, {"post_id": 48884, "ts": "2026-08-17T13:31:35Z", "hours": 10.6075, "text": "made the site for the foundation + continued making the launcher For this devlog i made the public facing website for the foundation. It has been kinda hard to do right but finally it’s kinda good looking. I also continued to make the launcher and fix things that didn’t worked."}, {"post_id": 47689, "ts": "2026-08-15T19:26:30Z", "hours": 17.5217, "text": "registered nonprofit + added google login and discord rich presence in the last days i successfully registered the nonprofit that owns the game. It took some time but it’s now registered. I succesfully added the google and microsoft login that will allow users to access only using those ways. It increases security and makes everything easier. I integrated also Discord Rich Presence do display on users running the game and launcher the status."}, {"post_id": 45473, "ts": "2026-08-11T23:34:56Z", "hours": 14.2642, "text": "made settings, servers and news pages + continued to edit the mod Hi everyone, in these days i’ve continued to build the launcher by making all these pages, they work well except for settings that a few things have still to be made."}, {"post_id": 44329, "ts": "2026-08-10T00:34:00Z", "hours": 14.4689, "text": "Restyle of the launcher + future of the mod I have restyled the Launcher to be prettier and more useful. The last release was only the first test interface to verify that it worked. Now it’s looking way better and far more usable. I’ve also been thinking about not just remaking this mod and then leaving it to die again. I intend to continue it, but I have no intention to profit from it. Because of this, I’m planning to create the iida Foundation through the HCB portal of Hack Club. The foundation will aim to create STEM projects to increase teenagers’ knowledge, specially through games that are actually interesting to play and provide real world skills, not just in game benefits. These skills include technology, energy, handcraft, and farming."}, {"post_id": 42652, "ts": "2026-08-07T14:24:40Z", "hours": 9.2544, "text": "First peek at the launcher This is the first look at the Launcher. I’m building this launcher in C++ with Qt. I chose this combination because it streamlines development and delivers superior graphics. The fields are currently empty, I’m using placeholders rather than mock data so once i connect the backend server all fields will populate automatically. Join our community on Discord: discord.gg/decimation Thanks for your interest!"}, {"post_id": 41630, "ts": "2026-08-05T23:20:54Z", "hours": 10.2097, "text": "the launcher I’ve started building the open source launcher in C++. I chose C++ for its flexibility across multiple platforms and because it’s the language I’m most comfortable with. (The design is currently AI generated, I’ll design something polished later.) I’m also continuing to refactor and clean up the mod’s codebase."}, {"post_id": 39981, "ts": "2026-08-03T10:17:23Z", "hours": 10.0, "text": "code clean up + debug lately i focused mostly on fixing bugs in the code that came from the deobfuscation and cleaning up duplicated functions/not needed anymore. I also started renaming functions that were like Ab and Ad to the actual use of it, however many functions are still incompressible on what they do and it’s taking me a lot to do it. As promised before i will now start building the launcher to finally make it playable again."}, {"post_id": 35793, "ts": "2026-07-27T13:36:56Z", "hours": 9.9894, "text": "Singleplayer Singleplayer is running great. No crashes, no blockers, nothing hanging on startup. Everything works as intended: Food and Drinks are usable, Weapons shoot, reload and work fully, Bombs the same, Cars are Driveable, Glider works, Clothes protect and are wearable Protocol coverage Piece by piece i’ve been reconstructing every message type the client sends and expects back matching the exact wire format so nothing breaks on either end. At this point the server correctly handles: Player profile fetching and viewing Kill counts, death counts, and zombie kill counts all tracked and saved per player Supporter status checks Crash report submissions, saved server-side Live player count, reported back to the client accurately A few message types are still open (server list population, some global stats, in-game notifications), but the core loop, the stuff a player actually touches every session is in and working. The top-right info panel is live The panel in the top-right corner of the client is now pulling its data straight from the network, live, with no issues. That data isn’t hardcoded or cached it’s a real pulled from the server like it’s supposed to. Getting that thing stable was one of the trickier parts of this whole stretch given how many layers of networking had to line up first but it’s paying off now. What this adds up to Individually none of these matter much, Together they mean the actual hard part (the plumbing nobody sees) is done and holding up. Singleplayer works, the network path from client to server works, the core gameplay data (kills, deaths, profiles, supporter status) is being tracked correctly. The next stretch of work is the hardest, filling in the remaining protocol gaps (server list, global stats, notifications) and starting to build the launcher Thanks for sticking with this rebuild. Hop into the Discord if you want to follow updates discord.gg/decimation"}, {"post_id": 34879, "ts": "2026-07-25T23:03:57Z", "hours": 7.4592, "text": "Hello everyone new updates!! The original mod talked to a server over raw TCP/UDP sockets (using a Java networking library called KryoNet) for things like player stats, the server list screen, and update checks. That backend was never open source and doesn’t exist anymore, so I’ve been writing a brand new one that speaks the exact same “language” the client expects matching its wire protocol message by message so the old client just works against new server code without needing to be rewritten itself. So far that new server handles: Player profiles (kills/deaths/stats) The in game server list Live player count More message types (server-side crash reports, supporter status, the update system) are getting added one at a time as I work through them. Networking infrastructure. Got a relay set up so the client’s existing hardcoded connection info actually reaches the new server, DNS pointed at the right place, and both sides talking over the same ports without falling over which involved learning more about TCP vs UDP port binding and firewall/security groups than I expected to going in. Fixed a pile of dead links. A handful of things the mod calls out to at runtime (update checks, a resource pack, some JSON it fetches for the main menu) pointed at old GitHub links that don’t exist anymore. Tracked those down one at a time and replaced them with working equivalents, including chasing down a sneaky “blocked because of the default Java user-agent” issue that looked like a permissions bug at first."}, {"post_id": 28052, "ts": "2026-07-14T02:18:51Z", "hours": 1.2119, "text": "Hey everyone, It’s been a while but Decimation is alive again. I want to give you a real update on where things stand, because a lot has happened behind the scenes and I don’t want that work to go unnoticed. (and i have no clue why it logged only 46m over the +100 hours of work done but whatever.) Where this started Like some of you may know, development on Decimation stalled a long time ago and the original source code was never made public. For a long time that meant the mod was effectively frozen, no fixes, no updates, no working mod. Over the past weeks I’ve been working on reviving the project from the ground up: rebuilding a working development environment, restoring the codebase to a buildable state, and getting the whole thing running on modern tooling instead of the outdated setup it originally shipped with. This has been a genuinely massive undertaking. We’re talking about thousands of individual issues that needed to be worked through one by one, some tiny, some structural, across a codebase that spans dozens of systems. It has not been a quick job, and there were several points where the smart move was to stop, rethink the approach, and redo work rather than push forward on a shaky foundation. What’s been accomplished so far Full build pipeline rebuilt. The mod now compiles against a modern, actively maintained toolchain instead of infrastructure that had quietly rotted away over the years (dead package repositories, unsupported build tools, etc). The codebase itself has been restored to a compilable state. This included resolving a huge number of structural issues throughout the mod’s systems, core mechanics, networking, rendering, player data, UI, and more. First successful in-game boot. After all of the above, I’ve gotten Decimation to actually launch in a Minecraft client again for the first time. Cross-machine reliability. Ironing out environment specific quirks so the project builds consistently regardless of which machine it’s compiled on. What’s next The immediate focus now is functional testing, going system by system to confirm everything behaves the way it’s supposed to, catching runtime issues that don’t show up until you actually play the mod, and gradually cleaning up the codebase so future changes are easier to make than this initial recovery was. I’m not going to promise a release date, because anyone who’s done a project like this knows those promises tend to age badly. What I can promise is that this isn’t a “one big push and abandon it again” situation, the goal is to get Decimation back to a state where it can actually be maintained and built upon going forward."}]...
|
Title: INDEMNITY by @ilfattorino | Stardance
Devl Title: INDEMNITY by @ilfattorino | Stardance
Devlogs:
Hey everyone, It’s been a while but Decimation is alive again. I want to give you a real update on where things stand, because a lot has happened behind the scenes and I don’t want that work to go unnoticed. (and i have no clue why it logged only 46m over the +100 hours of work done but whatever.) Where this started Like some of you may know, development on Decimation stalled a long time ago and the original source code was never made public. For a long time that meant the mod was effectively frozen, no fixes, no updates, no working mod. Over the past weeks I’ve been working on reviving the project from the ground up: rebuilding a working development environment, restoring the codebase to a buildable state, and getting the whole thing running on modern tooling instead of the outdated setup it originally shipped with. This has been a genuinely massive undertaking. We’re talking about thousands of individual issues that needed to be worked through one by one, some tiny, some structural, across a codebase that spans dozens of systems. It has not been a quick job, and there were several points where the smart move was to stop, rethink the approach, and redo work rather than push forward on a shaky foundation. What’s been accomplished so far Full build pipeline rebuilt. The mod now compiles against a modern, actively maintained toolchain instead of infrastructure that had quietly rotted away over the years (dead package repositories, unsupported build tools, etc). The codebase itself has been restored to a compilable state. This included resolving a huge number of structural issues throughout the mod’s systems, core mechanics, networking, rendering, player data, UI, and more. First successful in-game boot. After all of the above, I’ve gotten Decimation to actually launch in a Minecraft client again for the first time. Cross-machine reliability. Ironing out environment specific quirks so the project builds consistently regardless of which machine it’s compiled on. What’s next The immediate focus now is functional testing, going system by system to confirm everything behaves the way it’s supposed to, catching runtime issues that don’t show up until you actually play the mod, and gradually cleaning up the codebase so future changes are easier to make than this initial recovery was. I’m not going to promise a release date, because anyone who’s done a project like this knows those promises tend to age badly. What I can promise is that this isn’t a “one big push and abandon it again” situation, the goal is to get Decimation back to a state where it can actually be maintained and built upon going forward.
Hello everyone new updates!! The original mod talked to a server over raw TCP/UDP sockets (using a Java networking library called KryoNet) for things like player stats, the server list screen, and update checks. That backend was never open source and doesn’t exist anymore, so I’ve been writing a brand new one that speaks the exact same “language” the client expects matching its wire protocol message by message so the old client just works against new server code without needing to be rewritten itself. So far that new server handles: Player profiles (kills/deaths/stats) The in game server list Live player count More message types (server-side crash reports, supporter status, the update system) are getting added one at a time as I work through them. Networking infrastructure. Got a relay set up so the client’s existing hardcoded connection info actually reaches the new server, DNS pointed at the right place, and both sides talking over the same ports without falling over which involved learning more about TCP vs UDP port binding and firewall/security groups than I expected to going in. Fixed a pile of dead links. A handful of things the mod calls out to at runtime (update checks, a resource pack, some JSON it fetches for the main menu) pointed at old GitHub links that don’t exist anymore. Tracked those down one at a time and replaced them with working equivalents, including chasing down a sneaky “blocked because of the default Java user-agent” issue that looked like a permissions bug at first.
Singleplayer Singleplayer is running great. No crashes, no blockers, nothing hanging on startup. Everything works as intended: Food and Drinks are usable, Weapons shoot, reload and work fully, Bombs the same, Cars are Driveable, Glider works, Clothes protect and are wearable Protocol coverage Piece by piece i’ve been reconstructing every message type the client sends and expects back matching the exact wire format so nothing breaks on either end. At this point the server correctly handles: Player profile fetching and viewing Kill counts, death counts, and zombie kill counts all tracked and saved per player Supporter status checks Crash report submissions, saved server-side Live player count, reported back to the client accurately A few message types are still open (server list population, some global stats, in-game notifications), but the core loop, the stuff a player actually touches every session is in and working. The top-right info panel is live The panel in the top-right corner of the client is now pulling its data straight from the network, live, with no issues. That data isn’t hardcoded or cached it’s a real pulled from the server like it’s supposed to. Getting that thing stable was one of the trickier parts of this whole stretch given how many layers of networking had to line up first but it’s paying off now. What this adds up to Individually none of these matter much, Together they mean the actual hard part (the plumbing nobody sees) is done and holding up. Singleplayer works, the network path from client to server works, the core gameplay data (kills, deaths, profiles, supporter status) is being tracked correctly. The next stretch of work is the hardest, filling in the remaining protocol gaps (server list, global stats, notifications) and starting to build the launcher Thanks for sticking with this rebuild. Hop into the Discord if you want to follow updates discord.gg/decimation
code clean up + debug lately i focused mostly on fixing bugs in the code that came from the deobfuscation and cleaning up duplicated functions/not needed anymore. I also started renaming functions that were like Ab and Ad to the actual use of it, however many functions are still incompressible on what they do and it’s taking me a lot to do it. As promised before i will now start building the launcher to finally make it playable again.
the launcher I’ve started building the open source launcher in C++. I chose C++ for its flexibility across multiple platforms and because it’s the language I’m most comfortable with. (The design is currently AI generated, I’ll design something polished later.) I’m also continuing to refactor and clean up the mod’s codebase.
First peek at the launcher This is the first look at the Launcher. I’m building this launcher in C++ with Qt. I chose this combination because it streamlines development and delivers superior graphics. The fields are currently empty, I’m using placeholders rather than mock data so once i connect the backend server all fields will populate automatically. Join our community on Discord: discord.gg/decimation Thanks for your interest!
Restyle of the launcher + future of the mod I have restyled the Launcher to be prettier and more useful. The last release was only the first test interface to verify that it worked. Now it’s looking way better and far more usable. I’ve also been thinking about not just remaking this mod and then leaving it to die again. I intend to continue it, but I have no intention to profit from it. Because of this, I’m planning to create the iida Foundation through the HCB portal of Hack Club. The foundation will aim to create STEM projects to increase teenagers’ knowledge, specially through games that are actually interesting to play and provide real world skills, not just in game benefits. These skills include technology, energy, handcraft, and farming.
made settings, servers and news pages + continued to edit the mod Hi everyone, in these days i’ve continued to build the launcher by making all these pages, they work well except for settings that a few things have still to be made.
registered nonprofit + added google login and discord rich presence in the last days i successfully registered the nonprofit that owns the game. It took some time but it’s now registered. I succesfully added the google and microsoft login that will allow users to access only using those ways. It increases security and makes everything easier. I integrated also Discord Rich Presence do display on users running the game and launcher the status.
made the site for the foundation + continued making the launcher For this devlog i made the public facing website for the foundation. It has been kinda hard to do right but finally it’s kinda good looking. I also continued to make the launcher and fix things that didn’t worked.
I kept modifying the site + deobfuscating the mod and editing the launcher 1 ) I kept editing the site for the foundation that is still not looking professional enough and serious (I believe at least). Please share your opinion, what’s missing and what should I change: https://iidastemfoundation.org 2 ) I kept working on deobfuscating the mod (in fact all the hours counted for this devlog came from doing it) that is extremely hard to do and I don’t have any more tokens to use for this month so I guess I just have to keep working manually (feeling like in a coal mine rn). 3 ) I kept also working a bit on the launcher but nothing much for this update.
encountered e-gangsters, little edit on the launcher and kept modifying the client I had the pleasure to encounter e-ganster and they promised to search for exploits and to “disgust” the playerbase, how tuff.. They also said that the foundation registered with hcb is not real, lol After this little encounter i also kept modifying the launcher and the game. i kept debugging and fixed a little issue that was brought up by a kind person that the play button was bad, really bad, now it’s looking alright.
kept deobfuscating the game + kept modifying the foundation site i gave a new look to the foundation site with a new logo and kept working on the mod and maps
making logos + kept working on the mod I’ve been working on the logos of the foundation and the game that i didn’t like the old ones, and also I’m thinking about changing the name of this mod because it doesn’t make sense with all the hate received to keep working on this and as soon as it gets available to get ddosed and harassed. I’ve also been working like usual on the mod fixing bugs and more.
kept working on the mod in these days i just kept working on the mod, cleaning up code and rewriting functions, nothing much but time intensive. Also i fixed the mobs that didn’t worked before, now they are functional.
Worked on the server part of the mod I worked on making the server part of the mod work, now the servers work perfectly fine and I’m working on optimizing the code to make it run even smoother
Created Mail Server, Client, and SMTP Server For this devlog, I built the mail server and client to handle, manage, view, and send emails for the game and foundation. I initially tried running everything locally, but AWS blocked me, they toughtI was using port 25 for malicious activity and refused to unlock it. After that, I attempted to use AWS SES, but it was a nightmare: overly complex, required a ton of verification, and cost more than other options, so I scrapped it.While searching for a better solution, everything else was already working well, though I did spend a lot of time debugging with ChatGPT. Eventually, I found a free SMTP service that provided exactly what I needed. I integrated it with the server, and now everything runs smoothly.
Added offline status + fixed issue with profile For this devlog i added a full screen alert that says when the client is disconnected from the network and prevents the launching of the game. I also fixed an issue where when closing the launcher, disconnecting from the network and then reopening the launcher it would display a dummy profile in place of the logged in one I also spent a lot of time like all the other devlogs debugging the mod code and functions
Optimized email client + mod debugging For this devlog i optimized the email client to make it work as intedend, there were some issues with the html formatting of emails and many many issues with creating the email client like the passkeys not actually allowing to access the account and similiar things but now it works as intended and i don’t think additional modifications are required. From now on i will only work on the mod and i’m going to rebrand it to something else different, i don’t like the community that is left of this mod, it’s too much toxic and i don’t want to have to handle all of that childish behavior
worked on the mod a lot & other For this devlog, I spent many hours on the mod, resolving issues that caused occasional lag or crashes. A decompiled block of code had turned into gibberish yet still compiled; once isolated, it revealed the entire file was failing because of that section. I also corrected a minor problem in the email client from the previous dev logs where login worked only with a passkey and not with the password, and it is now resolved.
kept working on cleaning up code for this devlog i kept working on and cleaning up the code, there isn’t much left and i think that in 3-4 devlogs the code for the mod should be completly readable and ready to be shipped, wth it there will be also the open source launcher and other things like the network
changed the name + kept working i choose to officially change the name into another one the ti will share in the next devlog, i bought the new domain, set up the server, configured the domain with cloud flare and now it works perfectly. i need to still finish building the site but it works very well. Go now it just says test because i only put an h1 with that word but i will replace it soon with the site. After all this i kept also working on the mod continuing renaming functions and cleaning up the code
new name + logo i choose to change the name of the game to “Indemnity” i believe that it suits the game really well and im working rn on remaking the site. these are the new logos and graphics i also kept working on the mod like usual, it takes ages. !!please tell me what you think about these logos and how they could be better!!
renamed game + launcher for this update i renamed the game and all the functions with the new chosen name, i also added where needed the logo in place of the old “decimation” red text and it looks really good now. i also made the window a fixed size so it looks always good. added also the logo for the app that was previous the default empty logo....
|
1792903745.9839506
|
1793767745.9839506
|
|
19730
|
chat by @shash | Stardance
|
shash
|
0
|
249.0
|
0
|
[]
|
[{"post_id": 21107, "ts": "202 [{"post_id": 21107, "ts": "2026-07-02T21:59:19Z", "hours": 4.0, "text": "devlog"}, {"post_id": 20800, "ts": "2026-07-02T14:34:02Z", "hours": 10.0, "text": "another devlog"}, {"post_id": 20448, "ts": "2026-07-02T01:24:29Z", "hours": 2.0, "text": "anoher devlog"}, {"post_id": 19999, "ts": "2026-07-01T14:05:01Z", "hours": 33.0, "text": "dev log"}, {"post_id": 18738, "ts": "2026-06-29T22:30:05Z", "hours": 136.0, "text": "longass devlog"}, {"post_id": 12096, "ts": "2026-06-19T18:58:36Z", "hours": 4.0, "text": "devlog"}, {"post_id": 11962, "ts": "2026-06-19T14:58:39Z", "hours": 19.0, "text": "devlog"}, {"post_id": 11052, "ts": "2026-06-18T02:39:41Z", "hours": 8.0, "text": "."}, {"post_id": 10598, "ts": "2026-06-17T12:54:14Z", "hours": 6.0, "text": "nextdelog?"}, {"post_id": 10421, "ts": "2026-06-17T03:46:36Z", "hours": 3.0, "text": "more devlogs"}, {"post_id": 10225, "ts": "2026-06-16T21:10:28Z", "hours": 4.0, "text": "devlog 4?"}, {"post_id": 10053, "ts": "2026-06-16T17:01:07Z", "hours": 3.0, "text": "dev log 3"}, {"post_id": 9918, "ts": "2026-06-16T13:00:47Z", "hours": 2.0, "text": "devlog 2"}, {"post_id": 9786, "ts": "2026-06-16T07:03:34Z", "hours": 15.0, "text": "chat"}]...
|
Title: chat by @shash | Stardance
Devlogs:
chat
d Title: chat by @shash | Stardance
Devlogs:
chat
devlog 2
dev log 3
devlog 4?
more devlogs
nextdelog?
.
devlog
devlog
longass devlog
dev log
anoher devlog
another devlog
devlog...
|
1791823064.9270303
|
1792687064.9270303
|
|
43178
|
GamEngine by @bartoszkasyna | Stardance
|
bartoszkasyna
|
1
|
244.34
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:49:21Z", "hours": 195.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made GPU driven game engine. It use vulkan 1.4. GTAO and VSM are still little bugged. Project will be still in development. This experimental version. More deatils are in devlogs. If engine or demo crashes on your device please send me generated logs and device specification", "repo": "https://github.com/B4rtekk1/GamEngine", "demo": "https://github.com/B4rtekk1/GamEngine/releases/tag/v0.1.0"}]...
|
[{"post_id": 79106, "ts": "202 [{"post_id": 79106, "ts": "2026-10-12T18:07:52Z", "hours": 10.8381, "text": "I was working on bug fixes and glass system. Glass is not working was I want but it havs some progress. Currently glass is highly unoptimized."}, {"post_id": 78281, "ts": "2026-10-10T08:29:57Z", "hours": 4.4117, "text": "I made custom installer for my engine. Now i willl work on optimatization"}, {"post_id": 74967, "ts": "2026-09-28T18:36:35Z", "hours": 9.7639, "text": "I mainly working on bug fixing. Now VSM and GTAO are fully stable, TAA still needs some love. I was also working on fbx model importer. On the image you can see Amazon Lumberyard Bistro which has 2.7M triangles with 140FPS. I have to work on fps stability while moving camera and make glass shader/object."}, {"post_id": 74396, "ts": "2026-09-27T09:59:55Z", "hours": 9.5208, "text": "I was trying to made my version of DDGI but it was unstable, so I made this disabled. Full DDGI would be impossible for my gpu so I used Brixelizer GI from FidelityFX SDK from AMD. It looks good and stable. Image is capyured on intel sponza which has 2.7M traingles - 13x more than original sponza so my engine scale well."}, {"post_id": 73521, "ts": "2026-09-25T09:34:28Z", "hours": 9.7292, "text": "I was working on Ray Traced Contact Shadows and DDGI. Ray traced shadows works well without droping fps that much. Currently my DDGI is bugged - its very dark. The image is taken with RTCS, DGGI disabled"}, {"post_id": 72555, "ts": "2026-09-23T06:37:29Z", "hours": 5.0792, "text": "Successfully optimized GTAO and VSM, 40FPS gain and more stable 1% low"}, {"post_id": 71260, "ts": "2026-09-20T15:17:19Z", "hours": 7.5197, "text": "I was working on game optimization, editor functionalities and standalone game building. I successfully optimized GTAO and VSM a little. GTAO still have some halo around some objects and VSM are not full stable. I added option build game in editor. I have to optimize editor a little and add some more functionalities. On the first image you can see nvidia nsight graphics profiler and on the second one standalone game build running in 160 after few seconds. This is decent score for rtx 3050."}, {"post_id": 70490, "ts": "2026-09-19T08:46:32Z", "hours": 7.4986, "text": "I was trying to fix shadows but it didint go well, so I gave up and started refactoring code for better readibiliy. On the image you can see broken verin of shadows, dont worry I went back to working ones. I fixed few smaller nearly invisible shadows bugs, so I didint waste myy time. Now I will focus on optimatization and graphics effet"}, {"post_id": 69704, "ts": "2026-09-17T16:43:10Z", "hours": 8.0603, "text": "I started migration to dynamic rendering, so rendering pipeline would be much easier for user. I also made custom title bar. Im in process of improving UI. I found two bugs - in certains camera angle shadows/AO or something doesnt work correctly. Second - some random patterns may occur while looking into sky inside sponza"}, {"post_id": 69075, "ts": "2026-09-16T10:23:21Z", "hours": 5.7283, "text": "I made water system but it look horrible and performance isnt great, so i focused next on large models importing. Big models are now devided into meshlets. On the image you can see very popular benchmark scene, its called crytek sponza. I think that 170FPS in this stage is good"}, {"post_id": 68570, "ts": "2026-09-15T10:28:57Z", "hours": 8.1017, "text": "I am working on water system. I decided to make something diffrent that normal water commonly used in every modern engine. I want to make virtual water system which is inspired by VSM. More technical details I will provide in devlog when I finish my water system. I dont have any working water image so I just upload some engine footage. PS. It might be much more optimize than normal water."}, {"post_id": 67943, "ts": "2026-09-14T08:27:35Z", "hours": 6.5411, "text": "I was working on water system and improving GTAO. While testing I found weird little horizontal strips on shadows. I thought it was my WSM bug so I was trying to fix it. After I checked all possible bugs i realized that I could downgrade GTAO by linear interpolation. I fixed it and now works fine. Water currently has implemented SSR and simple Gernster waves. On the images you can see clip levels and virutal pages shown in shadow debug mode"}, {"post_id": 67159, "ts": "2026-09-13T07:20:53Z", "hours": 7.1444, "text": "I was working on editor optimatization and bug fixes. Editor launch time jumped from ~7seconds to 1.5 seconds if editor has cache, otherwise 4.3 seconds. Launching editor no more cause vulkan errors. I also added IBL and reflects. I also bugged shadows a little."}, {"post_id": 66406, "ts": "2026-09-12T06:58:22Z", "hours": 6.8744, "text": "I was working on finishing render graph. I also optimized editor - in huge scenes it will have more stable 60FPS. I optimized game mode - 1% low are higher now"}, {"post_id": 65853, "ts": "2026-09-11T08:49:16Z", "hours": 8.0272, "text": "I was mainly working on models and textures compression. Textures are now compressed into BC7 format. I also added remdergraph so user dont have to make it manually."}, {"post_id": 65239, "ts": "2026-09-10T07:13:42Z", "hours": 7.9544, "text": "Today I was working on game optimatization and little shadows improvements. I was mainly working on game profiler as you can see in the image"}, {"post_id": 64328, "ts": "2026-09-08T16:49:40Z", "hours": 9.6778, "text": "Last 2 days I was working on editor functionalities. I added built-in powersheell terminal. I also added shadergraph which currently is doesnt want to compile properly"}, {"post_id": 63480, "ts": "2026-09-07T11:14:38Z", "hours": 6.3356, "text": "I was working on UX in editor. Then I found bug which I couldnt fix for 3 hours. Bug was caused my matrix decompose floating point"}, {"post_id": 62420, "ts": "2026-09-05T19:23:52Z", "hours": 5.1811, "text": "Today I was working on optimatization, code quality and better model imports. fps jumped from ~400 to ~430."}, {"post_id": 61744, "ts": "2026-09-04T20:02:01Z", "hours": 8.3261, "text": "I was working on game optimzatization. I made jump from around 200FPS to 400. There is still a lot more things to optimize."}, {"post_id": 59136, "ts": "2026-08-31T19:21:14Z", "hours": 5.6275, "text": "I was working on optimizing grass system. I added wind component and optimized colission with other objects. Thanks to optimatization FPS jumped from ~250 to ~320. I also modified scene saving system - binary file as main file and .terrains failes as terrain data. I added Editor layout to AppData so editor rembeber your last layout"}, {"post_id": 58356, "ts": "2026-08-30T19:03:02Z", "hours": 6.1303, "text": "Today i was adding missing tests. I also updated terrain sculping system - you can now sculp all terrain at once if multiple instances. I added some utils and deleted fps limit in play mode."}, {"post_id": 57564, "ts": "2026-08-29T19:02:32Z", "hours": 4.8972, "text": "Today I was working on better shadow implemenatation. I implemented VSM shadows - smiliar are used in UE5. I think its looks good"}, {"post_id": 56852, "ts": "2026-08-28T20:10:13Z", "hours": 5.6839, "text": "Today I was working on code quality and better terrain sculping tools. I added grass painting. I also added some nice shader to grass - A rolling ball leaves a trail in the grass. Check it out!"}, {"post_id": 56432, "ts": "2026-08-28T06:18:19Z", "hours": 5.745, "text": "I was working on terrain sculping. I was inspired by unity system generator so I wanted to make something smiliar. Now there is only one brush but i will extend possibilities of my system."}, {"post_id": 55427, "ts": "2026-08-27T07:58:03Z", "hours": 4.6125, "text": "Added gltf models importing with editor asset manager. Imported gameobject has his unique mesh collider."}, {"post_id": 54988, "ts": "2026-08-26T12:44:55Z", "hours": 2.9125, "text": "I was fixing my physics system. I fixed some bugs and created new ones. First new bug is sphere bouning up on first contact. 2 bug is cube lifting up another cube. I’m happy that I removed object shaking"}, {"post_id": 54700, "ts": "2026-08-25T19:29:26Z", "hours": 6.6933, "text": "Today I was mainly working on code quality and project refactorization. When I was testing scenes with various of configuration I found some type of physics bug - Objects are shaking for some reason, you can see this in attached video"}, {"post_id": 53759, "ts": "2026-08-24T13:13:25Z", "hours": 1.2175, "text": "last 1.25h I was adding cube physics, imo it look very satisfying."}, {"post_id": 53644, "ts": "2026-08-24T09:33:54Z", "hours": 4.9856, "text": "I was working on realistic sphere physics. I think it looks good enough. I was also working on tests. Fixed bug when ramp after start/stop was changing her location."}, {"post_id": 52942, "ts": "2026-08-23T09:58:18Z", "hours": 3.4753, "text": "I added simple gravity and colliders. I also reorganized code a little - I make high level API so user dont have to use Vulkan and SDL directly."}, {"post_id": 52275, "ts": "2026-08-22T11:51:51Z", "hours": 3.0019, "text": "Added Color picker, and updated window reloading while adding MSAA or new color. Now you can easily change color in editor"}, {"post_id": 51666, "ts": "2026-08-21T13:55:21Z", "hours": 2.4742, "text": "I made object scriptable!"}, {"post_id": 50944, "ts": "2026-08-20T12:37:57Z", "hours": 4.6658, "text": "I messed something up and m editor wasnt responding I couldt click anything. I was trying to fix it almost 5 hours. What I fixed? - vulkan and SDL were recreating while turning MSAA on and GPU was loosing context"}, {"post_id": 49752, "ts": "2026-08-18T17:53:31Z", "hours": 3.2764, "text": "Editor Update The editor has been significantly improved and now looks much better. Cross-Platform Support The editor no longer depends on the Windows API, which means it should work on both Windows and Linux . Technology Stack The original goal was to use only: C++ Vulkan SDK SDL3 GLM These are all standard components that come with a typical Vulkan development setup. After further research, Dear ImGui was also added. It is currently the only third-party dependency . Performance Both the Scene View and Game View are capped at 60 FPS . The Scene View captures the 90th frame of the particle effect so that it remains static. Next Steps Focus will now shift to expanding the editor’s functionality."}, {"post_id": 49441, "ts": "2026-08-18T09:01:45Z", "hours": 1.725, "text": "I made basic editor. Now looks like terrible but I will make it better"}, {"post_id": 49021, "ts": "2026-08-17T16:44:03Z", "hours": 1.5692, "text": "Added movement, you can move by using wasd, scroll and RMB"}, {"post_id": 48153, "ts": "2026-08-16T13:31:10Z", "hours": 4.0589, "text": "Particle System I was trying to add .glb models importer but this is very hard to do without third parties dependencies and i messed up something - Tree looks flat(second attachment). After many failed attempts I decided to start making particle system, as you can see it looks good. It is also optimized. FPS drop which you can see on video is caused by cmake compilation in background. I hope you like my particles :) All of this is made in C++ and the Vulkan SDK."}, {"post_id": 47579, "ts": "2026-08-15T15:41:56Z", "hours": 2.8206, "text": "Progress Update – Last 3 Hours Focused on two main things: Engine Optimization Font Rasterizer – added support for rendering fonts in the HUD Optimizations: Integrated VMA (Vulkan Memory Allocator) Added object instancing Fixed a buffer bug that was causing a memory leak Image: Cube made of 30×30×30 (27 000) smaller cubes + HUD with rendered font. All of this is made in C++ and the Vulkan SDK."}, {"post_id": 47338, "ts": "2026-08-15T06:56:33Z", "hours": 5.75, "text": "Engine Updates Added GPU-driven Hi-Z culling Added canvas — you can now make HUDs Optimized scenes a little Added Scene Serializer Added Asset Manager Added Color class — you no longer have to work with plain vectors Showcase On the image you can see a cube made from 30×30×30 smaller cubes, each one casting a shadow. In the bottom-left corner you can see the canvas. All of this is made in C++ and the Vulkan SDK ."}, {"post_id": 46339, "ts": "2026-08-13T14:18:08Z", "hours": 4.5861, "text": "Added Engine Math based on glm. Optimized multi object drawing. Made better project structure"}, {"post_id": 45817, "ts": "2026-08-12T15:21:12Z", "hours": 2.5969, "text": "Added shadows, game objects, engine vectors and matrixs, standaole camera, position and transforms"}, {"post_id": 40303, "ts": "2026-08-03T18:52:30Z", "hours": 3.1914, "text": "I have reorganized code. I added MSAA and rotaing cube!"}, {"post_id": 39619, "ts": "2026-08-02T18:45:09Z", "hours": 0.8017, "text": "I finished my previus project so now i can have two concurrent - this and c++/cuda custom llm. Successfully rendered triangle :) Its only about ~1000 lines of code. I used offical tutorial for start."}]...
|
Title: GamEngine by @bartoszkasyna | Stardance
De Title: GamEngine by @bartoszkasyna | Stardance
Devlogs:
I finished my previus project so now i can have two concurrent - this and c++/cuda custom llm. Successfully rendered triangle :) Its only about ~1000 lines of code. I used offical tutorial for start.
I have reorganized code. I added MSAA and rotaing cube!
Added shadows, game objects, engine vectors and matrixs, standaole camera, position and transforms
Added Engine Math based on glm. Optimized multi object drawing. Made better project structure
Engine Updates Added GPU-driven Hi-Z culling Added canvas — you can now make HUDs Optimized scenes a little Added Scene Serializer Added Asset Manager Added Color class — you no longer have to work with plain vectors Showcase On the image you can see a cube made from 30×30×30 smaller cubes, each one casting a shadow. In the bottom-left corner you can see the canvas. All of this is made in C++ and the Vulkan SDK .
Progress Update – Last 3 Hours Focused on two main things: Engine Optimization Font Rasterizer – added support for rendering fonts in the HUD Optimizations: Integrated VMA (Vulkan Memory Allocator) Added object instancing Fixed a buffer bug that was causing a memory leak Image: Cube made of 30×30×30 (27 000) smaller cubes + HUD with rendered font. All of this is made in C++ and the Vulkan SDK.
Particle System I was trying to add .glb models importer but this is very hard to do without third parties dependencies and i messed up something - Tree looks flat(second attachment). After many failed attempts I decided to start making particle system, as you can see it looks good. It is also optimized. FPS drop which you can see on video is caused by cmake compilation in background. I hope you like my particles :) All of this is made in C++ and the Vulkan SDK.
Added movement, you can move by using wasd, scroll and RMB
I made basic editor. Now looks like terrible but I will make it better
Editor Update The editor has been significantly improved and now looks much better. Cross-Platform Support The editor no longer depends on the Windows API, which means it should work on both Windows and Linux . Technology Stack The original goal was to use only: C++ Vulkan SDK SDL3 GLM These are all standard components that come with a typical Vulkan development setup. After further research, Dear ImGui was also added. It is currently the only third-party dependency . Performance Both the Scene View and Game View are capped at 60 FPS . The Scene View captures the 90th frame of the particle effect so that it remains static. Next Steps Focus will now shift to expanding the editor’s functionality.
I messed something up and m editor wasnt responding I couldt click anything. I was trying to fix it almost 5 hours. What I fixed? - vulkan and SDL were recreating while turning MSAA on and GPU was loosing context
I made object scriptable!
Added Color picker, and updated window reloading while adding MSAA or new color. Now you can easily change color in editor
I added simple gravity and colliders. I also reorganized code a little - I make high level API so user dont have to use Vulkan and SDL directly.
I was working on realistic sphere physics. I think it looks good enough. I was also working on tests. Fixed bug when ramp after start/stop was changing her location.
last 1.25h I was adding cube physics, imo it look very satisfying.
Today I was mainly working on code quality and project refactorization. When I was testing scenes with various of configuration I found some type of physics bug - Objects are shaking for some reason, you can see this in attached video
I was fixing my physics system. I fixed some bugs and created new ones. First new bug is sphere bouning up on first contact. 2 bug is cube lifting up another cube. I’m happy that I removed object shaking
Added gltf models importing with editor asset manager. Imported gameobject has his unique mesh collider.
I was working on terrain sculping. I was inspired by unity system generator so I wanted to make something smiliar. Now there is only one brush but i will extend possibilities of my system.
Today I was working on code quality and better terrain sculping tools. I added grass painting. I also added some nice shader to grass - A rolling ball leaves a trail in the grass. Check it out!
Today I was working on better shadow implemenatation. I implemented VSM shadows - smiliar are used in UE5. I think its looks good
Today i was adding missing tests. I also updated terrain sculping system - you can now sculp all terrain at once if multiple instances. I added some utils and deleted fps limit in play mode.
I was working on optimizing grass system. I added wind component and optimized colission with other objects. Thanks to optimatization FPS jumped from ~250 to ~320. I also modified scene saving system - binary file as main file and .terrains failes as terrain data. I added Editor layout to AppData so editor rembeber your last layout
I was working on game optimzatization. I made jump from around 200FPS to 400. There is still a lot more things to optimize.
Today I was working on optimatization, code quality and better model imports. fps jumped from ~400 to ~430.
I was working on UX in editor. Then I found bug which I couldnt fix for 3 hours. Bug was caused my matrix decompose floating point
Last 2 days I was working on editor functionalities. I added built-in powersheell terminal. I also added shadergraph which currently is doesnt want to compile properly
Today I was working on game optimatization and little shadows improvements. I was mainly working on game profiler as you can see in the image
I was mainly working on models and textures compression. Textures are now compressed into BC7 format. I also added remdergraph so user dont have to make it manually.
I was working on finishing render graph. I also optimized editor - in huge scenes it will have more stable 60FPS. I optimized game mode - 1% low are higher now
I was working on editor optimatization and bug fixes. Editor launch time jumped from ~7seconds to 1.5 seconds if editor has cache, otherwise 4.3 seconds. Launching editor no more cause vulkan errors. I also added IBL and reflects. I also bugged shadows a little.
I was working on water system and improving GTAO. While testing I found weird little horizontal strips on shadows. I thought it was my WSM bug so I was trying to fix it. After I checked all possible bugs i realized that I could downgrade GTAO by linear interpolation. I fixed it and now works fine. Water currently has implemented SSR and simple Gernster waves. On the images you can see clip levels and virutal pages shown in shadow debug mode
I am working on water system. I decided to make something diffrent that normal water commonly used in every modern engine. I want to make virtual water system which is inspired by VSM. More technical details I will provide in devlog when I finish my water system. I dont have any working water image so I just upload some engine footage. PS. It might be much more optimize than normal water.
I made water system but it look horrible and performance isnt great, so i focused next on large models importing. Big models are now devided into meshlets. On the image you can see very popular benchmark scene, its called crytek sponza. I think that 170FPS in this stage is good
I started migration to dynamic rendering, so rendering pipeline would be much easier for user. I also made custom title bar. Im in process of improving UI. I found two bugs - in certains camera angle shadows/AO or something doesnt work correctly. Second - some random patterns may occur while looking into sky inside sponza
I was trying to fix shadows but it didint go well, so I gave up and started refactoring code for better readibiliy. On the image you can see broken verin of shadows, dont worry I went back to working ones. I fixed few smaller nearly invisible shadows bugs, so I didint waste myy time. Now I will focus on optimatization and graphics effet
I was working on game optimization, editor functionalities and standalone game building. I successfully optimized GTAO and VSM a little. GTAO still have some halo around some objects and VSM are not full stable. I added option build game in editor. I have to optimize editor a little and add some more functionalities. On the first image you can see nvidia nsight graphics profiler and on the second one standalone game build running in 160 after few seconds. This is decent score for rtx 3050.
Successfully optimized GTAO and VSM, 40FPS gain and more stable 1% low
I was working on Ray Traced Contact Shadows and DDGI. Ray traced shadows works well without droping fps that much. Currently my DDGI is bugged - its very dark. The image is taken with RTCS, DGGI disabled
I was trying to made my version of DDGI but it was unstable, so I made this disabled. Full DDGI would be impossible for my gpu so I used Brixelizer GI from FidelityFX SDK from AMD. It looks good and stable. Image is capyured on intel sponza which has 2.7M traingles - 13x more than original sponza so my engine scale well.
I mainly working on bug fixing. Now VSM and GTAO are fully stable, TAA still needs some love. I was also working on fbx model importer. On the image you can see Amazon Lumberyard Bistro which has 2.7M triangles with 140FPS. I have to work on fps stability while moving camera and make glass shader/object.
I made custom installer for my engine. Now i willl work on optimatization
I was working on bug fixes and glass system. Glass is not working was I want but it havs some progress. Currently glass is highly unoptimized.
Ships:
I made GPU driven game engine. It use vulkan 1.4. GTAO and VSM are still little bugged. Project will be still in development. This experimental version. More deatils are in devlogs. If engine or demo crashes on your device please send me generated logs and device specification...
|
1792853413.3946517
|
1792939813.3946517
|
|
21799
|
Kursal by @Kubik | Stardance
|
Kubik
|
1
|
241.28
|
4494
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T19:31:18Z", "hours": 225.0, "multiplier": 17.91, "payout": 4494, "blessing": "neutral", "text": "I built Kursal! A peer-to-peer, decentralized (means no central server!) and end-to-end encrypted messenger. It’s all coded in Rust for the backend and Svelte for the interface. There’s also a website for it showing a bit everything, it’s cool Basically when you open your client, it connects to other clients and creates a “mesh” of clients, communicating through each other. I think a good comparison is a mix of Bitcoin and Tor? Anyway it took me super long to code, and I hope you enjoy!", "repo": "https://github.com/KursalChat/Kursal", "demo": "https://kursal.chat/download"}]...
|
[{"post_id": 79997, "ts": "202 [{"post_id": 79997, "ts": "2026-10-15T20:32:51Z", "hours": 9.2917, "text": "Shipped and received ratings, thank you guys! We reached 25 stars on GitHub Changes: various bug fixes… lol (and dependency bumps) iOS build! and signed mac build! meaning you can know open the app on mac without it saying “broken”! (this was a signing issue yes, the app is not actually broken…) got Kursal working for ARCH !! finally, arch users can now open the app :) Still trying to get published on the app store and google play…. damn I did not think it would take that long"}, {"post_id": 73960, "ts": "2026-09-26T12:21:34Z", "hours": 6.9917, "text": "that gotta be the last devlog 😅 Basically i just “routine maintenance” the repo ¯ \\ (ツ) /¯ spent time TRYING getting it on the app store or play store… it’s pain 😭 but i’ll get it eventually!"}, {"post_id": 64991, "ts": "2026-09-09T19:21:46Z", "hours": 6.4067, "text": "Hi! I’m done! (i hope lol) i’m still in the process of publishing to the app store and play store… but heh it takes so long i’ll ship before i’m approved there lol Changes: Few possible vulnerability fixes: only allow LAN devices to reach LAN-specific endpoints Show security codes when added locally Strip more image metadata (like GPS infos) on more formats"}, {"post_id": 59064, "ts": "2026-08-31T17:38:46Z", "hours": 12.395, "text": "for real last devlog lol, mostly “ci” changes, nothing much Changes: improved code blocks! it has colors :) (thanks highlight.js) thanks Tiazzz for translating into Dutch! android + IOS building code updater on mobile opens the mobile store (instead of breaking) I spent a LOT of time on the Google and Apple publishing websites….. it takes time to get an app published…. :/"}, {"post_id": 54519, "ts": "2026-08-25T15:29:28Z", "hours": 11.0444, "text": "okay i think that’s the last devlog before I ship! sorry for that long time devlog but i was in holidays lol Changes: Use autonat on clients to determine if they can act as public relays Complete rework of the onboarding screens Better QR codes :D Bug Fixes: Fixed some potential security issues in the frontend (injections) Rewrite a part of the front-end to group util functions and avoid redundant code AND!! i’m almost done with the camera rewrite! i’m in the process of migrating that to the rust backend but this means native “per-device” code. Almost done! here are the onboarding screens one by one, i cant add more than 4 attachments so you’ll have to try urself to see ;)"}, {"post_id": 51026, "ts": "2026-08-20T14:49:41Z", "hours": 10.2336, "text": "hi! another devlog! i just turned 18 Changes: switched the formatter from prettier to oxfmt (it’s faster!) changed the icon got approved on OpenCollective ! Bug Fixes: avatar transfers now always work even when the other is offline removed some useless code… lol (like migration code) spent lot of time trying to migrate camera to backend but that’s still in the works… soon™"}, {"post_id": 48329, "ts": "2026-08-16T17:17:49Z", "hours": 9.6311, "text": "wow time actually flies! gotta devlog again XD i made cool assets for the app store release Features: you can now delete log files from the app unlimited file transfers (file transfers already existed, but now no size limit!) Bug Fixes stop spamming connections to peers… lol big language loading improvements! now shows the percentage of translation too more avatar work to store it on disk and not in the DB you can now mirror your camera if you want :) defer android permission window thingy for those interested i used a figma template for the phones 3d + a plugin (that was so much pain but it looks great lol)"}, {"post_id": 47315, "ts": "2026-08-15T05:58:52Z", "hours": 10.5314, "text": "more changess!!! and lots of fixes lol oh also i have setup https://status.kursal.chat (but not tracked that time) Performance: improved performance for the database (parallel reading) improved performance (storage & ram) for emojis perf: store avatars in files instead of serialized in the Contact {} struct more performance changes (camera loading, command palette) Bug Fixes: tried keeping less active connections to not blow up the client lol fixed a svelte #each issue… lol"}, {"post_id": 45057, "ts": "2026-08-11T10:00:47Z", "hours": 10.0292, "text": "okay I got some more work in! I’m getting really close to shipping, i’d like to get a demo and a proper app icon first tho Changes better QR code scanning screen! and it works on iOS :D the bluetooth module got improvements! no unwrap left (= cannot panic now) + better transfer speed! compressed all image assets to webp (gained like at least few MB) translated again everything in french lol migrated some localStorage data (file-path association) to the encrypted database"}, {"post_id": 43310, "ts": "2026-08-08T14:38:07Z", "hours": 10.1664, "text": "Lots of work! but no release yet, i’m almost done for beta.6!! :D a major thing i worked on is Github actions release. Now, when I create the draft release, GH actions will build for every platform in parallel and release! Features Contact page complete rework (easier to understand :p), with autocorrect etc Call ringtone (probably temporary, but it’s shipped!) Bug Fixes Smaller offline messages checks Addresses display, general UI improvements Prefer local connections & improved file transfers MacOS .kursal file association"}, {"post_id": 41634, "ts": "2026-08-05T23:40:37Z", "hours": 10.2592, "text": "Released beta.4 and beta.5 with lots of improvements and fixes! I spent uh… some time on trying to make a ring tone (like an hour maybe?) but i cant upload it here :/ but whatever it’s not that good anyway lol Features Updater progress bar (spinner go spinnyyy) Major long-term code improvements: you can now select the number of uses and the time it expires Bug Fixes critical first-contact deadlock fix… (oopsy) Pinned & unread messages improvements More accurate user status and that’s basically it I guess!"}, {"post_id": 40748, "ts": "2026-08-04T14:08:58Z", "hours": 10.1056, "text": "Released beta.3 and currently reworking long-term codes for beta.4! not done yet, but it’s WIP :) Features app now embeds the latest ToS update date, so when you update and last agreed to a previous version it shows a pop up so you can agree again Bug Fixes lots of CI fixes… like really a lot 😅 re-enabled mDNS, kinda forgot to put it back… app displays edge-to-edge on mobile, no weird offset! (normally) grammar fixes in english and french… yeeah!"}, {"post_id": 38297, "ts": "2026-07-31T16:46:21Z", "hours": 9.8047, "text": "Released a beta.2 fixing lots of things and almost done with a beta.3 I think… :D What changed? first, i spent like 4 hours translating everything into french LOL Features Mobile native file sharing (this one is crazy!) Large messages send as file (10k+) In-app log view File caption (sends as msg) Bug Fixes Otp consumption Offline messages edits Contact onboarding mobile self-lock (yeah u couldnt do the onboarding on phone in beta.1 😅) File upload location & UI Less in-app notifications that’s it for this devlog! we’ll see if I ship now or wait a bit more? i really want something to work super well :p"}, {"post_id": 37588, "ts": "2026-07-30T12:50:51Z", "hours": 10.1344, "text": "Okayy! i started publishing clean commits now and working with my github structure. Basically: I code on branches, like feature/some-feature . once it’s done, I squash it to dev. And when I want to release, I just make a branch release/0.1.0 (with the actual version) and change few things there! What changed? DOCKER WORKING! you can now host your relays using it Kursal JS is out too, you can now use the app API! Large messages send as file (10k+) In-app log view File caption (sends as msg) fixes: App focus notifications Contact onboarding mobile self-lock File upload location & UI Less in-app notifications File downloads What next I’m currently working on adding the native “share with” for Kursal to share images and files directly from your OS."}, {"post_id": 36273, "ts": "2026-07-28T08:26:38Z", "hours": 11.1028, "text": "Alright i got the new repo up! What changed? lots of bug fixes (IT OPENS ON ANDROID!) ci improvements got mail sending working from the domain spent lot of time setting the new repo up released the first beta + website update What next? testing… and getting to a stable release :)"}, {"post_id": 34027, "ts": "2026-07-24T13:26:17Z", "hours": 9.9975, "text": "hi! probably last few devlogs before a release?! What changed? more website improvements! added legal pages (boring stuff lol) fixed so many bugs offline messages work now!! and calls too tray icon & background process :) LOTS OF TESTING. and lots of improvements too What next? finish testing and publishing to the repo!"}, {"post_id": 32311, "ts": "2026-07-21T12:19:37Z", "hours": 10.9506, "text": "nothing much changed, again What changed? lots of internal code structure, some logic bugs & stuff Added docker support for hosting a relay! Improved the website and prepared for a beta release (not published yet, will do) More .md docs to explain everything! but more importantly (the only visual changes lol) terminal user interface for the relay! --tui new home for the app! (with stats)"}, {"post_id": 29439, "ts": "2026-07-16T11:58:15Z", "hours": 9.4086, "text": "again, nothing much to see… but lots of internal changes! What changed? complete rust refactor: made macros for frequently used things, organized the code better & stuff like that some quality of life features for the frontend like pasting an image in the chat directly more tutorials explaining kursal (offline messaging, file transfers) What next? i’m preparing everything for a soon-ish release! it’ll be a public beta version and yeah! hope it works"}, {"post_id": 27997, "ts": "2026-07-13T23:28:00Z", "hours": 10.3989, "text": "oops forgot to devlog again… and no new features this time What changed? as i said…. well nothing lots of bug fixes lots of code improvements (refactor stuff…) some UI/UX improvements but like nothing too crazy What next? honestly I cannot tell. I think i’m gonna start to plan the release and finally push to the public repo. gotta get everything ready, more bug fixes and proofread the code I guess! PS: sorry i really got no screenshots to show here so uh… here’s the intro animation when you first open the app!"}, {"post_id": 23055, "ts": "2026-07-05T19:50:56Z", "hours": 9.2908, "text": "I tried getting a feature out…. but nope, only fixed bugs What changed? Added AEC (active echo cancellation) on some platforms: i have to compile FROM these platforms, like cross-compilation straight up does not work… sorry windows Fixed file transfers and improved it’s UI Fixed offline messaging… i hope i had to figure out how to compile audio libs to other platforms… that took me a while…….. thanks opus What next? uhhh good question? more tests maybe? and UI improvements i was thinking about making a background process run, separate from the app that would get messages so you can close the app while that runs… will have to look into it"}, {"post_id": 21137, "ts": "2026-07-02T22:50:54Z", "hours": 4.73, "text": "hi! Started testing Kursal and found…. bugs! so i spent quite some time fixing them… What changed? Connections between peers were unstable: increased timeout + fixed a rate limiter bug Improved the UI with a new “connected nodes” section (see screenshot) Added an option to change the sample rate (defaults to 48 kHz, but you can lower to improve potential lag) and small UI improvements like moving the call bar to the bottom which fits better What next? test. test. test. my goal is to release the app in beta before august and get the first stable version out mid-august… we’ll see!"}, {"post_id": 18715, "ts": "2026-06-29T21:55:38Z", "hours": 11.0786, "text": "yooo 3rd devlog :) sorry i’m not posting very often, i’d like to devlog feature by feature but they really take time… What changed? Fixed vulnerabilities (post-quantum encryption in mailbox system & useless signature removal) Managing nodes in the settings (like viewing and adding connections) A lot of UI improvements a bit everywhere! calls… work in progress! calls is the feature i’ve been working on for a while. I re-used the encryption mechanism of file transfers: make a temporary secret key and then use it. I got SOUND going!! What next? testing offline messaging (my friends were still offline) testing calls (a lot)! improving call UI"}, {"post_id": 16325, "ts": "2026-06-26T15:51:40Z", "hours": 11.6608, "text": "Hello Got a lot of improvements working! Mainly on the front-end but quite a lot on the backend too actually! What changed? Added a CMD+K / CTRL+K search menu (see screenshot): you can search for settings, contacts or even messages! Made the background of the DMG installation on mac Searching messages!! and a few skeletons for when stuff is loading backend fixes… lots of em… like fixed adding a contact What next? still test offline messaging, still didn’t do that somehow"}, {"post_id": 13211, "ts": "2026-06-21T17:18:01Z", "hours": 15.6786, "text": "Hii! First Kursal devlog! This is a project i’ve started during Flavortown but I wasn’t done yet! Sorry kinda didn’t see the time pass lol What changed? Website rebranding! –> https://kursal.chat Spent a lot of time setuping “side-projects” like an uptime manager, translation manager etc Reworked the workflow for building, checking & more Lots of UI/UX changes POSSIBLY working offline messaging… (will test lol) What next? I’m about to test offline messaging, the whole app too actually lol…… hope it all works 🙏"}]...
|
Title: Kursal by @Kubik | Stardance
Devlogs:
Hii! Title: Kursal by @Kubik | Stardance
Devlogs:
Hii! First Kursal devlog! This is a project i’ve started during Flavortown but I wasn’t done yet! Sorry kinda didn’t see the time pass lol What changed? Website rebranding! –> https://kursal.chat Spent a lot of time setuping “side-projects” like an uptime manager, translation manager etc Reworked the workflow for building, checking & more Lots of UI/UX changes POSSIBLY working offline messaging… (will test lol) What next? I’m about to test offline messaging, the whole app too actually lol…… hope it all works 🙏
Hello Got a lot of improvements working! Mainly on the front-end but quite a lot on the backend too actually! What changed? Added a CMD+K / CTRL+K search menu (see screenshot): you can search for settings, contacts or even messages! Made the background of the DMG installation on mac Searching messages!! and a few skeletons for when stuff is loading backend fixes… lots of em… like fixed adding a contact What next? still test offline messaging, still didn’t do that somehow
yooo 3rd devlog :) sorry i’m not posting very often, i’d like to devlog feature by feature but they really take time… What changed? Fixed vulnerabilities (post-quantum encryption in mailbox system & useless signature removal) Managing nodes in the settings (like viewing and adding connections) A lot of UI improvements a bit everywhere! calls… work in progress! calls is the feature i’ve been working on for a while. I re-used the encryption mechanism of file transfers: make a temporary secret key and then use it. I got SOUND going!! What next? testing offline messaging (my friends were still offline) testing calls (a lot)! improving call UI
hi! Started testing Kursal and found…. bugs! so i spent quite some time fixing them… What changed? Connections between peers were unstable: increased timeout + fixed a rate limiter bug Improved the UI with a new “connected nodes” section (see screenshot) Added an option to change the sample rate (defaults to 48 kHz, but you can lower to improve potential lag) and small UI improvements like moving the call bar to the bottom which fits better What next? test. test. test. my goal is to release the app in beta before august and get the first stable version out mid-august… we’ll see!
I tried getting a feature out…. but nope, only fixed bugs What changed? Added AEC (active echo cancellation) on some platforms: i have to compile FROM these platforms, like cross-compilation straight up does not work… sorry windows Fixed file transfers and improved it’s UI Fixed offline messaging… i hope i had to figure out how to compile audio libs to other platforms… that took me a while…….. thanks opus What next? uhhh good question? more tests maybe? and UI improvements i was thinking about making a background process run, separate from the app that would get messages so you can close the app while that runs… will have to look into it
oops forgot to devlog again… and no new features this time What changed? as i said…. well nothing lots of bug fixes lots of code improvements (refactor stuff…) some UI/UX improvements but like nothing too crazy What next? honestly I cannot tell. I think i’m gonna start to plan the release and finally push to the public repo. gotta get everything ready, more bug fixes and proofread the code I guess! PS: sorry i really got no screenshots to show here so uh… here’s the intro animation when you first open the app!
again, nothing much to see… but lots of internal changes! What changed? complete rust refactor: made macros for frequently used things, organized the code better & stuff like that some quality of life features for the frontend like pasting an image in the chat directly more tutorials explaining kursal (offline messaging, file transfers) What next? i’m preparing everything for a soon-ish release! it’ll be a public beta version and yeah! hope it works
nothing much changed, again What changed? lots of internal code structure, some logic bugs & stuff Added docker support for hosting a relay! Improved the website and prepared for a beta release (not published yet, will do) More .md docs to explain everything! but more importantly (the only visual changes lol) terminal user interface for the relay! --tui new home for the app! (with stats)
hi! probably last few devlogs before a release?! What changed? more website improvements! added legal pages (boring stuff lol) fixed so many bugs offline messages work now!! and calls too tray icon & background process :) LOTS OF TESTING. and lots of improvements too What next? finish testing and publishing to the repo!
Alright i got the new repo up! What changed? lots of bug fixes (IT OPENS ON ANDROID!) ci improvements got mail sending working from the domain spent lot of time setting the new repo up released the first beta + website update What next? testing… and getting to a stable release :)
Okayy! i started publishing clean commits now and working with my github structure. Basically: I code on branches, like feature/some-feature . once it’s done, I squash it to dev. And when I want to release, I just make a branch release/0.1.0 (with the actual version) and change few things there! What changed? DOCKER WORKING! you can now host your relays using it Kursal JS is out too, you can now use the app API! Large messages send as file (10k+) In-app log view File caption (sends as msg) fixes: App focus notifications Contact onboarding mobile self-lock File upload location & UI Less in-app notifications File downloads What next I’m currently working on adding the native “share with” for Kursal to share images and files directly from your OS.
Released a beta.2 fixing lots of things and almost done with a beta.3 I think… :D What changed? first, i spent like 4 hours translating everything into french LOL Features Mobile native file sharing (this one is crazy!) Large messages send as file (10k+) In-app log view File caption (sends as msg) Bug Fixes Otp consumption Offline messages edits Contact onboarding mobile self-lock (yeah u couldnt do the onboarding on phone in beta.1 😅) File upload location & UI Less in-app notifications that’s it for this devlog! we’ll see if I ship now or wait a bit more? i really want something to work super well :p
Released beta.3 and currently reworking long-term codes for beta.4! not done yet, but it’s WIP :) Features app now embeds the latest ToS update date, so when you update and last agreed to a previous version it shows a pop up so you can agree again Bug Fixes lots of CI fixes… like really a lot 😅 re-enabled mDNS, kinda forgot to put it back… app displays edge-to-edge on mobile, no weird offset! (normally) grammar fixes in english and french… yeeah!
Released beta.4 and beta.5 with lots of improvements and fixes! I spent uh… some time on trying to make a ring tone (like an hour maybe?) but i cant upload it here :/ but whatever it’s not that good anyway lol Features Updater progress bar (spinner go spinnyyy) Major long-term code improvements: you can now select the number of uses and the time it expires Bug Fixes critical first-contact deadlock fix… (oopsy) Pinned & unread messages improvements More accurate user status and that’s basically it I guess!
Lots of work! but no release yet, i’m almost done for beta.6!! :D a major thing i worked on is Github actions release. Now, when I create the draft release, GH actions will build for every platform in parallel and release! Features Contact page complete rework (easier to understand :p), with autocorrect etc Call ringtone (probably temporary, but it’s shipped!) Bug Fixes Smaller offline messages checks Addresses display, general UI improvements Prefer local connections & improved file transfers MacOS .kursal file association
okay I got some more work in! I’m getting really close to shipping, i’d like to get a demo and a proper app icon first tho Changes better QR code scanning screen! and it works on iOS :D the bluetooth module got improvements! no unwrap left (= cannot panic now) + better transfer speed! compressed all image assets to webp (gained like at least few MB) translated again everything in french lol migrated some localStorage data (file-path association) to the encrypted database
more changess!!! and lots of fixes lol oh also i have setup https://status.kursal.chat (but not tracked that time) Performance: improved performance for the database (parallel reading) improved performance (storage & ram) for emojis perf: store avatars in files instead of serialized in the Contact {} struct more performance changes (camera loading, command palette) Bug Fixes: tried keeping less active connections to not blow up the client lol fixed a svelte #each issue… lol
wow time actually flies! gotta devlog again XD i made cool assets for the app store release Features: you can now delete log files from the app unlimited file transfers (file transfers already existed, but now no size limit!) Bug Fixes stop spamming connections to peers… lol big language loading improvements! now shows the percentage of translation too more avatar work to store it on disk and not in the DB you can now mirror your camera if you want :) defer android permission window thingy for those interested i used a figma template for the phones 3d + a plugin (that was so much pain but it looks great lol)
hi! another devlog! i just turned 18 Changes: switched the formatter from prettier to oxfmt (it’s faster!) changed the icon got approved on OpenCollective ! Bug Fixes: avatar transfers now always work even when the other is offline removed some useless code… lol (like migration code) spent lot of time trying to migrate camera to backend but that’s still in the works… soon™
okay i think that’s the last devlog before I ship! sorry for that long time devlog but i was in holidays lol Changes: Use autonat on clients to determine if they can act as public relays Complete rework of the onboarding screens Better QR codes :D Bug Fixes: Fixed some potential security issues in the frontend (injections) Rewrite a part of the front-end to group util functions and avoid redundant code AND!! i’m almost done with the camera rewrite! i’m in the process of migrating that to the rust backend but this means native “per-device” code. Almost done! here are the onboarding screens one by one, i cant add more than 4 attachments so you’ll have to try urself to see ;)
for real last devlog lol, mostly “ci” changes, nothing much Changes: improved code blocks! it has colors :) (thanks highlight.js) thanks Tiazzz for translating into Dutch! android + IOS building code updater on mobile opens the mobile store (instead of breaking) I spent a LOT of time on the Google and Apple publishing websites….. it takes time to get an app published…. :/
Hi! I’m done! (i hope lol) i’m still in the process of publishing to the app store and play store… but heh it takes so long i’ll ship before i’m approved there lol Changes: Few possible vulnerability fixes: only allow LAN devices to reach LAN-specific endpoints Show security codes when added locally Strip more image metadata (like GPS infos) on more formats
that gotta be the last devlog 😅 Basically i just “routine maintenance” the repo ¯ \ (ツ) /¯ spent time TRYING getting it on the app store or play store… it’s pain 😭 but i’ll get it eventually!
Shipped and received ratings, thank you guys! We reached 25 stars on GitHub Changes: various bug fixes… lol (and dependency bumps) iOS build! and signed mac build! meaning you can know open the app on mac without it saying “broken”! (this was a signing issue yes, the app is not actually broken…) got Kursal working for ARCH !! finally, arch users can now open the app :) Still trying to get published on the app store and google play…. damn I did not think it would take that long
Ships:
I built Kursal! A peer-to-peer, decentralized (means no central server!) and end-to-end encrypted messenger. It’s all coded in Rust for the backend and Svelte for the interface. There’s also a website for it showing a bit everything, it’s cool Basically when you open your client, it connects to other clients and creates a “mesh” of clients, communicating through each other. I think a good comparison is a mix of Bitcoin and Tor? Anyway it took me super long to code, and I hope you enjoy!...
|
1792853529.229275
|
1792939929.229275
|
|
7614
|
UniScan by @dexrn | Stardance
|
dexrn
|
0
|
239.34
|
0
|
[]
|
[{"post_id": 81208, "ts": "202 [{"post_id": 81208, "ts": "2026-10-20T09:19:45Z", "hours": 9.0592, "text": "Coming in the next full update will also be UI modes This is so that the UI is optimized for every device and their input methods This is the Mobile one, and the main page will (when its finished) have all remotes including non-connected ones and a button to add more remotes and such."}, {"post_id": 80144, "ts": "2026-10-16T11:58:28Z", "hours": 3.9517, "text": "Working on settings…! After this there will be configuration on the serverside and then after that, audio streaming!"}, {"post_id": 79731, "ts": "2026-10-15T07:54:37Z", "hours": 6.7103, "text": "New logo! (credits at end) I intend to make the logo customizable by allowing you to change the color of various elements, and choose between different logos (since no other software ive seen does this) Maybe even change the color of the scanner display when someone is talking even… Thanks to Unomelon for the base, which I used to draw the scanner. Check out Unomelon here: https://bsky.app/profile/unomelon.bsky.social , and his very cool game Allumeria here: https://allumeria.com/ (wasnt asked to add this but I think the game is really cool and am somewhat active in the community)"}, {"post_id": 77782, "ts": "2026-10-08T08:12:30Z", "hours": 5.2025, "text": "Finally committed the latest Shiki changes, will release UniScan’s next commit tomorrow."}, {"post_id": 76647, "ts": "2026-10-04T07:57:18Z", "hours": 11.0072, "text": "Have been working on more Shiki refactors and a nice language system for servers in UniScan to provide language strings without being able to overwrite client language strings Reworked most of the TaskPipelineBuilder with many more accepting delegate types and have done some cleanup since Tomorrow I will finish up releasing the next Shiki version and then I think I will be able to release the next UniScan commit and then keep working for an alpha release."}, {"post_id": 73501, "ts": "2026-09-25T07:49:46Z", "hours": 9.2694, "text": "getting yelled at by starpheus because I haven’t made devlog yet spent all nighter last night refactoring shiki’s modulemanagement project and then today I refactored lots of shiki’s taskpipeline project, as well as some work being done on Shiki’s Result and family (shiki is the side project library with most of it’s code originating from UniScan, and UniScan heavily depends on it) Now the browser initialization is much cleaner (but not perfect of course) (first screenshot is new, second is old) Removed HostEnvironment because we usually only grab the parts from DI anyway"}, {"post_id": 73041, "ts": "2026-09-24T08:06:31Z", "hours": 11.4114, "text": "For funzies, here’s the dev build running inside a rooted Oculus Quest 2 (thanks to my friend for testing this) This is also a good test of the netcode over a long distance (they’re in Malaysia while I’m in the US) Getting close to committing this all alongside Shiki and such… Long cleanup process."}, {"post_id": 70021, "ts": "2026-09-18T09:20:00Z", "hours": 2.1572, "text": "Here’s a showcase of my Uniden SDS100 scanning, with UniScan showing the details in real time! I programmed in some garbage test channels so you won’t see any channels talking in this video. Everything shown here is sent by the server and updated by the server… Still somewhat far from complete as I have to figure out more stuff (mainly more stuff for the client to deal with, like hiding state display textblock on null bindings and more UI features/styling)."}, {"post_id": 69912, "ts": "2026-09-18T01:47:47Z", "hours": 10.1983, "text": "Okayyy so I was able to actually completely gut DeviceState and now it’s actually just a class which is also used to serialize individual states. This also means I can nuke reflection from the serialization process since I can just make IDeviceState forced to inherit IStateSerializer which will be much more dynamic!!! This means literally any states can be sent to the client and as long as the server or the module has the UI to render the states, it will work. This also allows states to be diffed and only the changed parts to be sent Second screenshot shows the UI sent by the server, note that the Volume: 0 is actually all being handled on the client via binding strings (where the server only sends the client the device states and the binding strings will look up those states itself)"}, {"post_id": 67990, "ts": "2026-09-14T10:18:38Z", "hours": 0.7964, "text": "And now we can finally start seeing the fruits of our labor"}, {"post_id": 67864, "ts": "2026-09-14T04:29:36Z", "hours": 7.07, "text": "IT FINALLY WORKS The UI shit I built on the server now syncs to the client correctly, and the flow isn’t actually too bad! Although this will be improved by also having a registry…registry…(yeah I know it’s weird) on the client so that UI elements can have values bind to them, and all the server has to do is send the client data to those registries"}, {"post_id": 65237, "ts": "2026-09-10T07:13:02Z", "hours": 3.4144, "text": "Went on a small side-tangent. Icons! (dw still working on the SSR device stuff)"}, {"post_id": 63401, "ts": "2026-09-07T06:50:20Z", "hours": 5.6181, "text": "Sorry, haven’t been super active due to life. Fixed a few bugs in the meantime and implemented most of the SSR binding stuff, but it’s far from finished, hell I haven’t even gotten to test it yet. Will be gone for a bit tomorrow, and the next day I will be at a different house for a few days albeit with my computer."}, {"post_id": 61349, "ts": "2026-09-04T07:02:15Z", "hours": 5.4761, "text": "While I didn’t get to scanner state displaying yet, I did refactor the classes that handle how remotes connect, disconnect, etc so that it’s not spread around the codebase. This fixes a few bugs related to state management due to how originally these viewmodels were constructed separately of eachother. Tomorrow I will be gone for a few hrs but should be back soon enough to hopefully make some more refactors and/or start on the remote display. Pictured is the new disconnect button in the remote on the sidebar"}, {"post_id": 60741, "ts": "2026-09-03T09:41:59Z", "hours": 2.8389, "text": "The client can now disconnect itself, and more styling has been added to the SSR UI (shown here is a Container which is centered and has a slight margin) tomorrow will be some more work on the SSR UI and then finally getting the scanner state to show on the client. I’m not too pleased with the idea that the server may change the look of the device pages on the clients, though… I still feel like there could be some better way to go about this."}, {"post_id": 60674, "ts": "2026-09-03T06:03:58Z", "hours": 7.28, "text": "I FINALLY GOT SSR WORKING MY GOD still too primitive to do anything atm, working on it."}, {"post_id": 59441, "ts": "2026-09-01T09:14:39Z", "hours": 2.6186, "text": "A friend of mine was able to test it on iOS, we got it working. Gonna have them send in the PR later and set up CI for it."}, {"post_id": 58714, "ts": "2026-08-31T07:59:18Z", "hours": 3.1222, "text": "Started working on state sync, will continue tomorrow probably States are synced now but I need to think about how to deal with scanner groups and channels and such because there are different types of channels (such as P25, conventional, etc) among other type issues and I want to reduce the need for any modules on the client if I can."}, {"post_id": 56408, "ts": "2026-08-28T05:18:41Z", "hours": 1.9061, "text": "UniScan Client v0.1.0, UniScan Server (Host) v0.1.1 Lots of changes, most of them are backend changes, but there are also a handful of frontend changes too! https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.1.0 Remotes are now stored per file instead of one large file, and the UI has been neatened up. The server now sends metadata containing a logo, various information, an MOTD, links, etc. The UI has been updated to display this information too. There are more changes than this, but there are too many to list here without hitting the 4000 char limit. Attached is a small video showing some of the new UI stuffs. By no means is it bug free, but the PR reached a point where it could be merged to allow for other important tasks to be focused on (like y’know, showing the actual scanner info)"}, {"post_id": 55440, "ts": "2026-08-27T08:29:55Z", "hours": 1.0639, "text": "I think this looks pretty nice apparently Avalonia has some nuget package that adds ItemsRepeater which does what I was originally trying to do in a cleaner way"}, {"post_id": 55410, "ts": "2026-08-27T06:57:46Z", "hours": 0.9983, "text": "Here’s the announcements UI, I think I’m almost done on this branch and then I’ll continue on main."}, {"post_id": 55287, "ts": "2026-08-27T00:47:49Z", "hours": 2.4511, "text": "Need opinions on this UI The server logo now shows where possible, so on the home view and in the sidebar In the remote view, there is a top ‘window’(?) that holds (from top to bottom): logo (to the side: title, description), server links and then the bottom floating window thing holds the server MOTD I still need to find a place to hold the server announcements… Alongside this were a ton of internal refactors, and the subscribe button now works (but the server still won’t properly send the current state) Been trying to post this since yesterday (I re-recorded the video today), but Hackatime has been down."}, {"post_id": 54227, "ts": "2026-08-25T03:48:43Z", "hours": 5.8811, "text": "Remotes are now stored per file instead of all inside one file. Additionally, server info is now properly cached! I had to rewrite most of the remote initialization flow, but now it’s much better. Adding and removing remotes automatically saves to disk because I can observe the list. This isn’t the end of this overhaul, but we’re getting closer… I think I want to refactor more of UniScanClient next. This is happening on another branch: https://github.com/UniScanProject/UniScan/tree/feat/use_server_provided_display_names After this branch is merged into main, I will make the available server info also show since we have the entire RemoteInfo being sent, which includes announcements, a description, a logo, etc."}, {"post_id": 53539, "ts": "2026-08-24T04:08:25Z", "hours": 3.6514, "text": "Working on dropping display names from client remotes As well as some refactor of the connection flow using my new TaskPipeline Once this is done, the server will be able to send branding, announcements, and other useful information on connect for the client to display!"}, {"post_id": 52159, "ts": "2026-08-22T07:56:54Z", "hours": 1.7483, "text": "Just released a new version, now you can make remotes from the UI finally. Here’s a video showing the creation flow. Note that the list is dynamic based on classes implementing IConnectionMethodFactoryViewModel with attribute ConnectionMethodFactoryViewModelAttribute"}, {"post_id": 52085, "ts": "2026-08-22T04:54:12Z", "hours": 2.8142, "text": "working on fixing the fact that you can’t really make remotes"}, {"post_id": 51645, "ts": "2026-08-21T13:05:32Z", "hours": 3.4047, "text": "FINALLY I GOT IT DONE IM SO TIRED New loading screen!!!! And OPFS file handles are now keyed by int im going to sleep now https://uniscan.dexrn.me"}, {"post_id": 51484, "ts": "2026-08-21T06:59:47Z", "hours": 0.3158, "text": "Much nicer loading screen"}, {"post_id": 51332, "ts": "2026-08-20T22:40:12Z", "hours": 2.3814, "text": "Alright I’ve committed and now you can access UniScan through https://uniscan.dexrn.me Note that since this is still an early version, you can’t really do much. You can also install it as a PWA on iOS, Android, and most desktop browsers. (pictured is UniScan as a PWA in ungoogled-chromium) Hopefully tomorrow I will fix the crash with adding remotes by making some sort of map of connection type -> UI widget to define the settings for them. (meant to post this yesterday, but GH was still working on some cert garbage)"}, {"post_id": 50726, "ts": "2026-08-20T02:11:03Z", "hours": 1.7997, "text": "UniScan now works in browser! I’ve also added a nice crash handler since unhandled exceptions act weird in the browser. Just polishing up now, will commit and set up Actions to host this. Once it’s up, the link will be https://uniscan.dexrn.me (The crash shown in the video is a real issue and will be fixed later.)"}, {"post_id": 50685, "ts": "2026-08-20T00:10:14Z", "hours": 2.6617, "text": "FINALLY I GOT OPFS WORKING GG"}, {"post_id": 50163, "ts": "2026-08-19T08:34:19Z", "hours": 0.6781, "text": "OK I GOT IT SOMEWHAT WORKING IN BROWSER FINALLY still need to keep implementing OPFS stuff though. serilog 01:32:29 [ERR | UniScan.Client.Core.Config.Remote.RemotesListFile] Failed to save remotes to remotes.json System.Exception: Entry not found at SpawnDev.SpawnJS.SpawnJSRuntime.<_InteropCallApplyAsync>d__132`1[[SpawnDev.SpawnJS.JSObjects.FileSystemSyncAccessHandle, SpawnDev.SpawnJS, Version=2.1.8.0, Culture=neutral, PublicKeyToken=null]].MoveNext()"}, {"post_id": 50120, "ts": "2026-08-19T06:14:18Z", "hours": 1.0522, "text": "I think this looks pretty good for a little loading screen. I’ll probably add a try/catch if possible and show an error dialog when some fatal exception is thrown… The “Loading…” text is temporary and is done in Avalonia, will make a proper loading screen there sometime later."}, {"post_id": 50073, "ts": "2026-08-19T03:53:07Z", "hours": 1.5272, "text": "Using this time to test out M3 web (even though it’s in maintenance mode) This is just for the loading screen while it downloads all the WASMs. The cell tower is temporary until I can either make my own logo or find someone who will make one for me."}, {"post_id": 49405, "ts": "2026-08-18T06:53:24Z", "hours": 0.5689, "text": "Waiting on a bug to be fixed in SpawnJS.WebWorkers and then hopefully next update will include web support + a website for y’all to test the client!!! Couldn’t do much today since I was so busy, however since I’m home now I can work on UniScan at a better time than 12 in the morning."}, {"post_id": 48708, "ts": "2026-08-17T06:57:16Z", "hours": 2.0306, "text": "Didn’t get to release last night, as a new bug popped up. 11>MessagePack.GeneratedMessagePackResolver.g.cs(74,74): Error CS0426 : The type name 'Shiki' does not exist in the type 'GeneratedMessagePackResolver'11>------- Finished building project: UniScan.Network. Succeeded: False. Errors: 1. Was able to fix it with some property in the AssemblyInfo. (see: github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2133) I changed the Identifier to be a Slug instead for the devices. Working on browser stuff real quick and will commit sometime soon."}, {"post_id": 47901, "ts": "2026-08-16T05:27:47Z", "hours": 1.0794, "text": "Not fully happy with the manner in which this works, but the virtual scanner does work! Will publish some if not all of it tonight, but no version tag for this yet until I fix my refactoring."}, {"post_id": 47322, "ts": "2026-08-15T06:23:55Z", "hours": 1.4389, "text": "Working on a virtual scanner module to help development by simulating a scanner, hope to have it ready by tomorrow. This also means any future contributors will be able to start contributing even if they do not own a scanner!"}, {"post_id": 46716, "ts": "2026-08-14T05:00:44Z", "hours": 0.8869, "text": "spun up entire android emulator just to realize it was some debug code I forgot to remove that was causing it to throw and die because afaik currentdirectory is / for android apps? gonna release this and then start working on remote adding from UI I think"}, {"post_id": 46099, "ts": "2026-08-13T02:11:59Z", "hours": 5.3278, "text": "UniScan source is now up, you can view it at https://github.com/UniScanProject/UniScan UniScan Client & Server v0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Server.Host%2F0.0.2 Added CI for UniScan.Server.Host UniScan.Client.Core Use DI for PacketRegistry Update RemoteFactory.Create to pass PacketRegistry instance from DI Breaking Changes Updated RemoteServer constructors to take an instance of PacketRegistry Removed InternalUniScanClientPacketConfigurator Packets are now registered from AssembliesPacketSource InternalUniScanClientModule no longer adds an IPacketConfigurator to DI as this class has been removed. UniScan.Network Breaking Changes Renamed ScannerInfoPacket -> ScannerRegistrationPacket The new ID for this packet is UniScan:packet/clientbound/device/registration This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase Removed BuiltinPacketRegistrar Removed IPacketConfigurator Moved PacketRegistry and RegistryPacketAttribute to UniScan.Network.Registry Created IPacketSource and AssembliesPacketSource AssembliesPacketSource collects all classes that inherit IPacket and have the RegistryPacket attribute. Removed the singleton Instance property from PacketRegistry Created PacketRegistry.RegisterFromSource and PacketRegistry.RegisterFromSource<TPacketSource> PacketRegistry.RegisterFromSource takes a given IPacketSource and registers all the packets it provides. PacketRegistry.RegisterFromSource<TPacketSource> creates a new instance of the given TPacketSource type and passes it to PacketRegistry.RegisterFromSource UniScan.Server.Core SubscribePacketHandler now sends the newly renamed ScannerRegistrationPacket Breaking Changes Removed PacketRegistry.RegisterFromSource InternalUniScanServerModule no longer adds an IPacketConfigurator to DI as this class has been removed. Packets are now registered from AssembliesPacketSource UniScan.Server.Host Now creates its own PacketRegistry and passes it to the UniScanServer constructor. UniScan.Tests Now creates its own PacketRegistry and passes it to the ClientSocket constructor."}, {"post_id": 44449, "ts": "2026-08-10T06:23:32Z", "hours": 11.9661, "text": "Been working on cleaning up the codebase in preparation for the initial commit. (thanks @CT5 for some of the motivation) https://github.com/UniScanProject/UniScan will be the project’s home. This does NOT mean it is ready to use, it is far from so. However, it means I will be able to publish releases and such, and everyone will be able to read the code. I will also be working on a Module alongside the core project, which acts as a virtual scanner, for testing of course. My next steps will be getting the virtual scanner module good enough to use as testing, then figure out what to do about the UI, as I don’t really want to force modules onto users. My idea here is that we send a UI ‘definition’(?) to the client for it to render, and let modules hook into them. Means we can also have each button call to the server when pressed if it’s meant to perform a server-side action. I am also planning a scope increase to include SDRs and two-way radios in the distant future. Would like y’alls opinions."}, {"post_id": 28082, "ts": "2026-07-14T03:34:16Z", "hours": 15.6422, "text": "Doing better at Avalonia so I was able to fix some issues and make the Home screen actually contain something useful, with this being a list of all connected remotes and their devices in one place. Oh, and a ton of netcode setup which I forgot to post in this devlog, will show it in the next one."}, {"post_id": 18787, "ts": "2026-06-30T00:07:21Z", "hours": 34.5525, "text": "so far so good! I might want to make the Identifier text slightly smaller….. Now onto making “subscriptions” work, couldn’t come up with a better name than this though. It takes me so long to do anything because I constantly have the urge to refactor things, as well as trying to get stuff perfect the first time."}, {"post_id": 7411, "ts": "2026-06-12T10:42:10Z", "hours": 11.1469, "text": "FINALLY HOLY SHIT WHY IS IT SUCH PAIN TO DO ASYNC INIT IN AVALONIA I wouldnt need to do this if the browser wasnt so picky with OPFS and async………. UGH basically now during OnFrameworkInitializationCompleted I just run task in background that calls my async function at end of async function it sets Content of root view to newly created MainViewModel"}, {"post_id": 6029, "ts": "2026-06-10T03:40:35Z", "hours": 2.2417, "text": "Finally getting remotes closer to working Now you can add them from the GUI (but you can’t connect to them yet…)"}, {"post_id": 5432, "ts": "2026-06-09T06:21:20Z", "hours": 0.9203, "text": "didn’t notice at the time but I was writing out the length with the wrong endianness fixed it and now dotnetty doesn’t silently ignore it"}, {"post_id": 5404, "ts": "2026-06-09T04:53:56Z", "hours": 10.0017, "text": "testing the socket, seems like packets aren’t being handled just yet but at least we’re getting somewhere"}]...
|
Title: UniScan by @dexrn | Stardance
Devlogs:
tes Title: UniScan by @dexrn | Stardance
Devlogs:
testing the socket, seems like packets aren’t being handled just yet but at least we’re getting somewhere
didn’t notice at the time but I was writing out the length with the wrong endianness fixed it and now dotnetty doesn’t silently ignore it
Finally getting remotes closer to working Now you can add them from the GUI (but you can’t connect to them yet…)
FINALLY HOLY SHIT WHY IS IT SUCH PAIN TO DO ASYNC INIT IN AVALONIA I wouldnt need to do this if the browser wasnt so picky with OPFS and async………. UGH basically now during OnFrameworkInitializationCompleted I just run task in background that calls my async function at end of async function it sets Content of root view to newly created MainViewModel
so far so good! I might want to make the Identifier text slightly smaller….. Now onto making “subscriptions” work, couldn’t come up with a better name than this though. It takes me so long to do anything because I constantly have the urge to refactor things, as well as trying to get stuff perfect the first time.
Doing better at Avalonia so I was able to fix some issues and make the Home screen actually contain something useful, with this being a list of all connected remotes and their devices in one place. Oh, and a ton of netcode setup which I forgot to post in this devlog, will show it in the next one.
Been working on cleaning up the codebase in preparation for the initial commit. (thanks @CT5 for some of the motivation) https://github.com/UniScanProject/UniScan will be the project’s home. This does NOT mean it is ready to use, it is far from so. However, it means I will be able to publish releases and such, and everyone will be able to read the code. I will also be working on a Module alongside the core project, which acts as a virtual scanner, for testing of course. My next steps will be getting the virtual scanner module good enough to use as testing, then figure out what to do about the UI, as I don’t really want to force modules onto users. My idea here is that we send a UI ‘definition’(?) to the client for it to render, and let modules hook into them. Means we can also have each button call to the server when pressed if it’s meant to perform a server-side action. I am also planning a scope increase to include SDRs and two-way radios in the distant future. Would like y’alls opinions.
UniScan source is now up, you can view it at https://github.com/UniScanProject/UniScan UniScan Client & Server v0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Server.Host%2F0.0.2 Added CI for UniScan.Server.Host UniScan.Client.Core Use DI for PacketRegistry Update RemoteFactory.Create to pass PacketRegistry instance from DI Breaking Changes Updated RemoteServer constructors to take an instance of PacketRegistry Removed InternalUniScanClientPacketConfigurator Packets are now registered from AssembliesPacketSource InternalUniScanClientModule no longer adds an IPacketConfigurator to DI as this class has been removed. UniScan.Network Breaking Changes Renamed ScannerInfoPacket -> ScannerRegistrationPacket The new ID for this packet is UniScan:packet/clientbound/device/registration This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase Removed BuiltinPacketRegistrar Removed IPacketConfigurator Moved PacketRegistry and RegistryPacketAttribute to UniScan.Network.Registry Created IPacketSource and AssembliesPacketSource AssembliesPacketSource collects all classes that inherit IPacket and have the RegistryPacket attribute. Removed the singleton Instance property from PacketRegistry Created PacketRegistry.RegisterFromSource and PacketRegistry.RegisterFromSource<TPacketSource> PacketRegistry.RegisterFromSource takes a given IPacketSource and registers all the packets it provides. PacketRegistry.RegisterFromSource<TPacketSource> creates a new instance of the given TPacketSource type and passes it to PacketRegistry.RegisterFromSource UniScan.Server.Core SubscribePacketHandler now sends the newly renamed ScannerRegistrationPacket Breaking Changes Removed PacketRegistry.RegisterFromSource InternalUniScanServerModule no longer adds an IPacketConfigurator to DI as this class has been removed. Packets are now registered from AssembliesPacketSource UniScan.Server.Host Now creates its own PacketRegistry and passes it to the UniScanServer constructor. UniScan.Tests Now creates its own PacketRegistry and passes it to the ClientSocket constructor.
spun up entire android emulator just to realize it was some debug code I forgot to remove that was causing it to throw and die because afaik currentdirectory is / for android apps? gonna release this and then start working on remote adding from UI I think
Working on a virtual scanner module to help development by simulating a scanner, hope to have it ready by tomorrow. This also means any future contributors will be able to start contributing even if they do not own a scanner!
Not fully happy with the manner in which this works, but the virtual scanner does work! Will publish some if not all of it tonight, but no version tag for this yet until I fix my refactoring.
Didn’t get to release last night, as a new bug popped up. 11>MessagePack.GeneratedMessagePackResolver.g.cs(74,74): Error CS0426 : The type name 'Shiki' does not exist in the type 'GeneratedMessagePackResolver'11>------- Finished building project: UniScan.Network. Succeeded: False. Errors: 1. Was able to fix it with some property in the AssemblyInfo. (see: github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2133) I changed the Identifier to be a Slug instead for the devices. Working on browser stuff real quick and will commit sometime soon.
Waiting on a bug to be fixed in SpawnJS.WebWorkers and then hopefully next update will include web support + a website for y’all to test the client!!! Couldn’t do much today since I was so busy, however since I’m home now I can work on UniScan at a better time than 12 in the morning.
Using this time to test out M3 web (even though it’s in maintenance mode) This is just for the loading screen while it downloads all the WASMs. The cell tower is temporary until I can either make my own logo or find someone who will make one for me.
I think this looks pretty good for a little loading screen. I’ll probably add a try/catch if possible and show an error dialog when some fatal exception is thrown… The “Loading…” text is temporary and is done in Avalonia, will make a proper loading screen there sometime later.
OK I GOT IT SOMEWHAT WORKING IN BROWSER FINALLY still need to keep implementing OPFS stuff though. serilog 01:32:29 [ERR | UniScan.Client.Core.Config.Remote.RemotesListFile] Failed to save remotes to remotes.json System.Exception: Entry not found at SpawnDev.SpawnJS.SpawnJSRuntime.<_InteropCallApplyAsync>d__132`1[[SpawnDev.SpawnJS.JSObjects.FileSystemSyncAccessHandle, SpawnDev.SpawnJS, Version=2.1.8.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
FINALLY I GOT OPFS WORKING GG
UniScan now works in browser! I’ve also added a nice crash handler since unhandled exceptions act weird in the browser. Just polishing up now, will commit and set up Actions to host this. Once it’s up, the link will be https://uniscan.dexrn.me (The crash shown in the video is a real issue and will be fixed later.)
Alright I’ve committed and now you can access UniScan through https://uniscan.dexrn.me Note that since this is still an early version, you can’t really do much. You can also install it as a PWA on iOS, Android, and most desktop browsers. (pictured is UniScan as a PWA in ungoogled-chromium) Hopefully tomorrow I will fix the crash with adding remotes by making some sort of map of connection type -> UI widget to define the settings for them. (meant to post this yesterday, but GH was still working on some cert garbage)
Much nicer loading screen
FINALLY I GOT IT DONE IM SO TIRED New loading screen!!!! And OPFS file handles are now keyed by int im going to sleep now https://uniscan.dexrn.me
working on fixing the fact that you can’t really make remotes
Just released a new version, now you can make remotes from the UI finally. Here’s a video showing the creation flow. Note that the list is dynamic based on classes implementing IConnectionMethodFactoryViewModel with attribute ConnectionMethodFactoryViewModelAttribute
Working on dropping display names from client remotes As well as some refactor of the connection flow using my new TaskPipeline Once this is done, the server will be able to send branding, announcements, and other useful information on connect for the client to display!
Remotes are now stored per file instead of all inside one file. Additionally, server info is now properly cached! I had to rewrite most of the remote initialization flow, but now it’s much better. Adding and removing remotes automatically saves to disk because I can observe the list. This isn’t the end of this overhaul, but we’re getting closer… I think I want to refactor more of UniScanClient next. This is happening on another branch: https://github.com/UniScanProject/UniScan/tree/feat/use_server_provided_display_names After this branch is merged into main, I will make the available server info also show since we have the entire RemoteInfo being sent, which includes announcements, a description, a logo, etc.
Need opinions on this UI The server logo now shows where possible, so on the home view and in the sidebar In the remote view, there is a top ‘window’(?) that holds (from top to bottom): logo (to the side: title, description), server links and then the bottom floating window thing holds the server MOTD I still need to find a place to hold the server announcements… Alongside this were a ton of internal refactors, and the subscribe button now works (but the server still won’t properly send the current state) Been trying to post this since yesterday (I re-recorded the video today), but Hackatime has been down.
Here’s the announcements UI, I think I’m almost done on this branch and then I’ll continue on main.
I think this looks pretty nice apparently Avalonia has some nuget package that adds ItemsRepeater which does what I was originally trying to do in a cleaner way
UniScan Client v0.1.0, UniScan Server (Host) v0.1.1 Lots of changes, most of them are backend changes, but there are also a handful of frontend changes too! https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.1.0 Remotes are now stored per file instead of one large file, and the UI has been neatened up. The server now sends metadata containing a logo, various information, an MOTD, links, etc. The UI has been updated to display this information too. There are more changes than this, but there are too many to list here without hitting the 4000 char limit. Attached is a small video showing some of the new UI stuffs. By no means is it bug free, but the PR reached a point where it could be merged to allow for other important tasks to be focused on (like y’know, showing the actual scanner info)
Started working on state sync, will continue tomorrow probably States are synced now but I need to think about how to deal with scanner groups and channels and such because there are different types of channels (such as P25, conventional, etc) among other type issues and I want to reduce the need for any modules on the client if I can.
A friend of mine was able to test it on iOS, we got it working. Gonna have them send in the PR later and set up CI for it.
I FINALLY GOT SSR WORKING MY GOD still too primitive to do anything atm, working on it.
The client can now disconnect itself, and more styling has been added to the SSR UI (shown here is a Container which is centered and has a slight margin) tomorrow will be some more work on the SSR UI and then finally getting the scanner state to show on the client. I’m not too pleased with the idea that the server may change the look of the device pages on the clients, though… I still feel like there could be some better way to go about this.
While I didn’t get to scanner state displaying yet, I did refactor the classes that handle how remotes connect, disconnect, etc so that it’s not spread around the codebase. This fixes a few bugs related to state management due to how originally these viewmodels were constructed separately of eachother. Tomorrow I will be gone for a few hrs but should be back soon enough to hopefully make some more refactors and/or start on the remote display. Pictured is the new disconnect button in the remote on the sidebar
Sorry, haven’t been super active due to life. Fixed a few bugs in the meantime and implemented most of the SSR binding stuff, but it’s far from finished, hell I haven’t even gotten to test it yet. Will be gone for a bit tomorrow, and the next day I will be at a different house for a few days albeit with my computer.
Went on a small side-tangent. Icons! (dw still working on the SSR device stuff)
IT FINALLY WORKS The UI shit I built on the server now syncs to the client correctly, and the flow isn’t actually too bad! Although this will be improved by also having a registry…registry…(yeah I know it’s weird) on the client so that UI elements can have values bind to them, and all the server has to do is send the client data to those registries
And now we can finally start seeing the fruits of our labor
Okayyy so I was able to actually completely gut DeviceState and now it’s actually just a class which is also used to serialize individual states. This also means I can nuke reflection from the serialization process since I can just make IDeviceState forced to inherit IStateSerializer which will be much more dynamic!!! This means literally any states can be sent to the client and as long as the server or the module has the UI to render the states, it will work. This also allows states to be diffed and only the changed parts to be sent Second screenshot shows the UI sent by the server, note that the Volume: 0 is actually all being handled on the client via binding strings (where the server only sends the client the device states and the binding strings will look up those states itself)
Here’s a showcase of my Uniden SDS100 scanning, with UniScan showing the details in real time! I programmed in some garbage test channels so you won’t see any channels talking in this video. Everything shown here is sent by the server and updated by the server… Still somewhat far from complete as I have to figure out more stuff (mainly more stuff for the client to deal with, like hiding state display textblock on null bindings and more UI features/styling).
For funzies, here’s the dev build running inside a rooted Oculus Quest 2 (thanks to my friend for testing this) This is also a good test of the netcode over a long distance (they’re in Malaysia while I’m in the US) Getting close to committing this all alongside Shiki and such… Long cleanup process.
getting yelled at by starpheus because I haven’t made devlog yet spent all nighter last night refactoring shiki’s modulemanagement project and then today I refactored lots of shiki’s taskpipeline project, as well as some work being done on Shiki’s Result and family (shiki is the side project library with most of it’s code originating from UniScan, and UniScan heavily depends on it) Now the browser initialization is much cleaner (but not perfect of course) (first screenshot is new, second is old) Removed HostEnvironment because we usually only grab the parts from DI anyway
Have been working on more Shiki refactors and a nice language system for servers in UniScan to provide language strings without being able to overwrite client language strings Reworked most of the TaskPipelineBuilder with many more accepting delegate types and have done some cleanup since Tomorrow I will finish up releasing the next Shiki version and then I think I will be able to release the next UniScan commit and then keep working for an alpha release.
Finally committed the latest Shiki changes, will release UniScan’s next commit tomorrow.
New logo! (credits at end) I intend to make the logo customizable by allowing you to change the color of various elements, and choose between different logos (since no other software ive seen does this) Maybe even change the color of the scanner display when someone is talking even… Thanks to Unomelon for the base, which I used to draw the scanner. Check out Unomelon here: https://bsky.app/profile/unomelon.bsky.social , and his very cool game Allumeria here: https://allumeria.com/ (wasnt asked to add this but I think the game is really cool and am somewhat active in the community)
Working on settings…! After this there will be configuration on the serverside and then after that, audio streaming!
Coming in the next full update will also be UI modes This is so that the UI is optimized for every device and their input methods This is the Mobile one, and the main page will (when its finished) have all remotes including non-connected ones and a button to add more remotes and such....
|
1792785158.047574
|
1793389958.047574
|
|
27897
|
Astilbe by @yf | Stardance
|
yf
|
0
|
238.2
|
0
|
[]
|
[{"post_id": 76951, "ts": "202 [{"post_id": 76951, "ts": "2026-10-05T05:22:41Z", "hours": 8.2967, "text": "Docs r out. Just b4 release, I will compile a windows compatible exe too, since I am unsigned on mac!"}, {"post_id": 71715, "ts": "2026-09-21T11:24:18Z", "hours": 3.6139, "text": "The dmg is ready! now, website for product before final shipping…"}, {"post_id": 70967, "ts": "2026-09-20T04:05:02Z", "hours": 6.1125, "text": "Prepping for final checks before shipping! Made some assets as well."}, {"post_id": 70076, "ts": "2026-09-18T12:26:23Z", "hours": 4.3944, "text": "26/26 pass! Mutex connections and database sanitisation is certified and up and running. SO far on the release checklist, half of everything is done!"}, {"post_id": 70002, "ts": "2026-09-18T08:00:35Z", "hours": 8.1869, "text": "Did comprehensive backend stress testing especially on the health+integrity of backend database structures by forcefully inserting malformed data. Identified around 2-3 vulnerabilities and 2 blunt failures and I will resolve that in the backend by force-sanitising all data that is to be entered"}, {"post_id": 69833, "ts": "2026-09-17T21:26:08Z", "hours": 8.4408, "text": "Made the search bar in toolkits functional and debugged the css-bug in which the model-detail was not aligned with the styles of model-card classes among other bug hunting work"}, {"post_id": 69590, "ts": "2026-09-17T11:27:50Z", "hours": 8.6647, "text": "Major housekeeping, css bug fixing too"}, {"post_id": 69453, "ts": "2026-09-17T02:40:52Z", "hours": 9.1756, "text": "Added comprehensive error coding (documentation website tba)"}, {"post_id": 68530, "ts": "2026-09-15T08:32:20Z", "hours": 9.7789, "text": "Stopping logic refined, huge unification of toolcall/send direct logic and further housekeeping incl/ with deletion of target/ recompilation, and headless testing (heterogeneous AI testing) and major user testing"}, {"post_id": 67674, "ts": "2026-09-13T20:42:48Z", "hours": 8.8681, "text": "Now toolkits are enable-able (they are too premature for production, they are a beta-feature for the alpha release, I couldn’t really be bothered with more hours of edge case testing and fixing of this specific singular function) and I also added a search bar."}, {"post_id": 67261, "ts": "2026-09-13T10:15:00Z", "hours": 10.5817, "text": "Housekeeping is taking way too long… did some style unifying, etc. Did minor structural edits for edge casing, next devlog I will delete my cache and re-do it to test the full experience! Also, collapsable sidebar!"}, {"post_id": 66942, "ts": "2026-09-12T22:21:49Z", "hours": 15.5981, "text": "Did a lot of housekeeping and stylistic edits! Preparing for alpha release! (Accidentally coded for too long before a devlog, oopsies.)"}, {"post_id": 66366, "ts": "2026-09-12T05:05:04Z", "hours": 5.4525, "text": "yay first in australia (55h this week). Anyway did a bunch of stuff including housekeeping and error catching, introducing error codes E04 and E05; more info will come as we get closer to github release and alpha release."}, {"post_id": 65666, "ts": "2026-09-10T23:30:12Z", "hours": 8.535, "text": "Did bug hunting, Error handling and housekeeping. Be tuned for the alpha release, the second next devlog!"}, {"post_id": 65389, "ts": "2026-09-10T14:28:24Z", "hours": 4.4897, "text": "Implemented a search (wikipedia) tool! Second last stage before alpha release!"}, {"post_id": 65275, "ts": "2026-09-10T08:50:27Z", "hours": 9.8061, "text": "Added tool calls! Now assistants can read your system specs and remember what you said (if you ask it to)"}, {"post_id": 64755, "ts": "2026-09-09T12:07:17Z", "hours": 7.2394, "text": "Added toolkit skeleton, and added chat branching + regeneration!"}, {"post_id": 64546, "ts": "2026-09-09T01:32:09Z", "hours": 7.5061, "text": "Theme chooser and auto-titler implemented! Auto-titler automatically uses the loaded model to generate a title for your conversation (I did implement using smallest model, but the current model is shown to be much faster due to cache anyway) in the backend. I also implemented a little orientation tour. This time it’s all light mode, to make up for my silly mistake last devlog of posting a darkmode with my light mode update."}, {"post_id": 64170, "ts": "2026-09-08T12:02:50Z", "hours": 2.3167, "text": "Added a light theme and some icons (svg)!"}, {"post_id": 63935, "ts": "2026-09-08T00:38:20Z", "hours": 9.3778, "text": "Streamlined the onboarding experience, now onboarding preferences do save properly! Model recommendations also dynamically updated. I started a git to prepare for major feature additions but it is not yet uploaded to GitHub. Stay tuned!"}, {"post_id": 63510, "ts": "2026-09-07T12:39:34Z", "hours": 2.4556, "text": "Devlog X? Hi all, Astilbe is approaching YAGNI full basic functionality. I’m really excited! Anyhow I apologise for taking this long to write a proper devlog. However, I will accordingly update all my previous devlogs with the detail we all deserve very soon as I finish the polish. This devlog will be a summary of the previous devlogs combined: CSS is standardised. I have to concur that it is substantially, the new styling, is AI-generated; however, a lot of details were manually tweaked. I also ensured standardisation of styling and tested edge cases personally. (Animations were also comprehensively standardised and implemented) Settings is now separated into basic and advanced settings. Advanced settings is enable-able with a toggle. If you ask why, it’s because Astilbe is designed to be grandma-friendly and useful for people who are not necessarily computer savvy. Model Library is now fully functional. Basically, you can now download any model from the library, and you can adjust your tiers to the models that you like. (Tiers is just the models set for the “fast”, “balanced” and “advanced” modes.) Error handling is unified now. Catch-alls are implemented more comprehensively and I have been doing manual edge-case testing to ensure polish for every single function added. In this devlog, I added smart conversation ranking and infinite scroll, in order to save compute from being wasted by displaying EVERY SINGLE old conversation in the scrollbar, similar to how Claude does it. Conversations are now also ranked by the last_used time. Anyhow, that’s all for now. Thank you for reading!"}, {"post_id": 63441, "ts": "2026-09-07T09:12:28Z", "hours": 10.9264, "text": "Implemented model library, did a LOT of debugging, separated settings, resolved the Qwen-model printing."}, {"post_id": 62900, "ts": "2026-09-06T13:06:59Z", "hours": 4.0383, "text": "#Major stylistic update!"}, {"post_id": 34590, "ts": "2026-07-25T13:24:16Z", "hours": 8.7214, "text": "We implemented popups and did bug hunting"}, {"post_id": 30062, "ts": "2026-07-17T10:45:46Z", "hours": 8.5508, "text": "Model Library is fully implemented now!"}, {"post_id": 29890, "ts": "2026-07-17T01:40:15Z", "hours": 2.4431, "text": "Now model choosing is available"}, {"post_id": 28822, "ts": "2026-07-15T10:07:36Z", "hours": 1.2228, "text": "Multi-model downloading now enabled!"}, {"post_id": 28208, "ts": "2026-07-14T11:02:23Z", "hours": 1.0669, "text": "Did some algorithm efficienticising for a more balanced algorithm! More details to come…"}, {"post_id": 28131, "ts": "2026-07-14T07:07:27Z", "hours": 7.5458, "text": "Model suggestions are ready!"}, {"post_id": 26267, "ts": "2026-07-10T23:24:52Z", "hours": 11.1003, "text": "Tried to use WebLLM; reverted. Coding binge"}, {"post_id": 25905, "ts": "2026-07-10T12:16:06Z", "hours": 1.8692, "text": "Error handling and basic chat finalised"}, {"post_id": 25848, "ts": "2026-07-10T10:23:07Z", "hours": 4.5439, "text": "Major updates to Astilbe! More info to come when core functionality is implemented and I have time to start recordign detailed devlogs."}, {"post_id": 25234, "ts": "2026-07-09T11:13:31Z", "hours": 2.0533, "text": "Updates to come when my devlogs are formatted properly in ~3 days"}, {"post_id": 25071, "ts": "2026-07-09T01:01:36Z", "hours": 9.5983, "text": "More updates to come soon (I definitely did not rewrite the entire architecture)"}, {"post_id": 18281, "ts": "2026-06-29T11:40:03Z", "hours": 0.9589, "text": "Devlog 4"}, {"post_id": 18132, "ts": "2026-06-29T04:30:15Z", "hours": 1.2342, "text": "Devlog 3: Settings and Customisation Hello everybody! @yf here with the third devlog. Thankfully, there was not much change to the project purpose (phew) so I can jump straight into what I did. A quick snapshot: I implemented a working settings panel that allows users to customise their experience and saves it to a temp file in the app via tauri-plugin-store . What did I do? I: Created a settings panel that allows customisation of the following values: (For Dev mode:) temperature (float, 0.0-1.0) top_p (float, 0.0-1.0) top_k (int, 1-100) (For the everyday user, dev mode values are hidden, and the following values are the changeable ones:) streaming (bool, true/false) thinking (bool, true/false) theme (string, not implemented yet) I then stored the values as a single json structure options structured in the following way: { \"temperature\" : 0.7 , \"top_p\" : 0.9 , \"top_k\" : 40 , \"streaming\" : true , \"thinking\" : true , \"theme\" : \"default\" , \"model\" : \"Qwen3.5:0.8/2/4B\" } (i.e.) Then, I ditched yet again the rust backend message structure to make way for this new chat structure. I basically added a new key-value pair to the ChatMessage struct, which is options: ChatOptions , and fed it into ollama by flattening it using serde’s flatten attribute, structured the same way as the json above. Models cannot be changed as of the moment. Made the settings panel collapsible via the simple classList toggling. Implemented a simple tauri-plugin-store to save the settings to a temp file in the app, and then read it back on app start. This allows users to have their settings persist across sessions. What’s next? Of course, to truly streamline the user experience, I will have to install Ollama with the application. My next priorities are: To bundle Ollama bin with the application and install it on the user’s machine WITH the model. (This will use quite a lot of space, but I guess the installer file will be small enough to accomodate this.) To spawn the ollama process automatically rather than user required, and to kill it when the app is closed. I will do this all in the backend for security purposes. I could realistically just use ollama.cpp, but this means users have to download models themselves, so I think, at least for now, I will stick with the ollama binary. I will consider this in the future."}, {"post_id": 18046, "ts": "2026-06-29T00:42:02Z", "hours": 0.8717, "text": "Devlog 2: Streaming Responses Hello everybody! I’m back very quickly with the second devlog. As promised, Oh! Chat is: IN THE MODERN DIGITAL AGE, it has become increasingly difficult to control one’s exposure to the internet, regardless of how reserved one may be or what precautions one may take. With the advent of the large language model era, where people could discuss confidential information with chatbots, this problem - our inability to control the flow of our own data, relying on vague promises of ‘privacy’ that cloud-based services claim but never prove - has become more relevant than ever. Oh! Chat aims to combat this by giving users the premium UX that one experiences on existing AI chatbot applications and interfaces, retaining as much AI functionality as possible, while facilitating user operation, installation, and guaranteeing data privacy. (from a readme draft) Anyhow, let’s get to the point. Since we want everyday users to feel comfortable, we want to replicate the experience of existing AI chatbots. An important part of this is the text streaming feature, which allows users to see the response as it is being generated: a typing-like effect, and it is also a good method to verify that the model is working. This is what I did in this devlog. What did I do? I: Implemented a streaming response feature in the backend. Firstly, we ditch the original old logic with match request.await . This is because the await means we have to WAIT for the entire response to output before continued function execution (which is unideal). Instead, we use reqwest::Client to send a POST request to the Ollama instance, and then we use response.bytes_stream() to get a stream of bytes from the response. We then iterate over the stream using while let Some(chunk) = stream.next().await , and each chunk we convert it to a string and send it back to the frontend using emit_all(\"chunk\", chunk_str) . And the client gets it in real time via the listen(\"chunk\", (event) => { ... }) function as an initialised await in main.js . Finally, at the end of the response, a rust event response_end is emitted, and the frontend can accordingly adjust. A very simple implementation, but it works effectively. Drafted a basic readme . … That’s it. (It was quite hard to implement, but it is necessary for user experience.) What’s next? I plan on: Allowing chat customisation (to some degree) via settings. More details to come later. UI overhaul no. 1 and replacing the boilerplate html structure with a more well-defined one. Anyhow, thanks for reading! Watch for the next devlog."}, {"post_id": 17972, "ts": "2026-06-28T22:40:29Z", "hours": 2.5644, "text": "Devlog 1: The Start Hello everybody! This is the very first devlog for Oh! Chat. Well, we have to begin somewhere, right? And for us, we begin in this devlog. For the first entry, I can’t really expect not to do all the dirty work of setting up, dependency checking, and all the other mess that comes with starting. A quick overview: I built the initial bridge between front/backend, and established communication with the local Ollama instance. Also, a personal goal for me: maintain a level of professionalism when logging devlogs (so no more heavy slang, etc.). What is this? (Due to word limits please refer to the next devlog) What did I do? Let’s first talk about what we needed to finish before we could even start. Ollama & a local LLM As the top-tier consumer-grade inference engine for LLMs, Ollama is a good choice for the project. I also used the Qwen3.5:0.8/2/4B models for testing, as excellent edge models for testing. Tauri v2 Tauri is a great framework for building cross-platform desktop applications with html, css and js which I am familiar with. It also uses rust for backend, and though I am not proficient in rust (I have written some basic things in rust before, but not a full backend yet), I aim to use this project to further develop my skills. We now pivot to what I did in the first devlog: Environment & Project Initialization Created the core project structure utilizing the Tauri v2 CLI framework. (Following this tutorial ) Frontend Layout & Boilerplate Architecture Initialised a boilerplate frontend chat template with minimal css and html, and I wired main.js to the backend via invoke and listen commands. Local IPC & The Ollama Localhost Bridge Edited the Rust backend inside src-tauri/src/lib.rs. Creating async commands (#[tauri::command]) to handle inter-process communication (IPC): A hello world tester command; Mapping out the communication layer targeting localhost:11434 (the Ollama api server address for the local instance) to talk directly to the local Ollama instance running on the host machine with reqwest and tokio async libraries.: check_status : checks status (obviously) send_msg(message: ChatMessage) : sends a message to the Ollama instance and sends the response back directly using match request.await to handle the response as a single coherent string. (This is temporary for the moment as I will be implementing streaming soon). The message struct is also super simple: a simple json-like key-value pair: role: String, message: String . We use serde to serialize and deserialize the JSON data sent to and from the Ollama instance. What’s next? Well, there’s a lot to do. I have not yet done a lot of stuff, and I have many priorities with respect to this application, so I won’t be able to describe to you what I will do next; I guess you can just wait for the next devlog. But I can say that the following will definitely be likely to be done in the next update: Allowing slight chat customisation (Building on 1) giving users a settings panel to allow them to customise their experience. Drafting a basic readme . (non priority) Improve UI? Anyhow, thanks for reading and I hope you are eager for the next devlog (Cause I am!)"}]...
|
Title: Astilbe by @yf | Stardance
Devlogs:
Devlog Title: Astilbe by @yf | Stardance
Devlogs:
Devlog 1: The Start Hello everybody! This is the very first devlog for Oh! Chat. Well, we have to begin somewhere, right? And for us, we begin in this devlog. For the first entry, I can’t really expect not to do all the dirty work of setting up, dependency checking, and all the other mess that comes with starting. A quick overview: I built the initial bridge between front/backend, and established communication with the local Ollama instance. Also, a personal goal for me: maintain a level of professionalism when logging devlogs (so no more heavy slang, etc.). What is this? (Due to word limits please refer to the next devlog) What did I do? Let’s first talk about what we needed to finish before we could even start. Ollama & a local LLM As the top-tier consumer-grade inference engine for LLMs, Ollama is a good choice for the project. I also used the Qwen3.5:0.8/2/4B models for testing, as excellent edge models for testing. Tauri v2 Tauri is a great framework for building cross-platform desktop applications with html, css and js which I am familiar with. It also uses rust for backend, and though I am not proficient in rust (I have written some basic things in rust before, but not a full backend yet), I aim to use this project to further develop my skills. We now pivot to what I did in the first devlog: Environment & Project Initialization Created the core project structure utilizing the Tauri v2 CLI framework. (Following this tutorial ) Frontend Layout & Boilerplate Architecture Initialised a boilerplate frontend chat template with minimal css and html, and I wired main.js to the backend via invoke and listen commands. Local IPC & The Ollama Localhost Bridge Edited the Rust backend inside src-tauri/src/lib.rs. Creating async commands (#[tauri::command]) to handle inter-process communication (IPC): A hello world tester command; Mapping out the communication layer targeting localhost:11434 (the Ollama api server address for the local instance) to talk directly to the local Ollama instance running on the host machine with reqwest and tokio async libraries.: check_status : checks status (obviously) send_msg(message: ChatMessage) : sends a message to the Ollama instance and sends the response back directly using match request.await to handle the response as a single coherent string. (This is temporary for the moment as I will be implementing streaming soon). The message struct is also super simple: a simple json-like key-value pair: role: String, message: String . We use serde to serialize and deserialize the JSON data sent to and from the Ollama instance. What’s next? Well, there’s a lot to do. I have not yet done a lot of stuff, and I have many priorities with respect to this application, so I won’t be able to describe to you what I will do next; I guess you can just wait for the next devlog. But I can say that the following will definitely be likely to be done in the next update: Allowing slight chat customisation (Building on 1) giving users a settings panel to allow them to customise their experience. Drafting a basic readme . (non priority) Improve UI? Anyhow, thanks for reading and I hope you are eager for the next devlog (Cause I am!)
Devlog 2: Streaming Responses Hello everybody! I’m back very quickly with the second devlog. As promised, Oh! Chat is: IN THE MODERN DIGITAL AGE, it has become increasingly difficult to control one’s exposure to the internet, regardless of how reserved one may be or what precautions one may take. With the advent of the large language model era, where people could discuss confidential information with chatbots, this problem - our inability to control the flow of our own data, relying on vague promises of ‘privacy’ that cloud-based services claim but never prove - has become more relevant than ever. Oh! Chat aims to combat this by giving users the premium UX that one experiences on existing AI chatbot applications and interfaces, retaining as much AI functionality as possible, while facilitating user operation, installation, and guaranteeing data privacy. (from a readme draft) Anyhow, let’s get to the point. Since we want everyday users to feel comfortable, we want to replicate the experience of existing AI chatbots. An important part of this is the text streaming feature, which allows users to see the response as it is being generated: a typing-like effect, and it is also a good method to verify that the model is working. This is what I did in this devlog. What did I do? I: Implemented a streaming response feature in the backend. Firstly, we ditch the original old logic with match request.await . This is because the await means we have to WAIT for the entire response to output before continued function execution (which is unideal). Instead, we use reqwest::Client to send a POST request to the Ollama instance, and then we use response.bytes_stream() to get a stream of bytes from the response. We then iterate over the stream using while let Some(chunk) = stream.next().await , and each chunk we convert it to a string and send it back to the frontend using emit_all("chunk", chunk_str) . And the client gets it in real time via the listen("chunk", (event) => { ... }) function as an initialised await in main.js . Finally, at the end of the response, a rust event response_end is emitted, and the frontend can accordingly adjust. A very simple implementation, but it works effectively. Drafted a basic readme . … That’s it. (It was quite hard to implement, but it is necessary for user experience.) What’s next? I plan on: Allowing chat customisation (to some degree) via settings. More details to come later. UI overhaul no. 1 and replacing the boilerplate html structure with a more well-defined one. Anyhow, thanks for reading! Watch for the next devlog.
Devlog 3: Settings and Customisation Hello everybody! @yf here with the third devlog. Thankfully, there was not much change to the project purpose (phew) so I can jump straight into what I did. A quick snapshot: I implemented a working settings panel that allows users to customise their experience and saves it to a temp file in the app via tauri-plugin-store . What did I do? I: Created a settings panel that allows customisation of the following values: (For Dev mode:) temperature (float, 0.0-1.0) top_p (float, 0.0-1.0) top_k (int, 1-100) (For the everyday user, dev mode values are hidden, and the following values are the changeable ones:) streaming (bool, true/false) thinking (bool, true/false) theme (string, not implemented yet) I then stored the values as a single json structure options structured in the following way: { "temperature" : 0.7 , "top_p" : 0.9 , "top_k" : 40 , "streaming" : true , "thinking" : true , "theme" : "default" , "model" : "Qwen3.5:0.8/2/4B" } (i.e.) Then, I ditched yet again the rust backend message structure to make way for this new chat structure. I basically added a new key-value pair to the ChatMessage struct, which is options: ChatOptions , and fed it into ollama by flattening it using serde’s flatten attribute, structured the same way as the json above. Models cannot be changed as of the moment. Made the settings panel collapsible via the simple classList toggling. Implemented a simple tauri-plugin-store to save the settings to a temp file in the app, and then read it back on app start. This allows users to have their settings persist across sessions. What’s next? Of course, to truly streamline the user experience, I will have to install Ollama with the application. My next priorities are: To bundle Ollama bin with the application and install it on the user’s machine WITH the model. (This will use quite a lot of space, but I guess the installer file will be small enough to accomodate this.) To spawn the ollama process automatically rather than user required, and to kill it when the app is closed. I will do this all in the backend for security purposes. I could realistically just use ollama.cpp, but this means users have to download models themselves, so I think, at least for now, I will stick with the ollama binary. I will consider this in the future.
Devlog 4
More updates to come soon (I definitely did not rewrite the entire architecture)
Updates to come when my devlogs are formatted properly in ~3 days
Major updates to Astilbe! More info to come when core functionality is implemented and I have time to start recordign detailed devlogs.
Error handling and basic chat finalised
Tried to use WebLLM; reverted. Coding binge
Model suggestions are ready!
Did some algorithm efficienticising for a more balanced algorithm! More details to come…
Multi-model downloading now enabled!
Now model choosing is available
Model Library is fully implemented now!
We implemented popups and did bug hunting
#Major stylistic update!
Implemented model library, did a LOT of debugging, separated settings, resolved the Qwen-model printing.
Devlog X? Hi all, Astilbe is approaching YAGNI full basic functionality. I’m really excited! Anyhow I apologise for taking this long to write a proper devlog. However, I will accordingly update all my previous devlogs with the detail we all deserve very soon as I finish the polish. This devlog will be a summary of the previous devlogs combined: CSS is standardised. I have to concur that it is substantially, the new styling, is AI-generated; however, a lot of details were manually tweaked. I also ensured standardisation of styling and tested edge cases personally. (Animations were also comprehensively standardised and implemented) Settings is now separated into basic and advanced settings. Advanced settings is enable-able with a toggle. If you ask why, it’s because Astilbe is designed to be grandma-friendly and useful for people who are not necessarily computer savvy. Model Library is now fully functional. Basically, you can now download any model from the library, and you can adjust your tiers to the models that you like. (Tiers is just the models set for the “fast”, “balanced” and “advanced” modes.) Error handling is unified now. Catch-alls are implemented more comprehensively and I have been doing manual edge-case testing to ensure polish for every single function added. In this devlog, I added smart conversation ranking and infinite scroll, in order to save compute from being wasted by displaying EVERY SINGLE old conversation in the scrollbar, similar to how Claude does it. Conversations are now also ranked by the last_used time. Anyhow, that’s all for now. Thank you for reading!
Streamlined the onboarding experience, now onboarding preferences do save properly! Model recommendations also dynamically updated. I started a git to prepare for major feature additions but it is not yet uploaded to GitHub. Stay tuned!
Added a light theme and some icons (svg)!
Theme chooser and auto-titler implemented! Auto-titler automatically uses the loaded model to generate a title for your conversation (I did implement using smallest model, but the current model is shown to be much faster due to cache anyway) in the backend. I also implemented a little orientation tour. This time it’s all light mode, to make up for my silly mistake last devlog of posting a darkmode with my light mode update.
Added toolkit skeleton, and added chat branching + regeneration!
Added tool calls! Now assistants can read your system specs and remember what you said (if you ask it to)
Implemented a search (wikipedia) tool! Second last stage before alpha release!
Did bug hunting, Error handling and housekeeping. Be tuned for the alpha release, the second next devlog!
yay first in australia (55h this week). Anyway did a bunch of stuff including housekeeping and error catching, introducing error codes E04 and E05; more info will come as we get closer to github release and alpha release.
Did a lot of housekeeping and stylistic edits! Preparing for alpha release! (Accidentally coded for too long before a devlog, oopsies.)
Housekeeping is taking way too long… did some style unifying, etc. Did minor structural edits for edge casing, next devlog I will delete my cache and re-do it to test the full experience! Also, collapsable sidebar!
Now toolkits are enable-able (they are too premature for production, they are a beta-feature for the alpha release, I couldn’t really be bothered with more hours of edge case testing and fixing of this specific singular function) and I also added a search bar.
Stopping logic refined, huge unification of toolcall/send direct logic and further housekeeping incl/ with deletion of target/ recompilation, and headless testing (heterogeneous AI testing) and major user testing
Added comprehensive error coding (documentation website tba)
Major housekeeping, css bug fixing too
Made the search bar in toolkits functional and debugged the css-bug in which the model-detail was not aligned with the styles of model-card classes among other bug hunting work
Did comprehensive backend stress testing especially on the health+integrity of backend database structures by forcefully inserting malformed data. Identified around 2-3 vulnerabilities and 2 blunt failures and I will resolve that in the backend by force-sanitising all data that is to be entered
26/26 pass! Mutex connections and database sanitisation is certified and up and running. SO far on the release checklist, half of everything is done!
Prepping for final checks before shipping! Made some assets as well.
The dmg is ready! now, website for product before final shipping…
Docs r out. Just b4 release, I will compile a windows compatible exe too, since I am unsigned on mac!...
|
1792630367.8264303
|
1793235167.8264303
|
|
1507
|
Sub 100 Wh portable power station by @win7 | Stard Sub 100 Wh portable power station by @win7 | Stardance...
|
win7
|
0
|
232.03
|
0
|
[]
|
[{"post_id": 81818, "ts": "202 [{"post_id": 81818, "ts": "2026-10-22T16:59:23Z", "hours": 0.6336, "text": "Finally replaced the MDP1933 MOSFETs with beefier IRFB4110 MOSFETs, but boy was it expensive! Whenever we replace blown MOSFETs, its a good practice to replace the entire array even if one MOSFET is blown and the others work perfectly fine since you never know if the voltage spike or whatever calamity had partially destroyed it (it would fail to close properly, dropping a lot of voltage) Atleast the inverter’s been fixed now (or is it..?) and outputs a clean 230 V RMS. Tested with a 20 W lamp and it works well. Need to replace the 35 A automotive fuse on it as well since it was also blown due to the direct short that occurred, I’m using a piece of solder wire as a temporary substitute (not recommended btw) Need to test with bigger loads to ensure that its back at business and nothing else was damaged due to the overload. Also worked on the Instructable for the past two days while waiting to get the MOSFETs."}, {"post_id": 81032, "ts": "2026-10-19T16:53:58Z", "hours": 0.4167, "text": "Switching to daily devlogs from now on.. Worked on the broken inverter. Tried replacing the MOSFETS with a different ones. The original ones were MDP1933, with a drain to source resistance of less than 5 milliohms, while the ones I replaced with were IRFZ44N and featured a drain to source resistance of 15 milliohms. I need to find a stronger MOSFET than the original MDP1933 used in the build and also upgrade my table’s sticker to gray :D"}, {"post_id": 80699, "ts": "2026-10-18T15:31:28Z", "hours": 9.7653, "text": "After a full 2-week fever, I’m back into business :D. Things aren’t great to start off. To sum it up, the inverter died after I connected a chineese steamer apparently rated for “120 W”, when in reality, it drew around 500 W from my wall. My inverter tried to maintain its voltage and ended up killing its MOSFETS. I really hope the MOSFETS are the only ones damaged."}, {"post_id": 73669, "ts": "2026-09-25T17:07:41Z", "hours": 7.9381, "text": "Had to tear the unit down, do plastic welding since the screw mounting slots broke. Probably I would rate this as a 0/10 in the reparability scale by myself -_-. Also, bypassed the 10 V regulator on the charger boost converter module and now it can work from 9V. Planned to add another separate boost converter for the inverter to prevent inverter’s low voltage protection from kicking in. Bypassed the regulator here as well. I feel kinda lazy and tired, probably will log more time from tomorrow,,"}, {"post_id": 71826, "ts": "2026-09-21T16:47:09Z", "hours": 9.3172, "text": "Had to harvest a boost converter from my old bench power supply, fix it (it was dead shorted due to an internally shorted capacitor) Planning on adding a pre-boost converter for the inverter and the charger functions. They refuse to work below 10.2 V, disregarding 20~30% of battery capacity. Recorded the voltage, current, milliamp hours, power drawn along with time stamps. Gosh, my hands are numb now -_-."}, {"post_id": 71159, "ts": "2026-09-20T11:30:16Z", "hours": 9.6525, "text": "Welp, killed another boost converter. This one failed by having its output voltage always equal to the input voltage no matter what, unlike previously where the boost converter failed as a direct short. Other than this, I spent a lot of time troubleshooting the charging MPPT function, which seemed to not have proper limit and tripped whatever charger I had connected it to. Had to change the values quite a bit but nothing helped. In the end I noticed that the initial_in_voltage variable was set to the absolute minimum trigger point whenever the charger was connected, therefore the condition where the (initial_in_voltage - in_voltage variable <= 0.2) inequation is always held true and therefore the Arduino ramped up the PWM no matter what, it took a ton of time to figure out -_- In addition to this, I had also spent a around 2h in testing the power station regarding its thermals and max. power capability.."}, {"post_id": 70210, "ts": "2026-09-18T18:28:05Z", "hours": 3.8333, "text": "Successfully completed the soft started board in order to prevent the inrush current drawn by the XL4016 module from tripping certain chargers. It felt endless, I had to use 2 NPN transistors in an inverter configuration in order to not use a PNP transistor since I did not have one lol. Also 3D printed and replaced the old battery case for a newer one which has ventilation holes, helping in keeping the battery temperatures low.."}, {"post_id": 70113, "ts": "2026-09-18T14:21:50Z", "hours": 7.6569, "text": "In the process of making the soft starter circuit for the XL4016 module, since the inrush current trips some chargers, I’m set on using a 555 timer chip in order to turn on a relay 2s after powering on the relay. Anyways, tested the bare-bones version of the power station at around 100 W and/or 10A of current and it worked beautifully, though I was scared to my core when doing so, not wanting this setup to blow up like last time which killed the boost converter and both the charger modules."}, {"post_id": 69616, "ts": "2026-09-17T12:56:32Z", "hours": 9.4322, "text": "Printed the left side panel, tried to print the bottom panel but failed, also the BOM list final is ready!! Well, seems like the assembly process is going to be hard due to a ton of wires and obstacles :( Had to trim the direct source connector panel twice for it to fit in the right side panel Boost converter module is held under really high amount of tension probably due to 10mm bolt and nuts. Made orientation and placement mistakes while installing the chargers panel -_-"}, {"post_id": 69073, "ts": "2026-09-16T10:15:00Z", "hours": 9.6933, "text": "Looked through the designs and measurements, edited them when necessary, tested the charging circuit, not sure why but it trips my MacBook’s PD 30 W charger but not my Samsung PD power bank, probably due to inrush currents. After a long conflict, finally printed the right side panel, need to proceed with the left, top, bottom and back panel as well. I don’t know, I’m scared to waste ~100g of filament and ~10h of time over a failed print just because of a dimensional mistake or inaccuracy, I’m just looking through the final model in Fusion 360 countless times,!"}, {"post_id": 68037, "ts": "2026-09-14T12:41:01Z", "hours": 9.7931, "text": "Birthday devlog today🎉! Did a ton more of CAD work, including modification of slots and sketches, and boy was it painful!. I had to re-draw each sketch on top and repeat this once again since I need one for negative extrusion and one for filling the already existing slots. All caused by my poor judgement of the dimensions of the other parts But here I am! Also, had tweaked the code a little, did some power wire replacements and stuff"}, {"post_id": 66828, "ts": "2026-09-12T18:50:31Z", "hours": 7.2039, "text": "Working on the mainboard mount. The mainboard is planned to be mounted on top of the battery pack. Not sure how I’m gonna figure out how to make mounting holes on the bottom panel. Its 12:20 AM rn, need to go to bed,,,"}, {"post_id": 66084, "ts": "2026-09-11T17:35:16Z", "hours": 8.3944, "text": "Probably a really messy workbench right now. Anyways, once again, did quite a bit of working, especially in CAD and 3D printing. Finally, I’ve hit 100% of the program storage space in my Arduino Nano when uploading my code. Need to optimize the code. Had to snap off the screw mounts and the bottom section of the button mount cover for it to fit, fixed it in the later version though. Also, spent 5 full minutes troubleshooting, opening the mainboard out of its case only to find out that nothing was connected (power button, navigation buttons, etc.). Probably, late night fatigue kicking in,,"}, {"post_id": 65290, "ts": "2026-09-10T10:13:56Z", "hours": 9.3603, "text": "Printed out the front panel, got a ton of work to do on the other panels. Thinking of whether or not to add a fuse in series to the direct source connector.. I feel like fitting all of these components into their designated space might be a very tedious task. Its just a pain to measure and ensure everything is in its own designated region and every part seats in properly, and also, found a mini bug, which is to be fixed in the code,,"}, {"post_id": 64192, "ts": "2026-09-08T12:47:58Z", "hours": 7.145, "text": "Printed and assembled the chargers part And also, I’m in the middle of designing the right side panel, gonna take up a ton of time as I’m using hit and trial method"}, {"post_id": 63471, "ts": "2026-09-07T10:49:09Z", "hours": 8.2628, "text": "Completed the modelling part of the inverter case, charger panel and probably also the front panel. Did some minor bug tweaks in the code Also finished cutting the copper sheet for the inverter module"}, {"post_id": 62681, "ts": "2026-09-06T05:13:52Z", "hours": 9.9372, "text": "TERRIBLE NEWS: I lost 3D models of the main front panel, the inverter case AND the chargers panel to a power outage. I know I should’ve saved it but I either complete it and save it or just have them lying in my RAM overnight till it finishes and that power outages are rare for me, but here I am! Completed the bench power supply part, printed the front side in orange and screwed it on the gray bench power supply mount since I’m planning to use orange on gray as opposed to gray on orange. Also added an extra master XT60 connector for direct battery access connections."}, {"post_id": 62043, "ts": "2026-09-05T08:16:17Z", "hours": 5.7331, "text": "Officially over the 100h mark! 🎉 Designed the front plate of the chargers, designed a stencil to drill through the copper sheet that acts as a small ‘heatsoak’, soldered some cables and much more"}, {"post_id": 61095, "ts": "2026-09-03T20:18:00Z", "hours": 9.33, "text": "Did quite a bit of various work today, but the one that made me glad is the successfull printing of the bench power supply part after 5 devastating failed attempts. Designed the case in Fusion 360 Worked on the header connections Worked on the bench power supply part"}, {"post_id": 60231, "ts": "2026-09-02T13:52:59Z", "hours": 8.4903, "text": "Completed the case for the inverter part, switched to digital operation of the fan instead of analog due to never ending problems."}, {"post_id": 58861, "ts": "2026-08-31T13:16:28Z", "hours": 7.7978, "text": "Completed the addition fan and LED interface to the mainboard. I had to add a separate boost converter to the setup. Still the addition of fan causes fluctuation in time to empty readings, need to fix them in code,,"}, {"post_id": 57981, "ts": "2026-08-30T09:57:15Z", "hours": 9.0681, "text": "Finally completed the haptics part, there are still some areas that do not work like intended, but I cannot really do much about it. Designed as well as printed cases for the main board and batteries for enhanced safety. My streak has not extended for today despite 3h of work today.,"}, {"post_id": 56720, "ts": "2026-08-28T16:15:26Z", "hours": 8.8742, "text": "Worked on the haptics for quite a while, still need to add haptic feedback/notification for other messages displayed on the screen, though it is SOO BUGGY! I had to work on it for 3 full days, yet I still feel like the haptic patterns were inconsistent, gotta do more fixing tomorrow, or probably I might focus into something else for a while."}, {"post_id": 54409, "ts": "2026-08-25T12:36:45Z", "hours": 5.1358, "text": "Messed up and messed around using millis(), need more time to debug and fix it (I’m not an expert when it comes to dealing with millis(), open to suggestions), I don’t want to use delay() since it interferes with my mAh measurement in the code. Did a weird contraption of a capacitor, polarity protector diode on a perf board in order to act as a power distribution board since the boost converter had only 1 screw terminal.."}, {"post_id": 53145, "ts": "2026-08-23T16:06:15Z", "hours": 4.215, "text": "I have planned to integrate haptics to the power station too, though traditional ERMs felt too cheap and unreliable, therefore I made something called the “Haptic block”, an LRA (Linear Resonance Actuator)-based haptic actuator, similar to the ones found in flagship smartphones (I’m looking at you, iPhone 6S!). Used a 12V, 6N solenoid along with a MOSFET, resistor and a flyback diode for switching the solenoid with the Arduino board. It works great, started with the coding process, the timings have to be perfect, else, it feels like metal and plastic colliding (though that’s exactly what’s happening XD). With perfect timing though, it enhances the user experience by a lot!"}, {"post_id": 52310, "ts": "2026-08-22T12:55:48Z", "hours": 5.5439, "text": "Took quite a while to try various methods, debug, fix, etc. the MPPT charging. Finally, a transistor pulling the floating 100mV to ground along with an RC filter seems to work, works for now, though not the best way of doing this. (Literally screamed in joy when it finally worked lol :D)"}, {"post_id": 51662, "ts": "2026-08-21T13:48:01Z", "hours": 9.6022, "text": "A week’s worth of devlog, probably I’m gonna switch over to weekly devlogs cuz I’m a bit lazy. Anyways, once again, a ton of changes: First and foremost, replaced the charger modules and the boost converter (Boy was it expensive for me). Added ADS1115 ADC as I needed an extra analog pin for measuring input charging voltage, switched voltage, current and temperature measurement to there as well. Planning on adding 2 more temperature sensors, 1 for the battery and 1 for the charger modules. Working on charging part for now, gonna use MPPT. A mystery addition that I bet nobody can guess (its in the image btw), open to your guesses btw."}, {"post_id": 49024, "ts": "2026-08-17T16:46:02Z", "hours": 4.0364, "text": "A lot of changes and events. Spent almost an hour modifying/testing the charging lightning icon on top of the battery. Fixed the mAh counter Fixed the time to empty counter Edited the power value such that only positive values are shown Killed the boost converter and charger modules, still unsure what caused it but I suspect the boost converter overheating and then finally, a voltage spike killed the charger modules too. Any ideas/opinions are very helpful.."}, {"post_id": 46946, "ts": "2026-08-14T14:53:17Z", "hours": 2.3461, "text": "After 800 lines of code, I finally hit the 2kB RAM ceiling. Did some optimization work on the code. Had to take a backup of the flawless code, try new stuff, in split screen mode between 2 IDE screens"}, {"post_id": 46396, "ts": "2026-08-13T16:02:49Z", "hours": 2.4861, "text": "Completed the chargers part (mainly fixed the power measurement bugs). In addition to that, did the temperature controlled fan part for today, so far works perfectly."}, {"post_id": 45868, "ts": "2026-08-12T16:29:10Z", "hours": 4.4317, "text": "Finally completed the soft-latching power control part in the circuit. 2 Arduino nano(s) were k1lled during the process :*(. Used an N channel MOSFET at first in order to control power going to the Arduino, failed at it, switched to a relay (big mistake), driven by a transistor, finally got out, bought a P channel MOSFET, still driven by an NPN transistor, and in the end, it works flawlessly, gave me immense happiness watching it work flawlessly :D"}, {"post_id": 44056, "ts": "2026-08-09T16:02:34Z", "hours": 3.285, "text": "Did more soldering work, not the prettiest, has a ton of improvements to be made both on the hardware as well as the software side. So far, the charger and the inverter switching part works, need to add a transistor in between the system and the battery in order to turn it off completely when not in use.. Open to suggestions and improvements.."}, {"post_id": 42800, "ts": "2026-08-07T18:17:35Z", "hours": 3.3397, "text": "Burnt some midnight oil to disassemble the breadboard prototype and start with the actual circuitry, soldered a few components so far, yet there’s a lot more to do so, probably gonna take a month to complete -_-."}, {"post_id": 41956, "ts": "2026-08-06T14:15:24Z", "hours": 1.9422, "text": "Worked on the settings screen for a while. Added maximum power limit as well as basic RGB LED colour setting along with EEPROM memory to store the parameters"}, {"post_id": 40710, "ts": "2026-08-04T12:30:27Z", "hours": 1.1986, "text": "Completed drawing the sketch of the portable power station (sorry for the messy work, its the first sketch). Please let me know of any suggestions/improvements.."}, {"post_id": 38209, "ts": "2026-07-31T14:39:56Z", "hours": 1.9614, "text": "Did a lot of tidying and reposition work as well as addition of various controls toggles on and offs."}, {"post_id": 36412, "ts": "2026-07-28T14:57:38Z", "hours": 0.5439, "text": "Added 2 pages: Controls and Info, settings page is still pending.."}, {"post_id": 35897, "ts": "2026-07-27T16:59:50Z", "hours": 0.5722, "text": "Replaced the 20 A BMS with a 40 A one, in order to achieve the full 27 A capability"}, {"post_id": 21533, "ts": "2026-07-03T15:39:47Z", "hours": 0.7169, "text": "Started with the framework of the icons for turning the outputs on or off."}, {"post_id": 20828, "ts": "2026-07-02T15:07:41Z", "hours": 0.3336, "text": "Re-positioned the screen page indicator, fixed a bug that that was present since the start (fun fact: I thought that it was not possible to fix that till yesterday till I remembered “break” statement exists thanks to a dream I had last night using break statement to fix the same)"}, {"post_id": 20105, "ts": "2026-07-01T16:59:16Z", "hours": 0.3414, "text": "Added some adjustments, possibly also a framework of multiple screens."}, {"post_id": 19142, "ts": "2026-06-30T11:57:17Z", "hours": 1.2953, "text": "Completed the temperature reading, temperature warning, as well as temperature controlled fan pwm signal. Bugs: Temperature and PWM value fluctuate greatly when connecting an LED as a test for PWM regulation"}, {"post_id": 18287, "ts": "2026-06-29T12:00:09Z", "hours": 0.9761, "text": "Bare-bone version of the code is ready, works without any major bugs.. Next step: Continue coding of the remaining features and functions (Tested and verified on my trusty breadboard setup)"}]...
|
Title: Sub 100 Wh portable power station by @win7 Title: Sub 100 Wh portable power station by @win7 | Stardance
Devlogs:
Bare-bone version of the code is ready, works without any major bugs.. Next step: Continue coding of the remaining features and functions (Tested and verified on my trusty breadboard setup)
Completed the temperature reading, temperature warning, as well as temperature controlled fan pwm signal. Bugs: Temperature and PWM value fluctuate greatly when connecting an LED as a test for PWM regulation
Added some adjustments, possibly also a framework of multiple screens.
Re-positioned the screen page indicator, fixed a bug that that was present since the start (fun fact: I thought that it was not possible to fix that till yesterday till I remembered “break” statement exists thanks to a dream I had last night using break statement to fix the same)
Started with the framework of the icons for turning the outputs on or off.
Replaced the 20 A BMS with a 40 A one, in order to achieve the full 27 A capability
Added 2 pages: Controls and Info, settings page is still pending..
Did a lot of tidying and reposition work as well as addition of various controls toggles on and offs.
Completed drawing the sketch of the portable power station (sorry for the messy work, its the first sketch). Please let me know of any suggestions/improvements..
Worked on the settings screen for a while. Added maximum power limit as well as basic RGB LED colour setting along with EEPROM memory to store the parameters
Burnt some midnight oil to disassemble the breadboard prototype and start with the actual circuitry, soldered a few components so far, yet there’s a lot more to do so, probably gonna take a month to complete -_-.
Did more soldering work, not the prettiest, has a ton of improvements to be made both on the hardware as well as the software side. So far, the charger and the inverter switching part works, need to add a transistor in between the system and the battery in order to turn it off completely when not in use.. Open to suggestions and improvements..
Finally completed the soft-latching power control part in the circuit. 2 Arduino nano(s) were k1lled during the process :*(. Used an N channel MOSFET at first in order to control power going to the Arduino, failed at it, switched to a relay (big mistake), driven by a transistor, finally got out, bought a P channel MOSFET, still driven by an NPN transistor, and in the end, it works flawlessly, gave me immense happiness watching it work flawlessly :D
Completed the chargers part (mainly fixed the power measurement bugs). In addition to that, did the temperature controlled fan part for today, so far works perfectly.
After 800 lines of code, I finally hit the 2kB RAM ceiling. Did some optimization work on the code. Had to take a backup of the flawless code, try new stuff, in split screen mode between 2 IDE screens
A lot of changes and events. Spent almost an hour modifying/testing the charging lightning icon on top of the battery. Fixed the mAh counter Fixed the time to empty counter Edited the power value such that only positive values are shown Killed the boost converter and charger modules, still unsure what caused it but I suspect the boost converter overheating and then finally, a voltage spike killed the charger modules too. Any ideas/opinions are very helpful..
A week’s worth of devlog, probably I’m gonna switch over to weekly devlogs cuz I’m a bit lazy. Anyways, once again, a ton of changes: First and foremost, replaced the charger modules and the boost converter (Boy was it expensive for me). Added ADS1115 ADC as I needed an extra analog pin for measuring input charging voltage, switched voltage, current and temperature measurement to there as well. Planning on adding 2 more temperature sensors, 1 for the battery and 1 for the charger modules. Working on charging part for now, gonna use MPPT. A mystery addition that I bet nobody can guess (its in the image btw), open to your guesses btw.
Took quite a while to try various methods, debug, fix, etc. the MPPT charging. Finally, a transistor pulling the floating 100mV to ground along with an RC filter seems to work, works for now, though not the best way of doing this. (Literally screamed in joy when it finally worked lol :D)
I have planned to integrate haptics to the power station too, though traditional ERMs felt too cheap and unreliable, therefore I made something called the “Haptic block”, an LRA (Linear Resonance Actuator)-based haptic actuator, similar to the ones found in flagship smartphones (I’m looking at you, iPhone 6S!). Used a 12V, 6N solenoid along with a MOSFET, resistor and a flyback diode for switching the solenoid with the Arduino board. It works great, started with the coding process, the timings have to be perfect, else, it feels like metal and plastic colliding (though that’s exactly what’s happening XD). With perfect timing though, it enhances the user experience by a lot!
Messed up and messed around using millis(), need more time to debug and fix it (I’m not an expert when it comes to dealing with millis(), open to suggestions), I don’t want to use delay() since it interferes with my mAh measurement in the code. Did a weird contraption of a capacitor, polarity protector diode on a perf board in order to act as a power distribution board since the boost converter had only 1 screw terminal..
Worked on the haptics for quite a while, still need to add haptic feedback/notification for other messages displayed on the screen, though it is SOO BUGGY! I had to work on it for 3 full days, yet I still feel like the haptic patterns were inconsistent, gotta do more fixing tomorrow, or probably I might focus into something else for a while.
Finally completed the haptics part, there are still some areas that do not work like intended, but I cannot really do much about it. Designed as well as printed cases for the main board and batteries for enhanced safety. My streak has not extended for today despite 3h of work today.,
Completed the addition fan and LED interface to the mainboard. I had to add a separate boost converter to the setup. Still the addition of fan causes fluctuation in time to empty readings, need to fix them in code,,
Completed the case for the inverter part, switched to digital operation of the fan instead of analog due to never ending problems.
Did quite a bit of various work today, but the one that made me glad is the successfull printing of the bench power supply part after 5 devastating failed attempts. Designed the case in Fusion 360 Worked on the header connections Worked on the bench power supply part
Officially over the 100h mark! 🎉 Designed the front plate of the chargers, designed a stencil to drill through the copper sheet that acts as a small ‘heatsoak’, soldered some cables and much more
TERRIBLE NEWS: I lost 3D models of the main front panel, the inverter case AND the chargers panel to a power outage. I know I should’ve saved it but I either complete it and save it or just have them lying in my RAM overnight till it finishes and that power outages are rare for me, but here I am! Completed the bench power supply part, printed the front side in orange and screwed it on the gray bench power supply mount since I’m planning to use orange on gray as opposed to gray on orange. Also added an extra master XT60 connector for direct battery access connections.
Completed the modelling part of the inverter case, charger panel and probably also the front panel. Did some minor bug tweaks in the code Also finished cutting the copper sheet for the inverter module
Printed and assembled the chargers part And also, I’m in the middle of designing the right side panel, gonna take up a ton of time as I’m using hit and trial method
Printed out the front panel, got a ton of work to do on the other panels. Thinking of whether or not to add a fuse in series to the direct source connector.. I feel like fitting all of these components into their designated space might be a very tedious task. Its just a pain to measure and ensure everything is in its own designated region and every part seats in properly, and also, found a mini bug, which is to be fixed in the code,,
Probably a really messy workbench right now. Anyways, once again, did quite a bit of working, especially in CAD and 3D printing. Finally, I’ve hit 100% of the program storage space in my Arduino Nano when uploading my code. Need to optimize the code. Had to snap off the screw mounts and the bottom section of the button mount cover for it to fit, fixed it in the later version though. Also, spent 5 full minutes troubleshooting, opening the mainboard out of its case only to find out that nothing was connected (power button, navigation buttons, etc.). Probably, late night fatigue kicking in,,
Working on the mainboard mount. The mainboard is planned to be mounted on top of the battery pack. Not sure how I’m gonna figure out how to make mounting holes on the bottom panel. Its 12:20 AM rn, need to go to bed,,,
Birthday devlog today🎉! Did a ton more of CAD work, including modification of slots and sketches, and boy was it painful!. I had to re-draw each sketch on top and repeat this once again since I need one for negative extrusion and one for filling the already existing slots. All caused by my poor judgement of the dimensions of the other parts But here I am! Also, had tweaked the code a little, did some power wire replacements and stuff
Looked through the designs and measurements, edited them when necessary, tested the charging circuit, not sure why but it trips my MacBook’s PD 30 W charger but not my Samsung PD power bank, probably due to inrush currents. After a long conflict, finally printed the right side panel, need to proceed with the left, top, bottom and back panel as well. I don’t know, I’m scared to waste ~100g of filament and ~10h of time over a failed print just because of a dimensional mistake or inaccuracy, I’m just looking through the final model in Fusion 360 countless times,!
Printed the left side panel, tried to print the bottom panel but failed, also the BOM list final is ready!! Well, seems like the assembly process is going to be hard due to a ton of wires and obstacles :( Had to trim the direct source connector panel twice for it to fit in the right side panel Boost converter module is held under really high amount of tension probably due to 10mm bolt and nuts. Made orientation and placement mistakes while installing the chargers panel -_-
In the process of making the soft starter circuit for the XL4016 module, since the inrush current trips some chargers, I’m set on using a 555 timer chip in order to turn on a relay 2s after powering on the relay. Anyways, tested the bare-bones version of the power station at around 100 W and/or 10A of current and it worked beautifully, though I was scared to my core when doing so, not wanting this setup to blow up like last time which killed the boost converter and both the charger modules.
Successfully completed the soft started board in order to prevent the inrush current drawn by the XL4016 module from tripping certain chargers. It felt endless, I had to use 2 NPN transistors in an inverter configuration in order to not use a PNP transistor since I did not have one lol. Also 3D printed and replaced the old battery case for a newer one which has ventilation holes, helping in keeping the battery temperatures low..
Welp, killed another boost converter. This one failed by having its output voltage always equal to the input voltage no matter what, unlike previously where the boost converter failed as a direct short. Other than this, I spent a lot of time troubleshooting the charging MPPT function, which seemed to not have proper limit and tripped whatever charger I had connected it to. Had to change the values quite a bit but nothing helped. In the end I noticed that the initial_in_voltage variable was set to the absolute minimum trigger point whenever the charger was connected, therefore the condition where the (initial_in_voltage - in_voltage variable <= 0.2) inequation is always held true and therefore the Arduino ramped up the PWM no matter what, it took a ton of time to figure out -_- In addition to this, I had also spent a around 2h in testing the power station regarding its thermals and max. power capability..
Had to harvest a boost converter from my old bench power supply, fix it (it was dead shorted due to an internally shorted capacitor) Planning on adding a pre-boost converter for the inverter and the charger functions. They refuse to work below 10.2 V, disregarding 20~30% of battery capacity. Recorded the voltage, current, milliamp hours, power drawn along with time stamps. Gosh, my hands are numb now -_-.
Had to tear the unit down, do plastic welding since the screw mounting slots broke. Probably I would rate this as a 0/10 in the reparability scale by myself -_-. Also, bypassed the 10 V regulator on the charger boost converter module and now it can work from 9V. Planned to add another separate boost converter for the inverter to prevent inverter’s low voltage protection from kicking in. Bypassed the regulator here as well. I feel kinda lazy and tired, probably will log more time from tomorrow,,
After a full 2-week fever, I’m back into business :D. Things aren’t great to start off. To sum it up, the inverter died after I connected a chineese steamer apparently rated for “120 W”, when in reality, it drew around 500 W from my wall. My inverter tried to maintain its voltage and ended up killing its MOSFETS. I really hope the MOSFETS are the only ones damaged.
Switching to daily devlogs from now on.. Worked on the broken inverter. Tried replacing the MOSFETS with a different ones. The original ones were MDP1933, with a drain to source resistance of less than 5 milliohms, while the ones I replaced with were IRFZ44N and featured a drain to source resistance of 15 milliohms. I need to find a stronger MOSFET than the original MDP1933 used in the build and also upgrade my table’s sticker to gray :D
Finally replaced the MDP1933 MOSFETs with beefier IRFB4110 MOSFETs, but boy was it expensive! Whenever we replace blown MOSFETs, its a good practice to replace the entire array even if one MOSFET is blown and the others work perfectly fine since you never know if the voltage spike or whatever calamity had partially destroyed it (it would fail to close properly, dropping a lot of voltage) Atleast the inverter’s been fixed now (or is it..?) and outputs a clean 230 V RMS. Tested with a 20 W lamp and it works well. Need to replace the 35 A automotive fuse on it as well since it was also blown due to the direct short that occurred, I’m using a piece of solder wire as a temporary substitute (not recommended btw) Need to test with bigger loads to ensure that its back at business and nothing else was damaged due to the overload. Also worked on the Instructable for the past two days while waiting to get the MOSFETs....
|
1792702058.5845563
|
1793306858.5845563
|
|
277
|
Kadent by @hacha-mouse | Stardance
|
hacha-mouse
|
1
|
231.72
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-01T15:24:36Z", "hours": 229.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Kadent Kadent is a cross-platform DAW featuring KASL, a domain-specific audio language, and node-graph processing system. Features Create music with familiar track-based UI Two track types: Note Track & Audio Track Node graph for every track KASL language with syntax similar to Swift The node graph allows you to combine multiple KASL programs to perform much more complex processing. What Is a Node Graph? Kadent uses node graph for track processing. A Node is a processing unit that calculates the output. In node graph, an output of one node can be connected to an input of another node. This allows you to connect multiple inputs and outputs freely to other nodes to create sound. Then, why did I adopt node graph? KASL programs can have multiple inputs and outputs, and their types may also vary. So placing them in order does not work because the DAW cannot know which output is connected to the specific input. That’s why Kadent uses node graph. Characteristics of KASL Utilizes Cranelift as a backend for quicker JIT compilation Specialized type of variables such as input , output and state Supports fixed-length arrays and structs Fixed-count loop syntax for predictable execution time Module system influenced by Python Custom infix/prefix/postfix operators (even normal arithmetic operators are defined and provided by std ) KASL Sample Program audio module is built-in module provided by Kadent. Note that these programs below won’t work outside the DAW. Gain Node import audio import std input in = audio.zero_sample() input gain = 0.0 output out = audio.zero_sample() func main() { out = in * [gain; audio.max_channels] } Mix Node import std import std/math/float as f import audio input input_1 = audio.zero_sample() input input_2 = audio.zero_sample() input factor = 0.0 output out = audio.zero_sample() func main() { let clamped_factor = f.clamp(factor, 0.0, 1.0) let multiplied_input_1: audio.Sample = input_1 * [clamped_factor; audio.max_channels] let multiplied_input_2: audio.Sample = input_2 * [1.0 - clamped_factor; audio.max_channels] out = multiplied_input_1 + multiplied_input_2 } Sawtooth Wave Synthesizer import audio as a import std import std/math/float as f input notes = a.EventSlot() input pitch = 1.0 output out = a.zero_sample() state allocator = a.Allocator() let base_freq = 440.0 let volume = 0.1 func main() { allocator.update(notes) var i = 0 loop a.max_voices { let voice = allocator.voices[i] let freq = pitch * base_freq * f.pow(2.0, (voice.pitch - 69.0) / 12.0) if voice.is_active { let t = voice.age let sample = saw(freq: freq, time: t) out = out + [sample * volume; a.max_channels] } i = i + 1 } } func saw(freq f = 440.0, time t: Float) -> Float { return 2.0 * (t * f) % 1.0 - 1.0 } Installation Go to the Releases page of my GitHub repository to download the latest precompiled binary, or compile the binary yourself. Detailed installation steps are described in README .", "repo": "https://github.com/hatya-mouse/kadent", "demo": "https://github.com/hatya-mouse/kadent/releases/tag/v0.1.1"}]...
|
[{"post_id": 81784, "ts": "202 [{"post_id": 81784, "ts": "2026-10-22T14:10:13Z", "hours": 0.8664, "text": "How to add Note Region You can add note region by double-clicking in the timeline. To add notes to it, you need to select the region by clicking it first. Code Editor Error .kdp files are serialized project files, not a source code. You can create a new source file by clicking the src/ directory in the Code Editor. To add a source code to the note track, first open a node graph and add a KASL node to it. In the Inspector, you can specify the path to the source code (e.g. src/example.kasl). Added Some More Documentation I’ve added documentation with screenshots of each panels: Timeline Inspector Automation Node Graph Piano Roll Code Editor"}, {"post_id": 81773, "ts": "2026-10-22T13:18:48Z", "hours": 1.8489, "text": "Added Documentation I saw that the reviewer tried to open the binary project file in the code editor and failed so I’ve decided to add a some sort of tutorial or a documentation. I really wanted to add an interactive tutorial so that the reviewers and the users can know how Kadent works, but I didn’t have time to do so so I’ve just added a few documentation."}, {"post_id": 59408, "ts": "2026-09-01T06:49:17Z", "hours": 17.1803, "text": "Added License Browser It’s been a while since my last devlog! During this time I’ve added an Acknowledgements view where you can look at license text and other informations of the Fonts and Crates that I’ve used. It was a bit difficult to implement because there are so many crates, but I’m satisfied with the result."}, {"post_id": 56435, "ts": "2026-08-28T06:22:03Z", "hours": 41.4536, "text": "Improved code editor I’ve implemented error highlighting in the code editor. I also added a list of errors at the bottom of the code editor, and I can jump to the position of the error by clicking the error. TextEdit in egui does not support highlighting character by character and instead it only highlighting by each sections, so red underlined part may be bigger than the actual error range, but I guess it still looks nice."}, {"post_id": 52794, "ts": "2026-08-23T04:24:09Z", "hours": 10.9353, "text": "sode I’ve created a simple binary serialization crate called “sode” for Kadent. This guarantees that the output binary won’t change even if the struct is modified so I thought it would be better than serde or that sort of serialization library. impl Encode for Note { fn encode ( & self , e : & mut Encoder ) -> Result < (), EncodeError > { e .field ( 0 , & self .start ) ? ; e .field ( 1 , & self .duration ) ? ; e .field ( 2 , & self .pitch ) ? ; e .field ( 3 , & self .velocity ) ? ; Ok (()) } } impl Decode for Note { fn decode ( d : & mut ValueDecoder ) -> Result < Self , DecodeError > { let d = d .to_field_decoder () ? ; Ok ( Note :: new ( d .field ( 0 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 1 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 2 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 3 ) ? .ok_or ( DecodeError :: InvalidData ) ? , )) } }"}, {"post_id": 51188, "ts": "2026-08-20T18:06:44Z", "hours": 4.3567, "text": "Curve type selection I’ve implemented a selection dropdown for three curve types: linear, step, and smooth. Next thing to do is to add a text field to adjust the curve tension"}, {"post_id": 50847, "ts": "2026-08-20T09:11:52Z", "hours": 8.7028, "text": "Automation Automation is here. I’ve implemented an automation node, which is associated with an automation track that you can add keyframes to value that changes over time. You can even connect automation nodes to KASL Node to use the value for calculation!"}, {"post_id": 49569, "ts": "2026-08-18T13:30:07Z", "hours": 4.8889, "text": "Refactored codebase It looks exactly the same as the previous devlog, but I refactored the codebase, primarily the EditorUiState. I separated many members of EditorUiState to multiple small structs for better readability"}, {"post_id": 48851, "ts": "2026-08-17T12:25:43Z", "hours": 7.1642, "text": "Added ruler to piano roll I’ve added the ruler to the piano roll. This will make note placement easier and more intuitive than before. Also I refactored the codebase a little bit, but honestly I thought the previous implementation would be better so I may be putting it back soon."}, {"post_id": 47876, "ts": "2026-08-16T04:17:12Z", "hours": 11.8714, "text": "Add seconds support for region placement I’ve added TimePosition and TimeBounds to store the position of the region. They have two modes: one stores the position in Ticks, and another one stores it in seconds. Ticks and seconds can be calculated from each other using TempoMap."}, {"post_id": 46767, "ts": "2026-08-14T08:06:59Z", "hours": 11.5078, "text": "On-demamd resampling for audio tracks Audio regions require resampling because the sample rate of the source data may differ from the required sample rate. So far, the audio engine for Kadent has been resampling the entire audio data before playback or exporting. However, resampling audio data in advance takes a lot of CPU and increases the time it takes to prepare for playback. This time I made it resample the audio data on demand during playback. This makes audio thread not to store the massive resampled audio data. *sample rate: a value that indicates how many samples are in a single second *sample: a value that represents the sound wave’s loudness at a specific moment in time"}, {"post_id": 45991, "ts": "2026-08-12T20:39:49Z", "hours": 49.1206, "text": "Waveform Rendering & Scroll Bar This time, I’ve mainly implemented two features: waveform rendering and timeline scroll bar. Waveform I’ve added a waveform rendering logic to the timeline. I handled it by generating peak value data to render it quicker than calculating the peak value while rendering. After all, it looks pretty nice and scales perfectly when zooming with my trackpad. Timeline Scroll Bar Another feature I’ve added is a timeline scroll bar. It may not look appealing, but its calculation was quite hard actually. I had to calculate the ratio of the visible area and the entire timeline to get the width of the scroll bar. I think it is lot better than egui’s builtin scroll bar, so I’m quite satisfied with the outcome!"}, {"post_id": 20035, "ts": "2026-07-01T15:15:14Z", "hours": 1.9881, "text": "Ability to adjust project range I’ve implemented a feature that the user can adjust the project’s export range just by dragging the handle in the ruler. Also the actual number is shown in the status bar while the handle is being dragged so the user can know the exact beat where is going to be exported."}, {"post_id": 19709, "ts": "2026-07-01T03:15:36Z", "hours": 23.7522, "text": "Refactored the audio engine I’ve streamlined the note processing logic in the audio engine. So far, the audio engine handled sequenced notes (notes that you can see in the editor) and the realtime MIDI notes that you can play using some MIDI controllers differently. It also lacked maintainability. That’s why I’ve completely rebuilt the logic to unify the process. It also contributed to reduce the amount of code, and I’m happy with that."}, {"post_id": 16801, "ts": "2026-06-27T08:53:19Z", "hours": 3.0306, "text": "Added Status Bar I’ve added a new status bar, which shows some informations such as sample rate, buffer size and the selected content, at the bottom of the window. Fixed Node Graph Rendering Bug The node graph used to be rendered on the front of the header, but I finally fixed this by using Panel to limit the area where painter can draw the graph."}, {"post_id": 15135, "ts": "2026-06-24T16:22:43Z", "hours": 7.1325, "text": "Improved menu design I’ve improved the design of the menu by adjusting the button style. It took quite a long time because of egui’s a little bit confusing styling API. Refactor and optimize the audio engine I’ve refactored the audio engine by using integer ticks to manage time instead of f32 beats. By using integer ticks, it can be calculated even faster and more accurately."}, {"post_id": 12564, "ts": "2026-06-20T14:55:28Z", "hours": 1.1906, "text": "Nested dropdown menu for device selection I’ve improved a device selection feature by nesting the menu. Thanks to this, users can click a single headphones button to change the MIDI ports and output devices. Also I added some icons for these."}, {"post_id": 12510, "ts": "2026-06-20T13:06:52Z", "hours": 1.2117, "text": "Selectable audio output I’ve added a feature to select audio output! It may seem simple but it actually needed refactoring the audio engine and it took a lot of time."}, {"post_id": 12455, "ts": "2026-06-20T10:23:24Z", "hours": 2.4333, "text": "Replacing audio stream when switching devices I’ve implemented a logic in the audio engine, that allows the Kadent DAW to switch the output device. It was challenging because Mixer and MPSC consumers cannot be cloned. Finally I used Arc and Mutex in order to share the context with multiple threads. let callback_ctx = Arc::new(Mutex::new(OutputCallbackContext { mixer, command_cons, midi_cons, vu_prod, pending_project: pending_arc, })); I used try_lock instead of normal lock , which may block the thread, as you can see in the screenshot."}, {"post_id": 9312, "ts": "2026-06-15T16:59:09Z", "hours": 5.6553, "text": "KASL module system improvement So far, KASL compiler didn’t allow us to import external programs with the same name, because the name of the namespace conflicts. Today I have added new alias feature, which can be used like this: import foo as bar With this syntax, you can import a program named foo.kasl and refer to it with bar . This can also improve readability when importing a file with a long name! Streamline compilation I wanted to try compiling Kadent to application that can be installed using an installer, instead of a simple executable binary. I found Taskfile, which is a build tool similar to make but uses a yaml file to define workflows. I found it very useful so I adopted it and it worked very well! Currently I only have workflow for macOS compilation but I want to add Windows and Linux support soon!"}, {"post_id": 8724, "ts": "2026-06-14T14:21:32Z", "hours": 2.6775, "text": "Project creation dialog I’ve implemented new project creation dialog. You can specify the name of the project and select the folder using a picker from the system."}, {"post_id": 8532, "ts": "2026-06-14T06:06:41Z", "hours": 2.6142, "text": "Implemented splash screen I’ve finally finished implementing the splash screen for Kadent. On the left side, there are two buttons for creating or opening a project. The right panel shows the recent projects. Challenge The biggest challenge in implementing the splash screen was to layout UI components. It was quite hard to center the logo and the buttons. I spent around 1hrs dealing with that problem. Here’s how I solved it: const BUTTON_WIDTH : f32 = 300.0 ; const BUTTON_HEIGHT : f32 = 42.0 ; const CONTENT_HEIGHT : f32 = 60.0 + 12.0 + 16.0 + 24.0 + 12.0 + BUTTON_HEIGHT * 2.0 ; impl SplashUi { pub ( super ) fn splash_controls ( & mut self , ui : & mut egui :: Ui ) -> Option < EditorTransition > { ui .vertical_centered (| ui | { // Add space to vertically center the UI parts ui .add_space ( full_height / 2.0 - CONTENT_HEIGHT / 2.0 ); // UI Components }) .inner } } Since centering both horizontally and vertically while calculating the height of the inner content is painful, I eventually hardcoded the height of the UI components in order to center the UI vertically. Logo I’ve also designed a logo for Kadent in the meantime. I tweaked the font called “Inter”, which is available on Google Fonts, for the logo."}, {"post_id": 8172, "ts": "2026-06-13T16:50:03Z", "hours": 7.3775, "text": "Kadent — A DAW with custom language to create synths and effects Refactored project strucure As my codebase became bigger, it started to be a bit complicated, so I’ve refactored the codebase. New folder structure is consist of four directories in src/ directory: commands , core , storage , and ui . commands directory contains the audio engine communication logic. It has some functions like add_note that adds a new note to the specified track and sends the updated project to the audio thread. core directory contains KASLNode implementation and some metadata. KASLNode is a specific node that can literally execute KASL programs. Metadata is a data that are not necessarily tied to audio engine. It includes track colors, track names, region names, etc. storage directory contains some implementation for storing and loading files. It has a logic to save and load the Kadent project file. ui directory contains the UI implementation. Inside the ui directory, there are components , theme , and workspaces directories. components directory has some common UI parts used in various parts of the DAW. theme defines colors and size used in the UI. workspaces contains the UI implementation for the editor and the splash screen. Splash screen I’m currently implementing a splash screen for Kadent. It used to have just two buttons to create or open a project. I’ve just finished implementing “Recent Projects” list. (shown on the right side)"}, {"post_id": 4027, "ts": "2026-06-07T06:23:01Z", "hours": 1.4083, "text": "Implemented multithread track processing for the audio engine using Rayon ! I used to think implementing multithreading would be a nightmare, but I utilized Rayon which was actually very intuitive and easy to use. The screenshot shows the exact code where the tracks are being processed in parallel."}, {"post_id": 30, "ts": "2026-05-31T09:44:30Z", "hours": 1.7811, "text": "I am working on a WASM backend for my KASL language!"}]...
|
Title: Kadent by @hacha-mouse | Stardance
Devlogs Title: Kadent by @hacha-mouse | Stardance
Devlogs:
I am working on a WASM backend for my KASL language!
Implemented multithread track processing for the audio engine using Rayon ! I used to think implementing multithreading would be a nightmare, but I utilized Rayon which was actually very intuitive and easy to use. The screenshot shows the exact code where the tracks are being processed in parallel.
Kadent — A DAW with custom language to create synths and effects Refactored project strucure As my codebase became bigger, it started to be a bit complicated, so I’ve refactored the codebase. New folder structure is consist of four directories in src/ directory: commands , core , storage , and ui . commands directory contains the audio engine communication logic. It has some functions like add_note that adds a new note to the specified track and sends the updated project to the audio thread. core directory contains KASLNode implementation and some metadata. KASLNode is a specific node that can literally execute KASL programs. Metadata is a data that are not necessarily tied to audio engine. It includes track colors, track names, region names, etc. storage directory contains some implementation for storing and loading files. It has a logic to save and load the Kadent project file. ui directory contains the UI implementation. Inside the ui directory, there are components , theme , and workspaces directories. components directory has some common UI parts used in various parts of the DAW. theme defines colors and size used in the UI. workspaces contains the UI implementation for the editor and the splash screen. Splash screen I’m currently implementing a splash screen for Kadent. It used to have just two buttons to create or open a project. I’ve just finished implementing “Recent Projects” list. (shown on the right side)
Implemented splash screen I’ve finally finished implementing the splash screen for Kadent. On the left side, there are two buttons for creating or opening a project. The right panel shows the recent projects. Challenge The biggest challenge in implementing the splash screen was to layout UI components. It was quite hard to center the logo and the buttons. I spent around 1hrs dealing with that problem. Here’s how I solved it: const BUTTON_WIDTH : f32 = 300.0 ; const BUTTON_HEIGHT : f32 = 42.0 ; const CONTENT_HEIGHT : f32 = 60.0 + 12.0 + 16.0 + 24.0 + 12.0 + BUTTON_HEIGHT * 2.0 ; impl SplashUi { pub ( super ) fn splash_controls ( & mut self , ui : & mut egui :: Ui ) -> Option < EditorTransition > { ui .vertical_centered (| ui | { // Add space to vertically center the UI parts ui .add_space ( full_height / 2.0 - CONTENT_HEIGHT / 2.0 ); // UI Components }) .inner } } Since centering both horizontally and vertically while calculating the height of the inner content is painful, I eventually hardcoded the height of the UI components in order to center the UI vertically. Logo I’ve also designed a logo for Kadent in the meantime. I tweaked the font called “Inter”, which is available on Google Fonts, for the logo.
Project creation dialog I’ve implemented new project creation dialog. You can specify the name of the project and select the folder using a picker from the system.
KASL module system improvement So far, KASL compiler didn’t allow us to import external programs with the same name, because the name of the namespace conflicts. Today I have added new alias feature, which can be used like this: import foo as bar With this syntax, you can import a program named foo.kasl and refer to it with bar . This can also improve readability when importing a file with a long name! Streamline compilation I wanted to try compiling Kadent to application that can be installed using an installer, instead of a simple executable binary. I found Taskfile, which is a build tool similar to make but uses a yaml file to define workflows. I found it very useful so I adopted it and it worked very well! Currently I only have workflow for macOS compilation but I want to add Windows and Linux support soon!
Replacing audio stream when switching devices I’ve implemented a logic in the audio engine, that allows the Kadent DAW to switch the output device. It was challenging because Mixer and MPSC consumers cannot be cloned. Finally I used Arc and Mutex in order to share the context with multiple threads. let callback_ctx = Arc::new(Mutex::new(OutputCallbackContext { mixer, command_cons, midi_cons, vu_prod, pending_project: pending_arc, })); I used try_lock instead of normal lock , which may block the thread, as you can see in the screenshot.
Selectable audio output I’ve added a feature to select audio output! It may seem simple but it actually needed refactoring the audio engine and it took a lot of time.
Nested dropdown menu for device selection I’ve improved a device selection feature by nesting the menu. Thanks to this, users can click a single headphones button to change the MIDI ports and output devices. Also I added some icons for these.
Improved menu design I’ve improved the design of the menu by adjusting the button style. It took quite a long time because of egui’s a little bit confusing styling API. Refactor and optimize the audio engine I’ve refactored the audio engine by using integer ticks to manage time instead of f32 beats. By using integer ticks, it can be calculated even faster and more accurately.
Added Status Bar I’ve added a new status bar, which shows some informations such as sample rate, buffer size and the selected content, at the bottom of the window. Fixed Node Graph Rendering Bug The node graph used to be rendered on the front of the header, but I finally fixed this by using Panel to limit the area where painter can draw the graph.
Refactored the audio engine I’ve streamlined the note processing logic in the audio engine. So far, the audio engine handled sequenced notes (notes that you can see in the editor) and the realtime MIDI notes that you can play using some MIDI controllers differently. It also lacked maintainability. That’s why I’ve completely rebuilt the logic to unify the process. It also contributed to reduce the amount of code, and I’m happy with that.
Ability to adjust project range I’ve implemented a feature that the user can adjust the project’s export range just by dragging the handle in the ruler. Also the actual number is shown in the status bar while the handle is being dragged so the user can know the exact beat where is going to be exported.
Waveform Rendering & Scroll Bar This time, I’ve mainly implemented two features: waveform rendering and timeline scroll bar. Waveform I’ve added a waveform rendering logic to the timeline. I handled it by generating peak value data to render it quicker than calculating the peak value while rendering. After all, it looks pretty nice and scales perfectly when zooming with my trackpad. Timeline Scroll Bar Another feature I’ve added is a timeline scroll bar. It may not look appealing, but its calculation was quite hard actually. I had to calculate the ratio of the visible area and the entire timeline to get the width of the scroll bar. I think it is lot better than egui’s builtin scroll bar, so I’m quite satisfied with the outcome!
On-demamd resampling for audio tracks Audio regions require resampling because the sample rate of the source data may differ from the required sample rate. So far, the audio engine for Kadent has been resampling the entire audio data before playback or exporting. However, resampling audio data in advance takes a lot of CPU and increases the time it takes to prepare for playback. This time I made it resample the audio data on demand during playback. This makes audio thread not to store the massive resampled audio data. *sample rate: a value that indicates how many samples are in a single second *sample: a value that represents the sound wave’s loudness at a specific moment in time
Add seconds support for region placement I’ve added TimePosition and TimeBounds to store the position of the region. They have two modes: one stores the position in Ticks, and another one stores it in seconds. Ticks and seconds can be calculated from each other using TempoMap.
Added ruler to piano roll I’ve added the ruler to the piano roll. This will make note placement easier and more intuitive than before. Also I refactored the codebase a little bit, but honestly I thought the previous implementation would be better so I may be putting it back soon.
Refactored codebase It looks exactly the same as the previous devlog, but I refactored the codebase, primarily the EditorUiState. I separated many members of EditorUiState to multiple small structs for better readability
Automation Automation is here. I’ve implemented an automation node, which is associated with an automation track that you can add keyframes to value that changes over time. You can even connect automation nodes to KASL Node to use the value for calculation!
Curve type selection I’ve implemented a selection dropdown for three curve types: linear, step, and smooth. Next thing to do is to add a text field to adjust the curve tension
sode I’ve created a simple binary serialization crate called “sode” for Kadent. This guarantees that the output binary won’t change even if the struct is modified so I thought it would be better than serde or that sort of serialization library. impl Encode for Note { fn encode ( & self , e : & mut Encoder ) -> Result < (), EncodeError > { e .field ( 0 , & self .start ) ? ; e .field ( 1 , & self .duration ) ? ; e .field ( 2 , & self .pitch ) ? ; e .field ( 3 , & self .velocity ) ? ; Ok (()) } } impl Decode for Note { fn decode ( d : & mut ValueDecoder ) -> Result < Self , DecodeError > { let d = d .to_field_decoder () ? ; Ok ( Note :: new ( d .field ( 0 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 1 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 2 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 3 ) ? .ok_or ( DecodeError :: InvalidData ) ? , )) } }
Improved code editor I’ve implemented error highlighting in the code editor. I also added a list of errors at the bottom of the code editor, and I can jump to the position of the error by clicking the error. TextEdit in egui does not support highlighting character by character and instead it only highlighting by each sections, so red underlined part may be bigger than the actual error range, but I guess it still looks nice.
Added License Browser It’s been a while since my last devlog! During this time I’ve added an Acknowledgements view where you can look at license text and other informations of the Fonts and Crates that I’ve used. It was a bit difficult to implement because there are so many crates, but I’m satisfied with the result.
Added Documentation I saw that the reviewer tried to open the binary project file in the code editor and failed so I’ve decided to add a some sort of tutorial or a documentation. I really wanted to add an interactive tutorial so that the reviewers and the users can know how Kadent works, but I didn’t have time to do so so I’ve just added a few documentation.
How to add Note Region You can add note region by double-clicking in the timeline. To add notes to it, you need to select the region by clicking it first. Code Editor Error .kdp files are serialized project files, not a source code. You can create a new source file by clicking the src/ directory in the Code Editor. To add a source code to the note track, first open a node graph and add a KASL node to it. In the Inspector, you can specify the path to the source code (e.g. src/example.kasl). Added Some More Documentation I’ve added documentation with screenshots of each panels: Timeline Inspector Automation Node Graph Piano Roll Code Editor
Ships:
Kadent Kadent is a cross-platform DAW featuring KASL, a domain-specific audio language, and node-graph processing system. Features Create music with familiar track-based UI Two track types: Note Track & Audio Track Node graph for every track KASL language with syntax similar to Swift The node graph allows you to combine multiple KASL programs to perform much more complex processing. What Is a Node Graph? Kadent uses node graph for track processing. A Node is a processing unit that calculates the output. In node graph, an output of one node can be connected to an input of another node. This allows you to connect multiple inputs and outputs freely to other nodes to create sound. Then, why did I adopt node graph? KASL programs can have multiple inputs and outputs, and their types may also vary. So placing them in order does not work because the DAW cannot know which output is connected to the specific input. That’s why Kadent uses node graph. Characteristics of KASL Utilizes Cranelift as a backend for quicker JIT compilation Specialized type of variables such as input , output and state Supports fixed-length arrays and structs Fixed-count loop syntax for predictable execution time Module system influenced by Python Custom infix/prefix/postfix operators (even normal arithmetic operators are defined and provided by std ) KASL Sample Program audio module is built-in module provided by Kadent. Note that these programs below won’t work outside the DAW. Gain Node import audio import std input in = audio.zero_sample() input gain = 0.0 output out = audio.zero_sample() func main() { out = in * [gain; audio.max_channels] } Mix Node import std import std/math/float as f import audio input input_1 = audio.zero_sample() input input_2 = audio.zero_sample() input factor = 0.0 output out = audio.zero_sample() func main() { let clamped_factor = f.clamp(factor, 0.0, 1.0) let multiplied_input_1: audio.Sample = input_1 * [clamped_factor; audio.max_channels] let multiplied_input_2: audio.Sample = input_2 * [1.0 - clamped_factor; audio.max_channels] out = multiplied_input_1 + multiplied_input_2 } Sawtooth Wave Synthesizer import audio as a import std import std/math/float as f input notes = a.EventSlot() input pitch = 1.0 output out = a.zero_sample() state allocator = a.Allocator() let base_freq = 440.0 let volume = 0.1 func main() { allocator.update(notes) var i = 0 loop a.max_voices { let voice = allocator.voices[i] let freq = pitch * base_freq * f.pow(2.0, (voice.pitch - 69.0) / 12.0) if voice.is_active { let t = voice.age let sample = saw(freq: freq, time: t) out = out + [sample * volume; a.max_channels] } i = i + 1 } } func saw(freq f = 440.0, time t: Float) -> Float { return 2.0 * (t * f) % 1.0 - 1.0 } Installation Go to the Releases page of my GitHub repository to download the latest precompiled binary, or compile the binary yourself. Detailed installation steps are described in README ....
|
1792821302.779773
|
1792907702.779773
|
|
4644
|
Zero-Assist by @Tan-May | Stardance
|
Tan-May
|
0
|
229.35
|
0
|
[]
|
[{"post_id": 40727, "ts": "202 [{"post_id": 40727, "ts": "2026-08-04T13:20:13Z", "hours": 13.7692, "text": "Check this out !! so yesterday i finished with the MCP implementation of the app , i implemented 4 transport method (STDIO,,HTTP,SSE and the LOCALHOST_STDIO) so when i was testing out i found out that only one of them is working properly , (the http one ) to which i connected multiple apps , mcp’s etc everything was working fine but when i tested the other transport method , not even a single one was working because it all needed the desktop to run with the specific packages so unfortunately i was not able to use it and i also find out about the nasa mcp where they daily upload the images mars rover images etc so i tried to test it but the problem was that the mcp was not http instead it was the STDIO so i was sad cause i had to fix first the mcp issue then test it but when i was in school in break i was getting board and opened the app and i had an idea like cant we just convert the normal stdio into the http mcp using the termux ? after asking to claude it said definitely we can do this so then i setuped the env(i will add a screenshot below ) and made a proxy server which converts the normal stdio mcp to the http steamtable and i was then able to access it locally using my app (i will add the image of it too) and i managed to connect to the mcp and fetch the images , now everything is working completely fine just the remaining part is the remaining transport which i will fix it some how !! also i will add some images i fetched below"}, {"post_id": 39007, "ts": "2026-08-01T17:30:37Z", "hours": 3.4689, "text": "Update !!! new devlog here … so now after doing some more research on the mcps and the implementation plans etc etc now im finally going all on it , ive added a ui component of the MCP in the Connection/Plugin/MCP , where i added few premade mcp options like (GitHub , brave search , external postgre sql etc ..) also there i added the option of the add custom server in which use can add custom server where currently the transport options are (STDIO,HTTP,SSE,LOCALHOST_STDIO (where you can add local mcp servers using the apps like termux etc ) so now that the ui is completed now i will move on to the connection part of the ui to the backend rust engine via uniffi )"}, {"post_id": 38224, "ts": "2026-07-31T14:56:23Z", "hours": 2.8122, "text": "Devlog time :> so now I’m continuing with the implementation of the MCP in the app like i previously talked now when i did some tinkering with the rust code using the ai , i managed to get all the connected MCP tools into the config file of the ai the config is getting updated now but the problem is that the config is constantly keeps changing don’t know what’s happening i guess the the problem is in the toml config generator which is glitching out , so now im trying fixing it from lots of time now , i guess i might have to use the antigravity to fix this but i exhausted my weekly limit cause I’m on a free tier 😭😭.. ill catch up with yall later till then bye bye 🙆.."}, {"post_id": 38050, "ts": "2026-07-31T07:21:16Z", "hours": 3.8936, "text": "Hello Hello Hello new devlog here , so now i started with the implementation of the MCP believe me guys once the app gets the MCP the app will go to another level , like it will then support literally any app (any app) it can perform actions like the mcp does but in simpler way also when i started with implementation i hit the problem again the code is there in the zeroclaw engine but again the problem is that its meant to run on the desktop so now we again have to do some changes in code and make the mcp run natively on the phone , i also found out some resources to do it like ( https://github.com/modelcontextprotocol/kotlin-sdk ) which is good so now the idea is something similar like shown in the screenshot below taken from the chat gpt …."}, {"post_id": 37593, "ts": "2026-07-30T13:01:48Z", "hours": 7.1106, "text": "Devlog here , so now i added the new cool animation (thinking orb ) this animation was totally inspired from the ( https://orbs.jakubantalik.com/ ) but the problem was that the orb was written in the typescript which wont work in our app cause our app is written in the kotlin so what i did was i downloaded the zip file from the repo pasted it to the claude and told him to convert it into kotlin for me and surprisingly the results was amazing , i will share the video recording too , and the other part i worked on was i added a few voices for my apps from the hugging face so now the user can use the custom voices too and also if he wants to use some of the default voices , the option is there do download in the app, some voices ( https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_GB/alan/medium/en_GB-alan-medium.onnx ) for someone whose interested …"}, {"post_id": 34542, "ts": "2026-07-25T10:46:59Z", "hours": 5.4758, "text": "Devlog: Google Workspace Integration This week I worked on integrating Google Workspace into Zero-Assist , allowing the AI to securely access services like Gmail, Google Drive, Google Docs, and Google Sheets after the user grants permission. The ZeroClaw engine already supports Google Workspace CLI (GWS) , but it was originally built for desktop Linux and expects a desktop environment with GWS already installed. Since Zero-Assist runs inside an Alpine Linux sandbox on Android using PRoot , that approach doesn’t work directly. Instead of rewriting the integration, I kept the existing architecture and adapted it for Android. What I Implemented I modified the sandbox installation process so that GWS is installed automatically whenever the user installs the standard sandbox packages. This means users don’t need to manually install or configure the CLI. Inside the app, I added a new Google Workspace plugin under: Connections → Plugins → Installed → Google Workspace When the user signs in, the Android app completes the OAuth flow and generates the required Google Workspace configuration files. To bridge Android and the Linux sandbox, I use the existing Android ↔ PRoot bridge . The plan is: User Login ↓ Android creates GWS credentials ↓ Credentials copied into PRoot sandbox ↓ Sandbox GWS CLI uses the same credentials ↓ AI can access approved Google services This keeps authentication native while allowing the Linux CLI to work without requiring the user to touch the terminal. Google Cloud Setup I also created a dedicated Google Cloud Console project for Zero-Assist. The project uses a Web Application OAuth client , which is required by the Google Workspace CLI authentication flow. I enabled the necessary APIs, including: Gmail API Google Drive API Google Docs API Google Sheets API More APIs can be enabled as additional integrations are added. Current Problem The authentication flow itself works correctly, and users can successfully sign in. The issue is that the generated credential/configuration files are not being copied correctly into the Linux sandbox . Because of this, the sandboxed GWS CLI cannot find the required authentication files, causing every Google Workspace command to fail. The current challenge isn’t OAuth—it’s reliably synchronizing credentials between Android and the PRoot environment. Once this bridge is working, users will simply sign in once, choose which Google services they want to grant access to, and Zero-Assist will be able to securely interact with those services without any manual setup. note:This devlog is written with hands and then passed to the chatgpt to format it with the .md because im very lazy to play with those colons and #’s"}, {"post_id": 33937, "ts": "2026-07-24T08:09:07Z", "hours": 6.6875, "text": "Device Control Development Update Yesterday I worked on expanding the Device Control system in my AI assistant. The idea behind this feature is to allow the AI to perform real actions on an Android device using the Accessibility Service . When the user gives a command such as “Subscribe to MrBeast on YouTube” , the main AI analyzes the request and delegates it to the Device Control tool. Current Workflow Launch the required application using: PackageManager.getLaunchIntentForPackage() startActivity() Capture a compressed screenshot of the current screen. Analyze the screenshot to identify UI elements and their screen coordinates. Navigate the interface and perform actions through the Android Accessibility APIs. Current Features Open applications Tap at (x, y) Swipe gestures Type text These core primitives allow the AI to interact with almost any Android application through UI automation. Future Improvements My main goals are to improve both speed and accuracy . Instead of navigating through multiple screens for simple system operations, I plan to add native high-level commands directly into the Device Control tool, such as: flashlight_toggle wifi_toggle bluetooth_toggle mobile_data_toggle volume_set brightness_set take_screenshot lock_screen open_notifications open_quick_settings go_home go_back open_recents These commands will allow the AI to execute common Android actions instantly without relying on visual navigation. For more complex tasks—such as interacting with third-party applications—the tool will continue using the screenshot + coordinate-based navigation pipeline. Long-Term Vision The goal is to build a hybrid Device Control system: Native commands for common Android operations (fast, reliable, and efficient). Vision-guided UI automation for complex interactions within any application. This architecture will significantly reduce execution time, improve reliability, and make the assistant capable of handling virtually any task on an Android device."}, {"post_id": 33134, "ts": "2026-07-22T19:18:54Z", "hours": 15.1933, "text": "So i basically went through the whole device control system and hardened it. the planner was splitting compound goals like “open instagram and message rohit” into separate calls which broke everything. also fixed it so the loop doesn’t just bail on the first response - it actually executes the action first. scroll was crashing if the planner didn’t send a direction so now it defaults down. and exceptions in the callback handler were just silently killing the process so now everything is caught and logged properly. added loop detection so it doesn’t get stuck repeating the same thing, post-action screen verification, and 44 tests to cover it all. very happy that it worked , it took lots of time but eventually i think the results are very very good though this thing not works great on the local ai’s but with the cheap api like openrouter/free , this thing can give pretty good results"}, {"post_id": 32219, "ts": "2026-07-21T07:52:35Z", "hours": 20.9892, "text": "okay so after spending lots of time on this issue , im finally able to make this work again , the problem was that (bin/sh, ust/bin/env) never extracted because of one code issue where i accidently mentioned them as the read only memory in the apps storage so the distro was installing also getting extracted but becacuse of the read only type of file , the app was not able to perform any actions on it , so now after taking the help from the open code now the sandbox is fully functional and working on every devices , also ive added some default packages which will get installed during the setup of the sandbox such as (wget, git , python3, jq, py3-pip, nodejs ,lftp and the openssh-client) just using the single command (apk add –no-cache bash curl wget git jq python3 py3-pip nodejs openssh-client lftp rsync)"}, {"post_id": 30521, "ts": "2026-07-18T05:11:12Z", "hours": 13.5486, "text": "Hello guys, devlog here!I finally got the Linux sandbox in Zero-Assist working end-to-end! The sandbox runs Alpine Linux through PRoot directly on Android without requiring root.Getting it working was harder than expected, though. I ran into several Android-specific issues.Fixing the SandboxThe first problem was Alpine’s heavy use of BusyBox hardlinks. My TAR extractor used File.copyTo(), which didn’t preserve executable permissions, causing errors like:proot error: execve(“/bin/sh”): Permission denied I fixed this by preserving executable bits:linkTarget.copyTo(outFile, overwrite = true) if (linkTarget.canExecute()) { outFile.setExecutable(true, false) } Some hardlinks were also extracted before BusyBox itself, so I added a second repair pass after extraction to restore critical commands like /bin/sh, /bin/ls, and /bin/cat.Symlinks were another problem because Android can block their creation. I added a fallback that copies the target when creating the actual symlink fails:try { Files.createSymbolicLink(outFile.toPath(), Paths.get(linkName)) } catch (e: Exception) { fallback.copyTo(outFile, overwrite = true) } I also had problems directly executing PRoot because some Android app directories can be noexec. The solution was to launch PRoot through Android’s system linker:val args = arrayOf( “/system/bin/linker64”, prootPath, “–rootfs=$rootfsPath”, “/bin/sh”, “-c”, command ) I also added corrupted download detection and automatic Alpine mirror fallback, making the rootfs installation much more reliable.Giving the AI Linux ToolsAfter getting the sandbox stable, I added two AI tools:sandbox_execute — Executes commands inside Alpine and supports persistent shell state, working directories, environment variables, timeouts, and background processes.sandbox_manage_process — Lets the AI list, monitor, read logs from, and kill background processes.For example, the AI can execute:{ “command”: “python3 –version && uname -a”, “working_dir”: “/root” } Or start a background server:{ “command”: “python3 -m http.server 8000”, “background”: true } The execution pipeline now looks like:AI Agent ↓ Rust Tool Layer ↓ Authenticated Local HTTP Bridge ↓ Kotlin Sandbox Manager ↓ PRoot ↓ Alpine Linux The Rust runtime communicates with the Kotlin sandbox through a localhost bridge on 127.0.0.1:49481, protected by a randomly generated per-process bearer token.And now the sandbox is fully functional end-to-end!The AI can execute real Linux commands, install packages, maintain persistent shell sessions, run scripts, start background processes, inspect their logs, and manage them — all inside Alpine Linux running directly on Android without root.This was one of the hardest parts of Zero-Assist so far, but now the AI finally has its own real Linux environment to work with."}, {"post_id": 29333, "ts": "2026-07-16T06:39:51Z", "hours": 11.0894, "text": "Giving Zero-Assist Its Own Linux Sandbox A lot of features I want in Zero-Assist need actual Linux tools: shell commands, Python, Git, Node.js, CLI tools, etc. I didn’t want this to require root, so I built a local Alpine Linux sandbox using PRoot that runs entirely on-device. The architecture is basically: AI daemon → sandbox tool → HTTP bridge → Kotlin sandbox manager → PRoot → Alpine Getting PRoot running One annoying problem was Android’s noexec restrictions. PRoot is stored inside the app’s data/native library directory and can’t always be executed normally. The solution was launching it through Android’s dynamic linker: private fun buildProcessArgs ( command : String , workingDir : String ): Array < String > { val args = arrayOf ( prootPath , \"--rootfs=$rootfsPath\" , \"--bind=/dev\" , \"--bind=/proc\" , \"--bind=/sys\" , \"--bind=$homePath:/root\" , \"--bind=$tmpPath:/tmp\" , \"-0\" , \"-w\" , workingDir , \"/bin/sh\" , \"-c\" , command ) return if ( ANDROID_LINKER != null ) arrayOf ( ANDROID_LINKER , * args ) else args } So commands effectively go through: /system/bin/linker64 → PRoot → Alpine → command This lets the bundled PRoot code run despite the noexec restriction. Connecting Rust and Kotlin My AI daemon is written in Rust, while the sandbox is managed by Kotlin. I connected them using a small NanoHTTPD server running only on localhost. return when ( session . uri ) { \"/health\" -> handleHealth () \"/execute\" -> handleExecute ( session ) \"/manage_process\" -> handleManageProcess ( session ) else -> errorJson ( Response . Status . NOT_FOUND , \"Unknown path: ${session.uri}\" ) } The Rust daemon sends authenticated requests to 127.0.0.1:49481 . The AI currently gets two tools: sandbox_execute - run Linux commands sandbox_manage_process - manage background processes Persistent shell sessions I wanted the sandbox to behave like an actual terminal instead of starting from scratch for every command. If the AI runs: cd /root/project export TEST = hello the next tool call stays in /root/project and keeps the environment variable. Each conversation gets a separate persistent shell: Conversation A → Shell A Conversation B → Shell B This keeps cwd/environment state while preventing different conversations from affecting each other. Background commands are isolated differently. Each one gets a separate PRoot executor and is tracked by a process manager. The AI can start a long-running command, continue doing other things, then check its logs or kill it later. Installing Alpine The sandbox manager handles the full setup: Download Alpine → Extract → Fix hardlinks/permissions → apk update → Install tools → Ready The hardlink fix was needed because some Alpine tar entries reference files that haven’t been extracted yet, which caused extraction failures on Android. Right now the sandbox comes with Bash, Python + pip, Node.js, Git, curl, wget, jq, SSH, lftp and rsync. The main parts are: ProotExecutor - executes commands LinuxSandboxManager - lifecycle/setup SandboxBridgeServer - Rust ↔ Kotlin bridge SandboxProcessManager - background processes PersistentSandboxShell - per-conversation shell state There is still more I want to improve, especially filesystem sharing, networking and reliability for longer agent tasks. But the main system is finally working: Zero-Assist can now give an AI agent a real Linux userspace running locally inside an Android app without requiring root. This started with the idea of somehow giving the AI a tiny Linux computer inside the app. Now it actually has one."}, {"post_id": 28451, "ts": "2026-07-14T18:16:53Z", "hours": 4.185, "text": "Giving My Android AI App Its Own Linux Sandbox One of the biggest problems with my app was that a lot of the features I wanted to build actually needed a real desktop environment. Things like: Running shell commands Browser automation Using desktop CLI tools Installing packages on demand Running scripts ZeroClaw already supports these kinds of capabilities, but on Android I couldn’t really use them to their full potential. The app simply didn’t have an environment that could support everything properly. So I decided… Why not give the app its own minimal Linux desktop? The Initial Research Luckily, I already had some experience with Linux. I had previously played around with: Linux distros PRoot chroot Minimal desktop environments So I started looking at every possible approach. Option 1 — Android’s default shell At first I thought about using the shell that every Android app already gets. It looked simple. But after experimenting with it, I realized it was missing a lot of the commands and tools I actually needed. That completely defeated the purpose of having a proper sandbox. So I dropped that idea. Option 2 — chroot Next I started researching chroot. Honestly, from a technical point of view, chroot is amazing. It gets extremely close to a real Linux environment. Performance is great and it behaves much more like an actual desktop installation. There was only one problem. It requires a rooted device. That was an immediate deal breaker. I don’t want someone to root their phone just to use my app. So chroot was out too. Option 3 — PRoot After a lot of brainstorming, reading documentation, and trying different ideas, I finally settled on PRoot. It isn’t perfect. There are still some limitations compared to a real Linux installation, but I’ll talk about those another time. The important part is this: No root required Works on normal Android devices Can run a real Linux userspace Supports the tools my AI actually needs For what I’m trying to build, it was the best balance. Choosing the distro I wanted something lightweight. Really lightweight. So I picked Alpine Linux . The base image is around 5 MB . Yes… Literally 5 MB. After installing the packages I consider “essential” for the AI (things like Python, pip, curl, git, etc.), the whole environment comes to roughly 700 MB . That gives the AI a solid starting point without making users download multiple gigabytes on day one. If more tools are needed later, the AI can simply install them inside the sandbox. Current Progress I’ve finally started implementing everything. So far I’ve added: sandbox_client.rs sandbox_main.kt Configuration files for the sandbox Default package lists that will be installed automatically There’s still a lot left to build, but the foundation is finally there. This is probably one of the biggest architectural changes I’ve made to the app so far. Instead of trying to force Android to behave like a desktop, I’m giving the AI its own Linux environment that it can actually work inside. Still a long way to go !!! MAKE SURE TO FOLLOW THE PROJECT YES THE IMAGE IS AI GENETRATED , BUT I DIDNT KNOW WHAT TO DO FOR BETTER EXPLAINATION SO I DID IT :D"}, {"post_id": 25882, "ts": "2026-07-10T11:26:04Z", "hours": 11.9064, "text": "After long time … hello guys making this devlog after very long time , i had an issue ,when i was cleaning up my project , removing the dead code and optimizing the app where i was taking the help of the antigravity for this , i accidently deleted the hardware side in the zero claw (engine of zero assist) which was in beta i was just remaining to test it because i didn’t have any proper hardware to do it so it was remaining to test and unfortunately i didn’t even had the code pushed on the GitHub which made the situation worst so now I’ve nearly fixed it , the app is successfully building properly and now I’ve decided to push the code every day if possible on the GitHub to avoid this type of things and I’m writing this devlog because of the new rule i came by where only 10 hrs. will be counted MY BAD LUCK now my 12 hrs. are going to waste 😭😭because i was not uploading the devlog and the time increased so uploading this asap so that my next time will be counted !!"}, {"post_id": 12384, "ts": "2026-06-20T06:53:41Z", "hours": 26.2319, "text": "Devlog #8 — Zero-Assist I added a Skills Section to Zero-Assist, and it’s probably one of the more useful things we’ve shipped so far. What It Is Skills are installable modules built by the Zeroclaw community that extend what the app can do. Things like Doc Writer, Auto-Coder, and more — each one teaches the app how to handle a specific type of task better. Install one, and Zero-Assist reads it and starts applying it automatically. No setup, no configuration, just tap and it works. These aren’t shortcuts or preset prompts. The app actually understands the skill and uses it to make smarter decisions when you’re working. Always Growing The library isn’t static. The community keeps adding new skills and updating existing ones, so the app naturally gets more capable over time without needing a big update from our end. Whatever gets added is available to you immediately. Big thanks to everyone in the Zeroclaw community who built and contributed skills — this whole section runs on your work. What’s Next We’re making it easier for more people to submit skills, and we’re looking at adding ratings and changelogs so you can track what’s new and what’s worth installing. More soon."}, {"post_id": 9693, "ts": "2026-06-16T03:16:35Z", "hours": 2.8722, "text": "Devlog #7 — Multi-Agent Architecture & Custom Agent Builder Zero-Assist just got a major upgrade. What if instead of one AI assistant, you had an entire team of AI specialists working together? That’s exactly what I’ve built. Multiple Agent System Zero-Assist now supports multiple specialized agents, each optimized for a specific role and workflow. Master Agent The brain of the operation. Orchestrates all agents Assigns tasks intelligently Monitors progress Routes requests to the best agent Researcher Agent Your personal information hunter. Searches the web Collects and analyzes data Returns structured insights Filters noise and focuses on relevant information Coder Agent Built for developers. Writes code Reviews code Fixes bugs Assists with architecture and implementation Planner Agent Turns chaos into clarity. Breaks down goals Creates actionable roadmaps Generates timelines Organizes complex projects Custom Agent Builder The most exciting feature in this update. You can now create your own specialized AI agents with just a few clicks. Customize: System Prompt Temperature Tags & Capabilities LLM Model Agent Role & Personality Want an AI Startup Advisor? Create one. Want a Bug-Hunting Expert? Create one. Want a Cybersecurity Specialist? Create one. The possibilities are endless. Why This Matters Most AI applications rely on a single model trying to do everything. Zero-Assist takes a different approach. Instead of one assistant, you get an entire ecosystem of AI specialists that can collaborate, delegate tasks, and work together to solve problems more efficiently. Each agent has: Its own configuration Its own expertise Its own behavior Its own model settings This creates a more scalable and intelligent workflow compared to traditional AI assistants. Vision The long-term goal isn’t just to build another chatbot. It’s to build an AI Operating System where users can create, orchestrate, and manage teams of intelligent agents that work together to accomplish complex tasks. And this is only the beginning. Screenshot attached below."}, {"post_id": 9256, "ts": "2026-06-15T15:22:43Z", "hours": 22.2608, "text": "#Devlog 6 -Zero-Assist Shipped a big update today. The app can now handle complex tasks much more reliably, and tools run in parallel instead of sequentially — so heavy workloads finish noticeably faster without the app choking midway. The smarter behavior actually came from Trimming down the soul.md, longterm-memory.md, agents.md, and user.md files reduced token usage significantly, and the model started reasoning better almost immediately. I tested it across several complex tasks and the output quality genuinely caught me off guard — results I didn’t expected!!! Voice has been a pain point for a while. Dug into the Piper latency issues, restructured the integration, and the pipeline is much smoother now. Still sounds robotic — that’s a problem I haven’t cracked yet — but the lag that made it frustrating to use is mostly gone. Overall the app feels like a different version of itself. More capable, leaner, and faster. Dropping Demo vid of the test runs below so you can see what it’s actually doing now. here is demo video too : https://youtube.com/shorts/F8sLD21dcWo"}, {"post_id": 6943, "ts": "2026-06-11T17:21:14Z", "hours": 15.2497, "text": "Devlog 5 – Channel Integration and Tool Access Today I spent most of my time working on one of the biggest features of the project so far: Channel Integration . The channels system already supports multiple platforms such as Telegram, WhatsApp, Slack, Discord, and several others. My goal was to connect these channels with the assistant so that it can interact with users across different platforms while still having access to the tools and capabilities available on the phone. To achieve this, I worked on properly connecting the Rust bridge with the Kotlin application. Once the communication layer was working correctly, I was able to expose several powerful capabilities to the assistant, including: Access to phone storage and files Accessibility-based device control Web tools and online actions Composio integrations File management and manipulation Cross-platform channel communication Various assistant tools that were previously isolated from each other This was a fairly complex task because multiple systems needed to communicate reliably. I also used AI assistance throughout the development process to help debug issues, validate approaches, and speed up implementation. In total, this work took roughly 12 hours . At the moment, I have not pushed the code to the repository because the feature still requires extensive testing. Since it touches storage access, tool execution, and communication across multiple services, I want to ensure everything is stable before making it public. Once I complete the testing phase, I will push the implementation to the repository. This feature significantly expands what the application can do. Instead of being just a chatbot, it is evolving into a full assistant platform capable of interacting with external services, managing files, controlling parts of the device, and communicating through multiple messaging platforms. The long-term vision is to create a system where users can build highly capable personal assistants that can perform real tasks rather than simply generate text. There is still a lot more work ahead, but today’s progress was a major step toward that goal. Stay tuned—some very exciting features are currently in development."}, {"post_id": 5481, "ts": "2026-06-09T09:01:08Z", "hours": 12.9753, "text": "Zero-Assist Devlog #4 — The Phone Is Now a Personal Chat Server so Devlog 4 is here. The main thing i fixed this time is the channels section of the app. channels are basically how Zero-Assist can gets input or give output to other app — like Telegram, WhatsApp, and other messaging apps. once you connect them, the app starts listening. but whats different now that channels are working, the phone isn’t just an AI assistant anymore. it’s your personal home server that you can message like a real in-person. what this actually means in practice: say you’re away and you message your own Telegram bot: “water the plants” — Zero-Assist picks that up, figures out what you mean, and either goes with an MQTT signal to your smart home setup or directly talks to your microcontroller over USB or BLE , whichever is available. no extra apps, no cloud, just your phone doing the work. same idea works for your homelab. you can message “ping my website” and the app will run the actual shell command on your phone and report back. this does need a one-time manual connection to set up, but after that it just works. basically the phone becomes a chat-controlled home automation that you own fully here is no cloud included except the llm , which you can also use the local llm . what i’m planning to add next: i’m planning a live dashboard screen for this — not raw logs, but a simplified readable feed. something like: “message received via Telegram → running plant watering command → sent MQTT signal ✓” the idea is it’s useful for people who like seeing what’s happening here, but written in plain language instead of technical stuff for the normal users . the hard part this time was : most of the time on this devlog went into connecting the Rust backend (which handles all the channel logic) to the Kotlin front-end of the app , so getting them to work together cleanly took a lot of debugging and was honestly the most frustrating part of this whole update. got it working though. more soon."}, {"post_id": 4198, "ts": "2026-06-07T12:47:20Z", "hours": 7.8933, "text": "devlog -3 added a new shared folder option int the app so that the app can share the storage from phone , it can open files edit files , manipulate the files and do lots of stuff with it , added the screenshot below"}, {"post_id": 3507, "ts": "2026-06-06T14:09:20Z", "hours": 18.2539, "text": "Devlog #2 is here!! so after the piper TTS update in devlog #1, I’ve been working on something way bigger — I added Composio integration to Zero-Assist for those who don’t know what composio is — it’s basically a platform that connects AI agents to over 1,000 apps like Gmail, Slack, GitHub, Notion, Salesforce, Google Drive and a lot more. think of it as the bridge between your AI and the rest of the internet. so now Zero-Assist can actually do things for you like — → send and read messages (if you give it the right permissions) → make notes in Notion automatically → send mails on your behalf → store your files to Google Drive → and a lot more depending on which apps you connect the best part is this feature was already there inside ZeroClaw (which is what Zero-Assist is built on), so it wasn’t built from scratch — it was more about bringing it properly into the Android app and making it actually usable. check out the video ( https://drive.google.com/file/d/1ZO56Ekrq7fu205Epqx8fH-Vkt_E5xc16/view?usp=sharing ) for a small demo of how it works"}, {"post_id": 1568, "ts": "2026-06-03T17:45:24Z", "hours": 3.4811, "text": "ZERO-ASSIST devlog 1 IM working on Zero-Assist voice assistant app on which im already working from March , the app has lots of features , i completely vibe coded the app but now im working on the finishing part of the app so today i improve the voice assist mode , the voice was really slow on cheaper Android phones. When you spoke to it, you’d wait 10+ seconds before hearing the voice response. What I fixed today 1️⃣ Made It Stop Waiting So Long Before: App waited up to 2.5-5 seconds to make sure the TTS Engine was ready Now: Only waits 0.9-1.8 seconds Result: Faster feedback !! You can also check the app here ( https://github.com/Tanmay-1122/Zero-Assist )"}]...
|
Title: Zero-Assist by @Tan-May | Stardance
Devlog Title: Zero-Assist by @Tan-May | Stardance
Devlogs:
ZERO-ASSIST devlog 1 IM working on Zero-Assist voice assistant app on which im already working from March , the app has lots of features , i completely vibe coded the app but now im working on the finishing part of the app so today i improve the voice assist mode , the voice was really slow on cheaper Android phones. When you spoke to it, you’d wait 10+ seconds before hearing the voice response. What I fixed today 1️⃣ Made It Stop Waiting So Long Before: App waited up to 2.5-5 seconds to make sure the TTS Engine was ready Now: Only waits 0.9-1.8 seconds Result: Faster feedback !! You can also check the app here ( https://github.com/Tanmay-1122/Zero-Assist )
Devlog #2 is here!! so after the piper TTS update in devlog #1, I’ve been working on something way bigger — I added Composio integration to Zero-Assist for those who don’t know what composio is — it’s basically a platform that connects AI agents to over 1,000 apps like Gmail, Slack, GitHub, Notion, Salesforce, Google Drive and a lot more. think of it as the bridge between your AI and the rest of the internet. so now Zero-Assist can actually do things for you like — → send and read messages (if you give it the right permissions) → make notes in Notion automatically → send mails on your behalf → store your files to Google Drive → and a lot more depending on which apps you connect the best part is this feature was already there inside ZeroClaw (which is what Zero-Assist is built on), so it wasn’t built from scratch — it was more about bringing it properly into the Android app and making it actually usable. check out the video ( https://drive.google.com/file/d/1ZO56Ekrq7fu205Epqx8fH-Vkt_E5xc16/view?usp=sharing ) for a small demo of how it works
devlog -3 added a new shared folder option int the app so that the app can share the storage from phone , it can open files edit files , manipulate the files and do lots of stuff with it , added the screenshot below
Zero-Assist Devlog #4 — The Phone Is Now a Personal Chat Server so Devlog 4 is here. The main thing i fixed this time is the channels section of the app. channels are basically how Zero-Assist can gets input or give output to other app — like Telegram, WhatsApp, and other messaging apps. once you connect them, the app starts listening. but whats different now that channels are working, the phone isn’t just an AI assistant anymore. it’s your personal home server that you can message like a real in-person. what this actually means in practice: say you’re away and you message your own Telegram bot: “water the plants” — Zero-Assist picks that up, figures out what you mean, and either goes with an MQTT signal to your smart home setup or directly talks to your microcontroller over USB or BLE , whichever is available. no extra apps, no cloud, just your phone doing the work. same idea works for your homelab. you can message “ping my website” and the app will run the actual shell command on your phone and report back. this does need a one-time manual connection to set up, but after that it just works. basically the phone becomes a chat-controlled home automation that you own fully here is no cloud included except the llm , which you can also use the local llm . what i’m planning to add next: i’m planning a live dashboard screen for this — not raw logs, but a simplified readable feed. something like: “message received via Telegram → running plant watering command → sent MQTT signal ✓” the idea is it’s useful for people who like seeing what’s happening here, but written in plain language instead of technical stuff for the normal users . the hard part this time was : most of the time on this devlog went into connecting the Rust backend (which handles all the channel logic) to the Kotlin front-end of the app , so getting them to work together cleanly took a lot of debugging and was honestly the most frustrating part of this whole update. got it working though. more soon.
Devlog 5 – Channel Integration and Tool Access Today I spent most of my time working on one of the biggest features of the project so far: Channel Integration . The channels system already supports multiple platforms such as Telegram, WhatsApp, Slack, Discord, and several others. My goal was to connect these channels with the assistant so that it can interact with users across different platforms while still having access to the tools and capabilities available on the phone. To achieve this, I worked on properly connecting the Rust bridge with the Kotlin application. Once the communication layer was working correctly, I was able to expose several powerful capabilities to the assistant, including: Access to phone storage and files Accessibility-based device control Web tools and online actions Composio integrations File management and manipulation Cross-platform channel communication Various assistant tools that were previously isolated from each other This was a fairly complex task because multiple systems needed to communicate reliably. I also used AI assistance throughout the development process to help debug issues, validate approaches, and speed up implementation. In total, this work took roughly 12 hours . At the moment, I have not pushed the code to the repository because the feature still requires extensive testing. Since it touches storage access, tool execution, and communication across multiple services, I want to ensure everything is stable before making it public. Once I complete the testing phase, I will push the implementation to the repository. This feature significantly expands what the application can do. Instead of being just a chatbot, it is evolving into a full assistant platform capable of interacting with external services, managing files, controlling parts of the device, and communicating through multiple messaging platforms. The long-term vision is to create a system where users can build highly capable personal assistants that can perform real tasks rather than simply generate text. There is still a lot more work ahead, but today’s progress was a major step toward that goal. Stay tuned—some very exciting features are currently in development.
#Devlog 6 -Zero-Assist Shipped a big update today. The app can now handle complex tasks much more reliably, and tools run in parallel instead of sequentially — so heavy workloads finish noticeably faster without the app choking midway. The smarter behavior actually came from Trimming down the soul.md, longterm-memory.md, agents.md, and user.md files reduced token usage significantly, and the model started reasoning better almost immediately. I tested it across several complex tasks and the output quality genuinely caught me off guard — results I didn’t expected!!! Voice has been a pain point for a while. Dug into the Piper latency issues, restructured the integration, and the pipeline is much smoother now. Still sounds robotic — that’s a problem I haven’t cracked yet — but the lag that made it frustrating to use is mostly gone. Overall the app feels like a different version of itself. More capable, leaner, and faster. Dropping Demo vid of the test runs below so you can see what it’s actually doing now. here is demo video too : https://youtube.com/shorts/F8sLD21dcWo
Devlog #7 — Multi-Agent Architecture & Custom Agent Builder Zero-Assist just got a major upgrade. What if instead of one AI assistant, you had an entire team of AI specialists working together? That’s exactly what I’ve built. Multiple Agent System Zero-Assist now supports multiple specialized agents, each optimized for a specific role and workflow. Master Agent The brain of the operation. Orchestrates all agents Assigns tasks intelligently Monitors progress Routes requests to the best agent Researcher Agent Your personal information hunter. Searches the web Collects and analyzes data Returns structured insights Filters noise and focuses on relevant information Coder Agent Built for developers. Writes code Reviews code Fixes bugs Assists with architecture and implementation Planner Agent Turns chaos into clarity. Breaks down goals Creates actionable roadmaps Generates timelines Organizes complex projects Custom Agent Builder The most exciting feature in this update. You can now create your own specialized AI agents with just a few clicks. Customize: System Prompt Temperature Tags & Capabilities LLM Model Agent Role & Personality Want an AI Startup Advisor? Create one. Want a Bug-Hunting Expert? Create one. Want a Cybersecurity Specialist? Create one. The possibilities are endless. Why This Matters Most AI applications rely on a single model trying to do everything. Zero-Assist takes a different approach. Instead of one assistant, you get an entire ecosystem of AI specialists that can collaborate, delegate tasks, and work together to solve problems more efficiently. Each agent has: Its own configuration Its own expertise Its own behavior Its own model settings This creates a more scalable and intelligent workflow compared to traditional AI assistants. Vision The long-term goal isn’t just to build another chatbot. It’s to build an AI Operating System where users can create, orchestrate, and manage teams of intelligent agents that work together to accomplish complex tasks. And this is only the beginning. Screenshot attached below.
Devlog #8 — Zero-Assist I added a Skills Section to Zero-Assist, and it’s probably one of the more useful things we’ve shipped so far. What It Is Skills are installable modules built by the Zeroclaw community that extend what the app can do. Things like Doc Writer, Auto-Coder, and more — each one teaches the app how to handle a specific type of task better. Install one, and Zero-Assist reads it and starts applying it automatically. No setup, no configuration, just tap and it works. These aren’t shortcuts or preset prompts. The app actually understands the skill and uses it to make smarter decisions when you’re working. Always Growing The library isn’t static. The community keeps adding new skills and updating existing ones, so the app naturally gets more capable over time without needing a big update from our end. Whatever gets added is available to you immediately. Big thanks to everyone in the Zeroclaw community who built and contributed skills — this whole section runs on your work. What’s Next We’re making it easier for more people to submit skills, and we’re looking at adding ratings and changelogs so you can track what’s new and what’s worth installing. More soon.
After long time … hello guys making this devlog after very long time , i had an issue ,when i was cleaning up my project , removing the dead code and optimizing the app where i was taking the help of the antigravity for this , i accidently deleted the hardware side in the zero claw (engine of zero assist) which was in beta i was just remaining to test it because i didn’t have any proper hardware to do it so it was remaining to test and unfortunately i didn’t even had the code pushed on the GitHub which made the situation worst so now I’ve nearly fixed it , the app is successfully building properly and now I’ve decided to push the code every day if possible on the GitHub to avoid this type of things and I’m writing this devlog because of the new rule i came by where only 10 hrs. will be counted MY BAD LUCK now my 12 hrs. are going to waste 😭😭because i was not uploading the devlog and the time increased so uploading this asap so that my next time will be counted !!
Giving My Android AI App Its Own Linux Sandbox One of the biggest problems with my app was that a lot of the features I wanted to build actually needed a real desktop environment. Things like: Running shell commands Browser automation Using desktop CLI tools Installing packages on demand Running scripts ZeroClaw already supports these kinds of capabilities, but on Android I couldn’t really use them to their full potential. The app simply didn’t have an environment that could support everything properly. So I decided… Why not give the app its own minimal Linux desktop? The Initial Research Luckily, I already had some experience with Linux. I had previously played around with: Linux distros PRoot chroot Minimal desktop environments So I started looking at every possible approach. Option 1 — Android’s default shell At first I thought about using the shell that every Android app already gets. It looked simple. But after experimenting with it, I realized it was missing a lot of the commands and tools I actually needed. That completely defeated the purpose of having a proper sandbox. So I dropped that idea. Option 2 — chroot Next I started researching chroot. Honestly, from a technical point of view, chroot is amazing. It gets extremely close to a real Linux environment. Performance is great and it behaves much more like an actual desktop installation. There was only one problem. It requires a rooted device. That was an immediate deal breaker. I don’t want someone to root their phone just to use my app. So chroot was out too. Option 3 — PRoot After a lot of brainstorming, reading documentation, and trying different ideas, I finally settled on PRoot. It isn’t perfect. There are still some limitations compared to a real Linux installation, but I’ll talk about those another time. The important part is this: No root required Works on normal Android devices Can run a real Linux userspace Supports the tools my AI actually needs For what I’m trying to build, it was the best balance. Choosing the distro I wanted something lightweight. Really lightweight. So I picked Alpine Linux . The base image is around 5 MB . Yes… Literally 5 MB. After installing the packages I consider “essential” for the AI (things like Python, pip, curl, git, etc.), the whole environment comes to roughly 700 MB . That gives the AI a solid starting point without making users download multiple gigabytes on day one. If more tools are needed later, the AI can simply install them inside the sandbox. Current Progress I’ve finally started implementing everything. So far I’ve added: sandbox_client.rs sandbox_main.kt Configuration files for the sandbox Default package lists that will be installed automatically There’s still a lot left to build, but the foundation is finally there. This is probably one of the biggest architectural changes I’ve made to the app so far. Instead of trying to force Android to behave like a desktop, I’m giving the AI its own Linux environment that it can actually work inside. Still a long way to go !!! MAKE SURE TO FOLLOW THE PROJECT YES THE IMAGE IS AI GENETRATED , BUT I DIDNT KNOW WHAT TO DO FOR BETTER EXPLAINATION SO I DID IT :D
Giving Zero-Assist Its Own Linux Sandbox A lot of features I want in Zero-Assist need actual Linux tools: shell commands, Python, Git, Node.js, CLI tools, etc. I didn’t want this to require root, so I built a local Alpine Linux sandbox using PRoot that runs entirely on-device. The architecture is basically: AI daemon → sandbox tool → HTTP bridge → Kotlin sandbox manager → PRoot → Alpine Getting PRoot running One annoying problem was Android’s noexec restrictions. PRoot is stored inside the app’s data/native library directory and can’t always be executed normally. The solution was launching it through Android’s dynamic linker: private fun buildProcessArgs ( command : String , workingDir : String ): Array < String > { val args = arrayOf ( prootPath , "--rootfs=$rootfsPath" , "--bind=/dev" , "--bind=/proc" , "--bind=/sys" , "--bind=$homePath:/root" , "--bind=$tmpPath:/tmp" , "-0" , "-w" , workingDir , "/bin/sh" , "-c" , command ) return if ( ANDROID_LINKER != null ) arrayOf ( ANDROID_LINKER , * args ) else args } So commands effectively go through: /system/bin/linker64 → PRoot → Alpine → command This lets the bundled PRoot code run despite the noexec restriction. Connecting Rust and Kotlin My AI daemon is written in Rust, while the sandbox is managed by Kotlin. I connected them using a small NanoHTTPD server running only on localhost. return when ( session . uri ) { "/health" -> handleHealth () "/execute" -> handleExecute ( session ) "/manage_process" -> handleManageProcess ( session ) else -> errorJson ( Response . Status . NOT_FOUND , "Unknown path: ${session.uri}" ) } The Rust daemon sends authenticated requests to 127.0.0.1:49481 . The AI currently gets two tools: sandbox_execute - run Linux commands sandbox_manage_process - manage background processes Persistent shell sessions I wanted the sandbox to behave like an actual terminal instead of starting from scratch for every command. If the AI runs: cd /root/project export TEST = hello the next tool call stays in /root/project and keeps the environment variable. Each conversation gets a separate persistent shell: Conversation A → Shell A Conversation B → Shell B This keeps cwd/environment state while preventing different conversations from affecting each other. Background commands are isolated differently. Each one gets a separate PRoot executor and is tracked by a process manager. The AI can start a long-running command, continue doing other things, then check its logs or kill it later. Installing Alpine The sandbox manager handles the full setup: Download Alpine → Extract → Fix hardlinks/permissions → apk update → Install tools → Ready The hardlink fix was needed because some Alpine tar entries reference files that haven’t been extracted yet, which caused extraction failures on Android. Right now the sandbox comes with Bash, Python + pip, Node.js, Git, curl, wget, jq, SSH, lftp and rsync. The main parts are: ProotExecutor - executes commands LinuxSandboxManager - lifecycle/setup SandboxBridgeServer - Rust ↔ Kotlin bridge SandboxProcessManager - background processes PersistentSandboxShell - per-conversation shell state There is still more I want to improve, especially filesystem sharing, networking and reliability for longer agent tasks. But the main system is finally working: Zero-Assist can now give an AI agent a real Linux userspace running locally inside an Android app without requiring root. This started with the idea of somehow giving the AI a tiny Linux computer inside the app. Now it actually has one.
Hello guys, devlog here!I finally got the Linux sandbox in Zero-Assist working end-to-end! The sandbox runs Alpine Linux through PRoot directly on Android without requiring root.Getting it working was harder than expected, though. I ran into several Android-specific issues.Fixing the SandboxThe first problem was Alpine’s heavy use of BusyBox hardlinks. My TAR extractor used File.copyTo(), which didn’t preserve executable permissions, causing errors like:proot error: execve(“/bin/sh”): Permission denied I fixed this by preserving executable bits:linkTarget.copyTo(outFile, overwrite = true) if (linkTarget.canExecute()) { outFile.setExecutable(true, false) } Some hardlinks were also extracted before BusyBox itself, so I added a second repair pass after extraction to restore critical commands like /bin/sh, /bin/ls, and /bin/cat.Symlinks were another problem because Android can block their creation. I added a fallback that copies the target when creating the actual symlink fails:try { Files.createSymbolicLink(outFile.toPath(), Paths.get(linkName)) } catch (e: Exception) { fallback.copyTo(outFile, overwrite = true) } I also had problems directly executing PRoot because some Android app directories can be noexec. The solution was to launch PRoot through Android’s system linker:val args = arrayOf( “/system/bin/linker64”, prootPath, “–rootfs=$rootfsPath”, “/bin/sh”, “-c”, command ) I also added corrupted download detection and automatic Alpine mirror fallback, making the rootfs installation much more reliable.Giving the AI Linux ToolsAfter getting the sandbox stable, I added two AI tools:sandbox_execute — Executes commands inside Alpine and supports persistent shell state, working directories, environment variables, timeouts, and background processes.sandbox_manage_process — Lets the AI list, monitor, read logs from, and kill background processes.For example, the AI can execute:{ “command”: “python3 –version && uname -a”, “working_dir”: “/root” } Or start a background server:{ “command”: “python3 -m http.server 8000”, “background”: true } The execution pipeline now looks like:AI Agent ↓ Rust Tool Layer ↓ Authenticated Local HTTP Bridge ↓ Kotlin Sandbox Manager ↓ PRoot ↓ Alpine Linux The Rust runtime communicates with the Kotlin sandbox through a localhost bridge on 127.0.0.1:49481, protected by a randomly generated per-process bearer token.And now the sandbox is fully functional end-to-end!The AI can execute real Linux commands, install packages, maintain persistent shell sessions, run scripts, start background processes, inspect their logs, and manage them — all inside Alpine Linux running directly on Android without root.This was one of the hardest parts of Zero-Assist so far, but now the AI finally has its own real Linux environment to work with.
okay so after spending lots of time on this issue , im finally able to make this work again , the problem was that (bin/sh, ust/bin/env) never extracted because of one code issue where i accidently mentioned them as the read only memory in the apps storage so the distro was installing also getting extracted but becacuse of the read only type of file , the app was not able to perform any actions on it , so now after taking the help from the open code now the sandbox is fully functional and working on every devices , also ive added some default packages which will get installed during the setup of the sandbox such as (wget, git , python3, jq, py3-pip, nodejs ,lftp and the openssh-client) just using the single command (apk add –no-cache bash curl wget git jq python3 py3-pip nodejs openssh-client lftp rsync)
So i basically went through the whole device control system and hardened it. the planner was splitting compound goals like “open instagram and message rohit” into separate calls which broke everything. also fixed it so the loop doesn’t just bail on the first response - it actually executes the action first. scroll was crashing if the planner didn’t send a direction so now it defaults down. and exceptions in the callback handler were just silently killing the process so now everything is caught and logged properly. added loop detection so it doesn’t get stuck repeating the same thing, post-action screen verification, and 44 tests to cover it all. very happy that it worked , it took lots of time but eventually i think the results are very very good though this thing not works great on the local ai’s but with the cheap api like openrouter/free , this thing can give pretty good results
Device Control Development Update Yesterday I worked on expanding the Device Control system in my AI assistant. The idea behind this feature is to allow the AI to perform real actions on an Android device using the Accessibility Service . When the user gives a command such as “Subscribe to MrBeast on YouTube” , the main AI analyzes the request and delegates it to the Device Control tool. Current Workflow Launch the required application using: PackageManager.getLaunchIntentForPackage() startActivity() Capture a compressed screenshot of the current screen. Analyze the screenshot to identify UI elements and their screen coordinates. Navigate the interface and perform actions through the Android Accessibility APIs. Current Features Open applications Tap at (x, y) Swipe gestures Type text These core primitives allow the AI to interact with almost any Android application through UI automation. Future Improvements My main goals are to improve both speed and accuracy . Instead of navigating through multiple screens for simple system operations, I plan to add native high-level commands directly into the Device Control tool, such as: flashlight_toggle wifi_toggle bluetooth_toggle mobile_data_toggle volume_set brightness_set take_screenshot lock_screen open_notifications open_quick_settings go_home go_back open_recents These commands will allow the AI to execute common Android actions instantly without relying on visual navigation. For more complex tasks—such as interacting with third-party applications—the tool will continue using the screenshot + coordinate-based navigation pipeline. Long-Term Vision The goal is to build a hybrid Device Control system: Native commands for common Android operations (fast, reliable, and efficient). Vision-guided UI automation for complex interactions within any application. This architecture will significantly reduce execution time, improve reliability, and make the assistant capable of handling virtually any task on an Android device.
Devlog: Google Workspace Integration This week I worked on integrating Google Workspace into Zero-Assist , allowing the AI to securely access services like Gmail, Google Drive, Google Docs, and Google Sheets after the user grants permission. The ZeroClaw engine already supports Google Workspace CLI (GWS) , but it was originally built for desktop Linux and expects a desktop environment with GWS already installed. Since Zero-Assist runs inside an Alpine Linux sandbox on Android using PRoot , that approach doesn’t work directly. Instead of rewriting the integration, I kept the existing architecture and adapted it for Android. What I Implemented I modified the sandbox installation process so that GWS is installed automatically whenever the user installs the standard sandbox packages. This means users don’t need to manually install or configure the CLI. Inside the app, I added a new Google Workspace plugin under: Connections → Plugins → Installed → Google Workspace When the user signs in, the Android app completes the OAuth flow and generates the required Google Workspace configuration files. To bridge Android and the Linux sandbox, I use the existing Android ↔ PRoot bridge . The plan is: User Login ↓ Android creates GWS credentials ↓ Credentials copied into PRoot sandbox ↓ Sandbox GWS CLI uses the same credentials ↓ AI can access approved Google services This keeps authentication native while allowing the Linux CLI to work without requiring the user to touch the terminal. Google Cloud Setup I also created a dedicated Google Cloud Console project for Zero-Assist. The project uses a Web Application OAuth client , which is required by the Google Workspace CLI authentication flow. I enabled the necessary APIs, including: Gmail API Google Drive API Google Docs API Google Sheets API More APIs can be enabled as additional integrations are added. Current Problem The authentication flow itself works correctly, and users can successfully sign in. The issue is that the generated credential/configuration files are not being copied correctly into the Linux sandbox . Because of this, the sandboxed GWS CLI cannot find the required authentication files, causing every Google Workspace command to fail. The current challenge isn’t OAuth—it’s reliably synchronizing credentials between Android and the PRoot environment. Once this bridge is working, users will simply sign in once, choose which Google services they want to grant access to, and Zero-Assist will be able to securely interact with those services without any manual setup. note:This devlog is written with hands and then passed to the chatgpt to format it with the .md because im very lazy to play with those colons and #’s
Devlog here , so now i added the new cool animation (thinking orb ) this animation was totally inspired from the ( https://orbs.jakubantalik.com/ ) but the problem was that the orb was written in the typescript which wont work in our app cause our app is written in the kotlin so what i did was i downloaded the zip file from the repo pasted it to the claude and told him to convert it into kotlin for me and surprisingly the results was amazing , i will share the video recording too , and the other part i worked on was i added a few voices for my apps from the hugging face so now the user can use the custom voices too and also if he wants to use some of the default voices , the option is there do download in the app, some voices ( https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_GB/alan/medium/en_GB-alan-medium.onnx ) for someone whose interested …
Hello Hello Hello new devlog here , so now i started with the implementation of the MCP believe me guys once the app gets the MCP the app will go to another level , like it will then support literally any app (any app) it can perform actions like the mcp does but in simpler way also when i started with implementation i hit the problem again the code is there in the zeroclaw engine but again the problem is that its meant to run on the desktop so now we again have to do some changes in code and make the mcp run natively on the phone , i also found out some resources to do it like ( https://github.com/modelcontextprotocol/kotlin-sdk ) which is good so now the idea is something similar like shown in the screenshot below taken from the chat gpt ….
Devlog time :> so now I’m continuing with the implementation of the MCP in the app like i previously talked now when i did some tinkering with the rust code using the ai , i managed to get all the connected MCP tools into the config file of the ai the config is getting updated now but the problem is that the config is constantly keeps changing don’t know what’s happening i guess the the problem is in the toml config generator which is glitching out , so now im trying fixing it from lots of time now , i guess i might have to use the antigravity to fix this but i exhausted my weekly limit cause I’m on a free tier 😭😭.. ill catch up with yall later till then bye bye 🙆..
Update !!! new devlog here … so now after doing some more research on the mcps and the implementation plans etc etc now im finally going all on it , ive added a ui component of the MCP in the Connection/Plugin/MCP , where i added few premade mcp options like (GitHub , brave search , external postgre sql etc ..) also there i added the option of the add custom server in which use can add custom server where currently the transport options are (STDIO,HTTP,SSE,LOCALHOST_STDIO (where you can add local mcp servers using the apps like termux etc ) so now that the ui is completed now i will move on to the connection part of the ui to the backend rust engine via uniffi )
Check this out !! so yesterday i finished with the MCP implementation of the app , i implemented 4 transport method (STDIO,,HTTP,SSE and the LOCALHOST_STDIO) so when i was testing out i found out that only one of them is working properly , (the http one ) to which i connected multiple apps , mcp’s etc everything was working fine but when i tested the other transport method , not even a single one was working because it all needed the desktop to run with the specific packages so unfortunately i was not able to use it and i also find out about the nasa mcp where they daily upload the images mars rover images etc so i tried to test it but the problem was that the mcp was not http instead it was the STDIO so i was sad cause i had to fix first the mcp issue then test it but when i was in school in break i was getting board and opened the app and i had an idea like cant we just convert the normal stdio into the http mcp using the termux ? after asking to claude it said definitely we can do this so then i setuped the env(i will add a screenshot below ) and made a proxy server which converts the normal stdio mcp to the http steamtable and i was then able to access it locally using my app (i will add the image of it too) and i managed to connect to the mcp and fetch the images , now everything is working completely fine just the remaining part is the remaining transport which i will fix it some how !! also i will add some images i fetched below...
|
1791825634.2514575
|
1792689634.2514575
|
|
30941
|
Mati by @Joschi | Stardance
|
Joschi
|
1
|
228.73
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T12:33:31Z", "hours": 228.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Welcome to MATI Discover MATI, a simple and relaxing Sudoku-inspired puzzle game designed to challenge your number-solving skills without putting you under pressure. Your goal is simple: Find the right numbers and complete every row and column correctly. MATI is designed to be fun and stress-free: No Time Pressure: Disable the timer whenever you want and play at your own pace. No Mistakes to Fear: MATI doesn’t punish you for incorrect entries. Simply correct them whenever you notice a mistake. 4 Different Sizes: Choose from four puzzle sizes to match your preferred challenge. Built-in Terminal: Prefer an old-school experience? Play MATI directly in its integrated terminal. Full Keyboard Support: No mouse or trackpad? No problem! MATI can be controlled entirely with your keyboard. ! Development Notice! MATI is still under active development. More features, improvements, and refinements are planned for future updates. Thank you for checking out MATI!", "repo": "https://github.com/JKfromHMS/Mati", "demo": "https://github.com/JKfromHMS/Mati/releases/tag/Mati"}]...
|
[{"post_id": 71221, "ts": "202 [{"post_id": 71221, "ts": "2026-09-20T14:03:17Z", "hours": 0.7347, "text": "Fixed the Read-Me After I got noticed that my Read-Me is not quite what it has to be, I have done a new version that should fit better into the requirements."}, {"post_id": 70074, "ts": "2026-09-18T12:15:17Z", "hours": 5.6108, "text": "Probably the last devlog on this project After more than 220 hours of coding and more and another 200 hours of deciding what to do and talking to other developers about how I could make this program run and do it good, I finally think that it is on a point at which I can think about shipping it. It runs, has no crucial bugs I noticed and is efficient enough to not take several hours just for the export of an mp4 video. Maybe I will add more features later, so do not be shy to comment what you like and what I should change and of course, please tell me if you have found any bug or unnatural behavior. OS Declaration Even though my goal was to make MATI run on every of the big 3 (Mac-OS, Linux, Windows) the current version just runs as wanted on Windows, due to different handling with graphic, which just means, that not every text is placed wright and that the overall look is scratched on Linux and Mac-OS. PS: The picture is the app icon."}, {"post_id": 67290, "ts": "2026-09-13T11:20:20Z", "hours": 9.3047, "text": "Tutorial I added a tutorial that shows the player how the game mainly works and give him the information about the shortcuts. Also I added a function to make the clock a reopen point for a small explanation what the program can do."}, {"post_id": 65414, "ts": "2026-09-10T15:09:37Z", "hours": 7.2906, "text": "Finalizing basic functions My goal is the finish the app as soon as possible. So I am know fixing the last few bugs and add the last missing feature that the program should have. This devlog should just let you know, that the last days were full of deciding what could I do to improve the program and were the bugs are. (Poorly most of this sort of spend time is not count toward the project.) The provided screenshots shows a thing I am currently trying to do better, the extended settings, because like you see, the design is very bad."}, {"post_id": 61761, "ts": "2026-09-04T20:25:16Z", "hours": 9.6339, "text": "Better Structure, Same Simplicity The last (many) hours I spend with one thing. Making sure the codes run even with new and better structure internal. This was also really important, because it made it easier to integrate multiple new things. One thing is, that now into the nearly same and reliable stats design comes buttons. This buttons are basically the headers, means size, mode, games … . If you click on them they basically sort the stats after this header. Furthermore the terminal got a big upgrade, because now it has three new ways to get deeper into your game. At first you can now easily check if you have paused matches. Also you can check your export history, which new feature made it actually also possible to get warned if you export a single match multiple times. And last but not least analysis. Because the game now got a deeper understanding of how you are playing and what are your trends and you can view all of this by the terminals history. (And I was shocked how good it worked with my recent 150 matches.) I hope, I didn’t overwhelmed you with all these information and that you are as curious for the new version as I am."}, {"post_id": 60773, "ts": "2026-09-03T11:24:14Z", "hours": 2.2931, "text": "Chapters I added with the help of AI the possibility to have chapters into my game. So you now can go exactly to the start of every action like you do in the game itself. And even though I know that this do not make that much of the decision how good the program is, it is still another thing that I now know how to do and I think that this is also really important."}, {"post_id": 59881, "ts": "2026-09-01T21:22:44Z", "hours": 9.7594, "text": "System remake It took a while and I forgot a little the time it used, but I did it. Now the whole game runs more efficient threw the new system that handles buttons separate and keeps them cached, so they do not have to be completely calculated every frame new. Also some designs changed slightly."}, {"post_id": 58281, "ts": "2026-08-30T17:28:26Z", "hours": 7.7617, "text": "Bug fixing and redesign Over the last thew versions, even though I spend a lot of time in debugging, many little bugs appear. Sometimes they comes just from moving a function or mistyping and sometimes deeper. So with this version I fixed again many of them, like wrong time show in the achievements and many others. Furthermore I worked and correcting and redesigning the whole terminal help logic, giving the main achievements new names and, like you see in the picture, modified the general achievements screen so that it not just looks better, but also feels better in reason of an improved algorithm to hide the mouse and navigation buttons. PS: If you use it and find a bug, it would be really nice if you could comment it."}, {"post_id": 57627, "ts": "2026-08-29T20:40:59Z", "hours": 7.5722, "text": "Code split and missing feature give With the latest version the game has grown to 14 game and 3 language constructor files, because I a made clearer structure in the code itself, that means I grabbed my screens file and extracted everything that was in there but with questionable reason. So the new files helpers and alt_hover was created. The task of alt_hover is explicit to handle everything containing the keyboard navigation possibilities. Helpers on the other hand is made for everything that is like a config but little more. (I know, that my config still is more as it should, I’ll try to change this as soon as possible.) Also I added with this update missing features that already should be in there like that the keyboard navigation also works in the advanced settings or that like you see in the picture the buttons in settings have an own color palette to make sure that it is clear that they at first are toggle buttons and have an associated color for each of their states. Furthermore I fixed a few little bugs, like that the back jump to the achievement button is not working with the up going higher than to the full-screen button. I hope you enjoy version 0.6.1"}, {"post_id": 56788, "ts": "2026-08-28T18:19:14Z", "hours": 4.5989, "text": "New Design and better language including Now the Achievements have this existing new design that not just looks better but also provides you more easy the needed information. I also made the language better fitting to the shown elements and changed some slightly to make it also look better. Furthermore I fixed a few little bugs like that you could not select ctrl and key shortcuts by yourself or that the pause text has not reacted to that."}, {"post_id": 55614, "ts": "2026-08-27T16:05:18Z", "hours": 9.0169, "text": "Languages and Efficiency The last few hours I used to refresh my school knowledge in French and Spanish to create language packets for my game in this two languages. What I did a little bit earlier is to work again on video exporting efficiency and now it gone really fast. Exporting a video in normal scale takes less time then playing it, in twice the resolution it takes usually around the play time or a little longer and in the highest settings still long. But overall it is now much faster and with less possible problems. PS: The export time are different depending on the hardware of your computer."}, {"post_id": 54404, "ts": "2026-08-25T12:23:33Z", "hours": 8.4808, "text": "Language and Efficiency After many hours I finally made it to add a second language to my game, beside English you know can have German texts in the game. Furthermore I took a little time to made the game as video export more efficient so that it takes 6 seconds less to export my test game."}, {"post_id": 51927, "ts": "2026-08-21T21:03:36Z", "hours": 8.6083, "text": "Languages What I used the last few hours for is what I probably will have to do for some more. Go threw the code and replace everything that generates an output the user could see with the new method that translate this. For this I also need to add the translations. As I needed a break I made the new design for the advanced settings, and now its like I wanted it to be. Furthermore the history in terminal supports now more sort options and - in front to change the meaning for this it has a new system that transfers everything with the same meaning into the same internal command."}, {"post_id": 51317, "ts": "2026-08-20T22:01:43Z", "hours": 8.9794, "text": "Added Advanced Settings It took long and still look not that great and do not work all over, but the base is set. To explain it, the game now has variable sound volume. Also you can now change the language, even though I do not have already created a fully second language. Furthermore navigation keys and ultra input order are now choose able, so if you prefer it different you can now make it so. PS: This devlog is made just in reason off time, at the moment none of this get pushed to GitHub, because it is still in developing."}, {"post_id": 49668, "ts": "2026-08-18T15:35:52Z", "hours": 6.5797, "text": "Fixed Bugs Now the game have finally also in terminal’s ultra game the option to pause the game and take a break. I also added a mechanism for players who want to be really fast that allows the program to submit commands automatically to reduce the submit click every action. Furthermore the achievement screen now has a two way navigation what means that you could either press the left/right arrow keys of your keyboard or click with your mouse on the magic appearing buttons. PS: V0.5.1 is out, it is an update mostly about bug fixing and just this little new features from witch 2 already should work in version beyond this."}, {"post_id": 48338, "ts": "2026-08-16T17:28:07Z", "hours": 4.4836, "text": "Achievements and clear up I added a new achievements show way that is based on multiple pages and every has his specific achievements on. I also cleared up the code a little bit, means I put fast added constants into the config, do little efficiency things and stuff like that. Furthermore I made scrollbars not just be better shown threw all menus, but also work better (more accurate). Now V0.5.0 is on GitHub, if you find bugs, please comment them under this devlog."}, {"post_id": 47395, "ts": "2026-08-15T09:45:19Z", "hours": 7.1794, "text": "Sort and filter system I added an advanced sort and filter system to the history in the terminal. Furthermore the history detail video export is now way faster and the exported videos just need the up to the half of the capacity they have needed before in the same quality level."}, {"post_id": 46868, "ts": "2026-08-14T12:38:24Z", "hours": 8.1706, "text": "Achievements and Design Now the game has an achievement system that show you something like tasks you could do. I also fixed like always some bugs from which are way to much in there and also redesigned the history detail grid position for every size."}, {"post_id": 45396, "ts": "2026-08-11T20:31:36Z", "hours": 4.8586, "text": "New jump system I added a new jump system for the setting, history detail, the Hannah Easter eggs and history view. This enabled the possibility to jump right back and not every time to the start and so you can navigate way faster threw this systems. I also fixed some bugs for example the bug that make the upscale from the exports video not work right. And like always, please comment under this if you notice a bug so that I can fix it."}, {"post_id": 44875, "ts": "2026-08-10T22:18:07Z", "hours": 7.9992, "text": "Efficiency and little changes Threw match case the code got little faster. I also corrected some weird keyboard navigation hover bugs fixed. Furthermore the terminal now got a clock and settings have a complete new look. The last really nameable thing is about that now, if you undo an action, this action is actually marked as undone (if not undone with the button), so you better reflect in the history detail view how the game was."}, {"post_id": 43391, "ts": "2026-08-08T16:33:15Z", "hours": 8.9786, "text": "Scrollbars and bug fix Now, finally, the scrollbars are really working and can be dragged as wished. I also added a version of the stats to the normal view and a version of the history and the settings to the terminal. Furthermore I worked on a way to scale the game up for the mp4 export and to make it harder to cheat. And, like always: If you test it (the newest versions code will be on GitHub in a few days) and should find any bug, please comment them so I can fix it."}, {"post_id": 41376, "ts": "2026-08-05T15:30:23Z", "hours": 6.8236, "text": "Efficiency I worked on the efficiency of the mp4 export and made sure that every sound is played correctly and every state is shown as wished."}, {"post_id": 38859, "ts": "2026-08-01T12:52:03Z", "hours": 5.6961, "text": "MP4 export Now you have the possibility to export a played game as a mp4 video file. With this method you can share your games with others."}, {"post_id": 37646, "ts": "2026-07-30T15:14:02Z", "hours": 7.1558, "text": "Fixed non working features Until now the program got a few things half implemented or even fully in the game but not use able because of mistakes. So know you finally see the scrollbars and you can navigate threw the terminal. You input line finally got moveable from left to right and right to left and buttons got a little new positioning. Also I made the code a little more efficient again."}, {"post_id": 36394, "ts": "2026-07-28T13:58:30Z", "hours": 5.6106, "text": "Efficiency and bug fix Underneath a list of what that means: Now you can see your stats threw the terminal again. Now only games in which you have done something are saved as paused games you can continue. Now also the ultra games are saved correctly and with every action. Now you can write play out again in the terminal. Now the wrong unknown command c message after resuming a game in ultra mode is removed. Now it does not matter anymore if a command has spaces in between or not (at least for those this is wanted). Now the check for play starts threw terminal, normal and ultra, and also for leaving the terminal is way more efficient thank to hash. Now the time code is more simplified. Now you can find a second Easter egg. Now you can with ptl (play time long) see, even over a minute, your playtime on milliseconds in terminal. Now you have a new stats looks that changes itself automatically to the number of your number of games. Now you automatically are on continue when you pause the game. Now Strg/Cmd n activates new match, like you would pressed the button. Now every in game terminal is closed correctly when wanted. Now Strg/Cmd m brings you back to menu everywhere you are. Now you can use up and down arrow to navigate threw your command history in terminal. Now stats show your real data and do not calculate the minutes out. Now terminal input are way more efficient. Now ultra games are way more efficient. Now terminal commands are way more efficient"}, {"post_id": 35778, "ts": "2026-07-27T12:52:18Z", "hours": 1.2631, "text": "Easter Egg #2 The photo show all things I changed in the last version now that everything is working. The game has still a few bugs and even threw the new algorithm even more so it will be a 0.3.2 expected next to fix these bugs as well. If you find one, please write it to me."}, {"post_id": 35735, "ts": "2026-07-27T11:16:54Z", "hours": 8.0969, "text": "Easter Egg and New Code structure After I was ill for a few days I now finished to implement a first planned Easter egg. I also restructured the code, but more about what I done exactly I will publish, when this version got completely working and got published on Git-Hub."}, {"post_id": 31862, "ts": "2026-07-20T16:17:02Z", "hours": 7.1044, "text": "Keyboard Control and Data The first thing I added is that know levels also can be generated with a system and not just based on luck. Also I added with a .smati file type the possibility to save and load the settings what means that when you change a setting this change will continue being there even after you restarted the game. Also you now can see your stats out of the terminal. The coolest new feature I think is the keyboard control option. That means that you now are able to navigate with your keyboard threw the normal mode instead of using the mouse."}, {"post_id": 30924, "ts": "2026-07-18T22:19:27Z", "hours": 1.9275, "text": "Ultra Mode and safety Added a filter system for the ultra mode, which is only visible if a ultra game was played and saved. I also added a question view, that you do not delete files without noticing."}, {"post_id": 30854, "ts": "2026-07-18T20:00:21Z", "hours": 5.2992, "text": "Terminal and Ultra Mode I added a terminal and a ultra mode in the terminal. The ultra mode is basically the normal game but with the different, that you have to type in what you want to do instead of clicking on the cell. The ultra mode also has a play time, the availability to get you time of the match, the restart it, to use a hint and it is also saved like the normal played matches. In the terminal you also can get the time on the second accurate."}, {"post_id": 29740, "ts": "2026-07-16T20:41:01Z", "hours": 3.0444, "text": "Bug fix and design V0.1.2 was exclusively for bug fix and design. Between the old versions I noticed bugs which I fixed to an high amount. Also I redesigned some things like the main menu or the pause menu and the design for the 7x7 grid. Now the code runs smoother and if we ignore the resize option the code is free from unwanted possibilities. If you find one, please say it, that I can fix it as well."}, {"post_id": 29464, "ts": "2026-07-16T13:08:05Z", "hours": 1.1544, "text": "Bug Fix Now you can see every dimmed cell correctly"}, {"post_id": 29433, "ts": "2026-07-16T11:42:57Z", "hours": 7.7711, "text": "Fullscreen, Resize and look and more With the new version you can put the game into fullscreen or just resize it in any way you like as long as you do not make it to small. Also you now can make the sounds be not there anymore. Furthermore you have a new version of the history and history-detail view with enables it for you to filter your games or see your games action by action"}, {"post_id": 27200, "ts": "2026-07-12T15:23:32Z", "hours": 1.3675, "text": "Audio Added an audio files which generates tones so that the game has in game sounds without copyright problems"}, {"post_id": 26125, "ts": "2026-07-10T18:47:20Z", "hours": 0.3211, "text": "Bug Fixes The Bugs was found and corrected. (Thanks to AI, that found the bugs and suggested fixes.) The Bugs were mostly just miss tips like a . instead of a , of a big letter instead of a little."}, {"post_id": 26112, "ts": "2026-07-10T18:16:47Z", "hours": 9.7158, "text": "Splitting I have started to split the game into several files, so each has a task and is better readable. Within the same I added new features like hints or a undo button, a 7x7 grid and overall a little overwork, so the code is overall better. But now are still bugs in there. (The only reason I update the project now is, because of the time I already needed and will need more.)"}, {"post_id": 23520, "ts": "2026-07-06T15:22:33Z", "hours": 3.2831, "text": "Time and Save Know you can enable to see a timer in the game. I also added a option to save your games as a history, but this still needs a lot of work, because the one file type is a bit of trickier than the last times I remembered."}, {"post_id": 22951, "ts": "2026-07-05T16:45:47Z", "hours": 0.7586, "text": "Settings and corrections The Game has no settings with an about Also I fixed a bug, which made the auto dim stop working."}, {"post_id": 22930, "ts": "2026-07-05T15:56:24Z", "hours": 0.7944, "text": "Dimming With a right click you can now dim a cell and if a cell is filled it dim automatically. Also I fixed a bug, which appeared in 0.0.4 with the 6x6."}, {"post_id": 22873, "ts": "2026-07-05T14:31:10Z", "hours": 1.1981, "text": "Expanded game modes and better marking Know you can choose between 4x4 5x5 and 6x6 game grid. Also the grid got a border and you can see if a row or column is solved, because they get marked then."}, {"post_id": 22802, "ts": "2026-07-05T11:53:20Z", "hours": 1.0408, "text": "Added a Main Screen You have now a main screen, from which you can start the game."}, {"post_id": 22764, "ts": "2026-07-05T10:45:32Z", "hours": 1.875, "text": "Created first Version it has no menu and just starts the game for one run"}]...
|
Title: Mati by @Joschi | Stardance
Devlogs:
Creat Title: Mati by @Joschi | Stardance
Devlogs:
Created first Version it has no menu and just starts the game for one run
Added a Main Screen You have now a main screen, from which you can start the game.
Expanded game modes and better marking Know you can choose between 4x4 5x5 and 6x6 game grid. Also the grid got a border and you can see if a row or column is solved, because they get marked then.
Dimming With a right click you can now dim a cell and if a cell is filled it dim automatically. Also I fixed a bug, which appeared in 0.0.4 with the 6x6.
Settings and corrections The Game has no settings with an about Also I fixed a bug, which made the auto dim stop working.
Time and Save Know you can enable to see a timer in the game. I also added a option to save your games as a history, but this still needs a lot of work, because the one file type is a bit of trickier than the last times I remembered.
Splitting I have started to split the game into several files, so each has a task and is better readable. Within the same I added new features like hints or a undo button, a 7x7 grid and overall a little overwork, so the code is overall better. But now are still bugs in there. (The only reason I update the project now is, because of the time I already needed and will need more.)
Bug Fixes The Bugs was found and corrected. (Thanks to AI, that found the bugs and suggested fixes.) The Bugs were mostly just miss tips like a . instead of a , of a big letter instead of a little.
Audio Added an audio files which generates tones so that the game has in game sounds without copyright problems
Fullscreen, Resize and look and more With the new version you can put the game into fullscreen or just resize it in any way you like as long as you do not make it to small. Also you now can make the sounds be not there anymore. Furthermore you have a new version of the history and history-detail view with enables it for you to filter your games or see your games action by action
Bug Fix Now you can see every dimmed cell correctly
Bug fix and design V0.1.2 was exclusively for bug fix and design. Between the old versions I noticed bugs which I fixed to an high amount. Also I redesigned some things like the main menu or the pause menu and the design for the 7x7 grid. Now the code runs smoother and if we ignore the resize option the code is free from unwanted possibilities. If you find one, please say it, that I can fix it as well.
Terminal and Ultra Mode I added a terminal and a ultra mode in the terminal. The ultra mode is basically the normal game but with the different, that you have to type in what you want to do instead of clicking on the cell. The ultra mode also has a play time, the availability to get you time of the match, the restart it, to use a hint and it is also saved like the normal played matches. In the terminal you also can get the time on the second accurate.
Ultra Mode and safety Added a filter system for the ultra mode, which is only visible if a ultra game was played and saved. I also added a question view, that you do not delete files without noticing.
Keyboard Control and Data The first thing I added is that know levels also can be generated with a system and not just based on luck. Also I added with a .smati file type the possibility to save and load the settings what means that when you change a setting this change will continue being there even after you restarted the game. Also you now can see your stats out of the terminal. The coolest new feature I think is the keyboard control option. That means that you now are able to navigate with your keyboard threw the normal mode instead of using the mouse.
Easter Egg and New Code structure After I was ill for a few days I now finished to implement a first planned Easter egg. I also restructured the code, but more about what I done exactly I will publish, when this version got completely working and got published on Git-Hub.
Easter Egg #2 The photo show all things I changed in the last version now that everything is working. The game has still a few bugs and even threw the new algorithm even more so it will be a 0.3.2 expected next to fix these bugs as well. If you find one, please write it to me.
Efficiency and bug fix Underneath a list of what that means: Now you can see your stats threw the terminal again. Now only games in which you have done something are saved as paused games you can continue. Now also the ultra games are saved correctly and with every action. Now you can write play out again in the terminal. Now the wrong unknown command c message after resuming a game in ultra mode is removed. Now it does not matter anymore if a command has spaces in between or not (at least for those this is wanted). Now the check for play starts threw terminal, normal and ultra, and also for leaving the terminal is way more efficient thank to hash. Now the time code is more simplified. Now you can find a second Easter egg. Now you can with ptl (play time long) see, even over a minute, your playtime on milliseconds in terminal. Now you have a new stats looks that changes itself automatically to the number of your number of games. Now you automatically are on continue when you pause the game. Now Strg/Cmd n activates new match, like you would pressed the button. Now every in game terminal is closed correctly when wanted. Now Strg/Cmd m brings you back to menu everywhere you are. Now you can use up and down arrow to navigate threw your command history in terminal. Now stats show your real data and do not calculate the minutes out. Now terminal input are way more efficient. Now ultra games are way more efficient. Now terminal commands are way more efficient
Fixed non working features Until now the program got a few things half implemented or even fully in the game but not use able because of mistakes. So know you finally see the scrollbars and you can navigate threw the terminal. You input line finally got moveable from left to right and right to left and buttons got a little new positioning. Also I made the code a little more efficient again.
MP4 export Now you have the possibility to export a played game as a mp4 video file. With this method you can share your games with others.
Efficiency I worked on the efficiency of the mp4 export and made sure that every sound is played correctly and every state is shown as wished.
Scrollbars and bug fix Now, finally, the scrollbars are really working and can be dragged as wished. I also added a version of the stats to the normal view and a version of the history and the settings to the terminal. Furthermore I worked on a way to scale the game up for the mp4 export and to make it harder to cheat. And, like always: If you test it (the newest versions code will be on GitHub in a few days) and should find any bug, please comment them so I can fix it.
Efficiency and little changes Threw match case the code got little faster. I also corrected some weird keyboard navigation hover bugs fixed. Furthermore the terminal now got a clock and settings have a complete new look. The last really nameable thing is about that now, if you undo an action, this action is actually marked as undone (if not undone with the button), so you better reflect in the history detail view how the game was.
New jump system I added a new jump system for the setting, history detail, the Hannah Easter eggs and history view. This enabled the possibility to jump right back and not every time to the start and so you can navigate way faster threw this systems. I also fixed some bugs for example the bug that make the upscale from the exports video not work right. And like always, please comment under this if you notice a bug so that I can fix it.
Achievements and Design Now the game has an achievement system that show you something like tasks you could do. I also fixed like always some bugs from which are way to much in there and also redesigned the history detail grid position for every size.
Sort and filter system I added an advanced sort and filter system to the history in the terminal. Furthermore the history detail video export is now way faster and the exported videos just need the up to the half of the capacity they have needed before in the same quality level.
Achievements and clear up I added a new achievements show way that is based on multiple pages and every has his specific achievements on. I also cleared up the code a little bit, means I put fast added constants into the config, do little efficiency things and stuff like that. Furthermore I made scrollbars not just be better shown threw all menus, but also work better (more accurate). Now V0.5.0 is on GitHub, if you find bugs, please comment them under this devlog.
Fixed Bugs Now the game have finally also in terminal’s ultra game the option to pause the game and take a break. I also added a mechanism for players who want to be really fast that allows the program to submit commands automatically to reduce the submit click every action. Furthermore the achievement screen now has a two way navigation what means that you could either press the left/right arrow keys of your keyboard or click with your mouse on the magic appearing buttons. PS: V0.5.1 is out, it is an update mostly about bug fixing and just this little new features from witch 2 already should work in version beyond this.
Added Advanced Settings It took long and still look not that great and do not work all over, but the base is set. To explain it, the game now has variable sound volume. Also you can now change the language, even though I do not have already created a fully second language. Furthermore navigation keys and ultra input order are now choose able, so if you prefer it different you can now make it so. PS: This devlog is made just in reason off time, at the moment none of this get pushed to GitHub, because it is still in developing.
Languages What I used the last few hours for is what I probably will have to do for some more. Go threw the code and replace everything that generates an output the user could see with the new method that translate this. For this I also need to add the translations. As I needed a break I made the new design for the advanced settings, and now its like I wanted it to be. Furthermore the history in terminal supports now more sort options and - in front to change the meaning for this it has a new system that transfers everything with the same meaning into the same internal command.
Language and Efficiency After many hours I finally made it to add a second language to my game, beside English you know can have German texts in the game. Furthermore I took a little time to made the game as video export more efficient so that it takes 6 seconds less to export my test game.
Languages and Efficiency The last few hours I used to refresh my school knowledge in French and Spanish to create language packets for my game in this two languages. What I did a little bit earlier is to work again on video exporting efficiency and now it gone really fast. Exporting a video in normal scale takes less time then playing it, in twice the resolution it takes usually around the play time or a little longer and in the highest settings still long. But overall it is now much faster and with less possible problems. PS: The export time are different depending on the hardware of your computer.
New Design and better language including Now the Achievements have this existing new design that not just looks better but also provides you more easy the needed information. I also made the language better fitting to the shown elements and changed some slightly to make it also look better. Furthermore I fixed a few little bugs like that you could not select ctrl and key shortcuts by yourself or that the pause text has not reacted to that.
Code split and missing feature give With the latest version the game has grown to 14 game and 3 language constructor files, because I a made clearer structure in the code itself, that means I grabbed my screens file and extracted everything that was in there but with questionable reason. So the new files helpers and alt_hover was created. The task of alt_hover is explicit to handle everything containing the keyboard navigation possibilities. Helpers on the other hand is made for everything that is like a config but little more. (I know, that my config still is more as it should, I’ll try to change this as soon as possible.) Also I added with this update missing features that already should be in there like that the keyboard navigation also works in the advanced settings or that like you see in the picture the buttons in settings have an own color palette to make sure that it is clear that they at first are toggle buttons and have an associated color for each of their states. Furthermore I fixed a few little bugs, like that the back jump to the achievement button is not working with the up going higher than to the full-screen button. I hope you enjoy version 0.6.1
Bug fixing and redesign Over the last thew versions, even though I spend a lot of time in debugging, many little bugs appear. Sometimes they comes just from moving a function or mistyping and sometimes deeper. So with this version I fixed again many of them, like wrong time show in the achievements and many others. Furthermore I worked and correcting and redesigning the whole terminal help logic, giving the main achievements new names and, like you see in the picture, modified the general achievements screen so that it not just looks better, but also feels better in reason of an improved algorithm to hide the mouse and navigation buttons. PS: If you use it and find a bug, it would be really nice if you could comment it.
System remake It took a while and I forgot a little the time it used, but I did it. Now the whole game runs more efficient threw the new system that handles buttons separate and keeps them cached, so they do not have to be completely calculated every frame new. Also some designs changed slightly.
Chapters I added with the help of AI the possibility to have chapters into my game. So you now can go exactly to the start of every action like you do in the game itself. And even though I know that this do not make that much of the decision how good the program is, it is still another thing that I now know how to do and I think that this is also really important.
Better Structure, Same Simplicity The last (many) hours I spend with one thing. Making sure the codes run even with new and better structure internal. This was also really important, because it made it easier to integrate multiple new things. One thing is, that now into the nearly same and reliable stats design comes buttons. This buttons are basically the headers, means size, mode, games … . If you click on them they basically sort the stats after this header. Furthermore the terminal got a big upgrade, because now it has three new ways to get deeper into your game. At first you can now easily check if you have paused matches. Also you can check your export history, which new feature made it actually also possible to get warned if you export a single match multiple times. And last but not least analysis. Because the game now got a deeper understanding of how you are playing and what are your trends and you can view all of this by the terminals history. (And I was shocked how good it worked with my recent 150 matches.) I hope, I didn’t overwhelmed you with all these information and that you are as curious for the new version as I am.
Finalizing basic functions My goal is the finish the app as soon as possible. So I am know fixing the last few bugs and add the last missing feature that the program should have. This devlog should just let you know, that the last days were full of deciding what could I do to improve the program and were the bugs are. (Poorly most of this sort of spend time is not count toward the project.) The provided screenshots shows a thing I am currently trying to do better, the extended settings, because like you see, the design is very bad.
Tutorial I added a tutorial that shows the player how the game mainly works and give him the information about the shortcuts. Also I added a function to make the clock a reopen point for a small explanation what the program can do.
Probably the last devlog on this project After more than 220 hours of coding and more and another 200 hours of deciding what to do and talking to other developers about how I could make this program run and do it good, I finally think that it is on a point at which I can think about shipping it. It runs, has no crucial bugs I noticed and is efficient enough to not take several hours just for the export of an mp4 video. Maybe I will add more features later, so do not be shy to comment what you like and what I should change and of course, please tell me if you have found any bug or unnatural behavior. OS Declaration Even though my goal was to make MATI run on every of the big 3 (Mac-OS, Linux, Windows) the current version just runs as wanted on Windows, due to different handling with graphic, which just means, that not every text is placed wright and that the overall look is scratched on Linux and Mac-OS. PS: The picture is the app icon.
Fixed the Read-Me After I got noticed that my Read-Me is not quite what it has to be, I have done a new version that should fit better into the requirements.
Ships:
Welcome to MATI Discover MATI, a simple and relaxing Sudoku-inspired puzzle game designed to challenge your number-solving skills without putting you under pressure. Your goal is simple: Find the right numbers and complete every row and column correctly. MATI is designed to be fun and stress-free: No Time Pressure: Disable the timer whenever you want and play at your own pace. No Mistakes to Fear: MATI doesn’t punish you for incorrect entries. Simply correct them whenever you notice a mistake. 4 Different Sizes: Choose from four puzzle sizes to match your preferred challenge. Built-in Terminal: Prefer an old-school experience? Play MATI directly in its integrated terminal. Full Keyboard Support: No mouse or trackpad? No problem! MATI can be controlled entirely with your keyboard. ! Development Notice! MATI is still under active development. More features, improvements, and refinements are planned for future updates. Thank you for checking out MATI!...
|
1792853463.92683
|
1792939863.92683
|
|
58573
|
spacecrew by @jakub-ginal | Stardance
|
jakub-ginal
|
1
|
227.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-15T10:03:07Z", "hours": 227.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "spacecrew - mission control for your terminal What I made: I got tired of opening five browser tabs to follow space, so I built one command that brings them all together. spacecrew tells you who’s in orbit this second, tells you when the ISS is about to cross your sky, counts down the next liftoff with a rocket photo beside it, displays NASA’s Picture of the Day in terminal characters, and tracks solar activity with a verdict on whether you’ll see auroras tonight. What was challenging: At one point, every satellite prediction was perfectly calculated, but for the mirror image of Earth. A single flipped sign in the orbital math put passes on the wrong side of the planet, and nothing looked obviously broken until I cross-checked each pass against an independent physics library, minute by minute, until reality matched. The other fight was time itself: switching an app built around UTC to local time without breaking a single countdown. What I’m proud of: The app now distrusts the internet by default. Dead APIs, rate limits, airplane mode: it keeps working from cached data and built-in satellite TLEs whenever possible. It also includes real orbital calculations, satellite tracking, radio frequencies, and a full interactive terminal interface, all installable with a single command. Features: People in Space, NASA APOD, Launches, ISS Tracking, Space Weather, Satellite Passes, Themes, Dashboard The GitHub README includes a detailed breakdown of the features, modes, configuration options, and command-line flags, along with screenshots and examples. Try it yourself: Install with either command: pipx install spacecrew or pip install spacecrew", "repo": "https://github.com/jakub-ginal/spacecrew", "demo": "https://pypi.org/project/spacecrew/"}]...
|
[{"post_id": 79650, "ts": "202 [{"post_id": 79650, "ts": "2026-10-14T21:49:05Z", "hours": 0.5514, "text": "spacecrew - quick terminal tour Quick tour of spacecrew in action: interactive menu, people in space, live ISS position, Tonight’s Best satellite passes, a launch countdown with the rocket photo view and more. Video is now available on the GitHub project page."}, {"post_id": 79610, "ts": "2026-10-14T18:19:01Z", "hours": 2.1667, "text": "v1.2.18 and v1.2.19 - Documentation and run fixes **Tzdata dependency ** - added the Windows-only tzdata dependency so timezones resolve correctly instead of falling back to UTC Dashboard navigation - fixed Enter-to-exit on Windows using msvcrt , while keeping existing POSIX behavior unchanged Module execution - python -m spacecrew now works via the new __main__.py Version detection - falls back to pyproject.toml in development checkouts to avoid reporting stale versions Docs - completely rewrote the README with feature sections and screenshots Published - v1.2.19 is now available on GitHub and PyPI"}, {"post_id": 79498, "ts": "2026-10-14T09:55:01Z", "hours": 10.1031, "text": "v1.2.17 - Timezones, rocket photos, and satellite pass fixes Local timezones - added --timezone flag, saved timezone settings, and automatic detection. Times display locally (e.g. 20:00 CEST), with UTC in parentheses in detail views UTC consistency - countdowns and --json output remain in UTC Rocket photos - press p in launch details to view a large, high-resolution rocket photo with minimal accompanying info Satellite pass accuracy - fixed a rotation sign error that caused incorrect predictions, verified against an independent reference to within ±1 minute Low-elevation passes - fixed filtering that silently dropped visible passes Settings persistence - fixed settings that sometimes failed to save Clean JSON output - status banners no longer pollute --json output Published - v1.2.17 is now available on GitHub and PyPI"}, {"post_id": 79399, "ts": "2026-10-13T20:13:28Z", "hours": 10.2, "text": "v1.2.16 - Fixes and configuration improvements Cache control - fixed --no-cache , which was parsed but previously ignored Custom configuration - added --config DIR , SPACE_CREW_CONFIG_DIR , and XDG_CONFIG_HOME support for isolated configs NASA API errors - added clearer DEMO_KEY rate-limit hints with an API link, plus 5xx and offline guidance in the APOD view SatNOGS cache - fixed cache typing to support both dictionaries and lists Offline weather - fixed offline responses to return the complete expected data structure Code cleanup - removed a duplicate docstring Documentation - updated the man page to v1.2.16 and synced README examples for --json and --config Published - v1.2.16 is now available on GitHub and PyPI"}, {"post_id": 79178, "ts": "2026-10-12T22:22:37Z", "hours": 8.0389, "text": "v1.2.15 - Scriptability, radio, and aurora JSON output - added --json support for passes, people, and launches, with machine-readable data for scripts, jq , cron jobs, and home automation Pass data - JSON includes satellite name, group, start/end times, max elevation, duration, magnitude, quality, cloud cover, moon phase, and visibility Downlink frequencies - new FREQUENCIES panel with SatNOGS transmitter data, including frequency, mode, uplink, baud rate, and description Offline frequency cache - transmitter data cached for 90 days and available offline Aurora forecast - dashboard and space weather view now show whether aurora is Overhead possible, Low on horizon possible, or Unlikely based on Kp and your location Reliable satellite data - 396-satellite offline TLE fallback across all 13 groups, with stale-cache failover when Celestrak is unavailable Faster fetching - shorter timeouts and improved data loading Published - v1.2.15 is now available on GitHub and PyPI"}, {"post_id": 79019, "ts": "2026-10-12T11:47:58Z", "hours": 10.3897, "text": "v1.2.14 - Live dashboard, countdowns, satellite info, and fetch improvements Live dashboard - updates every second, with background data refreshes every 60 seconds and Enter-only exit Countdowns everywhere - shows time until passes, red NOW for active passes, and dim ENDED for finished passes Pass filtering - ended passes are filtered out so lists start with the next upcoming pass Satellite info panel - displays NORAD ID, launch date, operator, country, and status from cached SatNOGS data Reliable data fetching - fast failover to stale cache and 396-satellite built-in fallback Parallel fetching - satellite groups load in parallel for better performance Cache protection - empty results never overwrite valid cached data Dashboard accuracy - Tiangong no longer displays ISS data Published - v1.2.14 is now available on GitHub and PyPI"}, {"post_id": 78781, "ts": "2026-10-11T16:18:02Z", "hours": 9.7994, "text": "v1.2.13 - Satellite data, dashboard, performance and documentation Offline satellite data - 396 real satellites across all 13 groups Satellite groups - fixed dead GROUP=other and empty iridium groups Dashboard fixes - q quits, Tiangong displays correct data, and unused imports removed Lazy-loaded images - Pillow and chafa no longer required at startup, with a new --no-image flag Performance improvements - optimized observer calculations and parallel group fetching Cache fixes - empty results no longer overwrite cached satellite data Documentation - updated README with all modes, configuration, and flags Man page - fixed documentation and removed duplicate man directory Published - v1.2.13 is now available on GitHub and PyPI"}, {"post_id": 78657, "ts": "2026-10-11T06:07:37Z", "hours": 11.6944, "text": "v1.2.12 - Bug fixes and packaging improvements Core stability - fixed argument parsing and replaced recursive refresh loops with proper loops Astronaut view - fixed crashes when photos are missing Moon phases - all 8 phases now work correctly, with proper UTC timestamps Satellite passes - fixed filter persistence, empty lists, group tags, and missing URLs ISS tracking - improved retries, offline handling, and location accuracy Dashboard - fixed storm level detection, now shows actual conditions Cache and display - improved corrupted cache handling and screen clearing APOD and space weather - fixed API key handling, date requests, and image loading with fallbacks Packaging - wheel now includes the man page and fallback TLE data Published - v1.2.12 is now available on GitHub and PyPI"}, {"post_id": 78399, "ts": "2026-10-10T17:20:02Z", "hours": 10.4, "text": "v1.2.10, v1.2.11 - Satellite tracker improvements Fallback TLE data - 24 satellites across 6 groups, available when network sources fail Detail view fixes Full-width panels - expanded panels for improved layout Faster TLE fetching Published - v1.2.11 is now available on GitHub and PyPI"}, {"post_id": 78156, "ts": "2026-10-09T20:18:48Z", "hours": 9.8033, "text": "v1.2.9 - Satellite detail view & themes Satellite detail redesign - new panel and table layout matching the launches and people views Header panel - satellite name, group badge, and FAV indicator Next Pass panel - highlighted summary with time, elevation, direction, duration, magnitude, quality, cloud cover, and moon phase Full passes table - date, time, max elevation, direction, duration, magnitude, quality, cloud cover, moon phase, and visibility Visibility indicators - green rows for visible passes and dimmed rows for non-visible passes Refined styling - subtle borders and softer colors for a cleaner look 10 themes - added Dracula Published - v1.2.9 is now available on GitHub and PyPI"}, {"post_id": 77945, "ts": "2026-10-08T22:00:46Z", "hours": 6.5667, "text": "v1.2.8 - Satellite Passes visual improvements Panel-based layout - each satellite now has a bordered card with its number, name, group badge, and [FAV] indicator Multiple passes - up to 3 passes per satellite, configurable Quality-tier borders - Best, Good, OK, and Dim tiers with matching colors Clean pass data - time, elevation, compass direction, duration, magnitude, and quality score Visibility details - cloud cover, moon phase, and VISIBLE status shown for each pass Satellite groups - fixed categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Favorites integration - [FAV] badge, favorites-only mode with 5 , and F to toggle favorites Detail view navigation - Enter returns to the previous list instead of the main menu Published - v1.2.8 is now available on GitHub and PyPI"}, {"post_id": 77840, "ts": "2026-10-08T14:16:42Z", "hours": 9.7667, "text": "v1.2.6 - Satellite groups, navigation & visual improvements Satellite groups - proper categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Detail view navigation - Enter now returns to the previous list instead of the main menu Cloud cover - displayed as ☁︎ XX% Azimuth - compass direction added, e.g. 45°NE → 135°SE Moon phase - displayed as Moon XX% Code cleanup Published - v1.2.5 is now available on GitHub and PyPI"}, {"post_id": 77668, "ts": "2026-10-07T19:40:00Z", "hours": 10.5333, "text": "v1.2.6 - Favorites satellites Favorites - add or remove satellites from the detail view with F Favorites mode - press 5 in the satellite passes menu to show only favorited satellites Favorites badge - ★ FAV badge shown in satellite detail view Persistent favorites - saved in ~/.config/spacecrew/config.toml Published - v1.2.5 is now available on GitHub and PyPI"}, {"post_id": 77374, "ts": "2026-10-06T18:11:40Z", "hours": 9.9, "text": "v1.2.5 - Satellite tracker fixes & polish Tonight’s Best fixed - no longer loads 10k+ Starlink satellites, only ISS + Stations Tiered quality system - Best (mag < 2, el > 45°, dur > 5 min), Good (mag < 4, el > 25°), OK (mag < 5.5, el > 15°) Filter menu - fixed duplicate code Calculating passes… - removed duplicate message Man page - added man spacecrew Shell completions - added bash, zsh, and fish support via spacecrew --generate-completion GitHub Release - added automatic release creation on tag push Published - v1.2.5 is now available on GitHub and PyPI"}, {"post_id": 77171, "ts": "2026-10-05T22:04:11Z", "hours": 5.9333, "text": "v1.2.3 - Pass Predictor fixes and UX improvements Tonight’s Best no longer loads 10k+ Starlink satellites Tiered quality system - Best, Good, OK instead of one strict filter Filter menu duplicate code fixed Calculating passes… duplicate message removed Night filtering fixed with sun_el_max v1.2.3 on GitHub and PyPI."}, {"post_id": 77035, "ts": "2026-10-05T13:12:07Z", "hours": 10.0, "text": "v1.2.3 - Satellite tracker redesign Pass Predictor redesign - Tonight’s Best, All Passes, Specific Satellite Cloud cover from Open-Meteo, cached for 1 hour Moon phase via local Meeus algorithm, fully offline Night pass info - cloud cover and moon phase when relevant Satellite groups reorganized for easier browsing Direct satellite search across all groups Type badges added to satellite details Simplified controls - Enter = back everywhere"}, {"post_id": 76893, "ts": "2026-10-04T23:29:10Z", "hours": 9.3603, "text": "v1.2.3 - Cloud cover and moon phase now appear alongside every predicted pass in the satellite tracker. Cloud cover - Real-time data from Open-Meteo. Shows percentage at exact pass time and location. Cached 1 hour. Moon phase - Local Meeus algorithm, zero API calls. Only shown for night passes (sun elevation < -6°). Displays phase name + illumination: MOON FIRST QUARTER 44%. v1.2.3 on GitHub and PyPI."}, {"post_id": 76707, "ts": "2026-10-04T11:48:44Z", "hours": 10.5, "text": "spacecrew v1.2.1 Dashboard mode (option 8) - 2-column btop-like grid: ISS/Tiangong/Passes left, Weather/People/Launches/APOD right; renders via Rich Layout grid 9 themes: default, Catppuccin Mocha/Latte, Tokyo Night, Gruvbox, Nord, Everforest, Rose Pine, Kanagawa - semantic styles, zero hardcoded colors, persist in config.toml v1.2.1 on GitHub and PyPI"}, {"post_id": 76537, "ts": "2026-10-03T21:14:34Z", "hours": 10.4872, "text": "v1.1.18 - Themes, progress bars, consistent Enter=back 5 themes: default, dark, solarized, dracula, monokai Progress bars: spinner for single fetch, count bar for multi-group TLE Enter = back everywhere for consistent navigation Replaced hardcoded colors with semantic theme styles Theme selection persists in config.toml v1.1.18 on GitHub and PyPI."}, {"post_id": 76264, "ts": "2026-10-02T23:41:38Z", "hours": 10.5508, "text": "v1.1.16-17 - Pass quality scores and real magnitudes: Quality (0-100) - elevation, duration, darkness, magnitude, rarity combined Real mags - per-type standards (ISS -1.3, Starlink 5.5, GPS 4.0) with range + phase correction Phase angle math - proper Sun-sat-observer geometry for realistic brightness UI shows both - mag -2.6 Q80 on every pass in list and detail views All groups covered - stations, Starlink, military, NOAA, GOES, GPS, Galileo, BeiDou, Iridium Offline–irst - cached TLE, zero network needed The predictor now tells you which passes are worth waking up for. v1.1.17 on GitHub and PyPI."}, {"post_id": 76099, "ts": "2026-10-02T10:05:54Z", "hours": 8.0419, "text": "spacecrew v1.1.15 - Satellite Pass Predictor update. Fixed TLE cache: each group (stations, starlink, military, gps, weather, science, amateur, radar, cubesat, geo, iridium). Menu: full menu (all/tonight/stations/starlink quick/days config), tonight’s best (quick 24h), specific satellite picker with group selector, search, pagination, 7-day detail, change location, back. 11 groups, 11,500+ satellites. Works offline (cached TLEs, 1-day TTL). v1.1.15 on GitHub and PyPI."}, {"post_id": 75904, "ts": "2026-10-01T15:35:24Z", "hours": 11.1056, "text": "spacecrew v1.1.14 - Satellite Pass Predictor. Menu option 6 / spacecrew –mode passes. Celestrak TLE data + local sgp4 propagation, no API keys, no rate limits, works offline after first run. Tracks ISS, Starlink trains, and many more satellites. Calculates visible passes for the next three days: elevation >10°, sky dark, satellite sunlit. Shows start time, max elevation, duration, direction, visibility flag. Location saved to config, prompted once. Example: ISS 05:53 UTC max 53° 6min west→east ✓, Starlink-1017 11:21 UTC max 80° 7min ✓. v1.1.14 on GitHub and PyPI."}, {"post_id": 75680, "ts": "2026-09-30T18:50:20Z", "hours": 10.3292, "text": "Today I released spacecrew v1.1.10, v1.1.11, and v1.1.12. v1.1.10 - Added –offline flag: runs entirely from local SQLite cache with zero network requests. Avoids rate limits, works without internet. All four modes work if previously cached. Banner shows “Offline mode: using cached data only”. v1.1.11 - Launch countdown timer: live T- in launches list (cyan to yellow to red as launch nears, LAUNCHED for past). Space Weather dashboard (menu option 5, –mode weather): solar flares (X/M/C colored), CMEs with speed, Kp index with storm level (Quiet to G5), NOAA 3-day forecast highlights. All cached (1-day TTL), works offline. v1.1.12 - Fixed few things. Published to GitHub (tags v1.1.10, v1.1.11, v1.1.12) and PyPI via automated workflow."}, {"post_id": 75385, "ts": "2026-09-29T22:02:03Z", "hours": 5.7128, "text": "Today I released spacecrew v1.1.9. The main addition is an ISS Tracker using wheretheiss.at (real-time TLE calculation) as primary source with open-notify.org fallback - shows latitude, longitude, altitude (~425 km), velocity (~27,500 km/h), visibility, and location name via reverse geocoding, plus a Google Maps link. Core improvements: persistent SQLite cache with configurable TTL (30 days default) for all API responses, a config file at ~/.config/spacecrew/config.toml (NASA API key, cache TTL, theme, default mode), CLI arguments for direct mode access (–mode {people,apod,launches,iss}), –clear-cache, –no-cache, Windows-compatible screen clearing, and Python 3.10 support via conditional tomli dependency. Published to GitHub (tag v1.1.9) and PyPI via the automated workflow."}, {"post_id": 74899, "ts": "2026-09-28T15:39:13Z", "hours": 10.4289, "text": "Today I worked on spacecrew and enhanced the project with major improvements. I enhanced NASA’s Astronomy Picture of the Day (APOD) with date navigation (previous day), HD image opening in browser, and full metadata display. I also added a new Upcoming Launches feature using The Space Devs API, showing 15 upcoming launches from all agencies with a clean panel-based list view and detailed view including links to launch transmissions when available, mission patch, and info/Wikipedia links. I restructured the CLI with a main menu for three modes (People in Space, APOD, Launches), added NASA_API_KEY environment variable support with DEMO_KEY fallback, and implemented in-memory session caching for both features. Published v1.1.8 to GitHub and PyPI."}, {"post_id": 74542, "ts": "2026-09-27T16:30:32Z", "hours": 4.5878, "text": "Today I worked on spacecrew and made several improvements to the project. I added NASA’s Astronomy Picture of the Day (APOD), so users can now view the current astronomical picture directly from the CLI. I also tested the feature, updated the project documentation, and published the updated version to GitHub and PyPI. I also worked on improving the overall project and making the CLI easier to use."}, {"post_id": 74031, "ts": "2026-09-26T15:43:20Z", "hours": 0.2561, "text": "Im working on spacecrew, a linux command line tool for managing and organizing space-related information directly from the terminal. Im improving the CLI, adding features, fixing bugs, and making the project easier to use."}]...
|
Title: spacecrew by @jakub-ginal | Stardance
Devl Title: spacecrew by @jakub-ginal | Stardance
Devlogs:
Im working on spacecrew, a linux command line tool for managing and organizing space-related information directly from the terminal. Im improving the CLI, adding features, fixing bugs, and making the project easier to use.
Today I worked on spacecrew and made several improvements to the project. I added NASA’s Astronomy Picture of the Day (APOD), so users can now view the current astronomical picture directly from the CLI. I also tested the feature, updated the project documentation, and published the updated version to GitHub and PyPI. I also worked on improving the overall project and making the CLI easier to use.
Today I worked on spacecrew and enhanced the project with major improvements. I enhanced NASA’s Astronomy Picture of the Day (APOD) with date navigation (previous day), HD image opening in browser, and full metadata display. I also added a new Upcoming Launches feature using The Space Devs API, showing 15 upcoming launches from all agencies with a clean panel-based list view and detailed view including links to launch transmissions when available, mission patch, and info/Wikipedia links. I restructured the CLI with a main menu for three modes (People in Space, APOD, Launches), added NASA_API_KEY environment variable support with DEMO_KEY fallback, and implemented in-memory session caching for both features. Published v1.1.8 to GitHub and PyPI.
Today I released spacecrew v1.1.9. The main addition is an ISS Tracker using wheretheiss.at (real-time TLE calculation) as primary source with open-notify.org fallback - shows latitude, longitude, altitude (~425 km), velocity (~27,500 km/h), visibility, and location name via reverse geocoding, plus a Google Maps link. Core improvements: persistent SQLite cache with configurable TTL (30 days default) for all API responses, a config file at ~/.config/spacecrew/config.toml (NASA API key, cache TTL, theme, default mode), CLI arguments for direct mode access (–mode {people,apod,launches,iss}), –clear-cache, –no-cache, Windows-compatible screen clearing, and Python 3.10 support via conditional tomli dependency. Published to GitHub (tag v1.1.9) and PyPI via the automated workflow.
Today I released spacecrew v1.1.10, v1.1.11, and v1.1.12. v1.1.10 - Added –offline flag: runs entirely from local SQLite cache with zero network requests. Avoids rate limits, works without internet. All four modes work if previously cached. Banner shows “Offline mode: using cached data only”. v1.1.11 - Launch countdown timer: live T- in launches list (cyan to yellow to red as launch nears, LAUNCHED for past). Space Weather dashboard (menu option 5, –mode weather): solar flares (X/M/C colored), CMEs with speed, Kp index with storm level (Quiet to G5), NOAA 3-day forecast highlights. All cached (1-day TTL), works offline. v1.1.12 - Fixed few things. Published to GitHub (tags v1.1.10, v1.1.11, v1.1.12) and PyPI via automated workflow.
spacecrew v1.1.14 - Satellite Pass Predictor. Menu option 6 / spacecrew –mode passes. Celestrak TLE data + local sgp4 propagation, no API keys, no rate limits, works offline after first run. Tracks ISS, Starlink trains, and many more satellites. Calculates visible passes for the next three days: elevation >10°, sky dark, satellite sunlit. Shows start time, max elevation, duration, direction, visibility flag. Location saved to config, prompted once. Example: ISS 05:53 UTC max 53° 6min west→east ✓, Starlink-1017 11:21 UTC max 80° 7min ✓. v1.1.14 on GitHub and PyPI.
spacecrew v1.1.15 - Satellite Pass Predictor update. Fixed TLE cache: each group (stations, starlink, military, gps, weather, science, amateur, radar, cubesat, geo, iridium). Menu: full menu (all/tonight/stations/starlink quick/days config), tonight’s best (quick 24h), specific satellite picker with group selector, search, pagination, 7-day detail, change location, back. 11 groups, 11,500+ satellites. Works offline (cached TLEs, 1-day TTL). v1.1.15 on GitHub and PyPI.
v1.1.16-17 - Pass quality scores and real magnitudes: Quality (0-100) - elevation, duration, darkness, magnitude, rarity combined Real mags - per-type standards (ISS -1.3, Starlink 5.5, GPS 4.0) with range + phase correction Phase angle math - proper Sun-sat-observer geometry for realistic brightness UI shows both - mag -2.6 Q80 on every pass in list and detail views All groups covered - stations, Starlink, military, NOAA, GOES, GPS, Galileo, BeiDou, Iridium Offline–irst - cached TLE, zero network needed The predictor now tells you which passes are worth waking up for. v1.1.17 on GitHub and PyPI.
v1.1.18 - Themes, progress bars, consistent Enter=back 5 themes: default, dark, solarized, dracula, monokai Progress bars: spinner for single fetch, count bar for multi-group TLE Enter = back everywhere for consistent navigation Replaced hardcoded colors with semantic theme styles Theme selection persists in config.toml v1.1.18 on GitHub and PyPI.
spacecrew v1.2.1 Dashboard mode (option 8) - 2-column btop-like grid: ISS/Tiangong/Passes left, Weather/People/Launches/APOD right; renders via Rich Layout grid 9 themes: default, Catppuccin Mocha/Latte, Tokyo Night, Gruvbox, Nord, Everforest, Rose Pine, Kanagawa - semantic styles, zero hardcoded colors, persist in config.toml v1.2.1 on GitHub and PyPI
v1.2.3 - Cloud cover and moon phase now appear alongside every predicted pass in the satellite tracker. Cloud cover - Real-time data from Open-Meteo. Shows percentage at exact pass time and location. Cached 1 hour. Moon phase - Local Meeus algorithm, zero API calls. Only shown for night passes (sun elevation < -6°). Displays phase name + illumination: MOON FIRST QUARTER 44%. v1.2.3 on GitHub and PyPI.
v1.2.3 - Satellite tracker redesign Pass Predictor redesign - Tonight’s Best, All Passes, Specific Satellite Cloud cover from Open-Meteo, cached for 1 hour Moon phase via local Meeus algorithm, fully offline Night pass info - cloud cover and moon phase when relevant Satellite groups reorganized for easier browsing Direct satellite search across all groups Type badges added to satellite details Simplified controls - Enter = back everywhere
v1.2.3 - Pass Predictor fixes and UX improvements Tonight’s Best no longer loads 10k+ Starlink satellites Tiered quality system - Best, Good, OK instead of one strict filter Filter menu duplicate code fixed Calculating passes… duplicate message removed Night filtering fixed with sun_el_max v1.2.3 on GitHub and PyPI.
v1.2.5 - Satellite tracker fixes & polish Tonight’s Best fixed - no longer loads 10k+ Starlink satellites, only ISS + Stations Tiered quality system - Best (mag < 2, el > 45°, dur > 5 min), Good (mag < 4, el > 25°), OK (mag < 5.5, el > 15°) Filter menu - fixed duplicate code Calculating passes… - removed duplicate message Man page - added man spacecrew Shell completions - added bash, zsh, and fish support via spacecrew --generate-completion GitHub Release - added automatic release creation on tag push Published - v1.2.5 is now available on GitHub and PyPI
v1.2.6 - Favorites satellites Favorites - add or remove satellites from the detail view with F Favorites mode - press 5 in the satellite passes menu to show only favorited satellites Favorites badge - ★ FAV badge shown in satellite detail view Persistent favorites - saved in ~/.config/spacecrew/config.toml Published - v1.2.5 is now available on GitHub and PyPI
v1.2.6 - Satellite groups, navigation & visual improvements Satellite groups - proper categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Detail view navigation - Enter now returns to the previous list instead of the main menu Cloud cover - displayed as ☁︎ XX% Azimuth - compass direction added, e.g. 45°NE → 135°SE Moon phase - displayed as Moon XX% Code cleanup Published - v1.2.5 is now available on GitHub and PyPI
v1.2.8 - Satellite Passes visual improvements Panel-based layout - each satellite now has a bordered card with its number, name, group badge, and [FAV] indicator Multiple passes - up to 3 passes per satellite, configurable Quality-tier borders - Best, Good, OK, and Dim tiers with matching colors Clean pass data - time, elevation, compass direction, duration, magnitude, and quality score Visibility details - cloud cover, moon phase, and VISIBLE status shown for each pass Satellite groups - fixed categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Favorites integration - [FAV] badge, favorites-only mode with 5 , and F to toggle favorites Detail view navigation - Enter returns to the previous list instead of the main menu Published - v1.2.8 is now available on GitHub and PyPI
v1.2.9 - Satellite detail view & themes Satellite detail redesign - new panel and table layout matching the launches and people views Header panel - satellite name, group badge, and FAV indicator Next Pass panel - highlighted summary with time, elevation, direction, duration, magnitude, quality, cloud cover, and moon phase Full passes table - date, time, max elevation, direction, duration, magnitude, quality, cloud cover, moon phase, and visibility Visibility indicators - green rows for visible passes and dimmed rows for non-visible passes Refined styling - subtle borders and softer colors for a cleaner look 10 themes - added Dracula Published - v1.2.9 is now available on GitHub and PyPI
v1.2.10, v1.2.11 - Satellite tracker improvements Fallback TLE data - 24 satellites across 6 groups, available when network sources fail Detail view fixes Full-width panels - expanded panels for improved layout Faster TLE fetching Published - v1.2.11 is now available on GitHub and PyPI
v1.2.12 - Bug fixes and packaging improvements Core stability - fixed argument parsing and replaced recursive refresh loops with proper loops Astronaut view - fixed crashes when photos are missing Moon phases - all 8 phases now work correctly, with proper UTC timestamps Satellite passes - fixed filter persistence, empty lists, group tags, and missing URLs ISS tracking - improved retries, offline handling, and location accuracy Dashboard - fixed storm level detection, now shows actual conditions Cache and display - improved corrupted cache handling and screen clearing APOD and space weather - fixed API key handling, date requests, and image loading with fallbacks Packaging - wheel now includes the man page and fallback TLE data Published - v1.2.12 is now available on GitHub and PyPI
v1.2.13 - Satellite data, dashboard, performance and documentation Offline satellite data - 396 real satellites across all 13 groups Satellite groups - fixed dead GROUP=other and empty iridium groups Dashboard fixes - q quits, Tiangong displays correct data, and unused imports removed Lazy-loaded images - Pillow and chafa no longer required at startup, with a new --no-image flag Performance improvements - optimized observer calculations and parallel group fetching Cache fixes - empty results no longer overwrite cached satellite data Documentation - updated README with all modes, configuration, and flags Man page - fixed documentation and removed duplicate man directory Published - v1.2.13 is now available on GitHub and PyPI
v1.2.14 - Live dashboard, countdowns, satellite info, and fetch improvements Live dashboard - updates every second, with background data refreshes every 60 seconds and Enter-only exit Countdowns everywhere - shows time until passes, red NOW for active passes, and dim ENDED for finished passes Pass filtering - ended passes are filtered out so lists start with the next upcoming pass Satellite info panel - displays NORAD ID, launch date, operator, country, and status from cached SatNOGS data Reliable data fetching - fast failover to stale cache and 396-satellite built-in fallback Parallel fetching - satellite groups load in parallel for better performance Cache protection - empty results never overwrite valid cached data Dashboard accuracy - Tiangong no longer displays ISS data Published - v1.2.14 is now available on GitHub and PyPI
v1.2.15 - Scriptability, radio, and aurora JSON output - added --json support for passes, people, and launches, with machine-readable data for scripts, jq , cron jobs, and home automation Pass data - JSON includes satellite name, group, start/end times, max elevation, duration, magnitude, quality, cloud cover, moon phase, and visibility Downlink frequencies - new FREQUENCIES panel with SatNOGS transmitter data, including frequency, mode, uplink, baud rate, and description Offline frequency cache - transmitter data cached for 90 days and available offline Aurora forecast - dashboard and space weather view now show whether aurora is Overhead possible, Low on horizon possible, or Unlikely based on Kp and your location Reliable satellite data - 396-satellite offline TLE fallback across all 13 groups, with stale-cache failover when Celestrak is unavailable Faster fetching - shorter timeouts and improved data loading Published - v1.2.15 is now available on GitHub and PyPI
v1.2.16 - Fixes and configuration improvements Cache control - fixed --no-cache , which was parsed but previously ignored Custom configuration - added --config DIR , SPACE_CREW_CONFIG_DIR , and XDG_CONFIG_HOME support for isolated configs NASA API errors - added clearer DEMO_KEY rate-limit hints with an API link, plus 5xx and offline guidance in the APOD view SatNOGS cache - fixed cache typing to support both dictionaries and lists Offline weather - fixed offline responses to return the complete expected data structure Code cleanup - removed a duplicate docstring Documentation - updated the man page to v1.2.16 and synced README examples for --json and --config Published - v1.2.16 is now available on GitHub and PyPI
v1.2.17 - Timezones, rocket photos, and satellite pass fixes Local timezones - added --timezone flag, saved timezone settings, and automatic detection. Times display locally (e.g. 20:00 CEST), with UTC in parentheses in detail views UTC consistency - countdowns and --json output remain in UTC Rocket photos - press p in launch details to view a large, high-resolution rocket photo with minimal accompanying info Satellite pass accuracy - fixed a rotation sign error that caused incorrect predictions, verified against an independent reference to within ±1 minute Low-elevation passes - fixed filtering that silently dropped visible passes Settings persistence - fixed settings that sometimes failed to save Clean JSON output - status banners no longer pollute --json output Published - v1.2.17 is now available on GitHub and PyPI
v1.2.18 and v1.2.19 - Documentation and run fixes **Tzdata dependency ** - added the Windows-only tzdata dependency so timezones resolve correctly instead of falling back to UTC Dashboard navigation - fixed Enter-to-exit on Windows using msvcrt , while keeping existing POSIX behavior unchanged Module execution - python -m spacecrew now works via the new __main__.py Version detection - falls back to pyproject.toml in development checkouts to avoid reporting stale versions Docs - completely rewrote the README with feature sections and screenshots Published - v1.2.19 is now available on GitHub and PyPI
spacecrew - quick terminal tour Quick tour of spacecrew in action: interactive menu, people in space, live ISS position, Tonight’s Best satellite passes, a launch countdown with the rocket photo view and more. Video is now available on the GitHub project page.
Ships:
spacecrew - mission control for your terminal What I made: I got tired of opening five browser tabs to follow space, so I built one command that brings them all together. spacecrew tells you who’s in orbit this second, tells you when the ISS is about to cross your sky, counts down the next liftoff with a rocket photo beside it, displays NASA’s Picture of the Day in terminal characters, and tracks solar activity with a verdict on whether you’ll see auroras tonight. What was challenging: At one point, every satellite prediction was perfectly calculated, but for the mirror image of Earth. A single flipped sign in the orbital math put passes on the wrong side of the planet, and nothing looked obviously broken until I cross-checked each pass against an independent physics library, minute by minute, until reality matched. The other fight was time itself: switching an app built around UTC to local time without breaking a single countdown. What I’m proud of: The app now distrusts the internet by default. Dead APIs, rate limits, airplane mode: it keeps working from cached data and built-in satellite TLEs whenever possible. It also includes real orbital calculations, satellite tracking, radio frequencies, and a full interactive terminal interface, all installable with a single command. Features: People in Space, NASA APOD, Launches, ISS Tracking, Space Weather, Satellite Passes, Themes, Dashboard The GitHub README includes a detailed breakdown of the features, modes, configuration options, and command-line flags, along with screenshots and examples. Try it yourself: Install with either command: pipx install spacecrew or pip install spacecrew...
|
1792756516.4344232
|
1792842916.4344232
|
|
43673
|
Corez.io by @FireWarrior | Stardance
|
FireWarrior
|
0
|
225.45
|
0
|
[]
|
[{"post_id": 77450, "ts": "202 [{"post_id": 77450, "ts": "2026-10-07T01:57:53Z", "hours": 17.9803, "text": "Devlog 6 Play at: https://corez.io 6 days ago Corez went live on corez.games. Since then I moved it to corez.io , shipped a HUGE v2, and rebuilt a ton of the game based on what players told me. It’s honestly a different game now, so make sure to read it! NEW HOME: corez.io The game now lives at corez.io (old links still bring you here) Moved to faster US servers, so way less lag The homepage loads about twice as fast and you can hit Play right away There’s a whole live raid playing behind the menu now, tanks mining and breaking rocks ROCKS GOT A GLOW UP 6 rock biomes: Sandstone, Red Clay, Mossy Hollows, Crystal Caves, Magma Veins and Obsidian Deep Gems sit inside the rocks, and the deeper you go the tougher the rock and the better the loot Mining feels way better: rock dust flies into your tank as you shoot, ore pays gems while you chip it, and gems fly straight to you when it breaks Mining is faster for everyone, no Mining Power points needed to have fun HOW RAIDS WORK NOW Most points wins! Points = gems you bank + kills + crowns At the last storm the top 3 players get crowns. Hold one for bonus points, or knock it off someone to steal it and their points Whoever is in 1st gets a bounty on their head, so nobody can just coast to the win Kills and gems are worth more as the storm closes in Every storm starts as the full rock circle and slides to a random spot DYING DOESN’T WRECK YOU ANYMORE Banked gems are 100% safe, always You keep 30% of the gems you were carrying “Respawn as (your tank)” puts you right back in with the same tank and stats Same stats and Random build buttons, so no more spending 50 points every life Vault shield when you leave a vault after banking, and safer respawns away from whoever just killed you THE CORE FIGHTS BACK The Core now shoots bullets you can dodge and sends drones you can shoot down Land the final hit for a 20% chance at a random shop item you don’t own yet! TONS OF NEW STUFF 81 achievements, including secret ones Raid perks every 5000 points Every skin redone as clean patterns that keep your team colour Sidekicks now mine rocks with you Daily rewards that give gemdust for the shop, and a View All tab to preview every cosmetic New HP and shield bars, a cleaner HUD, better chat bubbles Team Banks: break the banner to own it Press B to bank everything DUOS Fixed joining alone, the “away” bug and getting stuck on connecting Crowns work in Duos now, and they count for your team COMING NEXT: 650+ NEW TANKS A brand new Splitter branch Tier 5 tanks you unlock by growing to 2x your size mid-raid Over 770 tanks in total, and bots use them too That’s a LOT, so thank you to everyone who played and gave feedback, it literally shaped this whole update. Which tank branch are you most excited for? Comment below!"}, {"post_id": 75762, "ts": "2026-10-01T00:45:19Z", "hours": 34.7972, "text": "GAME PUBLISHED!!!! PLAY AT htttps://corez.games I PUBLISHED THE GAME YAYAYAYAYAYAYAYAY So a huuuuuuuggggeeeee recap of the stuff I did - put short Added growth mode Setup oracle server Bought a domain from name.com Setup the game for mobile Made accounts Added shop, locker, profile Setup password/username reset flow Created a discord bot that has commands to monitor the game nad stuff Added quests Added contracts Buffed factory, buffed autospawner, buffed annhilator, nerfed constructor, buffed rammer class, nerfed barricade, buffed streamliner, buffed penta shot, buffed triplet, buffed nailgun, nerfed conqueror (etc look at discord) FIXED TWO HUNDRED AND NINETY EIGHT BUGS (Yes, THAT many bugs accross all the commits) Added a working raid timer Added a alive tab and made it work Added a save command to save score Made banked gems stay accross sessions Added new ability rock barrage which spawns 10 rocks and destroys thigsn in the way Made rocks grow back 1/2 the speed of before Made gem rain Made meteor shower Revamped tutorial entirely Added mini tutorial first join Added guest login, username login, and discord login Added rankings bronze, silver, gold, plat, diamond, emerald, and champion Added leaderboard Created 40 skins Created 40 namestyles Added duos Made a new chat for duos Added esc keybind to open chat ingame Added friends Added a feature to chat with friends Designed logo and updated game name to Corez.io instead of Digwars Sound disabled by default Added performance settings in settings Added invite codes to the game which gives gemdust Added game currency gemdust to use in skin/name shop Added feedback page Made a YT channel Made a tiktok Published to itch, gamejolt, iogames.space, and a few others Added a contributors page Added play + win streaks daily Added and updated changelog Revamped ui, upgrade bars, and skill stats bar Added new raid overrides Added kill logs Made abilities usable on mobile Added custom movable joysticks on mobile Added new ui to mobile Added new storm look Added raid winners Added way too much to type out in stardance, ill post some more next time!! Join the discord or give feedback via the feedback button on homepage"}, {"post_id": 72938, "ts": "2026-09-24T02:31:56Z", "hours": 4.0744, "text": "just fixing more bugs… ahhhhhhhhhhhhhhhh Fixed a socket disconnect bug when 2 players joined the game at the same time Added a new spawn shield when spawning and a circle to indicate it Fixed lag issues that caused players to have less than 10fps and more than 7000ms ping. Fixed an error in which chests could overlap with rocks Made the time you could stay on rocks 3x Thats about it folks, just a small devlog for today. Hope yall enjoyed, thanks for reading!"}, {"post_id": 72492, "ts": "2026-09-23T02:27:19Z", "hours": 11.6403, "text": "Hi guys! Hope yall are doing well. I really changed my game a lot. Please give me any feedback you guys have (it can even be just that its laggy or a feature sucks!) Changes: Added bosses (4) which each look different and have their own capabilities Added rock-themed loot chests in rare and epic tier which each gives you gems, with a powerup guaranteed in the epic chest. Added Shop!!! Biggest change! Added over 20 items across kits, gear, drills, and siderarms! Configured the storm to properly work and also changed a BUNCH of ui, like moving leaderboard into minimap section, adding kill logs, adding notifications, moving the skill stats bottom right, etc. Added a NEW SKILL STAT: Mining power! Putting some points into this makes you mine faster! Added RAID OVERRIDES: These are overrides for the current storm phase which includes 1.5x size, more damage, rocket speed, etc! Test it out and give your feedback! https://digwars.hackclub.app/"}, {"post_id": 69442, "ts": "2026-09-17T02:01:30Z", "hours": 34.4983, "text": "Devlog 5 Play at: https://digwars.hackclub.app/ I have done a COMPLETE revamp on this game! Its a LOT of stuff but sure is interesting so make sure to read it! NEW MODE: BATTLE ROYALE, (Main and only mode now) How it works : Unlike regular battle royale where the last person to survive wins, this will be a battle royale lasting 2 hours and players can spawn in the middle of the match (chose this as we dont have many players) It lasts for 2 hours, and the storm comes from the edgs and closes in leaving a little final gap for 1.5 minutes, then resets, and the process continues creating an infinite storm loop Players CANNOT join during these 1.5 minutes and must spectate Purpose is to get as many kills and points as you can, which can be contributed to the shop to earn powerups for the game or cosmetics, and will also rank you up (once we add persistence and database) UI Revamps : Completely new death screen based on your rank in which you died and more stuff! Merged leaderboard with minimap which no shows 4 tabs - minimap, leaderboard, kill logs, and people alive. Added a lot of stuff like timers, notifications, etc Game updates : With the battle royale mode I have added: Bases: These look like outposts and can be killed and claimed by players. Claiming this acts like a zone of invulnerabity you can go to if you are attacked or low health. You have a ring on you with the color of the base signifying that you own it. You get kicked out 10 seconds after coming in. Also contains a vault inside to bank the gems Vaults: These are new vaults which rotate between rainbow colors. Any player can cash out their gems but only one player at a time per vault and they get kicked out after depositing Bug fixes : Heavily optimized so that the ping is as low as possible and the ping is now fully dependent on your location (server is in EU) Fixed a few bugs that caused the server to crash and some other stuff. Storm : The storm is a purple fog that closes in on players. A player in storm loses 10 health every second and dies with no health. For now it has a basic purple translucent look, will improve it. Theres SO much more but stardance is limiting me and Im also getting tired (waa) so see yall next time! Lmk what you guys think!"}, {"post_id": 60583, "ts": "2026-09-03T01:09:15Z", "hours": 7.6297, "text": "Devlog 4 Play it at: digwars.hackclub.app Changes: Added a hella sick background with moving tanks! (Image attached) Fixed 3-4 crucial bugs and made the game run way faster Fixed problems with bots being too conservative and not attacking afk players and such Im sorry that this devlog is hella short, I fractured my ring finger so I cant type much :( I really hope that this game succeeds and becomes at least a little popular (io-game popular); Ive spent way too much time for this and built too many projects to just quit this."}, {"post_id": 59288, "ts": "2026-09-01T00:12:56Z", "hours": 6.3742, "text": "Devlog 3 Play at digwars.hackclub.app! Added: Satchels Made game more compact instead of such a big map Planned out for shop Satchels: Satchels are kind of like backpacks behind players that show how much gems a player is holding so people with more gems has a more high risk play. I also fixed a BUNCH of bugs and got the game to run at around 75fps (which is an improvement from 50-60fps)"}, {"post_id": 51355, "ts": "2026-08-20T23:39:31Z", "hours": 18.2817, "text": "Devlog #2 Hi guys! Not sure why Im logging so many hours at a time, but regardless this is a another devlog for my gamer. Play it at www.digwars.hackclub.app ! Anyways, Ive done a LOT of stuff since my last devlog. 1. SFX All sfx were created by me using bfxr.net and exported as WAV files and imported into my game. I currently have 16 total sfx! List: Shooting SFX - Basic pew sound for shooting Drone Spawn - A little modern/motorised whirring type sound, lasts very short duration Rock Hit - Something that sounds like a rock being chipped except more 2d/gamified Rock Break - A light explosion/destroyal sound when a rock is destroyed Ore Break - Similar to rock break except a little more high pitched for a rock break which has gem(s) inside it Gem Pickup - A coin collecting type sound or a nice ding for a currency collecting type sound Satchel Full - A warning type sound that only sounds for like 1.5 seconds to notify the user to bank their gems Deposit Tick - A repeated tick sound that plays when depositing gems Deposit Done - A celebration or “yay” kinda sfx when the gems have all been deposited. Bank Celebration - Another nice ding except more intense as an achievement Combat Hit - A adrenaline rushing boop collision noise Combat Hurt - A health lowering typa sfx Combat Kill - Another adrenaline rushing exciting noise (srry cant describe lol) Death On Screen - Similar to combat kill, less intense Button UI Click - Just ur normal mouse click sound Rammer Movement - A whirring sound that is calm and low Also added sound options, as in screenshot 1. 2. Bots Not much to say here I added bots which move very much like human players and play like them, they were heavily tested, and improvised by analyzing where they got stuck, what they were missing, etc. Total of 40 bots for now due to the massive arena size. Initially added chat mechanics for the bots using deepseek api but that didnt go well. 3. Improved tutorial + New UI I did a complete overhaul on the UI and made it look pretty much new (though I have to improve it more it still looks slightly bad) Also made a WAYYY better tutorial! Its really awesome, gives u a nice small sandbox like arena just to learn every single one of the game mechanics. It uses a tiny part of the cpu and ram from the overall nest server. Thanks for reading this! Check out my game if yall want to as well; Cya next time!"}, {"post_id": 41718, "ts": "2026-08-06T03:08:25Z", "hours": 0.5606, "text": "Sub-Devlog #2 Not really a devlog, but just wanted to post a link for you guys to try out my game, will obviously make more devlogs on updating the game until I publish it officially. https://digwars.hackclub.app/#dw **Domain is based in europe, so it will lag in non-europe region, but its interpolated so other than input delay there shouldnt be any other problems."}, {"post_id": 41068, "ts": "2026-08-05T00:55:52Z", "hours": 89.6175, "text": "Hi guys! 👋 Test out my game here: https://digwars.hackclub.app/#dw (based in europe) I still have to roll out around 10 features and other bug fixes, so its obviously just a demo url, not the final game! This is my first devlog for my game, I’m sorry if it’s too long, I had to encompass around 90 hours of coding into one devlog. This is a comprehensive summary of my game and all of the functions of it. 🪨 What is Dig Wars? Dig Wars is a 2 team tank battle game where the whole map is a giant rock that never stops growing back :D You mine through it to collect gems, carry them back to your base vault to bank them, and fight the other team for control of the tunnels. 🌋 The Living Wall Every rock cell has health, and destroyed cells grow back after ~35 seconds over ~7 seconds, physically expanding and pushing tanks out of the way. Trapped between two growing rocks? You get crushed :D Tunnels heal from the walls inward, so active tunnels stay open while abandoned ones seal up. The side with more holes regrows faster, keeping the front line drifting back to center. ⛏️ Mining Every tank class has its own mining rate. Snipers and destroyers are excellent miners, drone classes are great escorts, drum classes barely scratch the rock. There’s a per player mining budget too, so you can’t spray clear a wall with an octo. Focused digging is fast. And the deeper you go, the harder the rock gets. 💎 Ore and Gems ~15% of rock cells contain ore. Four tiers: Copper - surface, ~40 gems Azurite - mid depth, ~90 gems Core Shards - deep, 400+ gems, glows through rock Emeralds - only 3 in the wall at once, server wide announcement when mined Breaking ore spawns gems exactly where the crystals are drawn. I had to keep four mirrored Voronoi implementations bit identical. Nightmare but it works :D 🎒 The Satchel Gems ride on your tank as a growing money bag others can see. You’re a target, an escort mission, and a gambling problem all at once. Cap of 4000 with a pulsing “Gem limit reached, please bank it!” warning Heavy gems slow you up to ~20% Die and you drop 60% of what you carried. Painful. :D 🏦 Banking The vault pad has a full UI: Carried, Already banked, and an input box for banking a custom ammount of gems. Deposits at 300 gems/sec, damage interrupts, so those last seconds are tense. A team war bar compares blue vs red banked totals with a live frontier notch. ⚡ The Rifts 2 Canyons, one towards the top and one towards the bottom going all the way from left to right, acting as tunnels for people too lazy to mine, which naturally makes it a hub for fighting. 🚩 Forward Outposts Hold a banner beacon for 30 seconds to capture a pocket in the wall. Gives forward respawn, field banking at 80%, and a no regrow radius. Enemies can shoot the beacon, and the wall always grows over it. 🗺️ World Map Fortnite style vector minimap and full screen map showing terrain, craters, bases, outposts, and the Rift. 🔊 Audio Fully procedural sound engine using the Web Audio API, no audio files. Rock cracks pitch up near death, breaking rock crunches, gems chime. Distance attenuation and stereo panning included. 🧠 The Tech The TerrainGrid tracks every rock cell’s health, alive state, ore tier, and deposits. Regrowth tracks death time, generation counters for re rolling ore, growth progress, and crush mechanics. Growing rocks have scaled collision so a 20% grown rock doesn’t block bullets. Trapping someone during regrowth is a strategy :D 🚀 What’s Next Core chambers and heists (crack a sealed chamber, erupts a gem fountain), a shop with drill tiers and consumables, bounties, war effort, and events. Plus a real playtest pass :D Thanks for reading all the way through! If you have questions or ideas, comment below or msg me on discord ( fire_warriorx ). Cya next time!"}]...
|
Title: Corez.io by @FireWarrior | Stardance
Devlo Title: Corez.io by @FireWarrior | Stardance
Devlogs:
Hi guys! 👋 Test out my game here: https://digwars.hackclub.app/#dw (based in europe) I still have to roll out around 10 features and other bug fixes, so its obviously just a demo url, not the final game! This is my first devlog for my game, I’m sorry if it’s too long, I had to encompass around 90 hours of coding into one devlog. This is a comprehensive summary of my game and all of the functions of it. 🪨 What is Dig Wars? Dig Wars is a 2 team tank battle game where the whole map is a giant rock that never stops growing back :D You mine through it to collect gems, carry them back to your base vault to bank them, and fight the other team for control of the tunnels. 🌋 The Living Wall Every rock cell has health, and destroyed cells grow back after ~35 seconds over ~7 seconds, physically expanding and pushing tanks out of the way. Trapped between two growing rocks? You get crushed :D Tunnels heal from the walls inward, so active tunnels stay open while abandoned ones seal up. The side with more holes regrows faster, keeping the front line drifting back to center. ⛏️ Mining Every tank class has its own mining rate. Snipers and destroyers are excellent miners, drone classes are great escorts, drum classes barely scratch the rock. There’s a per player mining budget too, so you can’t spray clear a wall with an octo. Focused digging is fast. And the deeper you go, the harder the rock gets. 💎 Ore and Gems ~15% of rock cells contain ore. Four tiers: Copper - surface, ~40 gems Azurite - mid depth, ~90 gems Core Shards - deep, 400+ gems, glows through rock Emeralds - only 3 in the wall at once, server wide announcement when mined Breaking ore spawns gems exactly where the crystals are drawn. I had to keep four mirrored Voronoi implementations bit identical. Nightmare but it works :D 🎒 The Satchel Gems ride on your tank as a growing money bag others can see. You’re a target, an escort mission, and a gambling problem all at once. Cap of 4000 with a pulsing “Gem limit reached, please bank it!” warning Heavy gems slow you up to ~20% Die and you drop 60% of what you carried. Painful. :D 🏦 Banking The vault pad has a full UI: Carried, Already banked, and an input box for banking a custom ammount of gems. Deposits at 300 gems/sec, damage interrupts, so those last seconds are tense. A team war bar compares blue vs red banked totals with a live frontier notch. ⚡ The Rifts 2 Canyons, one towards the top and one towards the bottom going all the way from left to right, acting as tunnels for people too lazy to mine, which naturally makes it a hub for fighting. 🚩 Forward Outposts Hold a banner beacon for 30 seconds to capture a pocket in the wall. Gives forward respawn, field banking at 80%, and a no regrow radius. Enemies can shoot the beacon, and the wall always grows over it. 🗺️ World Map Fortnite style vector minimap and full screen map showing terrain, craters, bases, outposts, and the Rift. 🔊 Audio Fully procedural sound engine using the Web Audio API, no audio files. Rock cracks pitch up near death, breaking rock crunches, gems chime. Distance attenuation and stereo panning included. 🧠 The Tech The TerrainGrid tracks every rock cell’s health, alive state, ore tier, and deposits. Regrowth tracks death time, generation counters for re rolling ore, growth progress, and crush mechanics. Growing rocks have scaled collision so a 20% grown rock doesn’t block bullets. Trapping someone during regrowth is a strategy :D 🚀 What’s Next Core chambers and heists (crack a sealed chamber, erupts a gem fountain), a shop with drill tiers and consumables, bounties, war effort, and events. Plus a real playtest pass :D Thanks for reading all the way through! If you have questions or ideas, comment below or msg me on discord ( fire_warriorx ). Cya next time!
Sub-Devlog #2 Not really a devlog, but just wanted to post a link for you guys to try out my game, will obviously make more devlogs on updating the game until I publish it officially. https://digwars.hackclub.app/#dw **Domain is based in europe, so it will lag in non-europe region, but its interpolated so other than input delay there shouldnt be any other problems.
Devlog #2 Hi guys! Not sure why Im logging so many hours at a time, but regardless this is a another devlog for my gamer. Play it at www.digwars.hackclub.app ! Anyways, Ive done a LOT of stuff since my last devlog. 1. SFX All sfx were created by me using bfxr.net and exported as WAV files and imported into my game. I currently have 16 total sfx! List: Shooting SFX - Basic pew sound for shooting Drone Spawn - A little modern/motorised whirring type sound, lasts very short duration Rock Hit - Something that sounds like a rock being chipped except more 2d/gamified Rock Break - A light explosion/destroyal sound when a rock is destroyed Ore Break - Similar to rock break except a little more high pitched for a rock break which has gem(s) inside it Gem Pickup - A coin collecting type sound or a nice ding for a currency collecting type sound Satchel Full - A warning type sound that only sounds for like 1.5 seconds to notify the user to bank their gems Deposit Tick - A repeated tick sound that plays when depositing gems Deposit Done - A celebration or “yay” kinda sfx when the gems have all been deposited. Bank Celebration - Another nice ding except more intense as an achievement Combat Hit - A adrenaline rushing boop collision noise Combat Hurt - A health lowering typa sfx Combat Kill - Another adrenaline rushing exciting noise (srry cant describe lol) Death On Screen - Similar to combat kill, less intense Button UI Click - Just ur normal mouse click sound Rammer Movement - A whirring sound that is calm and low Also added sound options, as in screenshot 1. 2. Bots Not much to say here I added bots which move very much like human players and play like them, they were heavily tested, and improvised by analyzing where they got stuck, what they were missing, etc. Total of 40 bots for now due to the massive arena size. Initially added chat mechanics for the bots using deepseek api but that didnt go well. 3. Improved tutorial + New UI I did a complete overhaul on the UI and made it look pretty much new (though I have to improve it more it still looks slightly bad) Also made a WAYYY better tutorial! Its really awesome, gives u a nice small sandbox like arena just to learn every single one of the game mechanics. It uses a tiny part of the cpu and ram from the overall nest server. Thanks for reading this! Check out my game if yall want to as well; Cya next time!
Devlog 3 Play at digwars.hackclub.app! Added: Satchels Made game more compact instead of such a big map Planned out for shop Satchels: Satchels are kind of like backpacks behind players that show how much gems a player is holding so people with more gems has a more high risk play. I also fixed a BUNCH of bugs and got the game to run at around 75fps (which is an improvement from 50-60fps)
Devlog 4 Play it at: digwars.hackclub.app Changes: Added a hella sick background with moving tanks! (Image attached) Fixed 3-4 crucial bugs and made the game run way faster Fixed problems with bots being too conservative and not attacking afk players and such Im sorry that this devlog is hella short, I fractured my ring finger so I cant type much :( I really hope that this game succeeds and becomes at least a little popular (io-game popular); Ive spent way too much time for this and built too many projects to just quit this.
Devlog 5 Play at: https://digwars.hackclub.app/ I have done a COMPLETE revamp on this game! Its a LOT of stuff but sure is interesting so make sure to read it! NEW MODE: BATTLE ROYALE, (Main and only mode now) How it works : Unlike regular battle royale where the last person to survive wins, this will be a battle royale lasting 2 hours and players can spawn in the middle of the match (chose this as we dont have many players) It lasts for 2 hours, and the storm comes from the edgs and closes in leaving a little final gap for 1.5 minutes, then resets, and the process continues creating an infinite storm loop Players CANNOT join during these 1.5 minutes and must spectate Purpose is to get as many kills and points as you can, which can be contributed to the shop to earn powerups for the game or cosmetics, and will also rank you up (once we add persistence and database) UI Revamps : Completely new death screen based on your rank in which you died and more stuff! Merged leaderboard with minimap which no shows 4 tabs - minimap, leaderboard, kill logs, and people alive. Added a lot of stuff like timers, notifications, etc Game updates : With the battle royale mode I have added: Bases: These look like outposts and can be killed and claimed by players. Claiming this acts like a zone of invulnerabity you can go to if you are attacked or low health. You have a ring on you with the color of the base signifying that you own it. You get kicked out 10 seconds after coming in. Also contains a vault inside to bank the gems Vaults: These are new vaults which rotate between rainbow colors. Any player can cash out their gems but only one player at a time per vault and they get kicked out after depositing Bug fixes : Heavily optimized so that the ping is as low as possible and the ping is now fully dependent on your location (server is in EU) Fixed a few bugs that caused the server to crash and some other stuff. Storm : The storm is a purple fog that closes in on players. A player in storm loses 10 health every second and dies with no health. For now it has a basic purple translucent look, will improve it. Theres SO much more but stardance is limiting me and Im also getting tired (waa) so see yall next time! Lmk what you guys think!
Hi guys! Hope yall are doing well. I really changed my game a lot. Please give me any feedback you guys have (it can even be just that its laggy or a feature sucks!) Changes: Added bosses (4) which each look different and have their own capabilities Added rock-themed loot chests in rare and epic tier which each gives you gems, with a powerup guaranteed in the epic chest. Added Shop!!! Biggest change! Added over 20 items across kits, gear, drills, and siderarms! Configured the storm to properly work and also changed a BUNCH of ui, like moving leaderboard into minimap section, adding kill logs, adding notifications, moving the skill stats bottom right, etc. Added a NEW SKILL STAT: Mining power! Putting some points into this makes you mine faster! Added RAID OVERRIDES: These are overrides for the current storm phase which includes 1.5x size, more damage, rocket speed, etc! Test it out and give your feedback! https://digwars.hackclub.app/
just fixing more bugs… ahhhhhhhhhhhhhhhh Fixed a socket disconnect bug when 2 players joined the game at the same time Added a new spawn shield when spawning and a circle to indicate it Fixed lag issues that caused players to have less than 10fps and more than 7000ms ping. Fixed an error in which chests could overlap with rocks Made the time you could stay on rocks 3x Thats about it folks, just a small devlog for today. Hope yall enjoyed, thanks for reading!
GAME PUBLISHED!!!! PLAY AT htttps://corez.games I PUBLISHED THE GAME YAYAYAYAYAYAYAYAY So a huuuuuuuggggeeeee recap of the stuff I did - put short Added growth mode Setup oracle server Bought a domain from name.com Setup the game for mobile Made accounts Added shop, locker, profile Setup password/username reset flow Created a discord bot that has commands to monitor the game nad stuff Added quests Added contracts Buffed factory, buffed autospawner, buffed annhilator, nerfed constructor, buffed rammer class, nerfed barricade, buffed streamliner, buffed penta shot, buffed triplet, buffed nailgun, nerfed conqueror (etc look at discord) FIXED TWO HUNDRED AND NINETY EIGHT BUGS (Yes, THAT many bugs accross all the commits) Added a working raid timer Added a alive tab and made it work Added a save command to save score Made banked gems stay accross sessions Added new ability rock barrage which spawns 10 rocks and destroys thigsn in the way Made rocks grow back 1/2 the speed of before Made gem rain Made meteor shower Revamped tutorial entirely Added mini tutorial first join Added guest login, username login, and discord login Added rankings bronze, silver, gold, plat, diamond, emerald, and champion Added leaderboard Created 40 skins Created 40 namestyles Added duos Made a new chat for duos Added esc keybind to open chat ingame Added friends Added a feature to chat with friends Designed logo and updated game name to Corez.io instead of Digwars Sound disabled by default Added performance settings in settings Added invite codes to the game which gives gemdust Added game currency gemdust to use in skin/name shop Added feedback page Made a YT channel Made a tiktok Published to itch, gamejolt, iogames.space, and a few others Added a contributors page Added play + win streaks daily Added and updated changelog Revamped ui, upgrade bars, and skill stats bar Added new raid overrides Added kill logs Made abilities usable on mobile Added custom movable joysticks on mobile Added new ui to mobile Added new storm look Added raid winners Added way too much to type out in stardance, ill post some more next time!! Join the discord or give feedback via the feedback button on homepage
Devlog 6 Play at: https://corez.io 6 days ago Corez went live on corez.games. Since then I moved it to corez.io , shipped a HUGE v2, and rebuilt a ton of the game based on what players told me. It’s honestly a different game now, so make sure to read it! NEW HOME: corez.io The game now lives at corez.io (old links still bring you here) Moved to faster US servers, so way less lag The homepage loads about twice as fast and you can hit Play right away There’s a whole live raid playing behind the menu now, tanks mining and breaking rocks ROCKS GOT A GLOW UP 6 rock biomes: Sandstone, Red Clay, Mossy Hollows, Crystal Caves, Magma Veins and Obsidian Deep Gems sit inside the rocks, and the deeper you go the tougher the rock and the better the loot Mining feels way better: rock dust flies into your tank as you shoot, ore pays gems while you chip it, and gems fly straight to you when it breaks Mining is faster for everyone, no Mining Power points needed to have fun HOW RAIDS WORK NOW Most points wins! Points = gems you bank + kills + crowns At the last storm the top 3 players get crowns. Hold one for bonus points, or knock it off someone to steal it and their points Whoever is in 1st gets a bounty on their head, so nobody can just coast to the win Kills and gems are worth more as the storm closes in Every storm starts as the full rock circle and slides to a random spot DYING DOESN’T WRECK YOU ANYMORE Banked gems are 100% safe, always You keep 30% of the gems you were carrying “Respawn as (your tank)” puts you right back in with the same tank and stats Same stats and Random build buttons, so no more spending 50 points every life Vault shield when you leave a vault after banking, and safer respawns away from whoever just killed you THE CORE FIGHTS BACK The Core now shoots bullets you can dodge and sends drones you can shoot down Land the final hit for a 20% chance at a random shop item you don’t own yet! TONS OF NEW STUFF 81 achievements, including secret ones Raid perks every 5000 points Every skin redone as clean patterns that keep your team colour Sidekicks now mine rocks with you Daily rewards that give gemdust for the shop, and a View All tab to preview every cosmetic New HP and shield bars, a cleaner HUD, better chat bubbles Team Banks: break the banner to own it Press B to bank everything DUOS Fixed joining alone, the “away” bug and getting stuck on connecting Crowns work in Duos now, and they count for your team COMING NEXT: 650+ NEW TANKS A brand new Splitter branch Tier 5 tanks you unlock by growing to 2x your size mid-raid Over 770 tanks in total, and bots use them too That’s a LOT, so thank you to everyone who played and gave feedback, it literally shaped this whole update. Which tank branch are you most excited for? Comment below!...
|
1792554916.7447872
|
1793159716.7447872
|
|
4799
|
Evochess by @Sam | Stardance
|
Sam
|
1
|
225.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-15T04:56:14Z", "hours": 225.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Let’s ship 🚢 This is a website where people can learn and improve their chess skills by watching courses, solving puzzles and practicing their vision. The website was overall really challenging to build. If I had do pick, it would definitely be making a working chessboard for puzzles. At the beginning of the project I didn’t even know if I was capable of building one but I am really glad I tried as I’ve learned so much. Another challenging thing would definitely be making the website responsive. I don’t like making website responsive and in this project animations added another layer of complexity. I’ve tried my best to keep things responsive though. I am really proud of completing the project and mainly working chessboard as this is my first time building something like this. I am also proud of the animations and the ui of the website. To test my website some knowledge of chess is preferred but even if you have zero knowledge about chess you can test out my project as there are courses which will teach you about chess. Thanks stardance for everything 💖💖. I probably would never have created or completed this project without stardance😄", "repo": "https://github.com/samgod1/Chess-website", "demo": "https://evochess.vercel.app"}]...
|
[{"post_id": 79525, "ts": "202 [{"post_id": 79525, "ts": "2026-10-14T13:11:44Z", "hours": 3.0406, "text": "THIS MIGHT BE THE LAST DEVLOG First I polished the puzzles sidebar. I made the sidebar width to be same as vision page sidebar. Then I changed the level button size as they were too small for larger screens. I also made the level button container scrollable if the level buttons overflow. This took the most time because the whole puzzles sidebar body was overflowing pushing down that start button. I just wanted the sidebar body to not overflow which would make the levels container to be scrollable. The fix at last was using min-height: 0 to the sidebar body. Idk how the min-height: 0 is helping here 😭 . Next I made the visualization section animation (The last section of the home page) to appear quicker. This was a recommendation from my brother as when scrolling previously the section might seem like it contained nothing until you scroll fully. I faced issued mainly with the section not pinning to the top of screen when trying to move the animation timeline starting point. Also I tried to placing text higher on y axis and animate it coming down with the user scroll which produce the result I was expecting. So, I split the timeline into two. The first one reveals the text and the second one shows a person visualizing. The tex revealing animation ends when the section top hits the top of the screen which makes the section pin to the top exactly how I wanted it to be. Then I polished vision page sidebar as follows: Made the sidebar responsive after user has clicked on start Made the sidebar header look better and fix mismatch of padding from body Returned to using flex for the attempts and mad them responsive Tweaked the options and info as they were looking odd in some screen sizes (mainly the tablet one which looked really bad) I then copied some of these changes to the puzzles sidebar for maintaining similarity. Lastly I capped the width of course, puzzles and vision page to 1600px by adding a wrapper element. It acted weird on puzzles and vision page sidebar as there was already a element named wrapper and so I changed the classname to page-wrapper."}, {"post_id": 76969, "ts": "2026-10-05T07:23:36Z", "hours": 1.8433, "text": "Fixing things and some more responsive things I’ve fixed chessboard displaying multiple selected squares. This happened when user selected a piece and then selected another piece by dragging. The fix was really simple. I just added resetSquares function when piece on drag start. I’ve also fixed pieces stacking on top of each other if user drags and drops a piece on another piece quickly before the opponents move happens. This was prevented when pieces are moved only by clicking but I forgot to prevent this if pieces were dragged and dropped. I did two things to prevent this: I reduced the time for opponent piece to move after the first move. I disabled the piece from dragging if it wasn’t the player’s turn. It seems the first fix wasn’t sufficient as it created another bug. So, if user selected a piece by clicking or dragging and then dragged the same piece then the destination squares and captureSquare will just completely disappear. The occurred due to resetSquares function that I had added. I thought for a while and came up with this solution. The resetSquares function only executes if user selects another piece on drag. However the function won’t execute if the selected Piece is being dragged. The selected piece state null at first so resetSquares() won’t also execute if selected piece is null. Now, it works as expected until and unless I find some bugs. Now returning back to the responsiveness. I fixed the puzzles button to be equal width and height. I had made the level buttons responsive before but they weren’t the same size. I had tried the aspect ratio last time as well but it was breaking the layout. Basically I used aspect ratio, removed the grid templated rows and changed some clamp values. Also I removed the media query below 1440px and integrated it as default css. After doing that, I started to fix the attempts in in vision sidebar. I thought it would take me two seconds to do it as I just had to apply the puzzle button knowledge here. I thought just doing this will work grid-template-columns: repeat(auto-fit, minmax(40px, 1fr)); I was wrong 😭 This worked fine for level buttons cuz the number of buttons were static. Here the attempts squares increases as the user clicks on the chessboard. If there’s only one attempt square then it will take the whole width. I was stuck after this. I tried different things such as using max-width, trying to add width: fit-content, etc. but nothing worked. At last I thought of reverting back to what the code orginally was which just used flex and flex wrap but coming this far I just used grid and used different values with height to make the attemps square kinda responsive. I still need to use clamp or something to make this look good. Uhhhhhh this is so frustrating… . I think I’m overexplaining things. I should just simplify down things"}, {"post_id": 75141, "ts": "2026-09-29T08:47:38Z", "hours": 2.0161, "text": "This devlog is a short one I’ve made the vision page responsive for larger screens. Last time I made the page responsive for mobile screens. I made some small changes in puzzles page while doing this for maintaining similar code . I ran into some issues such as css not working due to incorrect nesting and writing the writing the css on wrong file. Also, I removed media query for 1440px as the default css will work between 1024px and 1440px using clamp css functions and by doing that, above 1440px the css will stay the largest clamp value. I think I will do the same in puzzles page as well. 2hrs wen’t so quickly mainly cuz of my stupidity as I broke things that already was working fine. Also, I don’t think I like the mobile responsiveness that much but i don’t think i’ll change it now (or maybe I will). While writing this devlog I just realize that I’ve make the sidebar responsive after vision page has started. Uhhh i hate responsive design"}, {"post_id": 73203, "ts": "2026-09-24T16:25:05Z", "hours": 2.6344, "text": "Changed some puzzles and more responsiveness work Copied the puzzles page and it’s component’s media query css So after making puzzles page somewhat responsive last time, the first thing I decided to do after that was copying puzzles page media query css and just paste it in vision page as both of pages are very similar. This made the vision page and it’s components a little responsive. Puzzle changes I’ve changed the puzzle from level 12, 23 and 30. The 12 and 23 level had 2 ways to deliver checkmate and only one of them counted as correct. I changed them as user might get frustrated seeing that. My code doesn’t handle that so I just changed them. Level 30 was changed cuz it wasn’t really difficult. I don’t think I’m satisfied with the new level 30 puzzle either. One issue while polishing signup page I didn’t want the form to look squished on devices with small vertical screen size. Due to this last time I generally kept things smaller than what I wanted to make sure it looks okay for those devices. To fix that I added min-height to the form-container. It prevented the form from squishing but the form-container was overflowing as the puzzles page has 100dvh. What I wanted was just the form scrolling using overflow: scroll but this probably took me about 20-30 mins to make it work 😭 . I set overflow to scroll to form-container it didn’t work, added it to form which also didn’t work and then I added it to puzzles page. The scroll part was working when I added it on puzzles page but not what I was looking. Then I created a wrapper div to hold the img container and form container hoping now adding overflow:scroll to form container will do the job. After trying all things things I realized that the min-height was set to form container instead of form. The fix was to adding min-height to form and set overflow scroll to form-container. I removed the wrapper div after that as it was unnecessary and also hid the scrollbar that appears in form-container. Signup and login page polish after that annoying issue After that annoying issue I’d say things went pretty smoothly. I mainly used clamp as always for making things responsive. And as always it took me longer that expected. After polishing up the signup page I copied the code to login page and just changed signup to login. Vision page responsive on mobile devices Making the vision page responsive for mobile device was really similar as polishing signup page. I just used clamp for everything and made sure everything looked good. Now that I think about it i only made the sidebar responsive including the popup menu as only that is displayed on mobile devices and chessboard is hidden. The chessboard is also kinda responsive due to the copy pasting the puzzles page media query css. The making of sidebar responsive was just trying out different sizes and then putting the value into clamp calculator and copy pasting the value. Now, I’ll work on the vision page responsiveness for bigger devices and then if everything looks great after testing then I’ll ship the project"}, {"post_id": 71645, "ts": "2026-09-21T06:52:58Z", "hours": 3.2419, "text": "Made puzzles page responsive and bugs fixes Puzzles page responsive Most the time was spent making the puzzles page responsive. As always it took more time than expected. There were many issue that popped up and slowly but surely I fixed them. One of the issues was in bigger mobile screens the sidebar was being squished because the chessboard was getting really big but puzzles page has height of 100dvh as the chesboard in mobile phones is calculated according to width. To fix it I tried adding min-height to the sidebar for not getting squished and height of auto to puzzles page but this broke the sidebar when puzzles is not started cuz there’s no chessboard. The height of sidebar is 100% so due to the parent’s height being auto the sidebar height was about as didn’t fill the whole screen. To fix this I used overflow: scroll to puzzles page and it’s height to 100dvh. Another issue came when trying to make chessboard and sidebar look decent in different laptop sizes. I made it somehow work but using clamp, min-height, max-height, min-width and max width. It was kind of a pain to solve all the issues that came while doing this. That’s why I’ve rushed making the puzzles page responsive. My plan is to come and polish it after I’ve made the course page responsive as well. It shouldn’t be too difficult imo as it’s very similar to puzzles page. Fixed user being able to drag and drop opponent’s pieces It was a quite dumb bug. I had prevented this for click to move feature but I didn’t think about it in drag and drop. The fix was quite simple as dnd-kit (npm package) provides a disabled property in useDraggble. I disabled it for the pieces for dragging which had the opposite color of chessboard. Fix next puzzle button not working on second last level I didn’t actually know about this bug. A friend of mine told me about this issue while testing the website. After level 29 is completed a state is toggled to true which prevents the next button from not working. The next button is now only supposed to not work after completed the last level. I haven’t used fixed values for fixing this so in future if I decide to add or remove puzzles it shouldn’t break. The fix was a little more complex than I anticipated. 9 days of stardance remain now. So, I have to lock in now. Okay bie"}, {"post_id": 70097, "ts": "2026-09-18T13:33:32Z", "hours": 2.1928, "text": "We’re close to the end First I fixed the buggy dropping piece. I fixed this when I first worked on drag and drop piece feature but I don’t know how it broke again. When trying different things to fix it I tried to move the setIsDragging(false) lower inside dragEnd function below movePiece and capturePiece function calls. Surprisingly it worked 😄. I fixed light square being dark and vise versa if user had the black pieces. I found out this issue because the coordinates colors were mismatched. So my first intuition was changing the color of coords.jsx. I got really confused as the changes did nothing in the browser. I am so dumb I was changing the vision page chessboard’s coords.jsx instead of puzzles page chessboard’s coords.jsx. It worked but then I realized the coordinates color weren’t wrong square colors were. I undid the changes made to coords.jsx. I also seperated the coords.jsx but adding puzzles and vision in the name. Then I fixed the squares color for black’s board. I’ve figured out the mobile design for puzzle section. First the idea was that the chessboard and sidebar would be stacked on top of each other. This was the easy route but if I did that then it would add friction to the mobile players as they would have to scroll all the way down to start the puzzles. Then I looked at chess.com and they were doing it really well where only after clicking start puzzle the chessboard will appear. So I removed the chessboard below 425px first and then made the button text, size and gap smaller. I also removed the aspect ratio of 1/1 from the buttons as the buttons were ruining the gaps between them in certain screen sizes. Now for the first challenge I faced. How do I only make the chessboard appear and disappear when clicking start puzzle only on mobile devices. As I used gsap matchMedia to make the chessboard’s container display none or block according to hasPuzzleStarted for mobile screens. The chessboardSize is calculated according to chessboard container so that the chessboard is divisible by 4. When first loading the chessboard if the container has display none then the chessboardSize becomes zero and when setting the container to block will only show empty chessboard container without a board. I tried using the autoAlpha property of gsap hoping that it will do that same job as display none but without remove the element. It was making the container invisible but the container would still retain it’s height and width. I was starting to doubt myself here and was thinking to take the easy route but just stacking the board and sidebar vertically. After thinking for a while I came up with a breakthrough I made the position of chessboard container to absolute and visibility to invisible. Now the chessboard container won’t be visible and won’t take up any space as it is absolute. When the board used absolute position idk why but the board container got so bigger. It also distorted the pieces when puzzle started. To fix it I ran the gsapMatchMedia code only after chessboardSize is calculated which was a great idea. It fixed the board when the puzzle started but when it was hidden it was still large. I just replaced the absolute and visibility with display: none as it only runs after the chessboardSize is calculated, that’s why there is no issue with display:none. Last change is when sidebarMode is notStarted then only chessboard is hidden. I know that 80% of the things I say won’t be understood but I’m not a good explainer so you have do deal with it 😅. Were really close to the end now I just have to make puzzles page and vision page responsive and just polish the website and then click the ship button"}, {"post_id": 69180, "ts": "2026-09-16T15:22:21Z", "hours": 2.6522, "text": "Omg how does changing the color model solve the issue Before that I fixed the black piece being upside down when dragging. You can see it in my last devlog’s video. I was only happening with black pieces because to make the board work when user got the black pieces I just rotated the board 180 degree. This made all the pieces upside down and to fix that I again rotated the piece’s img 180 degree. Ig when dragging using dnd-kit (npm package) the transform value was being overwritten causing this issue. To fix the issue rather the rotating with board using css I changed the order of files and ranks. I used flex-direction column replacing column-reverse for the rank to start from 1 to 8. Then for reversing the files when color is black then I mapped squares from reversed files array using toReversed array method. I thought by doing this I’ll make the code cleaner but I think it’s more messy now 😭 . Also I did have hard time understanding my own code when trying to solve the issue 😭 . I fixed the pieces, destSquares and captureSquares being generated on the wrong squares. I realized the piece transition wasn’t working when capturing piece both for user’s piece and opponent’s piece. The transition only happens if hasPlacedPieces is set to true and isDragging is false. So, my first assumption the hasPlacedPieces was being turned to false only when capturing pieces but I was wrong. I was checked if it had something to do with the value of isDragging. I found the isDragging was never turned false so I fixed it but still the main issue wasn’t resolved. I was console logging things and just trying to figure out what was actually causing the issue. The fix was really simple. To implement the drag and drop feature I’ve broken down piece code into it’s own component. There inside the component I have added the key attribute and it was the issue. The key attribute is supposed to be used on the component itself instead of inside the component div. (Eg.) I don’t know why it only broke the capture transition but anyways it’s fixed Now to the part where I don’t even understand how does this even happen. Hopefully you understood what I was saying in the video btw please unmute the video as I am talking in that video. So what happened was the piece img bg color changes when it’s selected. This was working fine until I added the dragging feature. When the piece is dragged you see the background color comes along with the piece. So I decided that the square should change it’s color rather than the img inside the piece. I was going to create squareRefs for holding all the values of sqaures and then select the square using gsap to change the color but I realized a easier way would be to just target the square id. It worked so I also decided to use for changing background color of square when user move was either correct or incorrect. On light squares it worked great and it also fixed the animation as the same animation was working a little weirdly when using pieceRefs. I was happy that it was better but then I found the bug from the video. I tried different things and just couldn’t figure out what was the issue but when I decided to change the color from var(–c-red) to yellow it worked as intended. Then I changed the same hsl color into hex and it also worked but I don’t know whyyyy. If someone knows why this happened please tell me cuz it’s ridiculous. Most of the issue had a simple solution but learning what caused the issue what the difficult part."}, {"post_id": 68502, "ts": "2026-09-15T07:18:35Z", "hours": 3.0806, "text": "Worked on the drag and drop feature Although it’s not fully complete and polished, it’s kinda working. I stopped working on the feature and started writing this devlog cuz It has been 3hrs I’m forgetting what I did while working on it. Firstly I wasn’t even going to implement this on the first place as I thought this was outside my coding capability but someone gave me a feedback that I should add this feature so I decided to give it a shot. I found out about the dnd-kit package for implementing drag and drop. I was skeptical of using it at first. I was reading their docs to figure out the package. My main concern was how would I implement the feature with the already existing click to move feature. They provide a useDraggable hook for making any element draggable. The useDraggable was used to make the piece draggable. I had to convert the piece code into a component for it to work. To drop something into another thing there’s useDropable hook which as the piece I made square, destSquares and captureSquares into components. If I were a good react dev I would’ve already did those things ig the using the package is some what helping my code to be cleaner. I used the useDroppable hook inside destinationSquares and captureSquares. I was concerned that we couldn’t actually drop the piece as it doesn’t live inside the square rather it lives on top of the board using position absolute. But, I had gotten dnd-kit wrong. I element does need go inside the element if useDroppable is used. There’s DragDropProvider that connects both draggable and droppable hook. Let’s just say DragDropProvider gave me all the function such as dragEnd and values needed to move the piece. Later I changed the useDroppable to be inside all squares cuz after dragging the piece there was some issues when dropping the piece in it’s original square if the user wanted to cancel the move. I didn’t really have to write new code for moving, capturing and resettingSquare as the code I wrote previously worked fine with the drag and drop functionality. There were many issues while trying to add this feature. Still there are issues I need to fix such as the highlighting the square bg color instead of the piece bg color when selecting piece and other bugs I’ve found. Also transition when opponent captures pieces doesn’t working also need to fix that. But, I’m really glad I tried to add this feature as I’ve learned alot and the puzzles board now feels more fun because of the feature. Thanks @PAPER_01 for suggesting the feature 💖 Okay, I’ll stop yapping. Have a good time"}, {"post_id": 67307, "ts": "2026-09-13T11:45:38Z", "hours": 2.3678, "text": "Gosh I’m so dumb Last time I thought I had fixed 404 page issue when visiting paths like course directly. I did fix it for local development but not for production which is really dumb, shouldn’t the development environment be the same as deployment when using vercel cli. I tweaked the vercel.json to fix the issue in production now but now in the development the website didn’t work. The fix that I’m now using is leaving the production as it is and in devlopment using the environment created by vercel cli only as backend and running the frontend seperately using pnpm run dev. To connect both backend and frontend I configured the vite.config.js to redirect every /api request to localhost:3000(this is running throught vercel cli) Most of the time was spent on making the signup page responsive. The login page is also now responsive but it’s just a copy paste of signup page css. I am quite dissapointed in myself because it took me so long to do this and still I don’t like how it looks on certain screens. As I realized that I was spending too much time on making signup page responsive I panicked and just rushed the process. As a result a have a reponsive signup and login page that I’m not very proud of. I fixed the signup not working. While signing up there it showed user already exist error everytime. The fix was quite simple, I had missed await keyword when checking for user with same email in database. Due to which the userExists variable was always true. Then I did something really dumb. I tried to fix something that was already working. I was worried that if I delete a user from database and then if that user tries to login then it would throw an error so without even checking if that was true I started making changes to the protectRoute.js file. I was thinking after the token is verified then I’ll just check if the user exists or not. In the process I deleted one important line of code because of which I wasn’t able to login now and I didn’t know why. I tried made the code as before not knowing the line is still missing so the error still persisted. After giving up and doing ctrl + z undo the previous code returned I finally realized the missing line of code. Also the feature was already there when fetching user data so none of this was necessary 🫠 ."}, {"post_id": 66353, "ts": "2026-09-12T04:12:13Z", "hours": 4.2436, "text": "We’ve reached 200 hours It’s a big milestone that I’ve finally reached . I’ve made the whole course page responsive. This took me longer than I’ve expected. But before that I was getting 404 not found when visiting locations like /course directly but it was working normally when I was navbar to navigate. I’ve seen this issue before as well so I kinda knew that this was because of react SPA (Single Page Application) thing. To fix this I configured the vercel.json file and now it works as expected. So onto the course page. Firstly I made the accordions responsive on mobile screens using css clamp function. I removed the course info section for mobile devices. I didn’t touch the course card as they were a future problem for me to do. But the basic idea was the image with take up the whole width and the image and the text will be vertically aligned instead of the default horizontal alignment. Between 1024px and 768px one of the issues was the course info was looking crammed on the smaller side. so I reduced the padding and font-sizes with clamp css function so that it still looks good on the bigger screens. I also made the progress bar slimmer and badges smaller. Another issue were the course cards. One the bigger screens they looked find but on smaller screens the text were taking up more height than the image itself. I changed the value of thumbnail image from fixed value to %. Also I reduced the massive 1.75rem padding on the course card container for smaller screens. Also for all screens sizes below768px I made the banner slightly bigger vertically as the previous banner was looking very slim on mobile devices. I scraped the idea of making course cards vertically aligned and stayed with the horizontal alignment. I somehow managed the cards to look decent on smaller screens as well by using clamp(). The things I needed to do were similar but I guess it took me long as I was first checking the min and max values using browser dev tools and then putting that into clamp calculator and then pasting the value into vscode. Basically I had to constantly switch between things. In the end, I went to sleep but couldn’t fall asleep so I decided to complete the course page reponsiveness and do on last thing which was making the loading spinner responsive. Then, I peacefully went to bed ."}, {"post_id": 65437, "ts": "2026-09-10T15:59:36Z", "hours": 3.6533, "text": "This was a rough one One a good note I’ve completed making the home page responsive (for now). After making the hero section more responsive last time I then proceeded with making the courses and puzzles page more responsive. I mainly used the clamp css funciton to make the course and puzzles section responsive. The courses section remained the same as I am quite happy wiht how it turn out but I didn’t like how the puzzles section was looking after testing the website out in my phone. It looked to small for a section so below 768px instead of the text and image being horizontally aligned it’s now vertically aligned. The clamp part was similar to the courses section. Finally after completing those two I started working on the visualization section. I was the hardest section to make responsive due to the absolute positioning of the moves. Firstly I only focused on bigger screens as I had no idea how it would look on smaller devices. The moves were positioned before by mapping an array with the move notation and the css of top and right/left with percent values. I tried to remove that and instead of mapping the elements I thought of manually placing them and giving the ids by which I could have greater control over the css. While trying that I couldn’t make it work as in smaller screen heights it still looked terrible. At this point I was losing hope. I was wasting time watching a anime series just so I could avoid working on this. I tried thinking out the solution but nothing came in mind. Later when I was messing around with css throught the developer tools on the browser I realized the I could change the height of the image container to change the positioning of the moves as the moves are postioned on the basis of the image container. Now below 1440px the height of image container is 90% and below 1024px it’s 80% and I have a max-height value set for safety. It’s not prefect but it’s much better and I’m relieved 😌 . The mobile design uses a image contaning the main image and all the moves as there’s no animation on mobile devices. I made the image in fimga and using clamps and % values I think it’s decently responsive. To make the pages responsive I am using the developer tool in browser to first figure out the min and max values and the putting that value into clamp calculator to generate values. I am constantly switching between vscode and browser for this and if you have a better way to do it please lemme know. Okay the devlog has turned very long so biee…"}, {"post_id": 64066, "ts": "2026-09-08T06:38:40Z", "hours": 1.9236, "text": "Worked on hero and puzzles section (Responsiveness) The puzzles section was the easier that hero and courses section for making it responsive cuz puzzles section doesn’t contain any animations or any special thing. After several trials of adjusting the fonts and image I stopped after it looked quite decent. Before working on the visualization section I decided to polish the hero section first. My main goal with polishing the hero sectino was mainly using clamp() css function for smooth responsive text. Although the text are responsive using media queries in hero section, the text look kinda odd in some screens. After using clamp the website feels better that before. Also I changed the width of image with % values which does feel better. I also used clamp for some vertical padding as well cuz it was looking bad for devices with smaller vertical heights. I thought from 425px to 768px was tablet screen size but it seems the tablet screen size starts from 768px. So now upto 768px the website follows the mobile design. Now I’ll polishing courses section and puzzles sections just like the hero section. Wish me luck 😄. Bye I wanted to add more images but it seems 4 is the limit ."}, {"post_id": 63438, "ts": "2026-09-07T08:57:07Z", "hours": 4.4833, "text": "More website responsive stuff Firstly, I removed the animations from home and courses section below 768px of screen size. I didn’t remove the hero section starting animation cuz it’s nice. I used gsap matchMedia to achieve this. While removing the animations a funny thing happened, the matchMedia wasn’t working and then I was reading this a gsap forum hoping to see where did I go wrong. I later found that I was doing things correctly but instead of looking at localhost I was looking at live website. Obviously the changes didn’t appear 🤦♂️ Then, I made the courses section kinda resposive. Firstly I went to figma to design the mobile version of courses section as I was mainly unsure of what to do with the thumbnail cards. I decided to turn them into carousel which imo was a great idea. First, I turned turned the main courses section text smaller and then started working on the carousel. The making of carousel was rough. Firstly I was reading stuff online on how the sliding thing works. I think I somewhat figured that out but what I couldn’t figure out is the aligning the cards perfectly. The issue was I was going for a style where the first and the last card aren’t centered alight while the rest of them are. The swiping snapped the cards into place and some parts of the left and right cards would also be visible. I couldn’t figure out how to make this and was about to making hamburger menu but coincidentally while scrolling the stardance home page I saw recommended projects section where it’s like a carousel without the snapping thing. It was way easier to achieve than what I was thinking so even though I didn’t make what I wanted the carousel isn’t bad. The overall the courses section felt responsive so I started working on the hamburger menu. Working on hamburger menu went pretty smoothly except for some things going wrong here and there. I first roughly designed the the menu in figma and then wrote the code."}, {"post_id": 62042, "ts": "2026-09-05T08:11:51Z", "hours": 3.8953, "text": "Starting making the website responsive Before starting on making the website responsive I saw that when logging in or signing up there is some delay before redirection where people might click the login button several times thinking that it it’s working which is bad ux. In development there was almost no delay because I was using local mongodb. To let the user know that the button has been clicked successfully and to prevent multiple login/signup button clicks the buttons are disabled as soon as user clicks any button in login or signup page while turning the buttons color into gray. Now on to the reponsive ui part. I first tried making the navbar responsive but it didn’t look right in small screens. I was also trying to make the hero section responsive but without any design to follow. So realizing that I needed a design first I then hopped onto figma to design the navbar and hero section. I changed the ui of the navbar ig to make it easier to make it responsive but I don’t know if the navbar ui got better or worse. I know one thing and that is the navbar has got simpler. The design on the mobile is pretty simple imo but that’s the best I could do to make it look decent. I used flex property to make all the text align vertically in phones and decided to remove the image in phone screens. I’ve have currently hidden all sections below 1024px except the hero section to focus only on the hero section without other sections interference. I’ve mostly used hardcoded values to make hero section which I will change to clamp css propery for smoother hero section responsiveness. I have just eyeballed the sizes and paddings which is a bad idea but I’m just lazy to create figma design for every layouts. Now, I’ll make the hamburger menu working. Uhh, I hate making website responsive but it has to be done. If you’ve any suggestion feel free to leave it down in the comments."}, {"post_id": 61270, "ts": "2026-09-04T03:49:40Z", "hours": 1.9669, "text": "The website is live guys I used vercel to deploy my mern stack project and it was rough . I first tried deploying the the frontend and the backend separately. After reading blogs and trying I ended up deploying the express backend but at that point I had learned that there’s vercel cli with which I don’t have to push commits everytime to find out errors in production. I can just use “vercel dev” command to create a production like environment but for development and testing out. I couldn’t figure out how to run frontend and backend seperately using vercel cli. I then tried deploying the whole repo. The issue with this was I couldn’t configure the website with folder structure like this chess-website ----frontend ----backend Maybe there’s a way to make this work (I couldn’t ), I chose the easier path which I’m kinda familiar with. In this approach there’s no frontend and backend directory. The backend is renamed to api which allows vercel to recognize that it’s the backend and all the contents of the frontend folder will be moved up to the root directory. Errors came as I changed the folder structure but fixed on after another. The backend wasn’t working which got me really confused. There were many issues in this approach as well but atlast the website is running and backend is working properly . The two days break I took from coding is over and i think I feel better. Here’s the link to the website: https://evochess.vercel.app/"}, {"post_id": 58966, "ts": "2026-08-31T15:18:41Z", "hours": 2.2961, "text": "Many small improvements 🙂 I’ve added transition to level btns and added icons and different ui to puzzle sidebar button. I am using an array inside objects to display all buttons. So to customize the buttons I manipulated the array.Some button have only text, some have both text and img and some have only img. Also the main button is wider and other buttons are gray in background color. For this I used the className like in tailwind to add the styling meaning the buttons which need gray color will have the className gray. The size of the buttons is differentiated using different values of flex grow. I think the buttons look way better now. I’ve added reset if user changes from puzzles page to other page. The is to avoid any unnecessary bugs and error. I had already done this in vision page now it was the turn of the puzzles page. I have been avoiding this for so long but finally I’ve done it. I added the videos for professional course (or should I say advance course). I changed the name to advance cuz professional is just the wrong word to use here. I also moved some videos from beginner to intermediate. Now that the courses are in place I can finally write what you’ll learn in the information section. I’ve added numbers such as 0 - 1000 representing what I mean by beginner. I’ve tried to match videos to the elo level. The data in courses section in the home page is also change from placeholder data. Looking back at the code they are really bad but I’ll leave it as it is not broken 😁. Now I think the project is coming to it’s final stages I do need to add things but after that ig all I need is to polish the website and make website responsive. I’ve also fixed progress bar animation happening everytime on reload. This was a small thing but it was bugging me so I decided to fix it. Fixing it was annoying as I had expected to fix this easily. After some trial and error I fixed it using a hasCompleted state which is set to true after finish lesson button is click. Only when the hasCompleted is true the animation occurs. Some other changes I did were fixing only displaying highest achieved medal in course page and adding background color transitions to buttons. Enought yapping. I don’t feel like coding and I think I should take some rest for the next two days. Hope the rest reset my feelings and returns me to my prime stardance days 😆."}, {"post_id": 56525, "ts": "2026-08-28T10:04:18Z", "hours": 2.7708, "text": "Wow! This is the 51th devlog I’ve added the player color indicator in the sidebar. It tells you which color you’re playing. Before coding this I just complicating things in my head by thinking of creating new unnecessary states. I used pen and paper to think and realized why not use the color state already available in chessboard. To access the state I moved it up to the puzzles context file where both sidebar and chessboard could get and change the color. I also moved the hint down as it look clutter both color and hint together in the sidebar. Two quick small fixes. I fixed retry and back button not working and fixed replay button not playing the same level only on last level. I’ve added pawn promotions functionality to the opponent’s pawns. In puzzle 17 and 26 there are promotions that happen but without the promotion part it just looks weird to look at. Especially in level 26 where the pawn promotes to a knight and without having that knowledge the user will just get confused. I haven’t added promotion functionality for the user pawns because there is no puzzle that requires it. I will add it if I have the time to but rn i am going to just ignore it. One of the bugs I faced while doing this was the knight promotion worked fine but the queen promotion at level 17 wasn’t. The pawn was just disappearing because the pawn was capturing itself cuz the promotion only work for black pieces which is now fixed. Next I fixed the random color option color menu not working. Idk when and how it broke I thought it was working fine but it seems not. It seems it was not working because the element was being unmounted before running the selectRandomColor function. So, I moved it to vision context and with a useEffect hook it runs every time hasStarted is true. A small change but which I feel great that it’s solved. When clicking on accordion or pieces twice sometimes it selects the icon and other things which was just annoying. The fix was just two lines of css which I learned from a random dude on the internet. Really thank that random dude. I’ve now added functionality for adding multiple bestScore for according to the time and color. Before the highest score in vision would be the score scored across any time or color. So if you were to score 5 point in 45 seconds and score 5 points in 30 seconds they were treated as the same thing which imo opinion isn’t fair. To achieve this I used object inside a object unlike the single number representing the bestScore like before. The object looks like this. { white: { 15: 0, 30: 0, 45: 0, }, black: { 15: 0, 30: 0, 45: 0, } } I did have a very hard time figuring out how to update the state like this as I had to change the specific time score within the correct color. One thing I did learn from this is we can use square brackets for using a variable’s value as key while manipulating the useState object. I also encountered some errors while trying to implement this functionality. Now everything is working as expected."}, {"post_id": 55374, "ts": "2026-08-27T05:12:03Z", "hours": 2.2717, "text": "I’m so sloppy now I’ve added sounds for piece movement, capturing piece and completed puzzle. I spent more time than I should’ve finding the sounds. I am still not sure about the sounds that I’ve added expect completed puzzle sound. There was issue with playing sounds during opponent move cuz unlike moving player’s piece where there are seperate function for moving and capturing pieces, the moving and capturing logic is inside the same function. After thinking a while I did solve the issue. It seems mac default recording doesn’t capture sounds so you just have to trust me here 😅. I’ve made hint button disabled when pieces are moving (Both player and opponent piece). I did this after figuring out if user click the hint button quickly after the last puzzle move then we get an error. Although this thing happening is very unlikely but it’s better to always fix bugs. Also I don’t know what happens if user clicks on hint inbetween moves so I think preventing it is better. A small change, I’ve added better hover transition to logout button. I didn’t add a red background during making it cuz I had issue with chaning the svg color. I’ve learned that if I make the svg inline in the jsx and set fill to currentColor then I can change the svg color through css and add transitions. Also, I’ve added popup animations to time menu and color menu. I was even struggling with this even though I’ve added those kind of animations before. I was using the new Activity element in react to toggle the menus but to for adding the animations I’ve removed the Activity element cuz the menu would disappear before animating. I took some break from coding cuz I got sick. I think I’m really sloppy now. Imo these changes shouldn’t have taken me 2hrs. Hope I will be able to shake off this sloppiness."}, {"post_id": 53935, "ts": "2026-08-24T17:12:15Z", "hours": 2.6236, "text": "A little rest from programming I’ve added hint button in the puzzles sidebar. I had been trying to avoid working on this but I couldn’t avoid it forever. Also the puzzles sidebar looked really empty without the hint button. In chess.com the hint button highlights the correct. I did things a little differently, the hint is communicated via text to user. The text animates during first appearance and I’ve made it so that user gets only one hint. After the hint the button goes gray indicating it’s not clickable anymore. I made puzzles sidebar code better to display buttons and also added replay button with functionality on successful puzzle complete. I mainly made the code better cuz I need to add the replay button. The replay button is same as retry button for replaying the puzzle after completion. I made next button do nothing if user reaches the last level. Before when completing the last puzzle level we would reach the next level automatically which is prevented now. I’ve been sick for 2-3 days now and am just writing this devlog. Hopefully from tomorrow I will be working on the project more seriously."}, {"post_id": 51434, "ts": "2026-08-21T04:22:13Z", "hours": 1.9856, "text": "Interesting updates I added back button in puzzles sidebar with functionality. Before there was not way to go to the default sidebar (the notStarted state). Now after messing up or completing a puzzle there’s a back button which sets the board to default postion and set sidebarMode to “notStarted”. I wanted both buttons to be taking up equal space but later thought the smaller back button is better. Also now, puzzleLevel updates instantly updates after solving a puzzle instead of updating only after clicking next puzzle button. User can now select and play any completed puzzle by clicking level btns in sidebar. Previously user can only start the puzzle Level user has reached which meant no puzzle 1 and 2 resolving puzzle after user has reached level 3. I split the puzzleLevel state into selectedLevel and highestReachedLevel. The puzzle is set to the selectedLevel and the buttons aren’t clickable above the highestReachedLevel. The ui of level buttons is changed. I made the buttons smaller and made the selected level more distinct by adding a inner glow to the button. We’ve upto 30 levels now . I downloaded the lichess puzzles database for this project but whenever I opened the file my laptop will just heat as there were more than 69 millions data 💀 . I did try to use the lichess data but I didn’t actually like the progression of difficulty so I used chatgpt to make puzzles. I’ve played upto 21 levels and I think it’s good so far. That’s all for now, okay bie…."}, {"post_id": 50379, "ts": "2026-08-19T15:27:48Z", "hours": 1.1106, "text": "Finally, I present to you a short devlog 😆 I have fixed the issue of pieces moving with transition when pieces are being placed after clicking on retry puzzle. To prevent this I already written code which worked perfectly but when only on retry puzzle it wasn’t working. This solution was simple but figuring out the issue took time. To fix the issue I used a useState hook to set hasPiecesPlaced to true only after pieces state updated. Also, I’ve already written code for handling page change in the middle of vision practice. I think this doesn’t work after I removed Chessboard.jsx and ChessboardContext.jsx. Not sure when this broke . I found better way to do this using the useEffect hook cleanup function. I learned that when adding setState directly in cleanup function it throws at recurring error 😭 . I felt my laptop heating up 😭 😭 . But there’s no error when adding setState inside the function and then running the function in the cleanup function. That’s all for today. Couldn’t do as much as would like today cuz a rat bit me 😭. Bye…"}, {"post_id": 49661, "ts": "2026-08-18T15:27:18Z", "hours": 4.6519, "text": "Ayy good progress today I created a separate chessboard component for puzzles page only. Before both puzzles page and vision page were using the same chessboard component making the code complex, hard to read and hard to debug. Firstly I decided to move all the chessboard functions and states into puzzle context but later changed my mind midway. I decided the chessboard functions and states make more sense to be in it’s own folder. Everything broke while doing as expected but I fixed them one by one. Now the puzzles chessboard is functional and it’s code looks a little less overwhelming to me. Now the vision page also needed a separate a chessboard. It wasn’t as easy as just copying and pasting most of the code into vision chessboard because the data was connected to more components of the sidebar such as progress timer, color Menu, etc. I don’t if I should separate the functions to components that they server of just dump it all into the vision context file. What I did was keep functions into their respective folders cuz I think the vision context file looks really cluttered doing that. Everything broke here as well but as before I fixed things one by one. Now I really believe it will be much easier for me to work on chessboards as they’ve been seperated. Also I deleted the original chessboard component and chessboard context after that. On clicking the sidebar button the reset board function is called and the function came from chessboard context. As there is no chessboard context now you can see that there’s a problem here. The reset board function in now in PuzzlesChessboard.jsx which means we can’t access it from PuzzlesSidebarBody.jsx. To solve this I just made the board reset everytime when hasPuzzleStarted is true. We do have the access to hasPuzzleStarted from puzzle context. Fixing that somehow broke the piece transition though. After that I mostly worked on the small things. Such as fixing no transition during piece, fixing the progress timer staring with 2 seconds less than the time set, adding chessboard size to puzzles chessboard in a better way, etc… Now the next puzzle and retry puzzle buttons also work. The next puzzle button works as expected. The retry puzzle button also works but the pieces move to their repective place with animation when the board resets which I don’t wan’t. To prevent this specific thing I have already written some code before and it’s working when starting the puzzle, moving to next puzzle, rendering the default pieces on first load. I can’t figure out why it’s specifically working for retrying a puzzle. I spend a good amount of time looking but idk. I’ll look into this tomorrow. I think the devlogs are still pretty long. I’ll try to keep the devlogs shorter on future devlogs. Okay bie…"}, {"post_id": 48941, "ts": "2026-08-17T14:42:47Z", "hours": 3.0389, "text": "Two steps forward, Four steps backwards 😭 Firstly, I’ve fixed the gsap animations not working. This happened because last time I renamed all the color state into chessboardColor. Due to this the gsap backgroundColor css property turned into backgroundchessboardColor. Ig the lesson here is think before using change all occurences feature in vscode. The sidebar now changes. If puzzle hasn’t started then it’s the same old ui. If the puzzle starts the level btns disappear along with start puzzle button. If user makes incorrect move the sidebar show retry puzzle button and if the puzzle is completed successfully then next puzzle button shows up. One thing I learned here is making one button use different className, onClick handler and text easily by storing all data in object. The retry and completed onClick function looks empty. So, I decided to work on the retry puzzle button functionality. To make the functionality work I imported the resetBoard function from chessboard context. Calling the function directly didn’t work because setState function doesn’t apparently update if the value is same. I fixed that by passing {retryLevel: true} or false to the function. After doing this the first opponent move did break and I did fix it but I think with bad code. Looking at the code now I’ve been calling resetting the board and setting default position using the chessboardColor seems wrong. So, then I started cleaning the code. I guess I was correct and things needed to change. I would say these are mostly small changes and don’t need explanation but it seems that the chessboardColor had an actually bug and it took my soul away trying to fix that 😭 . So, the opponent move was capturing it’s own piece meaning that the piece which moved at the beginning would automatically disappear. This was happening because the moveOpponentPiece function ran before the chessboardColor could change when the puzzle is first started. To fix this I had used useEffect hook with chessboardColor in the dependency array to reset the board. But only works if I have the black pieces. If I have the white pieces the chessboardColor doesn’t update because useState doesn’t update when the value is same. The value is white at first because of the default position set when puzzle hasn’t started. I don’t even know how to explain the fix i used. I just chained state updates from file to file to have colorUpdated state value updated in chessboard context.jsx. Basically I had a rough time fixing the resetBoard function running before chessboard color was updated. This time even pen and paper also couldn’t help me solve this 😭 😭 but it did help me to understand the problem on a deeper level. I tried adding next puzzle button functionality. “I tried” 😭 cuz I couldn’t get it to work and on top of that when I tested the retry button it didn’t work. Don’t know how but the retry button also broke. Now, I’m taking a huge decision again. I think some of the problems can be reduced if the chessboard wasn’t a single component that works on both puzzle page and vision page. I think I was too ambitious but now seeing these issues I think it’s better for me to have to separate chessboard components. This might not be the best practice, but this will probably make my life easier. I just read the “Devlogs that get noticed” in the resources page and I think I should make my devlogs a little shorter. I said this in one of my previous blocks as well, but it seems that I am explaining too much. So let’s see what will happen tomorrow. Okay bieeee…."}, {"post_id": 47257, "ts": "2026-08-15T02:00:48Z", "hours": 3.0875, "text": "Learnt something valuable ✨ Okay now the puzzle buttons have dynamic ui. The puzzle button will have ui according to the puzzle level. I was confused on how to achieive because there were three condition instead of two. If there were only two coniditions then it would have be easy as I would have simply used ternary operator. I couldn’t use if condition inside jsx. After some time I figured that if could call a function and use if conditions inside the function and return the className. Also now the puzzle level is stored and fetched from the backend. After doing that a toast error popped up as you can see below. I didn’t know why this was showing up when the page is first loaded up but instead of fixing that I first moved on to make the start puzzle button work. I think my main problem is I get distracted easily. To make the start puzzles button work firstly I created puzzle context file . I was deciding to make the chesboard context the puzzlecontext as all the data needed for puzzles page was there but I think it’s better to seperate those things. So, I placed the puzzle context higher than chessboard context with that thought process. If the puzzle hasn’t started the fen value is set to default starting position. Then I again got distracted and thought why isn’t the vision context also above the chessboard context. So, I moved the vision context and the coordinates broke. The reason was color state so then I created different color states for vision and puzzle context. While writing this I don’t actually know what I’m really doing. I do one thing and jump onto another making writing the devlog very hard. I think I can do better… 🙁 After learning the lesson, doing thing one at a time. I only focused on making the start button work. So I moved some values inside puzzles context for this to work and everything broke. But, I wasn’t feeling overwhelmed as my focus on only one thing. Slowly but surely I fixed the pieces moving, capturing and the first opponent move. I think my main issue is dealing with useState hook updating in batches. Ig I will just get better with time. Still the backgroundColor animation is broken which I need to fix. Also while doing this I found out why the toast error was occurring. Silly me didn’t add method post to update the puzzle level. Now after the puzzle finishes the puzzle levels value updates and the updated value persists. I should definitely do things one at a time. Getting distracted and doing multiple things will just make me feeling overwhelmed and will make it harder for me to devlog as well."}, {"post_id": 46384, "ts": "2026-08-13T15:40:46Z", "hours": 4.4847, "text": "Making good progress The piece background color now changes color depending upon the correct or incorrect move that the user makes. Last time I was trying to achieve this by just using useState hook. I’ve understood now that it was the wrong approach instead now gsap handles the animation part. The main issue with gsap I was having was I didn’t know how to select the exact piece for animation. I’ve achieved this by using useRef hook named pieceRefs containing an object will all the pieces on the board with their ids as key. I haven’t never used a ref like this before and it feels scary to write code in the unknown territory but ig it’s a part learning. Also I’ve removed the code that changed the backgroundColor using useState and used gsap. It was just waste of my time to try to use useState hook to change the backgroundColor . So now, piece toggling the highlighted bg color when a piece is selected or unselected will be handled through gsap. Ahhhhhhh.. Finally after a puzzle is completed successfully the the next puzzle will start. My brain feels like it’s melting after making this work. I struggled so much to make the work mainly due to react batching the state updates. Unexpected bugs came while coding this. So, basically a puzzle is considered finished if the moveOpponentPiece function has no moves left. Then, we change the fen state and also reset the board so that the pieces are placed again. After that when player reaches next level the opponent first move needs to take place. For that I have a useEffect hook to check if opponentMoveIndex and userMoveIndex value are default values. The values are set to default through resetBoard function and if the values are the default ones then the opponent pieces moves. One of the main issues I had with this was the moveOpponentPiece function was running twice. Due to which one of the opponent move was being skipped. I wasn’t able to locate why and was making so many unnecessary changes and console logging everywhere to fix this 😭 . The issue was that the useEffect that I talked about earlier had pieces in the dependency array making the moveOpponentPiece function to run twice. I’m really exhausted after doing this… Then after some relaxation I made a rough figma design for the puzzles sidebar. It was kinda relaxing to not worry about coding for a while. I had big plans for the sidebar like making candy crush type levels but I don’t think I’ve time for that so just basic buttons will have to do. I’ve tried creating the distuinguishing the levels based on completed levels, current level and locked levels. Back to coding again, I mostly copied the vision sidebar code for puzzles sidebar as the only difference is in the sidebar body. It seems that I’ve forgetten to use css grids. I wanted the buttons layout to be responsive. I took a quick revisit on how grids. Throwed random properties at the grid hoping it will work as I expected 😆. At last it was the auto-fill property I was looking for with a combination of minmax. I’ve tried created the css for completed, current and locked now I just have to hook them up to the buttons according to puzzle level reached by player. I’ll do that tomorrow, now I’ll stop writing. If you’re reading this, I hope your project is going well💖."}, {"post_id": 45805, "ts": "2026-08-12T14:57:39Z", "hours": 2.5114, "text": "I am stuck Ayy the opponent moves work as expected now. In last devlog I wasn’t able to capture opponent’s page because I accidentally didn’t filter the pieces, only moved the piece. Now the capturing system also works as normal. While talking about capturing pieces now the opponent can also capture pieces. If any of the player’s piece is on the destination of opponent’s piece then it will be captured. The main lesson learned here is to mostly use the previous data while changing the state’s value to avoid unnecessary bugs. I’ve made the reset board function work. This was the point where I decided to rebuilt the code by removing the use dom manipulation and looking back I think it was a great decision by me. (Context: 2, 3 devlogs ago I found out my code was really trash while creating the reset board function). While writing reset board function I did run into some weird bugs. The board is reset by reconverting the fen to pieces array. The first opponent move happens when the opponentMoveIndex is 0 now. In the reset function the opponentMoveIndex is set to zero. I’ll add a animation to indicate that the user’s move is incorrect later. For now I added the animation for the piece moving. I’ve learned that when moving the pieces by updating the state in react, the key of the element is what matters for animation to occur. If the key of the element is same and just the transform style has changed react knows that it’s the same piece that jumped from one place to another. Also now, the move transition doesn’t happen when the pieces are being place. Because the pieces are placed using the transfrom property, the same property used to move the piece. I took me a while to fix this. It seems that this was happening because the squareWidth was making the page re render. I’ve fixed it but I still I don’t completely understand it, which shows that I’ve a long way to go. This one is small but crucial. Now the user cannot select the opponent’s piece during opponent’s turn. I’ve added a 500 ms delay for opponent’s move so that it doesn’t feel things are happening really fast. In that timeframe user is not able to select any pieces now. I am now stuck at the part where I am trying to animate the pieces after checking the user input. Whether it’s correct or incorrect. I wanted to make the background green if the move was correct and red if it move user made was incorrect. Using states is proving to be tricky for me as they’re fully synchronous. My brain goes okay this will happen and that will happen but the code won’t have the updated data because of useState nature. Also I tried to change the background color same way I move the pieces. Now that I think I about it I just wasted time. I will try to do animations with gsap now but idk how to explain I can’t really think of a way to do it with these useStates. Okay this was more that enough yap for 2hr 30 mins of work. Let’s see if I figure out a way tomorrow. If you’re reading this love you man 💖."}, {"post_id": 45236, "ts": "2026-08-11T16:05:21Z", "hours": 6.4983, "text": "Most rebuilding my broken code For context last devlog I took the decision to start rewriting the code to stop accessing dom directly by using states. Now the pieces are mapped from pieces state rather than directly from fen so that I can move the pieces from state instead of manipulating the dom. To achieve this I firstly created to convert the fen to pieces array. The pieces array looks something like this rn. [ {id: 'r-a8', pieceNotation: 'r', square: 'a8', coordOfFile: 0, coordOfRank: 0}, {id: 'r-e8', pieceNotation: 'r', square: 'e8', coordOfFile: 4, coordOfRank: 0} ] From this I learnt that setting the key attribute serves it’s own purpose in react. I don’t fully understand it rn but I’ll look into it. Now, the id of the piece serves as the key for the piece element and if I’ve understood correctly that will be vital in animating the piece moving. Yay the rook has been reestablished using react state without any dom manipulation. The reestablishment wasn’t too difficult as I thought due to the already existing code. All the changes now happen in the pieces state which then causes the react to repaint the pieces. Now the rook can move from one square to another and capture opponent’s pieces. Also I’ve made the reset squares function as it removes the destination squares, caputure squares, etc . Although there’s no animation during piece movement rn I’ll it add later. After making the rook work I stared making all other pieces work as they used to before. I thought I had to write most of the code to fix all the pieces but after finishing the rook other fix other pieces wasn’t that bad. I reused the code from the rook where I could, fixed some bugs and errors on the way and modified the code where necessary. Sometimes I got stuck due to my own stupidity but that’s nothing new 😆. The moveOpponentPiece function is rebuilt. Now the first opponent move will happen when the board is first loaded. While fixing this function I found out that I was able to select the opponent’s piece as well. This shouldn’t be the case cuz I had already put railguards for preventing this. After fixing the moveOpponentPiece function I checked why this was happenning and the cause was I put railguards only if user click on another piece when a piece was already selected and that code was also wrong. I fixed them both and now they work as expected. Another bug found. When I clicked on the first pawn it only created one destination square instead of two. This was happening because the for loop had only 7 iterations instead of 8 which added the starting pawn squares to the array. Also the user’s pawn were able to capture the user’s pieces which was a big nono so I quickly fixed that. Even thought the moveOpponentPiece is working for the first move it instantly breaks from the second move. I still fully don’t understand why this is happening. I know it has something to do with using setState and it not being synchronous. The code looks like this let updatedPieces = pieces.map((piece) => { if (piece.square === position) { return { ...piece, square: destination }; } return piece; }); setPieces((prev) => { console.log(\"updated\", updatedPieces);// I don't understand how this value return updatedPieces; // and this are have different values}); I’ve fixed it while writing this devlog removing updatedPieces variable and mapping the value directly inside setPieces(). Now, the second move works but the third move is broken 😭 . I’ll look into this tomorrow. I’ll wrap this up for today. Also I’m changing my devlog style a little bit. I’m not telling you all the problems I ran into like I did before to keep the devlogs a little short."}, {"post_id": 44520, "ts": "2026-08-10T10:34:10Z", "hours": 3.1394, "text": "Taking a BIG decision Updates: Fixed pieces creating only single capture square Added redirection to signup page in puzzle and vision page if user isn’t logged in Made user unable to select piece when opponent’s piece is moving Connect oppenent’s move to puzzle data, Add check for user moves and Add functionality to make the opponent piece move automatically after user plays the correct move I fixed the pawn not being showing two capture squares last time. After that I found out that the capturing the piece wasn’t removing the piece from the board. I found out a function that I have commented out was being called and causing an error so I removed the function call for now. This was easy to fix but by doing this I found out that the pawn wasn’t the only one who wasn’t able to display mutliple capture squares. All the other pieces weren’t able to display multiple capture squares due to a simple rookie react mistake. The value of captureSquares was being updated with it’s own value instead of using the previous value. After sorting that out I figured i should do same with the destination squares. Previously had an array updatedDestinationSquares after pushing all the values to the array then only I updated the destinationSquares value. In short I was doing the correct thing and me thinking that I could save 2 lines of code by adding setDestinationSquares directly to the loop was a bad idea but the state function isn’t synchronous. So I undid all the changes and also added a updatedCaptureSquare to all functions just to be safe. Now user can’t select pieces when it’s the opponent’s turn. Although the timeframe to select piece is small but still I wanted to be safe. I achieved this with a state named isOpponentPieceMoving. it’s toggled on when user clicks on a destination square and toggles back off after the animation finishes. Next I tried to make the opponent piece move work through with the help of the lichess puzzle data. Before the opponent piece could only the first move to play. After connecting the moveOpponentPiece with puzzles data. I created a function to check whether the move made by user is correct or incorrect. This was also being checked with the data in constants.js file. The data is stored like this r3r1k1/p4ppp/2p2n2/1p6/3P1qb1/2NQR3/PPB2PP1/R1B3K1 w - - 5,e3g3 e8e1 g1h2 e1c1 a1c1 f4h6 h2g1 h6c1 The moves part start after the comma. First move is of opponent. It tells from which square to which square the piece is needs to be moved Eg(e3 to g3). The second move seperated by space is what the user need to play to move forward in the puzzle. So if the user’s move is correct then I move the opponent’s piece. But if it’s incorrect then I reset the board. I got lost in the reset part. I learned if the key of a element is changed the element kinda resets. When I started doing this I felt a little uneasy. I was figuring out the code I wrote was manipulating the dom which isn’t the best practice in react. Regardless, I added a fragment to the code that was generating the pieces with a key with the value of boardKey and updated the boardKey when the user’s move was incorrect. But in my mind a question was lingering \"Should I redo this in the way how react wants it\" . Seeing the functionality working I pushed off that question. But, when I captured a piece a error popped up. The ss is below. I tried to locate why was that error popping up. I’ve concluded that the bad code has started to show why it’s called bad code. Although I might find this solution to this issue I think it’s better for me to just rewrite the code. This is painful but it will make me a better developer. Also I found another bug, the error isn’t the only reason I’m making this decision. I’ll push the code upto what I’ve done right now and then I’ll start to fix what I’ve created."}, {"post_id": 44051, "ts": "2026-08-09T15:53:39Z", "hours": 2.9425, "text": "I’m dissapointed in myself Updates: Fixed pawn unable to show two capture squares at once Added function to move opponent’s piece automatically Set fen according to puzzleLevel Moved opponent piece after the pieces have been placed and remove css transition into gsap animation while moving pieces Last time I added functionality to pawn to be able to capture pieces. It worked fine I there was only one piece diagonal to the pawn. I there were two pieces diagonally infront of the pawn only one capture square would appear. Now two capture squares appear if there are two pieces in front of the pawn diagonally. Fixing this was simple. Created the function to move the opponent’s piece automatically. In puzzles the user only moves their piece, the opponent’s piece moves automatically after user plays their move. This was the most frustrating thing I worked on today. I thought the function worked correctly but I was wrong. I’ll tell you in a sec. I added 3 fens with moves from lichess puzzles data in constants.js . Then I made the default fen data to null and made it so that the fen is selected according to the level of the puzzle. I think I was trying to add loading state for this. It was very poor thinking from me. I was just being very ambious and instead of trying to do things step by step I was trying to multiple things at this time. I don’t remember exactly what changes I tried to make ig I was trying to fix the moveOppenentPiece function as well at this time. I undid some of those changes, left others as it was and fixed the fen and commited that. I was already frustrated at that point and then when I tried fixing the moveOpponentPiece function the constant errors and bugs worsened my frustration. I don’t want to explain that part. Just know that after fighting with my code it’s working now. Also before I had css transition for trasform property. Meaning that whenever the pieces moved it moved smoothly. But when the chessboard is first rendered all the pieces also animate to their places. I fixed this by removing the transition css and using gsap to move the pieces. Now the first opponent move happens automatically. This was also frustrating to make it working. Basically today was frustrating. I thought I coded longer but seems like not. But anyway, when you’re at the bottom the only was is going up. Saying that I will stop writing this devlog. I feel I could have written an essay today. Okay bie…"}, {"post_id": 43708, "ts": "2026-08-09T03:48:45Z", "hours": 3.2064, "text": "Gobble up pieces Updates: Rotated piece img when color is black and made user unable to select opponent’s piece Added functionality of capturing pieces with rook Added functionality of capturing pieces to bishop, king and knight Added functionality of capturing pieces with pawn My goal was to make the board work from both sides. I was ready for this goal to be challenging. I was messing with squareid and position of pieces by checking the color of the board. But it seems don’t have to do much for things to work. Before, I have already made the board rotate using css. I was rotating the pieces when color was black and that was causing issue. Instead of rotating the piece I simply rotated the img inside the piece. Till now every is working as expected. Also I made user unable to select the opposite colored piece. Now we can capture pieces . If a piece can be captured, the piece will have four triangles at the corners. This is inspired from lichess as I didn’t really like the circle of chess.com. I made the triangles myself using figma. Also I created the dot in figma to change it’s color. Previously the dots were green. It took me some time to pick the colors of triangle and dot cuz I didn’t wanted their colors to ruin the feel of the chessboard. This works by firstly determining if the piece in the way of destination squares is our piece or the opponents. If it’s our piece then destination squares will instantly stop generating but if it’s the opponent’s piece the we first add the sqaure position to capuredSquares array and then stop generating the destination squares. While doing this I learnt about the remove method which allow me to remove the captured piece element from the board. It took time for figuring out how capture pieces with rook. After that it was really easy for me to do the same with other pieces as well except for the pawn. The pawn isn’t the same as other pieces. It moves vertically and captures diagonally. So I had to write code differently for the pawn. I code for the pawn does seem a little messy but i think it’s fine. I would say it wasn’t too difficult to make the pawn capture pieces. I did have to think about making the capturing functionality work for both white and black pawns. This much for this devlog. I am being quite lazy nowadays. Time to grind and lock back in. Hit me up if you also want to grind along with me."}, {"post_id": 43022, "ts": "2026-08-08T02:09:50Z", "hours": 3.1258, "text": "Mostly cleaning up my messy code 🧹 Updates: Made bishop not able to pass through pieces Made the code creating rook destination squares much cleaner Made the code creating bishop destination squares much cleaner Fixed rook and bishop not creating destination sqaures at the edges of the board Made code for creating knight destination squares cleaner and fix if statement condition of rook in ChessboardContext.jsx Made code for creating pawn destination squares cleaner and make pawn unable to pass through pieces Fixed bug while clicking on a piece when another piece is already selected In last devlog I made the rook unable to pass through pieces so it was very logical to do the same to bishop. Making the bishop unable to pass through pieces was pretty simple as the code wasn’t much different from the rook one. Idk what clicked in me after doing that I started to thinking about making the rook destionation squares creation code cleaner. The code was very messy and repitetive and I believed it can made cleaner and smaller. I used 4 while loops before which had almost the same code but different values and slightly different calculations. After thinking and trying I turned the 4 while loops in to a single while loop. Now the code looks much better. Seeing the success in rook destination squares creation code I then moved on to the bishop’s code. Made similar changes to the code as the rook’s code. Also i believe the queen works perfectly as it’s mixture of rook and bishop code but I haven’t really tested it on board. After cleaning up both rook and bishop I found a small bug. The bug appeared because of my slight mistake while trying to make the code better. Basically the rooke and bishop weren’t creating any destination square at the edges of the board. The fix was simple so this didn’t take long to fix. I already didn’t like the knight’s destination squares creation code. Me cleaning up the rook and bishop code gave me the motivation to make the knights code better. It did take some time for me for cleaning up that messy and tangled code. I was using break keyword for rook and bishop so I also used break for stopping the loop but I didn’t want the loop to stop completely I just needed to skip the loop if there way a piece or if the knight was on the edge of the board. After a quick search I found that continue keyword does the job. The pawn code wasn’t that messy but it could definetely do better. I mainly changed the pawn’s code cuz I wanted the pawn to also be unable to pass through pieces. Before there were two loops now I one loop does the job. Then I also made the pawn unable to pass through pieces by breaking the loop. Fixed the annoying bug. If a piece is clicked when another piece is already selected then it looks like both pieces are selected. Desitnation of both pieces are shown and both pieces are hightlighted. So, as clicking on a square reset the selected piece, I reset the previous piece if user selected another piece with a small change. Now I’m trying to making all these things work from the black side as well. Okay this much for this devlog. See you on the next one. Biee…👋"}, {"post_id": 42402, "ts": "2026-08-07T02:53:40Z", "hours": 3.7158, "text": "30 day streak let’s goo 🔥 Updates: Added functionality of moving pawn with seperation destination square for white and black Added functionality of moving knight Changed color of chessboard Made rook not able to pass through pieces The pawns now move one square at a time and have the option to move two squares if they’re on starting squares. Moving pawn one square is easy but I had to think about creating two destination squares infront of the pawn. So I created a array and push all the starting squares of the pawn and if the pawn is on one of the starting squares then two destination squares are created. It’s also seperate for black pawn and white pawn so that white pawn doesn’t get two destination squares when it’s on the black pawn’s starting squares. I forgot the knight also needed to move lol 😆. Just remembered in time after finishing the pawn. The knight was tricky to move. As always I used the mighty pen and paper first before coding. Creating the knight took some time due to random bugs here and there. I think I need to revisit the knight code later as it’s very messy. Yay, now the back pieces don’t disapper on the dark squares as I have changed the chessboard light and dark square colors. I think the new colors look great. I was lazy to test out colors so I went to chess.com and picked colors from one of their themes. Okay now were moving to the next step. Making the pieces not be able to move through pieces. I started with the rook. The plan was simple. Check for any piece with squareid that’s same of the destination square and if true stop the loop. I couldn’t figure out how to even select the piece. I was frustrated as I need to select the specific piece with the squareid attribute. I found out about ReactDOM.findDOMNode but I couldn’t figure out how to work with it. I felt really frustrated at that time. I was thinking of using document object but I know that is a bad practice in react. It seems I forgot that we can use querySelector in refs. I already had the chessboardRef so I used querySelector to find if a piece was on the way of the rook. Also I had to change the way I calculated the rook’s destination squares but let’s not talk about that I think the devlog has gotten pretty long. Although the problems are hard for me to solve when I see the results working I genuinely feel happy. I have gotten lazy after getting sick. Although I have not fully recovered yet I’ll try to stop wasting my time. Okay this much for now biee…."}, {"post_id": 40781, "ts": "2026-08-04T15:12:05Z", "hours": 3.8114, "text": "More pieces can move (I’m sick again 😭) Updates: Added functionality to handle vision page if user changes page during vision practice Added functionality of moving bishop and seperate calculation of rook moves Added functionality of moving queen Added functionality of moving king I told in the last devlog that I was working on hanling vision page if user changed page during vision practice. And now, it’s done. I think I have reset the necessary things so that vision page works normal. If any bug related to this appear in the future then I’ll fix it then. Right now everything looks fine after adding this functionality. Creating destination squares for rook was easy and I thought bishop would also be probably easy. I was very wrong. The thing with rook is that there will always be equal number of destination squares but bishop doesn’t. I bishop’s destination squares varies according to it’s position. I took a long time to figure things out in pen and paper. I even wrote the whole chessboard notation in paper and looked at only one diagonal first to find some sequence ( I’ve attached the img below 😆). I started coding after kind of figuring out where to start. I had issues during coding as well but we got it boys. Also I was using OR instead of AND in the while loop causing bugs and I needed some time to digest that AND definetely worked there. A silly mistake from my side. For the queen I didn’t have to code much as I wrapped the rook and bishop destination squares code in to a function. Then, I created a new function for creating destination squares of queen which just called both the rook and bishop function. As this was really easy I was pumped to move on creating king’s destination squares as it is also really easy. Took a sip of coffee and continued my coding journey. I was wrong 🥀. I got stuck adding the king’s destination squares. I was first thinking of combination of rook and bishop but only one out from every side. This was the wrong way of thinking ig. Then I thought I should use two nested for loops for creating the destination squares which firstly worked out badly cuz I’m dumb. The destination squares we’re being created in such odd manner. After fixing that I had to also remove the destination square which was being created on top of the king and also had to handle to not generate some destination squares when the rook is on the edges of the board. I have done nothing today due to my illness. I hate my immune system 😭. I’ll code for 5 mins now ig for keeping my streak alive. Okay biee.."}, {"post_id": 39546, "ts": "2026-08-02T15:52:07Z", "hours": 3.3606, "text": "The rook got some moves 💃 Updates: Added movement to piece when destSquare is clicked Added mode state for seperation of chessboard in puzzles and vision page Moved states, refs, effects and functions from Chessboard.jsx to VisionContext.jsx Working on handling vision page data if user switches to other page during vision practice Finally I can proudly say that the rook can move now. I am really happy that it’s working. To move the rook I had created destSquares(the square with green dots) last time. Now if the user clicks on any of the destSquare with some maths the rook move to that square. I’ve added transition for the movement to look smooth. While doing this the rook did move to the destSquare but when clicked on the rook again the destSquare appered from when the rook was last time. To fix this I grabbed the destSquare location (e4) then set the squareid of piece to the location. The destSquares were calculated based on the squareid so now after moving the rook I can move it again. Also now if the a piece is seleced the background color of the pieces changes. When a piece is selected then destSquares appear but if the piece is selected again or other square is clicked then the destSquares are removed. Small things like this is making the chessboard feel lively and feel that it works correctly. I wanted to do this before but I thought I’ll do it later. I added a mode state in Chessboard.jsx. The mode state is either “puzzles” or “vision” representing the page the chessboard is on. I have made the pieces not appear while I’m in vision page and am trying to make sure nothing is running behind the scences if user decides to move to another page after they click on start. The countdown timer code of vision page was in Chessboard.jsx. I didn’t like that so I decided to move the code to VisionContext.jsx with the timer I move some states , refs and function with it. I had some issues during this migration but it wasn’t too difficult to resolve. I thought I had worked more but seems like I’ve. I’m confused, when I think I have done little work at that time I some how end up will better hours and when I think I have done decent amount of work I end up with less hours. Anyways it feels good watching the rook moves are working correctly. This much for this devlog. Peace ✌️"}, {"post_id": 38612, "ts": "2026-08-01T02:55:53Z", "hours": 4.9544, "text": "I got sick 🤧🥀 Updates: Make pieces position perfectly to square in chessboard Moved chessboard states and refs to ChessboardContext.jsx Fixed pieces sometimes being group together in one square when chessboard offsetWidth is null Added destSquare element on click for all possible moves of rook Last time I did position the squares but when I changed the background color of pieces there was a slight misalignment. I started searching what was causing that to happen. It was due to the height and width of chessboard being in decimals. I checked to see what lichess were doing and found out the height and width of the chessboard were always divisible by four. I did the same for my website and now it’s perfectly aligned and that’s what I love to see. Moved the states and refs from chessboard.jsx to chessboardContext.jsx to make the chessboard code less cluttered. The code relevent to puzzles page is in the chessboardContext while the code revelent to vision page is still in the chessboard page. When the page was loaded for the first time the pieces were being group together at the top left square. It was being fixed automically when the page was reloaded. It also happened while navagating from home page. I found out this was happenning due to chessboardWidth being null at start. To fix this I created a useState for the chessboardWidth so the page rerendered after the value was changed. My goal today was to make the rook move but I could only work up to generating the destSquares when the piece is clicked. I achieved this by creating a useState array and if user now clicks on the rook it calculates all the possible squares that the rook can move to and then that array is mapped using math to place destSquares perfectly on top of squares. The destSquares have a dot insided them which will be replaced by a icon but that’s the reason they’re not aligned centered currently. I did have a hard time doing this. Let’s not talk about it. 😭 I’ve written everything in short so that I don’t hit the 4000 characters limit and also ig it’s better for people reading (if any 🥀). I got sick yesterday and was just able to work on my project for 1 hr. Today I thought didn’t work much but it seems today I did 3 and half hrs. I am happy about today. I really don’t know if I can create the puzzle but I’ll try my best to do so. Everything I try to do seems to come with their own set of challenges and take time to overcome those challenges. Let’s see what happens 😔"}, {"post_id": 37397, "ts": "2026-07-30T02:35:38Z", "hours": 3.0969, "text": "The pieces have been placed. I was so sloppy 😭 I’ve added pieces to the chessboard. I’ve finally started facing my fear and started working on the puzzles section. It seems that creating the chessboard for puzzles will be harder than I have anticipated. Also please don’t mind the black pieces blending in with the background. I didn’t find chess piece set I liked so I downloaded the lichess chess piece set from pinterest. I was trying to crop them in figma and I coundn’t crop them properly. Also it was a tedious job. After downloading two crop pieces from figma I again went to the web to find out if someone already made them. This website came in clutch (greenchess.net). They had the whole chess pieces set of lichess available for download. Then, I started to code with no plan in mind . I don’t know why do I do this to myself. Obviously it was a bad decision. So I decided to use pen and paper to mainly solve one thing and that was how to place the pieces on the board. The writing helped me alot to think better. I was so sloppy while coding. I was mostly outside while coding and I was really distracted. One sec I was coding and another sec I was thinking about something else. I was making so many silly mistakes making the process more frustrating that it already was. I learned about fen while doing this (Forsyth-Edwards Notation). Through this any chess position can be stored and recreated in one line. It looks like this rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 I only needed to loop over the first part divided by slashes for positioning the pieces. Other things will be used later. I feel the code is really poorly written but it works so idk. I also found out about regex while I was trying to write a if condition for seperating strings and string with numbers. Okay this much for today. Bie…."}, {"post_id": 36798, "ts": "2026-07-29T02:45:06Z", "hours": 2.2681, "text": "Moving onto something big (I’m scared) Updates: Change ui of popup menus in options.jsx Added sounds for correct and incorrect attempt in chessboard Added countdown and start sound in chessboard.jsx Added puzzles page Renamed sidebar of vision page and it’s component with prefix of vision. Most of the updates in this devlog are small changes. But now I am going on to work on the puzzles page. I don’t know how I will figure this out. I hope it goes mostly smoothly.. I had designed the popup menus in the last devlog. I think the newer design is much better than the last one. The popup menus don’t look the same in the figma and the website cuz I tweak some things while coding. The figma design was a rough design Adding the sounds in the vision page has made praticing much more fun. The built in mac recorder doesn’t record sound unfortunately or I just don’t how to.. So, I’ll add a ss of vision page with menu open and a ss of puzzles page. I added chessboard and sidebar to vision page. There were two sidebars now so I decided to rename vision page sidebar to VisionSidebar and puzzles pages sidebar to PuzzlesSidebar. Okay that was all for this time. Give me strength to start making the puzzle by liking and commentin on the devlog. Byee ♥️. Also if you’re reading this support @PAPER_01 . AniShuffle has been taken down but she’s been unbanned now 💖."}, {"post_id": 36163, "ts": "2026-07-28T02:25:06Z", "hours": 3.6781, "text": "You’ve my coordinates now Updates: Added coordinates to chessboard Changed previous to current Fixed user input on chessboard being checked before countdown finished The show coordinates now works Fixed some event bubbling issues in colorMenu and timeMenu Designing the pop up menus Now it’s easier to locate squares with the help of coordinates . Now you will also notice the board has fliped while changing colors. ~ A small change, in the sidebar the previous word has been replace with current. I think the current word makes more sense there. ~ I also fixed user being able to click on the squared before the countdown finished. This was a silly mistake from me. ~ The coordinates has made it easier to locate squares. But if you want some challenge then you can toggle show coordinates off now. ~ That’s all for this devlog. If you wan’t my actual coordinates dm me 😄."}, {"post_id": 35623, "ts": "2026-07-27T05:20:24Z", "hours": 7.9881, "text": "We’ve reach 100 hours 🎉 Changes: Fixed timer not displaying in sidebar Removed the square display after time is over Fixed timer setInterval running multiple times and made countdown timer code cleaner Fix TimeMenu not closing Removed unused imports Designed the sidebar to add new data Added the new design Added animation to make the square notation that appears on the chessboard disappear First of all, we have reached 100 hours let’s goooooo. I would like to thank everybody who have followed my project read, liked or commented on my devlogs . My project has recently started getting some traction. Special thanks to @PAPER_01 💖. I have done a lot of things this devlog. I will try to cover these in as short as possible. It seems that the setInterval in progress.jsx was running twice. I found out this while I was making the countdown timer code cleaner. So to fix that I reset the hasCountdownCompleted as soon as the timer in progress.jsx runs out. Now, countdown and progress timer work as intended with cleaner code. The random color option in color menu now works. It was a little tricky making that work. Let’s just say it wasn’t working as expected but the fix wasn’t that hard. I liked what chess.com were doing. They were displaying the square notation and then the square notation would just disappear. The square rotation will also live in the sidebar so that if user forgets what the square was just displayed, they can easily look at the sidebar. I really like this idea and decided to implement on my project as well. But before I added this to the website, I first designed it on Figma. I also thought of displaying the score and best score on sidebar. Designing it was fun and tricky. I didn’t really like how the previous score and best score were looking and after some trial and error it looked okay. All of these things were fine and enjoyable to do but making the best score work was so frustratingggggg. It’s the reason that I couldn’t devlog yesterday. The issue was score was showing to be zero inside updateTimer function even though the score was greater than zero everywhere else. I thought fixing it wouldn’t be really hard. I tried console log score everywhere to see when the value was being zero but there was no sign of the score turn into zero. Later I found out that due to the updateTimer function being inside a setInterval the value is kind of locked and used useRef hook to solve the issue. Okay, that’s all for this devlog. Now that I have reached 100 hours let’s aim for 150 hours as soon as possible. I have taken very long to write this devlog so I like would be heavily appreciated 😄."}, {"post_id": 34403, "ts": "2026-07-25T02:47:48Z", "hours": 4.5364, "text": "Mostly cleaning up the code and breaking things Changes: Made timer code better and cleaner Added functionality to timeMenu options Added countdown before starting the timer and displaying the squares -Added VisionContext.jsx to make code cleander and broke down vision page into smaller components As I said in the previous dialogue, the timer code was messy. So I decided to clean the code now it looks much better. Also now the time button options work now the timer will have 15, 30 or 45 seconds according to what you choose. So before, after cleaning on start the timer would start right away and the square would also show up. But this might make the user frustrated as they have to click start and right away move their mouse to the chessboard. I saw that chess.com has a countdown timer so I also made one. The code for this countdown timer is also messy so I will probably make it more cleaner next time. This is the main thing I have doing this whole devlog which I cannot show you because it’s just making the code cleaner. The vision pays had a chessboard component and then sidebar element to it. The sidebar element had all the code which was making the vision page could a lot messy. So I have broken down components into components and those components in the further components. I think this is making the code much more easy to read and find and debug each component more easily. But in the process of cleaning my messy code, things have broken down. The timer isn’t working, I will fix that later. I don’t have much to show here today so the see the countdown timer working and the broken timer 😝. I will fix everything in the next devlog. So stay tuned. Bieee…"}, {"post_id": 33853, "ts": "2026-07-24T03:14:59Z", "hours": 4.7681, "text": "Ayy almost 5 hrs today !! Changes: Fixed attempt square and attempts not wrapping as expected Fixed color being stuck in chessboard when same square is clicked rapidly Added color menu popup when click color button in sidebar Added time menu popup when user clicks time button in sidebar Added Progress component in sidebar with working score Made timer in progress.jsx functional Fixing the user attempts in the was pretty easy. I just added a attempts container to wrap the attempts element and then the CSS work as expected. Fixing the red or green colour being stuck in chessboard when clicked rapidly was a headache to fix. I was trying my best and at last I came up to the decision that I needed a timeline for the animation before the animation was played the progress of the animation should be zero. I tried that and obviously that didn’t work but it seems that I was close to the answer. I used Claude to figure out the answer and Claude used killTweenOf gsap function to remove the animation before the animation was even played. It also added a onInterrupt property to the animation which basically reverted the stuck colour after killing the animation. I didn’t want to use Claude, but I just couldn’t figure it out and I think it was better to use Claude as I have never used those functions and properties of gsap. Also Claude made that portion of my much cleaner. Seeing this now, I will be more focused on the cleanliness of the code because claude showed me that my code was repetitive and how it could be made smaller and easy readable. I decided to make the colour menu pop-up and time menu pop-up straight by coding instead of designing it first as I should have. As you can see, the result is very terrible. I am sure definitely fixing it in the next devlog. I was force thinking of making a pop-up menu component and using them in both buttons but I found that it was a hassle and not worth it. Only the white and black button in colour pop-up menu work. They just rotate the board and that’s all I still need to add functionality to them. After learning the lesson that I should definitely design before coding. I started designing the progress component. Although there isn’t much to design there I definitely would have made it as bad as the pop-up menus. While coding this, I also made the score display the total number of correct at attempts which was pretty easy. I just had to add one digit whenever the chose the correct square. Then, I started working on the timer. The timer would have been really easy if I just used setTimeout every second but I like to torture myself so instead of just doing that, I challenged myself using date constructor. I have done this before but it has been sometime and I remember how it worked. The countdown started from 28 which was frustrating. Now, I have just completed that but the code is really messy. I will definitely fix that tomorrow or today as I might post this devlog tomorrow. I think that shorter devlogs do better in terms of views. I’ll try that next time. See you in the next devlog 👋."}, {"post_id": 33005, "ts": "2026-07-22T15:24:41Z", "hours": 3.3339, "text": "Things are going great Changes: Added chessboard component with ranks and colored squares Added function for generating random squares and displayed them Added feature to display green and req squares to indicate whether the user clicked correctly or incorrectly in the chessboard Displayed attempt made by user in the sidebar with respective colors for correct and incorrect ones I thought doing all of these took me at least four hours but I was wrong. It seems that it’s only been about like three hours. This time I have worked on the chessboard itself on the vision page. Before it was just a plain whiteboard but now there are individual squares which was pretty easy to implement. I however needed some time to figure out how to add colours to the squares. But it also wasn’t that difficult. Then I created a function for generating random squares with the help of math.random(). I created an absolute element to display the random squares at the centre of the chessboard. To indicate the user that the square they have clicked is correct or incorrect I played the small animation that changed the colour of the user clicked square into red or green depending upon whether the user input was correct or incorrect. I was stuck here because I didn’t know how to reverse the animation. Of course I could just change the colour to green and then the colour of the square but that didn’t look quite right as I am probably going to change the chessboard colour later. So I wanted the animation to be flexible I was trying to play and reverse a animation timeline but it was so much easier than that later. I just remember there was the repeat and yo-yo property that will easily accomplish this effect I’m looking for. I have found a new bug with this if I spam click a square the square permanently turns into either red or green so definitely I will fix that in the next devlog. Also now the squares that the user clicks will be displayed on the side bar. The colour of this square notation will be red or green depending upon the user selected the square correctly or incorrectly. I have found out that there’s a flex related css bug in attempts element. I will look into that tomorrow. Okay bie.. Hope you have a great day 💖"}, {"post_id": 32765, "ts": "2026-07-22T04:05:46Z", "hours": 4.1331, "text": "Started working on the vision page Changes Designed the vison page Created the vison page and worked on the sidebar ui I have changed the name from visualisation to a vision. I actually don’t know which one is better. I just changed because chess.com and chesskid.com had vision for practicing the squares on the board. Designing of the vision section was quite fun although I had some issues with auto layout that wasn’t big of a deal. I was thinking what options should I have and thought it would be best to add show coordinates, change the color and select the time. I think the UI turned out pretty great. I will probably change the colour of the chessboard but black and white also looks fine. Coding design wasn’t too difficult. It was just copying the design that I made, but the Figma design looks different. I should check out why the size of the buttons are the same but in Figma they look a lot bigger. It might be because the width of the sidebar is not the same. In conclusion, this was a peaceful devlog. It feels really nice not having to fight with your code and your designs. Hope that the future develops are the same 🤞. Until then peace✌️."}, {"post_id": 32156, "ts": "2026-07-21T03:52:34Z", "hours": 4.9689, "text": "We have followers Changes Designed hollow medals Switched from localStorage to db for storing updating and retrieving completed courses data Added feature to show medals achieved by user Designing the hollow medals (I don’t know what to call that so I’ll just say hollow medal) was really fun. I just started designing the medal for fun in Figma. The result turned out really great even better than what I had expected. I was using circles for the medal itself and was trying to use the rectangles for the below design. Later I figured that it would be wiser to use the pencil instead of creating a rectangle and mapping out the bottom portion of the medal which turned out to be a great idea. In this project, I have started using Figma for creation of some assets and I am loving it so far my intention is to keep on using Figma until and unless I really have to use AI. Switching from localStorage to database for completed courses data was easy in my head but it took me longer than expected mainly because of three reasons. Firstly, I was thinking of creating a separate backend endpoint for course data. After creating the controller and route for course data I thought that it isn’t really necessary to create another endpoint for this as we can store it in the users data itself. Secondly, after deleting the routes and controller, I created API function for fetching and updating the completed course data period I had forgotten that I don’t actually need to have a separate getCompleted function because while fetching the user itself, the data comes with it. I have forgotten to delete the getCompleted.js file which I will do later. Thirdly, I have started to use Postman for testing out api . I am loving to learn things such as Postman and Figma. But this issue I was facing was the postman was working correctly but from my codebase the request body was showing undefined. It was a fetch thing I use axios before and I am figuring out right now why people used axios. It seems that I needed to specify in the header that this request had the content of json. So figuring that out also took some time. Also, I have added the feature to show medals achieved by user. The code isn’t quite clean for this feature. Thanks to the people that followed this project. I genuinely appreciate that 💖. New followers : @PAPER_01 @sak"}, {"post_id": 31100, "ts": "2026-07-19T07:07:40Z", "hours": 3.5, "text": "When will my devlog get more than 7 views 😭 Changes: Added loading component Added scrollsmoother in home page Fixed course page padding and added toast while redirecting unauthenticated user Added back button to signup and login page Designed the logo for website Added the logo to the website Now whenever the frontend fetches user data from the backend there will be a loading component that will come up. I made the loading spinner myself in figma why not 😃. Scrolling the home page using a mouse is so much better now now due to scrollsmoother plugin of gsap. I was facing a issue with this though. I was seeing an error while navigating to other pages. After a while I found out a guy with same issue in gsap forum and his solution worked. God bless that guy 🙌. Some small changes were fixing the padding in course page , adding a toast while redirecting unauthenticated user from couse page and adding back button in singup and login page. I think they don’t need much explanation. I tried to design the logo of my website in figma. I tried different things and landed with a design that felt decent (The logo with king in the center). I look nice up close but it didn’t feel the same when shrunk down as a logo. So I started designing another one. I landed on the logo with cyan and dark purple background and !! symbol up front. I really don’t know how I feel about this logo. I looks decent sometimes and other times questionable. Please leave your opinion in the comments 🙏. While adding the icon as a favicon, for some reason the favicon wasn’t display which was confusing. Later I found out that this was a brave issue cuz it’s showing up in zen browser. Okay this much for now. Please like so that more people see this devlog 😭."}, {"post_id": 30508, "ts": "2026-07-18T04:21:03Z", "hours": 5.0097, "text": "Wth it’s been 5hrs?? Added toast for login signup and login as guest errors Made the signup data persist even after the value of hasContinued changes Designed the dropdown menu Added dropdown menu Added logout functionality First of all, I’m genuinly confused how this took me 5hrs.. Added toast so that now when there’s any error during the signup or login. For example during signup maybe a user might write a username less than two characters, then the toast pops up telling the user it should be greater than 2 characters. I was stuck during this cuz the trycatch block wasn’t catching the error which was confusing. I used axios previously and it threw an error if the backend response wasn’t ok. But this time I avoided using axios for reasons that you guys probably know 💀. It seems that fetch didn’t throw any error so I had to manually throw errors in the api functions. The making of signup data persist on hasContinued value change was early. I just set the value attribute of input to be it’s respective useState data. As you can see in the image that I designed the dropdown. I first designed the dark one which I really loved but it didn’t match the navbar so I created a light one. After seeing the dark one I really didn’t like the light one. So I tried fixing the design. I asked someone in the slack and they said the previous light dropdown design looked fine. Ig looking at the dropdown for long made it look fine to me as well 😂. Now I added the dropdown to the website. I had issue with the padding of the logout button during designing phase but I just winged it during coding phase and it worked 🎉. The dropdown now looks fine imo. I however did have a issue while making the dropdown closing work when user clicked outside of the dropdown. I thought of using an overlay in the background but I knew that there was a way of doing this by checking the click event. It seems I had forgetten to do this. After some trial and errors I remember how it was done.. I also added logout functionality which was fairly easy to add cuz I’m storing the jwt in the localStorage. I just removed the token for localStorage, set the user to null, set isDropdownOpen to false and navigated the user to the home page. Ig, i’ll try do things faster next time ⚡️. Don’t want to spend 5hrs on things like these. Okay biee…"}, {"post_id": 29446, "ts": "2026-07-16T12:12:04Z", "hours": 2.0422, "text": "Omg it’s finally fixed I finally fixed the bug that I addressed in my last devlog. This was so frustrating. I never expected that this would take me 2hrs and I would write a whole devlog on it 💔. The bug was that when I was logging in I was being redirected to /signup after signup, login or login as guest. I had made so that after signing up or logging in the user would be redirected to course page. I had also made it so that if the user value is null then the user would be redirected to the sign of page. So now you can see that where this is going. I just couldn’t simply figure out why the user value was null. After doing so much thinking and reading the code and trying to fix the bug, I have finally succeeded.Another issue that I was facing during the working was I was constantly forgetting what I was doing and to see everything visually I used excalidraw as you can see in the picture. So there were three things that was leading to this bug. Firstly, I wasn’t using the await keyword while calling the api functions. Secondly, I didn’t have a loading state while fetching the user’s data. Lastly, the function getUser function responsible for fetching the user data wasn’t even being called when redirected to course page. The function was only being called when the user first loaded the website. Right now, my head is aching now I think I should take some rest. I didn’t remember to add loading state which was so silly of me. I only realized that after visiting my old project. Seeing that I felt dumb because ofc you would need a loading state while fetching the user data from backend. I feel a little relieved now 😮💨. I cannot even remember properly all the things that I tried to solve this. It was just a mess 😩. After solving the bug, now looking back, it wasn’t that difficult to solve. It was just a me problem. I could write more on this but I’m too tired for this now. Okay biee..👋"}, {"post_id": 28787, "ts": "2026-07-15T09:05:35Z", "hours": 2.67, "text": "Life is frustrating 😩 ##Changes: Added navigation to /course after successful login Designed navbar when user is logged in Added the user button in navbar when user is logged in Added redirection to signup if user goes to /course without authentication Fixed jwt malformed error in protectRoute.js The navigation to /course after successful was implemented before but I somehow missed to implement that in login page. Designing the navbar for authenticated user was very challenging than I expected. As you can see in the image there are multiple attempts at creating the navbar. Everything I tried was just looking bad. The final design is also questionable. But for now it is what it is. Now unauthenticated user aren’t allowed to visit course page. They will be redirected to signup page if they try. This was supposed to be simple but somehow I made this also hard for myself. I have done this before so this should have been easy for me but nope. The redirecting was working fine but I were to be authenticated and be on course page and then reload, then also I would be redirected to the signup page. After I made up my own solution for this which I don’t think is the best way to do it. Due to my incapability of designing simple things and solving minor bugs I was questioning my ability to solve problems and design. Which at that moment felt sad 😔. Also there was jwt malformed error popping up in the backend which was also frustrating to solve. Not because it was hard but because it was easy and I wasn’t able to solve it. I won’t tell you what happened here as the devlog is getting long. No video this time cuz the I can’t show the navigation changes working as they aren’t working properly. The bug is preventing user from redirecting to /course after login or signup. Instead user is redirected to signup. I know that this because of the two redirection changes made in this devlog. So, I’ll go and fix it asap. Hope your coding experience isn’t going as frustrating as mine. Thank you for reading my frustrations. Bye…👋"}, {"post_id": 28126, "ts": "2026-07-14T06:43:34Z", "hours": 4.0444, "text": "I’m sorry 😭 ##Changes: Use localStorage to store jwt instead of cookies Fix signup page unequal width of img and form container Changed login.css similar to signup.css for consistent code Added login as guest functionality Added navigation to /course after signup or login success Added UserContext.jsx to handle user data Added protectRoute middleware to verify jwt Added “/api/user/“ endpoint to get user data from backend Too many changes, let’s break them down. I’m sorry that I switched to localStorage to store jwt instead of cookies 😭. The cookie wasn’t working as expected. I was able to store the jwt in the cookie and receive it in the frontend but when I reloaded the cookie would just disappear. I know that there’s a fix for this as I have done this before as well. But, I know that I’ll face the same issue during deployment even if I fix the issue now. I’ll probably deploy this in vercel and last time (in flavortown) I had to change the whole code format due to the cookie issue. So this time I’ll just rely on localStorage for now. If I deploy the website myself then maybe I’ll consider using the cookie. But for now just forgive me 🙏. I fixed the unequal width of img container and form container with again in signup page. This happened because I added padding to the form-container instead of the form. Using flex for this was a headache so I used grid and it worked. Although I didn’t necessarily needed to change the login page css. I did it to maintain a consistent codebase. This is a huge one. I added login as guest functionality. I know that people will be skeptical of entering their email even though they can use any made up email such as [email protected] . I purely added this feature so that people don’t rate me bad just because they assumed that they need their own email to signup. And logging in as guest is easier as well so why not. Now, after the signup, login or login as guest is successful then we’ll be redirected to the course page. Later I’ll make it so that users who aren’t logged in won’t be able to access any other path except for the “/“. Also now there’s userContext.jsx for storing and distributing user data. For now there’s getUser function for getting user’s data. I have made the backend work to verify the user’s token and then only provide the user with their data. Alright no more yapping, the devlog has gotten very long. If anyone has read this devlog, God bless them. ~ Peace ✌️."}, {"post_id": 27519, "ts": "2026-07-13T04:42:38Z", "hours": 4.9611, "text": "More progress on signup and login Changes: Designed the username form Created the username form in signup Changed useRef to useState to store signup data Adjusted the backend to receive and store username Add login functionality Fixed required attribute not working in both signup and login form Designing the username form wasn’t that hard as it’s just the signup page but will less things. I looked at how chess.com was doing things during signup and thought it’s better to split the email and password into one form and username form into another. There’s also a back button to go to the email and password form. Coding the username form was a little frustrating as I had some issue positioning the back button. Now it’s working but now I am facing the old issue of img-container and form container not being the same width. I’ll fix that next. Also the way username form is display is by just toggling a state into true or false in the singup page. After adding the username form there was an error telling that email and password was null. This was because while entering the username I wouldn’t be able to access the email and password input using the useRef hook. The fix was simple, I just changed the useRef into useState and store the data on input change. Now that was extra data (username) that needed to be stored. I sent the username along with email and password to the backend and changed the userSchema to accept username. I worked on the signup functionality last time so this time I worked on the login functionality. In short, now during login the backend verifies the email and password and gives the user a jsonwebtoken as a cookie or an error. I wanted the input to display “field is required” when user tries to login or signup without filling in the form. I just couldn’t get this working and it was so frustrating because the issue was so simple. Later I found out that I was using e.preventDefault on the button instead of the form causing the input to not show “field is required” Okay enough yapping. Gotta go and work on the project. Hope your project is going smoothly. Bie…👋"}, {"post_id": 26400, "ts": "2026-07-11T05:20:12Z", "hours": 5.6911, "text": "50 hours!! Let’s go 🎉 Changes Designed signup page and login page Created signup page and login page Divided the codebase into frontend and backend Setup backend Setup signup endpoint to receive formData Designing the signup and long page was really fun. I took some inspirations from pinterest. I’m proud of the design I made 😄. Turning the design into code was also fun ig. I did face a small bug. The image looked bigger than the form but both had flex-grow of one. The fix was simple I just had to change the flex-basis to 0 so I did flex: 1. Finally I’ve started on the backend. It’s been some time since I haven’t done backend stuff. Coming back to backend felt nice. Although it was frustrating when the data sent to backend was just saying it was undefined. But after some time I just figured out that I forgot add express.json() middleware in my server.js. I’m well now and feel that now I’ve no motive of slowing now. Hope you’re also doing well 🤞."}, {"post_id": 25132, "ts": "2026-07-09T04:37:06Z", "hours": 2.7414, "text": "Many small improvements Changes Made the opened cards remain open after finishing a lesson or going back from watch course Saved completed course data in localStorage Added confetti animation after clicking on finish lesson Fixed value of total in course.jsx by making it dynamic Fixed navbar animating when reloading on non home paths This time I have done many small changes but I think that they make a great impact on the website. ~ Firstly I made the card remain open while visiting other pages. I mainly did this as a part of user experience. I thought that it’s inconvenient for a user to see the card they opened being closed after they come back from the course watching page. ~ Also, now the data of completed course persists. It is stored in localStorage. I’ll definitely stored the data in database in the future. Also I was facing an annoying bug doing this because I forgot that I needed to stringify the data before storing in localStorage😭. ~ There’s now confetti animation after clicking finish lesson. I think it looks nice. I used a npm package for the animation. ~ Before the total course was a dummy value of 10. Instead of counting the courses manually I just did a sum of length of all courses data from constant.js. Now, when I change the professional course value I won’t have to think about changing the total value. ~ The navbar animation was meant to run only when user move from home page to other page and vise versa. But, when I was on the course page and if I reloaded the animation would still happen. Fixing this was really painful as the solution was really easy but I just couldn’t figure it out. At last I took the help of Claude to figure out the solution 😩. ~ I took two days off because I was sick again😭. Why is my immune system so weakkk😭.."}, {"post_id": 22223, "ts": "2026-07-04T16:15:12Z", "hours": 2.0581, "text": "Now the completed course has a green tick mark Basically now if you click on finish lesson you’ll be redirected back to the course page and the lesson you choose as completed will have a green tick mark inside the course card. ~ Also, if a lesson is completed the navbar won’t show the finish lesson button. ~ Right now, the data doesn’t persist across reloads. I will store the data in localStorage next and when I implement the backend, then only I’ll store the data in database. ~ The challenging part was seeing the whole picture. How will the feature work, where will the data live and how to know if a lesson is completed, things like that. ~ Also, during development I thought of using useContext hook but I had forgot how to use the hook while following best practices so I just went to my previous project to relearn stuff😅😆. ~ I decided to use pen and paper for problem solving and better visualization which worked really great for me 🎉🎉. I will definitely do this when I encounter problems in the future 😄. ~ Btw, No bullet points this time😅. I haven’t completed much as I’m sick. Hopefully I get well tomorrow🤞."}, {"post_id": 20676, "ts": "2026-07-02T10:26:56Z", "hours": 4.2492, "text": "I’m locked in Progress: Changed the dummy data from beginnerCourse and intermediateCourse in constants.js Created WatchCourse page Made courseCard open WatchCourse page with respective course video Made navbar show go back and finish lesson on button if the user is on WatchCourse page Designed a banner for the course page I changed the data of beginnerCourse and intermediateCourse in constants.js file which instantly made the cards inside both beginner and intermediate so much better. The professionalCourse data hasn’t changed and will be changed later. ~ After that I worked on one of the main feature of the website which is being able to watch the course. Now, if user clicks on a course that they want to watch, then will be redirected to WatchCourse page. I achieved by using the YouTube embed link and dynamic routing. ~ The navbar also changes in WatchCourse page as there will be go back and finish lesson button. The go back button currently works but I still have to work on the finish lesson button. ~ I took a break from coding after doing that and started working on the banner. I don’t really know how the banner should look so I just added a gradient, two chess pieces, some text and some chess analysis moves and called it a day. ~ Now I’ll go export that banner and add it to my website. If you have any recommendations please let me know. Biee.."}, {"post_id": 19060, "ts": "2026-06-30T07:56:09Z", "hours": 4.2233, "text": "Mostly designing and coding that design. Progress: Completed the info element Designed the course card inside the accordion Created the course card component Moved accordion, courseCard and progressBar component into components folder within the course page The course page is slowly but surely coming together. I think the info element looks really nice now that it’s complete. But yeah the list does contain dummy information. I will change them after I have selected the videos as my courses. ~ CourseCard component seems okay imo. The tick mark is supposed to indicate that the user hasn’t completed that course. After the individual course is completed it will go green. I have mixed feelings for the tick mark being there. The idea seems find but I’m really not sure about the design. ~ But anyways it was fun designing in figma. In the website have made the CourseCard with the ability of each card having different text and image but right now they are only a little different in different levels. ~ Idk how time passes so quickly. Got only this much done in 4hrs😕 but I think I am now starting to enjoy the process. I am not focused on the time so heavily as I was before 😇. ~ Okay this time I have decided to keep my devlog shorter. Any opinions will be appreciated ❤️."}, {"post_id": 18099, "ts": "2026-06-29T03:11:34Z", "hours": 5.4111, "text": "Ayy new devlog let’s go!! Updates: Designed the info part (the portion with the progress bar) Created working accordion component with animations Started working on the info part Created working progress bar component with animation I like the design of the info element. I have tried using hierarchy to make the design look good. Also I randomly had the idea of earned badges after the user completes the whole course of a certain difficulty. Then, I hoped onto coding the accordion. Firstly I wasn’t making accordion as a component. There were just three div in the course page and I realized that if I don’t make it a component the code is going to look messy so I created the accordion component and now the code looks much cleaner. While making that I stumbled across a funny bug. Clicking on one accordion component was making all component to open. It was because of gsap selecting all the similar classes and animating them. I fixed that by using useRef to select elements. I have also created a progress bar and now I’m working on completing the info element. The progress bar looks good if it’s even a little bit full but idk how I feel about the progress bar when it’s at 0%. It feels bland and idk what to do. Okay enough rambling. I feel my devlogs should be shorter ig. Anyways if you have any suggestions please let me know. Peace ✌️Ayy new devlog let’s go!!"}, {"post_id": 16777, "ts": "2026-06-27T07:43:36Z", "hours": 3.9072, "text": "Updates Added RootLayout.jsx for reusing a single a navbar across all pages Changed react-router-dom to react-router Added expanding animation to the navbar when the path is “/” and shrinking animation on other paths except “/” Designed the course part in course page What I wanted Before I added the navbar inside home page but after creating the course page I realized that I would want the navbar to be reusable across all pages. Also I wanted the navbar to expand in other pages expect the home page. Switch to react-router I was using react-router-dom for managing routes. I tried to look up the docs to make the navbar reusable. I couldn’t find anything and saw that react-router-dom just used react-router so I thought it’s was not necessary for me to use react-router-dom so I just switch to react-router. Navbar animation issue Animating navbar to expand and shrink was a mess. It’s look really simple and it is simple but not for my brain. I first thought of making the width to 100% and set align items to center. The width part animated as expected but the align items didn’t. Then I thought of using position absolute and centering the nav but now the navbar wasn’t respecting the nav-container’s padding. It was frustrating so I took help of claude and centered it using y property by doing some maths. Time flies I also had issue with the timeline reverse not working but I think I should stop my complains here. I am rambling here because it took too long to do too little 😭 . Designing the course page On the positive side the I have started working on the design of course page. I have only done a small part but it’s looking amazing. The part other part that don’t look right were the design which I made during the start of the project. Rn I am just refining that previous design of mine, that’s why the navbar looks different in figma. Hope you have a nice day ❤️"}, {"post_id": 16064, "ts": "2026-06-26T03:14:51Z", "hours": 4.9211, "text": "Visualization section transformation Separated visualization section into text wrapper and body wrapper Added a text with reveal animation in text wrapper Added visualizedMoves with animation around the img-container Deleted the thought component Finally I get to post a devlog with some good. It’s a better time cuz I’m logging both the figma and the coding time for the first time. Previous design I didn’t really like the previous design so I thought for a while and came up with this design. Although it isn’t perfect it’s much better than the last one. The figma design and the website don’t look the same because I just did the design roughly in figma and then winged the chess moves position in vscode. I think removing the background of the chess moves was a great decision. New design Firstly I designed the concept in figma before coding. I added a text wrapper within the visualization to break the flow of the website. The previous design which I was going towards started feeling like a generic website (a bad one). Now the there’s text with a reveal animation which looks pretty simple tbh but I think it’s better. I might change that in future though or add elements to make it look fuller. The after the text animation the person visualizing image appears and different moves appear indicating that the person is thinking the moves. I was going to use a thought component for this but I did it in a more simpler manner. Time I always underestimate the time required to build things. I feel that I should have completed more in the time that has been recorded but small bugs happen while coding which is really frustrating. In this devlog also I feel I should have completed more. Am I just slow or happens to others as well. I really would like to know (comment)."}, {"post_id": 14231, "ts": "2026-06-23T07:41:29Z", "hours": 1.8261, "text": "Hey, this devlog is a messy one. Changes: Created visualization section Created thought component Designing the visualization section Connected figma to hackatime I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. Why this devlog is messy/incomplete The main purpose of this devlog is to figure out where I am currently in my project . I haven’t worked on my project like I used to because of my illness. So, instead of working on the project and forgetting what i did I just decided to commit the changes in my vscode write this devlog. I am hoping to work on this project as before as I am feeling better now. So that’s why the images below seem incomplete. Hope you guys are doing well. Btw the figma ss and the website image don’t match cuz i decided to change the figma design just before writing this devlog. I wasn’t happy with the previous design so i’m just tweking it to see where i land."}, {"post_id": 9977, "ts": "2026-06-16T14:48:46Z", "hours": 2.8114, "text": "Changes: Split home.jsx into smaller components Installed and applied different font weights Made navbar better Completed puzzle section on a basic level This time instead of jumping on doing something new I started with making the code cleaner first. It was easy as nothing broke. Then, I realized the font in the hero section doesn’t look as bold as in my figma design so after looking into the problem for a while I realized I had just the regular font weight of font downloaded leading to fonts looking different. Also made navbar better by decreasing horizontal padding in the button and adding a box shadow. Adding the box shadow made the navbar visible in the courses section. I also completed puzzle section which is looking good but I want to animate the image (Yoinked from chess.com btw 😅). The animation will bring so much life into the section but I really don’t know achieve that. If you can help me or have any suggestion in general please let me know. That’s all for this time folks. Piece ✌️ (It’s a pun btw)"}, {"post_id": 9132, "ts": "2026-06-15T08:50:45Z", "hours": 3.4731, "text": "Ayy new devlog!! Changes: Corrected timing of animations in courses section Added level indicator of thumbnail Added temporary images in each thumbnail. Added animation to course title Made animation on work reverse as well I’ve shifted on my macbook for coding which I’ve received from flavortown. Anyways, the courses section looks much better now. I am still not satisfied with the animation of courses info elements. I spend way to long to make that work but in the end I took help of gemini to make it work. Also, timing looks way better than last time. Now, I’m going to split the home page into smaller components to make the code cleaner. Also I’ve to do something of the navbar. Any suggestion will be appreciated."}, {"post_id": 7841, "ts": "2026-06-13T02:27:10Z", "hours": 2.3547, "text": "Changes: Added shrinking animation in hero section Moved courses text to a constants file Added thumbnails in the courses section with animation The courses section animation doesn’t look the way I want it to be. I’ll be fixing that.. Also things are taking more time than expected which is really frustrating. I thought this will take me about an hour but it’s still not finished. I’ll surely finish courses section today. Hope your project is going smoothly."}, {"post_id": 6073, "ts": "2026-06-10T06:20:34Z", "hours": 2.8981, "text": "Changes: Added text reveal animation Ahhhh it took three hours only to create this text revealing animation. I stumbled across many css and gsap bugs to make this. I first tried to use the ::before pseudo element which worked really well but later replaced it with span cuz i couldn’t figure out how to animate that with gsap. There are many other things that really annoyed me but lets not make this devlog a whole essay. But I love how it turned out in the end."}, {"post_id": 4195, "ts": "2026-06-07T12:47:02Z", "hours": 2.2108, "text": "Changes: Fixed the page stacking animation Changed the layout of hero section. Made navbar position fixed I was trying to make the navbar sticky which wasn’t working at first and was so annoying, after solving that I found out that it won’t go outside hero section. I was frustrated that I was messing up something so easy. Also it seems that I was doing the stacking animation the wrong way so I fixed that also. So now I have a clean stacking page animation and a navbar that stays at a fixed position."}, {"post_id": 2749, "ts": "2026-06-05T14:52:59Z", "hours": 0.9686, "text": "Created courses-section with page stacking animation. It took me an hour to figure this out 😭. I knew that I have to pin the hero-section but couldn’t figure out how to move the courses-section to overlap the hero-section. I watched different videos and even went to some random guy linked in account to find out the answer. But eventually I just figured it out myself. I still have to check if the way I have accomplished it is the correct way or not."}, {"post_id": 2615, "ts": "2026-06-05T07:31:04Z", "hours": 1.5622, "text": "Just worked on adding the animations to the home page. Also I downloaded the font instead of using google fonts cuz it was taking some time to load every time I reloaded the website. The animation of the hero text was a little tricky as it wasn’t working at first but then I found out the culprit was span. I change the span to inline-block and then the animation worked as expected. I have also made the let’s go nav button same as the cta button for consistency. You won’t be able to see the animations sadly cuz I’m attaching a screenshot here."}, {"post_id": 1995, "ts": "2026-06-04T08:13:05Z", "hours": 3.4961, "text": "First devlog I have worked on the hero section. I think it looks pretty good. I have some improvements to do on the nav bar. Also, I have to crop out the hero image. The image is taking alot of space rn. Now I’ll devlog after the hero section is complete and then will start on animating the hero section. Hope you’re project is also going well."}]...
|
Title: Evochess by @Sam | Stardance
Devlogs:
Firs Title: Evochess by @Sam | Stardance
Devlogs:
First devlog I have worked on the hero section. I think it looks pretty good. I have some improvements to do on the nav bar. Also, I have to crop out the hero image. The image is taking alot of space rn. Now I’ll devlog after the hero section is complete and then will start on animating the hero section. Hope you’re project is also going well.
Just worked on adding the animations to the home page. Also I downloaded the font instead of using google fonts cuz it was taking some time to load every time I reloaded the website. The animation of the hero text was a little tricky as it wasn’t working at first but then I found out the culprit was span. I change the span to inline-block and then the animation worked as expected. I have also made the let’s go nav button same as the cta button for consistency. You won’t be able to see the animations sadly cuz I’m attaching a screenshot here.
Created courses-section with page stacking animation. It took me an hour to figure this out 😭. I knew that I have to pin the hero-section but couldn’t figure out how to move the courses-section to overlap the hero-section. I watched different videos and even went to some random guy linked in account to find out the answer. But eventually I just figured it out myself. I still have to check if the way I have accomplished it is the correct way or not.
Changes: Fixed the page stacking animation Changed the layout of hero section. Made navbar position fixed I was trying to make the navbar sticky which wasn’t working at first and was so annoying, after solving that I found out that it won’t go outside hero section. I was frustrated that I was messing up something so easy. Also it seems that I was doing the stacking animation the wrong way so I fixed that also. So now I have a clean stacking page animation and a navbar that stays at a fixed position.
Changes: Added text reveal animation Ahhhh it took three hours only to create this text revealing animation. I stumbled across many css and gsap bugs to make this. I first tried to use the ::before pseudo element which worked really well but later replaced it with span cuz i couldn’t figure out how to animate that with gsap. There are many other things that really annoyed me but lets not make this devlog a whole essay. But I love how it turned out in the end.
Changes: Added shrinking animation in hero section Moved courses text to a constants file Added thumbnails in the courses section with animation The courses section animation doesn’t look the way I want it to be. I’ll be fixing that.. Also things are taking more time than expected which is really frustrating. I thought this will take me about an hour but it’s still not finished. I’ll surely finish courses section today. Hope your project is going smoothly.
Ayy new devlog!! Changes: Corrected timing of animations in courses section Added level indicator of thumbnail Added temporary images in each thumbnail. Added animation to course title Made animation on work reverse as well I’ve shifted on my macbook for coding which I’ve received from flavortown. Anyways, the courses section looks much better now. I am still not satisfied with the animation of courses info elements. I spend way to long to make that work but in the end I took help of gemini to make it work. Also, timing looks way better than last time. Now, I’m going to split the home page into smaller components to make the code cleaner. Also I’ve to do something of the navbar. Any suggestion will be appreciated.
Changes: Split home.jsx into smaller components Installed and applied different font weights Made navbar better Completed puzzle section on a basic level This time instead of jumping on doing something new I started with making the code cleaner first. It was easy as nothing broke. Then, I realized the font in the hero section doesn’t look as bold as in my figma design so after looking into the problem for a while I realized I had just the regular font weight of font downloaded leading to fonts looking different. Also made navbar better by decreasing horizontal padding in the button and adding a box shadow. Adding the box shadow made the navbar visible in the courses section. I also completed puzzle section which is looking good but I want to animate the image (Yoinked from chess.com btw 😅). The animation will bring so much life into the section but I really don’t know achieve that. If you can help me or have any suggestion in general please let me know. That’s all for this time folks. Piece ✌️ (It’s a pun btw)
Hey, this devlog is a messy one. Changes: Created visualization section Created thought component Designing the visualization section Connected figma to hackatime I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. Why this devlog is messy/incomplete The main purpose of this devlog is to figure out where I am currently in my project . I haven’t worked on my project like I used to because of my illness. So, instead of working on the project and forgetting what i did I just decided to commit the changes in my vscode write this devlog. I am hoping to work on this project as before as I am feeling better now. So that’s why the images below seem incomplete. Hope you guys are doing well. Btw the figma ss and the website image don’t match cuz i decided to change the figma design just before writing this devlog. I wasn’t happy with the previous design so i’m just tweking it to see where i land.
Visualization section transformation Separated visualization section into text wrapper and body wrapper Added a text with reveal animation in text wrapper Added visualizedMoves with animation around the img-container Deleted the thought component Finally I get to post a devlog with some good. It’s a better time cuz I’m logging both the figma and the coding time for the first time. Previous design I didn’t really like the previous design so I thought for a while and came up with this design. Although it isn’t perfect it’s much better than the last one. The figma design and the website don’t look the same because I just did the design roughly in figma and then winged the chess moves position in vscode. I think removing the background of the chess moves was a great decision. New design Firstly I designed the concept in figma before coding. I added a text wrapper within the visualization to break the flow of the website. The previous design which I was going towards started feeling like a generic website (a bad one). Now the there’s text with a reveal animation which looks pretty simple tbh but I think it’s better. I might change that in future though or add elements to make it look fuller. The after the text animation the person visualizing image appears and different moves appear indicating that the person is thinking the moves. I was going to use a thought component for this but I did it in a more simpler manner. Time I always underestimate the time required to build things. I feel that I should have completed more in the time that has been recorded but small bugs happen while coding which is really frustrating. In this devlog also I feel I should have completed more. Am I just slow or happens to others as well. I really would like to know (comment).
Updates Added RootLayout.jsx for reusing a single a navbar across all pages Changed react-router-dom to react-router Added expanding animation to the navbar when the path is “/” and shrinking animation on other paths except “/” Designed the course part in course page What I wanted Before I added the navbar inside home page but after creating the course page I realized that I would want the navbar to be reusable across all pages. Also I wanted the navbar to expand in other pages expect the home page. Switch to react-router I was using react-router-dom for managing routes. I tried to look up the docs to make the navbar reusable. I couldn’t find anything and saw that react-router-dom just used react-router so I thought it’s was not necessary for me to use react-router-dom so I just switch to react-router. Navbar animation issue Animating navbar to expand and shrink was a mess. It’s look really simple and it is simple but not for my brain. I first thought of making the width to 100% and set align items to center. The width part animated as expected but the align items didn’t. Then I thought of using position absolute and centering the nav but now the navbar wasn’t respecting the nav-container’s padding. It was frustrating so I took help of claude and centered it using y property by doing some maths. Time flies I also had issue with the timeline reverse not working but I think I should stop my complains here. I am rambling here because it took too long to do too little 😭 . Designing the course page On the positive side the I have started working on the design of course page. I have only done a small part but it’s looking amazing. The part other part that don’t look right were the design which I made during the start of the project. Rn I am just refining that previous design of mine, that’s why the navbar looks different in figma. Hope you have a nice day ❤️
Ayy new devlog let’s go!! Updates: Designed the info part (the portion with the progress bar) Created working accordion component with animations Started working on the info part Created working progress bar component with animation I like the design of the info element. I have tried using hierarchy to make the design look good. Also I randomly had the idea of earned badges after the user completes the whole course of a certain difficulty. Then, I hoped onto coding the accordion. Firstly I wasn’t making accordion as a component. There were just three div in the course page and I realized that if I don’t make it a component the code is going to look messy so I created the accordion component and now the code looks much cleaner. While making that I stumbled across a funny bug. Clicking on one accordion component was making all component to open. It was because of gsap selecting all the similar classes and animating them. I fixed that by using useRef to select elements. I have also created a progress bar and now I’m working on completing the info element. The progress bar looks good if it’s even a little bit full but idk how I feel about the progress bar when it’s at 0%. It feels bland and idk what to do. Okay enough rambling. I feel my devlogs should be shorter ig. Anyways if you have any suggestions please let me know. Peace ✌️Ayy new devlog let’s go!!
Mostly designing and coding that design. Progress: Completed the info element Designed the course card inside the accordion Created the course card component Moved accordion, courseCard and progressBar component into components folder within the course page The course page is slowly but surely coming together. I think the info element looks really nice now that it’s complete. But yeah the list does contain dummy information. I will change them after I have selected the videos as my courses. ~ CourseCard component seems okay imo. The tick mark is supposed to indicate that the user hasn’t completed that course. After the individual course is completed it will go green. I have mixed feelings for the tick mark being there. The idea seems find but I’m really not sure about the design. ~ But anyways it was fun designing in figma. In the website have made the CourseCard with the ability of each card having different text and image but right now they are only a little different in different levels. ~ Idk how time passes so quickly. Got only this much done in 4hrs😕 but I think I am now starting to enjoy the process. I am not focused on the time so heavily as I was before 😇. ~ Okay this time I have decided to keep my devlog shorter. Any opinions will be appreciated ❤️.
I’m locked in Progress: Changed the dummy data from beginnerCourse and intermediateCourse in constants.js Created WatchCourse page Made courseCard open WatchCourse page with respective course video Made navbar show go back and finish lesson on button if the user is on WatchCourse page Designed a banner for the course page I changed the data of beginnerCourse and intermediateCourse in constants.js file which instantly made the cards inside both beginner and intermediate so much better. The professionalCourse data hasn’t changed and will be changed later. ~ After that I worked on one of the main feature of the website which is being able to watch the course. Now, if user clicks on a course that they want to watch, then will be redirected to WatchCourse page. I achieved by using the YouTube embed link and dynamic routing. ~ The navbar also changes in WatchCourse page as there will be go back and finish lesson button. The go back button currently works but I still have to work on the finish lesson button. ~ I took a break from coding after doing that and started working on the banner. I don’t really know how the banner should look so I just added a gradient, two chess pieces, some text and some chess analysis moves and called it a day. ~ Now I’ll go export that banner and add it to my website. If you have any recommendations please let me know. Biee..
Now the completed course has a green tick mark Basically now if you click on finish lesson you’ll be redirected back to the course page and the lesson you choose as completed will have a green tick mark inside the course card. ~ Also, if a lesson is completed the navbar won’t show the finish lesson button. ~ Right now, the data doesn’t persist across reloads. I will store the data in localStorage next and when I implement the backend, then only I’ll store the data in database. ~ The challenging part was seeing the whole picture. How will the feature work, where will the data live and how to know if a lesson is completed, things like that. ~ Also, during development I thought of using useContext hook but I had forgot how to use the hook while following best practices so I just went to my previous project to relearn stuff😅😆. ~ I decided to use pen and paper for problem solving and better visualization which worked really great for me 🎉🎉. I will definitely do this when I encounter problems in the future 😄. ~ Btw, No bullet points this time😅. I haven’t completed much as I’m sick. Hopefully I get well tomorrow🤞.
Many small improvements Changes Made the opened cards remain open after finishing a lesson or going back from watch course Saved completed course data in localStorage Added confetti animation after clicking on finish lesson Fixed value of total in course.jsx by making it dynamic Fixed navbar animating when reloading on non home paths This time I have done many small changes but I think that they make a great impact on the website. ~ Firstly I made the card remain open while visiting other pages. I mainly did this as a part of user experience. I thought that it’s inconvenient for a user to see the card they opened being closed after they come back from the course watching page. ~ Also, now the data of completed course persists. It is stored in localStorage. I’ll definitely stored the data in database in the future. Also I was facing an annoying bug doing this because I forgot that I needed to stringify the data before storing in localStorage😭. ~ There’s now confetti animation after clicking finish lesson. I think it looks nice. I used a npm package for the animation. ~ Before the total course was a dummy value of 10. Instead of counting the courses manually I just did a sum of length of all courses data from constant.js. Now, when I change the professional course value I won’t have to think about changing the total value. ~ The navbar animation was meant to run only when user move from home page to other page and vise versa. But, when I was on the course page and if I reloaded the animation would still happen. Fixing this was really painful as the solution was really easy but I just couldn’t figure it out. At last I took the help of Claude to figure out the solution 😩. ~ I took two days off because I was sick again😭. Why is my immune system so weakkk😭..
50 hours!! Let’s go 🎉 Changes Designed signup page and login page Created signup page and login page Divided the codebase into frontend and backend Setup backend Setup signup endpoint to receive formData Designing the signup and long page was really fun. I took some inspirations from pinterest. I’m proud of the design I made 😄. Turning the design into code was also fun ig. I did face a small bug. The image looked bigger than the form but both had flex-grow of one. The fix was simple I just had to change the flex-basis to 0 so I did flex: 1. Finally I’ve started on the backend. It’s been some time since I haven’t done backend stuff. Coming back to backend felt nice. Although it was frustrating when the data sent to backend was just saying it was undefined. But after some time I just figured out that I forgot add express.json() middleware in my server.js. I’m well now and feel that now I’ve no motive of slowing now. Hope you’re also doing well 🤞.
More progress on signup and login Changes: Designed the username form Created the username form in signup Changed useRef to useState to store signup data Adjusted the backend to receive and store username Add login functionality Fixed required attribute not working in both signup and login form Designing the username form wasn’t that hard as it’s just the signup page but will less things. I looked at how chess.com was doing things during signup and thought it’s better to split the email and password into one form and username form into another. There’s also a back button to go to the email and password form. Coding the username form was a little frustrating as I had some issue positioning the back button. Now it’s working but now I am facing the old issue of img-container and form container not being the same width. I’ll fix that next. Also the way username form is display is by just toggling a state into true or false in the singup page. After adding the username form there was an error telling that email and password was null. This was because while entering the username I wouldn’t be able to access the email and password input using the useRef hook. The fix was simple, I just changed the useRef into useState and store the data on input change. Now that was extra data (username) that needed to be stored. I sent the username along with email and password to the backend and changed the userSchema to accept username. I worked on the signup functionality last time so this time I worked on the login functionality. In short, now during login the backend verifies the email and password and gives the user a jsonwebtoken as a cookie or an error. I wanted the input to display “field is required” when user tries to login or signup without filling in the form. I just couldn’t get this working and it was so frustrating because the issue was so simple. Later I found out that I was using e.preventDefault on the button instead of the form causing the input to not show “field is required” Okay enough yapping. Gotta go and work on the project. Hope your project is going smoothly. Bie…👋
I’m sorry 😭 ##Changes: Use localStorage to store jwt instead of cookies Fix signup page unequal width of img and form container Changed login.css similar to signup.css for consistent code Added login as guest functionality Added navigation to /course after signup or login success Added UserContext.jsx to handle user data Added protectRoute middleware to verify jwt Added “/api/user/“ endpoint to get user data from backend Too many changes, let’s break them down. I’m sorry that I switched to localStorage to store jwt instead of cookies 😭. The cookie wasn’t working as expected. I was able to store the jwt in the cookie and receive it in the frontend but when I reloaded the cookie would just disappear. I know that there’s a fix for this as I have done this before as well. But, I know that I’ll face the same issue during deployment even if I fix the issue now. I’ll probably deploy this in vercel and last time (in flavortown) I had to change the whole code format due to the cookie issue. So this time I’ll just rely on localStorage for now. If I deploy the website myself then maybe I’ll consider using the cookie. But for now just forgive me 🙏. I fixed the unequal width of img container and form container with again in signup page. This happened because I added padding to the form-container instead of the form. Using flex for this was a headache so I used grid and it worked. Although I didn’t necessarily needed to change the login page css. I did it to maintain a consistent codebase. This is a huge one. I added login as guest functionality. I know that people will be skeptical of entering their email even though they can use any made up email such as [email protected] . I purely added this feature so that people don’t rate me bad just because they assumed that they need their own email to signup. And logging in as guest is easier as well so why not. Now, after the signup, login or login as guest is successful then we’ll be redirected to the course page. Later I’ll make it so that users who aren’t logged in won’t be able to access any other path except for the “/“. Also now there’s userContext.jsx for storing and distributing user data. For now there’s getUser function for getting user’s data. I have made the backend work to verify the user’s token and then only provide the user with their data. Alright no more yapping, the devlog has gotten very long. If anyone has read this devlog, God bless them. ~ Peace ✌️.
Life is frustrating 😩 ##Changes: Added navigation to /course after successful login Designed navbar when user is logged in Added the user button in navbar when user is logged in Added redirection to signup if user goes to /course without authentication Fixed jwt malformed error in protectRoute.js The navigation to /course after successful was implemented before but I somehow missed to implement that in login page. Designing the navbar for authenticated user was very challenging than I expected. As you can see in the image there are multiple attempts at creating the navbar. Everything I tried was just looking bad. The final design is also questionable. But for now it is what it is. Now unauthenticated user aren’t allowed to visit course page. They will be redirected to signup page if they try. This was supposed to be simple but somehow I made this also hard for myself. I have done this before so this should have been easy for me but nope. The redirecting was working fine but I were to be authenticated and be on course page and then reload, then also I would be redirected to the signup page. After I made up my own solution for this which I don’t think is the best way to do it. Due to my incapability of designing simple things and solving minor bugs I was questioning my ability to solve problems and design. Which at that moment felt sad 😔. Also there was jwt malformed error popping up in the backend which was also frustrating to solve. Not because it was hard but because it was easy and I wasn’t able to solve it. I won’t tell you what happened here as the devlog is getting long. No video this time cuz the I can’t show the navigation changes working as they aren’t working properly. The bug is preventing user from redirecting to /course after login or signup. Instead user is redirected to signup. I know that this because of the two redirection changes made in this devlog. So, I’ll go and fix it asap. Hope your coding experience isn’t going as frustrating as mine. Thank you for reading my frustrations. Bye…👋
Omg it’s finally fixed I finally fixed the bug that I addressed in my last devlog. This was so frustrating. I never expected that this would take me 2hrs and I would write a whole devlog on it 💔. The bug was that when I was logging in I was being redirected to /signup after signup, login or login as guest. I had made so that after signing up or logging in the user would be redirected to course page. I had also made it so that if the user value is null then the user would be redirected to the sign of page. So now you can see that where this is going. I just couldn’t simply figure out why the user value was null. After doing so much thinking and reading the code and trying to fix the bug, I have finally succeeded.Another issue that I was facing during the working was I was constantly forgetting what I was doing and to see everything visually I used excalidraw as you can see in the picture. So there were three things that was leading to this bug. Firstly, I wasn’t using the await keyword while calling the api functions. Secondly, I didn’t have a loading state while fetching the user’s data. Lastly, the function getUser function responsible for fetching the user data wasn’t even being called when redirected to course page. The function was only being called when the user first loaded the website. Right now, my head is aching now I think I should take some rest. I didn’t remember to add loading state which was so silly of me. I only realized that after visiting my old project. Seeing that I felt dumb because ofc you would need a loading state while fetching the user data from backend. I feel a little relieved now 😮💨. I cannot even remember properly all the things that I tried to solve this. It was just a mess 😩. After solving the bug, now looking back, it wasn’t that difficult to solve. It was just a me problem. I could write more on this but I’m too tired for this now. Okay biee..👋
Wth it’s been 5hrs?? Added toast for login signup and login as guest errors Made the signup data persist even after the value of hasContinued changes Designed the dropdown menu Added dropdown menu Added logout functionality First of all, I’m genuinly confused how this took me 5hrs.. Added toast so that now when there’s any error during the signup or login. For example during signup maybe a user might write a username less than two characters, then the toast pops up telling the user it should be greater than 2 characters. I was stuck during this cuz the trycatch block wasn’t catching the error which was confusing. I used axios previously and it threw an error if the backend response wasn’t ok. But this time I avoided using axios for reasons that you guys probably know 💀. It seems that fetch didn’t throw any error so I had to manually throw errors in the api functions. The making of signup data persist on hasContinued value change was early. I just set the value attribute of input to be it’s respective useState data. As you can see in the image that I designed the dropdown. I first designed the dark one which I really loved but it didn’t match the navbar so I created a light one. After seeing the dark one I really didn’t like the light one. So I tried fixing the design. I asked someone in the slack and they said the previous light dropdown design looked fine. Ig looking at the dropdown for long made it look fine to me as well 😂. Now I added the dropdown to the website. I had issue with the padding of the logout button during designing phase but I just winged it during coding phase and it worked 🎉. The dropdown now looks fine imo. I however did have a issue while making the dropdown closing work when user clicked outside of the dropdown. I thought of using an overlay in the background but I knew that there was a way of doing this by checking the click event. It seems I had forgetten to do this. After some trial and errors I remember how it was done.. I also added logout functionality which was fairly easy to add cuz I’m storing the jwt in the localStorage. I just removed the token for localStorage, set the user to null, set isDropdownOpen to false and navigated the user to the home page. Ig, i’ll try do things faster next time ⚡️. Don’t want to spend 5hrs on things like these. Okay biee…
When will my devlog get more than 7 views 😭 Changes: Added loading component Added scrollsmoother in home page Fixed course page padding and added toast while redirecting unauthenticated user Added back button to signup and login page Designed the logo for website Added the logo to the website Now whenever the frontend fetches user data from the backend there will be a loading component that will come up. I made the loading spinner myself in figma why not 😃. Scrolling the home page using a mouse is so much better now now due to scrollsmoother plugin of gsap. I was facing a issue with this though. I was seeing an error while navigating to other pages. After a while I found out a guy with same issue in gsap forum and his solution worked. God bless that guy 🙌. Some small changes were fixing the padding in course page , adding a toast while redirecting unauthenticated user from couse page and adding back button in singup and login page. I think they don’t need much explanation. I tried to design the logo of my website in figma. I tried different things and landed with a design that felt decent (The logo with king in the center). I look nice up close but it didn’t feel the same when shrunk down as a logo. So I started designing another one. I landed on the logo with cyan and dark purple background and !! symbol up front. I really don’t know how I feel about this logo. I looks decent sometimes and other times questionable. Please leave your opinion in the comments 🙏. While adding the icon as a favicon, for some reason the favicon wasn’t display which was confusing. Later I found out that this was a brave issue cuz it’s showing up in zen browser. Okay this much for now. Please like so that more people see this devlog 😭.
We have followers Changes Designed hollow medals Switched from localStorage to db for storing updating and retrieving completed courses data Added feature to show medals achieved by user Designing the hollow medals (I don’t know what to call that so I’ll just say hollow medal) was really fun. I just started designing the medal for fun in Figma. The result turned out really great even better than what I had expected. I was using circles for the medal itself and was trying to use the rectangles for the below design. Later I figured that it would be wiser to use the pencil instead of creating a rectangle and mapping out the bottom portion of the medal which turned out to be a great idea. In this project, I have started using Figma for creation of some assets and I am loving it so far my intention is to keep on using Figma until and unless I really have to use AI. Switching from localStorage to database for completed courses data was easy in my head but it took me longer than expected mainly because of three reasons. Firstly, I was thinking of creating a separate backend endpoint for course data. After creating the controller and route for course data I thought that it isn’t really necessary to create another endpoint for this as we can store it in the users data itself. Secondly, after deleting the routes and controller, I created API function for fetching and updating the completed course data period I had forgotten that I don’t actually need to have a separate getCompleted function because while fetching the user itself, the data comes with it. I have forgotten to delete the getCompleted.js file which I will do later. Thirdly, I have started to use Postman for testing out api . I am loving to learn things such as Postman and Figma. But this issue I was facing was the postman was working correctly but from my codebase the request body was showing undefined. It was a fetch thing I use axios before and I am figuring out right now why people used axios. It seems that I needed to specify in the header that this request had the content of json. So figuring that out also took some time. Also, I have added the feature to show medals achieved by user. The code isn’t quite clean for this feature. Thanks to the people that followed this project. I genuinely appreciate that 💖. New followers : @PAPER_01 @sak
Started working on the vision page Changes Designed the vison page Created the vison page and worked on the sidebar ui I have changed the name from visualisation to a vision. I actually don’t know which one is better. I just changed because chess.com and chesskid.com had vision for practicing the squares on the board. Designing of the vision section was quite fun although I had some issues with auto layout that wasn’t big of a deal. I was thinking what options should I have and thought it would be best to add show coordinates, change the color and select the time. I think the UI turned out pretty great. I will probably change the colour of the chessboard but black and white also looks fine. Coding design wasn’t too difficult. It was just copying the design that I made, but the Figma design looks different. I should check out why the size of the buttons are the same but in Figma they look a lot bigger. It might be because the width of the sidebar is not the same. In conclusion, this was a peaceful devlog. It feels really nice not having to fight with your code and your designs. Hope that the future develops are the same 🤞. Until then peace✌️.
Things are going great Changes: Added chessboard component with ranks and colored squares Added function for generating random squares and displayed them Added feature to display green and req squares to indicate whether the user clicked correctly or incorrectly in the chessboard Displayed attempt made by user in the sidebar with respective colors for correct and incorrect ones I thought doing all of these took me at least four hours but I was wrong. It seems that it’s only been about like three hours. This time I have worked on the chessboard itself on the vision page. Before it was just a plain whiteboard but now there are individual squares which was pretty easy to implement. I however needed some time to figure out how to add colours to the squares. But it also wasn’t that difficult. Then I created a function for generating random squares with the help of math.random(). I created an absolute element to display the random squares at the centre of the chessboard. To indicate the user that the square they have clicked is correct or incorrect I played the small animation that changed the colour of the user clicked square into red or green depending upon whether the user input was correct or incorrect. I was stuck here because I didn’t know how to reverse the animation. Of course I could just change the colour to green and then the colour of the square but that didn’t look quite right as I am probably going to change the chessboard colour later. So I wanted the animation to be flexible I was trying to play and reverse a animation timeline but it was so much easier than that later. I just remember there was the repeat and yo-yo property that will easily accomplish this effect I’m looking for. I have found a new bug with this if I spam click a square the square permanently turns into either red or green so definitely I will fix that in the next devlog. Also now the squares that the user clicks will be displayed on the side bar. The colour of this square notation will be red or green depending upon the user selected the square correctly or incorrectly. I have found out that there’s a flex related css bug in attempts element. I will look into that tomorrow. Okay bie.. Hope you have a great day 💖
Ayy almost 5 hrs today !! Changes: Fixed attempt square and attempts not wrapping as expected Fixed color being stuck in chessboard when same square is clicked rapidly Added color menu popup when click color button in sidebar Added time menu popup when user clicks time button in sidebar Added Progress component in sidebar with working score Made timer in progress.jsx functional Fixing the user attempts in the was pretty easy. I just added a attempts container to wrap the attempts element and then the CSS work as expected. Fixing the red or green colour being stuck in chessboard when clicked rapidly was a headache to fix. I was trying my best and at last I came up to the decision that I needed a timeline for the animation before the animation was played the progress of the animation should be zero. I tried that and obviously that didn’t work but it seems that I was close to the answer. I used Claude to figure out the answer and Claude used killTweenOf gsap function to remove the animation before the animation was even played. It also added a onInterrupt property to the animation which basically reverted the stuck colour after killing the animation. I didn’t want to use Claude, but I just couldn’t figure it out and I think it was better to use Claude as I have never used those functions and properties of gsap. Also Claude made that portion of my much cleaner. Seeing this now, I will be more focused on the cleanliness of the code because claude showed me that my code was repetitive and how it could be made smaller and easy readable. I decided to make the colour menu pop-up and time menu pop-up straight by coding instead of designing it first as I should have. As you can see, the result is very terrible. I am sure definitely fixing it in the next devlog. I was force thinking of making a pop-up menu component and using them in both buttons but I found that it was a hassle and not worth it. Only the white and black button in colour pop-up menu work. They just rotate the board and that’s all I still need to add functionality to them. After learning the lesson that I should definitely design before coding. I started designing the progress component. Although there isn’t much to design there I definitely would have made it as bad as the pop-up menus. While coding this, I also made the score display the total number of correct at attempts which was pretty easy. I just had to add one digit whenever the chose the correct square. Then, I started working on the timer. The timer would have been really easy if I just used setTimeout every second but I like to torture myself so instead of just doing that, I challenged myself using date constructor. I have done this before but it has been sometime and I remember how it worked. The countdown started from 28 which was frustrating. Now, I have just completed that but the code is really messy. I will definitely fix that tomorrow or today as I might post this devlog tomorrow. I think that shorter devlogs do better in terms of views. I’ll try that next time. See you in the next devlog 👋.
Mostly cleaning up the code and breaking things Changes: Made timer code better and cleaner Added functionality to timeMenu options Added countdown before starting the timer and displaying the squares -Added VisionContext.jsx to make code cleander and broke down vision page into smaller components As I said in the previous dialogue, the timer code was messy. So I decided to clean the code now it looks much better. Also now the time button options work now the timer will have 15, 30 or 45 seconds according to what you choose. So before, after cleaning on start the timer would start right away and the square would also show up. But this might make the user frustrated as they have to click start and right away move their mouse to the chessboard. I saw that chess.com has a countdown timer so I also made one. The code for this countdown timer is also messy so I will probably make it more cleaner next time. This is the main thing I have doing this whole devlog which I cannot show you because it’s just making the code cleaner. The vision pays had a chessboard component and then sidebar element to it. The sidebar element had all the code which was making the vision page could a lot messy. So I have broken down components into components and those components in the further components. I think this is making the code much more easy to read and find and debug each component more easily. But in the process of cleaning my messy code, things have broken down. The timer isn’t working, I will fix that later. I don’t have much to show here today so the see the countdown timer working and the broken timer 😝. I will fix everything in the next devlog. So stay tuned. Bieee…
We’ve reach 100 hours 🎉 Changes: Fixed timer not displaying in sidebar Removed the square display after time is over Fixed timer setInterval running multiple times and made countdown timer code cleaner Fix TimeMenu not closing Removed unused imports Designed the sidebar to add new data Added the new design Added animation to make the square notation that appears on the chessboard disappear First of all, we have reached 100 hours let’s goooooo. I would like to thank everybody who have followed my project read, liked or commented on my devlogs . My project has recently started getting some traction. Special thanks to @PAPER_01 💖. I have done a lot of things this devlog. I will try to cover these in as short as possible. It seems that the setInterval in progress.jsx was running twice. I found out this while I was making the countdown timer code cleaner. So to fix that I reset the hasCountdownCompleted as soon as the timer in progress.jsx runs out. Now, countdown and progress timer work as intended with cleaner code. The random color option in color menu now works. It was a little tricky making that work. Let’s just say it wasn’t working as expected but the fix wasn’t that hard. I liked what chess.com were doing. They were displaying the square notation and then the square notation would just disappear. The square rotation will also live in the sidebar so that if user forgets what the square was just displayed, they can easily look at the sidebar. I really like this idea and decided to implement on my project as well. But before I added this to the website, I first designed it on Figma. I also thought of displaying the score and best score on sidebar. Designing it was fun and tricky. I didn’t really like how the previous score and best score were looking and after some trial and error it looked okay. All of these things were fine and enjoyable to do but making the best score work was so frustratingggggg. It’s the reason that I couldn’t devlog yesterday. The issue was score was showing to be zero inside updateTimer function even though the score was greater than zero everywhere else. I thought fixing it wouldn’t be really hard. I tried console log score everywhere to see when the value was being zero but there was no sign of the score turn into zero. Later I found out that due to the updateTimer function being inside a setInterval the value is kind of locked and used useRef hook to solve the issue. Okay, that’s all for this devlog. Now that I have reached 100 hours let’s aim for 150 hours as soon as possible. I have taken very long to write this devlog so I like would be heavily appreciated 😄.
You’ve my coordinates now Updates: Added coordinates to chessboard Changed previous to current Fixed user input on chessboard being checked before countdown finished The show coordinates now works Fixed some event bubbling issues in colorMenu and timeMenu Designing the pop up menus Now it’s easier to locate squares with the help of coordinates . Now you will also notice the board has fliped while changing colors. ~ A small change, in the sidebar the previous word has been replace with current. I think the current word makes more sense there. ~ I also fixed user being able to click on the squared before the countdown finished. This was a silly mistake from me. ~ The coordinates has made it easier to locate squares. But if you want some challenge then you can toggle show coordinates off now. ~ That’s all for this devlog. If you wan’t my actual coordinates dm me 😄.
Moving onto something big (I’m scared) Updates: Change ui of popup menus in options.jsx Added sounds for correct and incorrect attempt in chessboard Added countdown and start sound in chessboard.jsx Added puzzles page Renamed sidebar of vision page and it’s component with prefix of vision. Most of the updates in this devlog are small changes. But now I am going on to work on the puzzles page. I don’t know how I will figure this out. I hope it goes mostly smoothly.. I had designed the popup menus in the last devlog. I think the newer design is much better than the last one. The popup menus don’t look the same in the figma and the website cuz I tweak some things while coding. The figma design was a rough design Adding the sounds in the vision page has made praticing much more fun. The built in mac recorder doesn’t record sound unfortunately or I just don’t how to.. So, I’ll add a ss of vision page with menu open and a ss of puzzles page. I added chessboard and sidebar to vision page. There were two sidebars now so I decided to rename vision page sidebar to VisionSidebar and puzzles pages sidebar to PuzzlesSidebar. Okay that was all for this time. Give me strength to start making the puzzle by liking and commentin on the devlog. Byee ♥️. Also if you’re reading this support @PAPER_01 . AniShuffle has been taken down but she’s been unbanned now 💖.
The pieces have been placed. I was so sloppy 😭 I’ve added pieces to the chessboard. I’ve finally started facing my fear and started working on the puzzles section. It seems that creating the chessboard for puzzles will be harder than I have anticipated. Also please don’t mind the black pieces blending in with the background. I didn’t find chess piece set I liked so I downloaded the lichess chess piece set from pinterest. I was trying to crop them in figma and I coundn’t crop them properly. Also it was a tedious job. After downloading two crop pieces from figma I again went to the web to find out if someone already made them. This website came in clutch (greenchess.net). They had the whole chess pieces set of lichess available for download. Then, I started to code with no plan in mind . I don’t know why do I do this to myself. Obviously it was a bad decision. So I decided to use pen and paper to mainly solve one thing and that was how to place the pieces on the board. The writing helped me alot to think better. I was so sloppy while coding. I was mostly outside while coding and I was really distracted. One sec I was coding and another sec I was thinking about something else. I was making so many silly mistakes making the process more frustrating that it already was. I learned about fen while doing this (Forsyth-Edwards Notation). Through this any chess position can be stored and recreated in one line. It looks like this rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 I only needed to loop over the first part divided by slashes for positioning the pieces. Other things will be used later. I feel the code is really poorly written but it works so idk. I also found out about regex while I was trying to write a if condition for seperating strings and string with numbers. Okay this much for today. Bie….
I got sick 🤧🥀 Updates: Make pieces position perfectly to square in chessboard Moved chessboard states and refs to ChessboardContext.jsx Fixed pieces sometimes being group together in one square when chessboard offsetWidth is null Added destSquare element on click for all possible moves of rook Last time I did position the squares but when I changed the background color of pieces there was a slight misalignment. I started searching what was causing that to happen. It was due to the height and width of chessboard being in decimals. I checked to see what lichess were doing and found out the height and width of the chessboard were always divisible by four. I did the same for my website and now it’s perfectly aligned and that’s what I love to see. Moved the states and refs from chessboard.jsx to chessboardContext.jsx to make the chessboard code less cluttered. The code relevent to puzzles page is in the chessboardContext while the code revelent to vision page is still in the chessboard page. When the page was loaded for the first time the pieces were being group together at the top left square. It was being fixed automically when the page was reloaded. It also happened while navagating from home page. I found out this was happenning due to chessboardWidth being null at start. To fix this I created a useState for the chessboardWidth so the page rerendered after the value was changed. My goal today was to make the rook move but I could only work up to generating the destSquares when the piece is clicked. I achieved this by creating a useState array and if user now clicks on the rook it calculates all the possible squares that the rook can move to and then that array is mapped using math to place destSquares perfectly on top of squares. The destSquares have a dot insided them which will be replaced by a icon but that’s the reason they’re not aligned centered currently. I did have a hard time doing this. Let’s not talk about it. 😭 I’ve written everything in short so that I don’t hit the 4000 characters limit and also ig it’s better for people reading (if any 🥀). I got sick yesterday and was just able to work on my project for 1 hr. Today I thought didn’t work much but it seems today I did 3 and half hrs. I am happy about today. I really don’t know if I can create the puzzle but I’ll try my best to do so. Everything I try to do seems to come with their own set of challenges and take time to overcome those challenges. Let’s see what happens 😔
The rook got some moves 💃 Updates: Added movement to piece when destSquare is clicked Added mode state for seperation of chessboard in puzzles and vision page Moved states, refs, effects and functions from Chessboard.jsx to VisionContext.jsx Working on handling vision page data if user switches to other page during vision practice Finally I can proudly say that the rook can move now. I am really happy that it’s working. To move the rook I had created destSquares(the square with green dots) last time. Now if the user clicks on any of the destSquare with some maths the rook move to that square. I’ve added transition for the movement to look smooth. While doing this the rook did move to the destSquare but when clicked on the rook again the destSquare appered from when the rook was last time. To fix this I grabbed the destSquare location (e4) then set the squareid of piece to the location. The destSquares were calculated based on the squareid so now after moving the rook I can move it again. Also now if the a piece is seleced the background color of the pieces changes. When a piece is selected then destSquares appear but if the piece is selected again or other square is clicked then the destSquares are removed. Small things like this is making the chessboard feel lively and feel that it works correctly. I wanted to do this before but I thought I’ll do it later. I added a mode state in Chessboard.jsx. The mode state is either “puzzles” or “vision” representing the page the chessboard is on. I have made the pieces not appear while I’m in vision page and am trying to make sure nothing is running behind the scences if user decides to move to another page after they click on start. The countdown timer code of vision page was in Chessboard.jsx. I didn’t like that so I decided to move the code to VisionContext.jsx with the timer I move some states , refs and function with it. I had some issues during this migration but it wasn’t too difficult to resolve. I thought I had worked more but seems like I’ve. I’m confused, when I think I have done little work at that time I some how end up will better hours and when I think I have done decent amount of work I end up with less hours. Anyways it feels good watching the rook moves are working correctly. This much for this devlog. Peace ✌️
More pieces can move (I’m sick again 😭) Updates: Added functionality to handle vision page if user changes page during vision practice Added functionality of moving bishop and seperate calculation of rook moves Added functionality of moving queen Added functionality of moving king I told in the last devlog that I was working on hanling vision page if user changed page during vision practice. And now, it’s done. I think I have reset the necessary things so that vision page works normal. If any bug related to this appear in the future then I’ll fix it then. Right now everything looks fine after adding this functionality. Creating destination squares for rook was easy and I thought bishop would also be probably easy. I was very wrong. The thing with rook is that there will always be equal number of destination squares but bishop doesn’t. I bishop’s destination squares varies according to it’s position. I took a long time to figure things out in pen and paper. I even wrote the whole chessboard notation in paper and looked at only one diagonal first to find some sequence ( I’ve attached the img below 😆). I started coding after kind of figuring out where to start. I had issues during coding as well but we got it boys. Also I was using OR instead of AND in the while loop causing bugs and I needed some time to digest that AND definetely worked there. A silly mistake from my side. For the queen I didn’t have to code much as I wrapped the rook and bishop destination squares code in to a function. Then, I created a new function for creating destination squares of queen which just called both the rook and bishop function. As this was really easy I was pumped to move on creating king’s destination squares as it is also really easy. Took a sip of coffee and continued my coding journey. I was wrong 🥀. I got stuck adding the king’s destination squares. I was first thinking of combination of rook and bishop but only one out from every side. This was the wrong way of thinking ig. Then I thought I should use two nested for loops for creating the destination squares which firstly worked out badly cuz I’m dumb. The destination squares we’re being created in such odd manner. After fixing that I had to also remove the destination square which was being created on top of the king and also had to handle to not generate some destination squares when the rook is on the edges of the board. I have done nothing today due to my illness. I hate my immune system 😭. I’ll code for 5 mins now ig for keeping my streak alive. Okay biee..
30 day streak let’s goo 🔥 Updates: Added functionality of moving pawn with seperation destination square for white and black Added functionality of moving knight Changed color of chessboard Made rook not able to pass through pieces The pawns now move one square at a time and have the option to move two squares if they’re on starting squares. Moving pawn one square is easy but I had to think about creating two destination squares infront of the pawn. So I created a array and push all the starting squares of the pawn and if the pawn is on one of the starting squares then two destination squares are created. It’s also seperate for black pawn and white pawn so that white pawn doesn’t get two destination squares when it’s on the black pawn’s starting squares. I forgot the knight also needed to move lol 😆. Just remembered in time after finishing the pawn. The knight was tricky to move. As always I used the mighty pen and paper first before coding. Creating the knight took some time due to random bugs here and there. I think I need to revisit the knight code later as it’s very messy. Yay, now the back pieces don’t disapper on the dark squares as I have changed the chessboard light and dark square colors. I think the new colors look great. I was lazy to test out colors so I went to chess.com and picked colors from one of their themes. Okay now were moving to the next step. Making the pieces not be able to move through pieces. I started with the rook. The plan was simple. Check for any piece with squareid that’s same of the destination square and if true stop the loop. I couldn’t figure out how to even select the piece. I was frustrated as I need to select the specific piece with the squareid attribute. I found out about ReactDOM.findDOMNode but I couldn’t figure out how to work with it. I felt really frustrated at that time. I was thinking of using document object but I know that is a bad practice in react. It seems I forgot that we can use querySelector in refs. I already had the chessboardRef so I used querySelector to find if a piece was on the way of the rook. Also I had to change the way I calculated the rook’s destination squares but let’s not talk about that I think the devlog has gotten pretty long. Although the problems are hard for me to solve when I see the results working I genuinely feel happy. I have gotten lazy after getting sick. Although I have not fully recovered yet I’ll try to stop wasting my time. Okay this much for now biee….
Mostly cleaning up my messy code 🧹 Updates: Made bishop not able to pass through pieces Made the code creating rook destination squares much cleaner Made the code creating bishop destination squares much cleaner Fixed rook and bishop not creating destination sqaures at the edges of the board Made code for creating knight destination squares cleaner and fix if statement condition of rook in ChessboardContext.jsx Made code for creating pawn destination squares cleaner and make pawn unable to pass through pieces Fixed bug while clicking on a piece when another piece is already selected In last devlog I made the rook unable to pass through pieces so it was very logical to do the same to bishop. Making the bishop unable to pass through pieces was pretty simple as the code wasn’t much different from the rook one. Idk what clicked in me after doing that I started to thinking about making the rook destionation squares creation code cleaner. The code was very messy and repitetive and I believed it can made cleaner and smaller. I used 4 while loops before which had almost the same code but different values and slightly different calculations. After thinking and trying I turned the 4 while loops in to a single while loop. Now the code looks much better. Seeing the success in rook destination squares creation code I then moved on to the bishop’s code. Made similar changes to the code as the rook’s code. Also i believe the queen works perfectly as it’s mixture of rook and bishop code but I haven’t really tested it on board. After cleaning up both rook and bishop I found a small bug. The bug appeared because of my slight mistake while trying to make the code better. Basically the rooke and bishop weren’t creating any destination square at the edges of the board. The fix was simple so this didn’t take long to fix. I already didn’t like the knight’s destination squares creation code. Me cleaning up the rook and bishop code gave me the motivation to make the knights code better. It did take some time for me for cleaning up that messy and tangled code. I was using break keyword for rook and bishop so I also used break for stopping the loop but I didn’t want the loop to stop completely I just needed to skip the loop if there way a piece or if the knight was on the edge of the board. After a quick search I found that continue keyword does the job. The pawn code wasn’t that messy but it could definetely do better. I mainly changed the pawn’s code cuz I wanted the pawn to also be unable to pass through pieces. Before there were two loops now I one loop does the job. Then I also made the pawn unable to pass through pieces by breaking the loop. Fixed the annoying bug. If a piece is clicked when another piece is already selected then it looks like both pieces are selected. Desitnation of both pieces are shown and both pieces are hightlighted. So, as clicking on a square reset the selected piece, I reset the previous piece if user selected another piece with a small change. Now I’m trying to making all these things work from the black side as well. Okay this much for this devlog. See you on the next one. Biee…👋
Gobble up pieces Updates: Rotated piece img when color is black and made user unable to select opponent’s piece Added functionality of capturing pieces with rook Added functionality of capturing pieces to bishop, king and knight Added functionality of capturing pieces with pawn My goal was to make the board work from both sides. I was ready for this goal to be challenging. I was messing with squareid and position of pieces by checking the color of the board. But it seems don’t have to do much for things to work. Before, I have already made the board rotate using css. I was rotating the pieces when color was black and that was causing issue. Instead of rotating the piece I simply rotated the img inside the piece. Till now every is working as expected. Also I made user unable to select the opposite colored piece. Now we can capture pieces . If a piece can be captured, the piece will have four triangles at the corners. This is inspired from lichess as I didn’t really like the circle of chess.com. I made the triangles myself using figma. Also I created the dot in figma to change it’s color. Previously the dots were green. It took me some time to pick the colors of triangle and dot cuz I didn’t wanted their colors to ruin the feel of the chessboard. This works by firstly determining if the piece in the way of destination squares is our piece or the opponents. If it’s our piece then destination squares will instantly stop generating but if it’s the opponent’s piece the we first add the sqaure position to capuredSquares array and then stop generating the destination squares. While doing this I learnt about the remove method which allow me to remove the captured piece element from the board. It took time for figuring out how capture pieces with rook. After that it was really easy for me to do the same with other pieces as well except for the pawn. The pawn isn’t the same as other pieces. It moves vertically and captures diagonally. So I had to write code differently for the pawn. I code for the pawn does seem a little messy but i think it’s fine. I would say it wasn’t too difficult to make the pawn capture pieces. I did have to think about making the capturing functionality work for both white and black pawns. This much for this devlog. I am being quite lazy nowadays. Time to grind and lock back in. Hit me up if you also want to grind along with me.
I’m dissapointed in myself Updates: Fixed pawn unable to show two capture squares at once Added function to move opponent’s piece automatically Set fen according to puzzleLevel Moved opponent piece after the pieces have been placed and remove css transition into gsap animation while moving pieces Last time I added functionality to pawn to be able to capture pieces. It worked fine I there was only one piece diagonal to the pawn. I there were two pieces diagonally infront of the pawn only one capture square would appear. Now two capture squares appear if there are two pieces in front of the pawn diagonally. Fixing this was simple. Created the function to move the opponent’s piece automatically. In puzzles the user only moves their piece, the opponent’s piece moves automatically after user plays their move. This was the most frustrating thing I worked on today. I thought the function worked correctly but I was wrong. I’ll tell you in a sec. I added 3 fens with moves from lichess puzzles data in constants.js . Then I made the default fen data to null and made it so that the fen is selected according to the level of the puzzle. I think I was trying to add loading state for this. It was very poor thinking from me. I was just being very ambious and instead of trying to do things step by step I was trying to multiple things at this time. I don’t remember exactly what changes I tried to make ig I was trying to fix the moveOppenentPiece function as well at this time. I undid some of those changes, left others as it was and fixed the fen and commited that. I was already frustrated at that point and then when I tried fixing the moveOpponentPiece function the constant errors and bugs worsened my frustration. I don’t want to explain that part. Just know that after fighting with my code it’s working now. Also before I had css transition for trasform property. Meaning that whenever the pieces moved it moved smoothly. But when the chessboard is first rendered all the pieces also animate to their places. I fixed this by removing the transition css and using gsap to move the pieces. Now the first opponent move happens automatically. This was also frustrating to make it working. Basically today was frustrating. I thought I coded longer but seems like not. But anyway, when you’re at the bottom the only was is going up. Saying that I will stop writing this devlog. I feel I could have written an essay today. Okay bie…
Taking a BIG decision Updates: Fixed pieces creating only single capture square Added redirection to signup page in puzzle and vision page if user isn’t logged in Made user unable to select piece when opponent’s piece is moving Connect oppenent’s move to puzzle data, Add check for user moves and Add functionality to make the opponent piece move automatically after user plays the correct move I fixed the pawn not being showing two capture squares last time. After that I found out that the capturing the piece wasn’t removing the piece from the board. I found out a function that I have commented out was being called and causing an error so I removed the function call for now. This was easy to fix but by doing this I found out that the pawn wasn’t the only one who wasn’t able to display mutliple capture squares. All the other pieces weren’t able to display multiple capture squares due to a simple rookie react mistake. The value of captureSquares was being updated with it’s own value instead of using the previous value. After sorting that out I figured i should do same with the destination squares. Previously had an array updatedDestinationSquares after pushing all the values to the array then only I updated the destinationSquares value. In short I was doing the correct thing and me thinking that I could save 2 lines of code by adding setDestinationSquares directly to the loop was a bad idea but the state function isn’t synchronous. So I undid all the changes and also added a updatedCaptureSquare to all functions just to be safe. Now user can’t select pieces when it’s the opponent’s turn. Although the timeframe to select piece is small but still I wanted to be safe. I achieved this with a state named isOpponentPieceMoving. it’s toggled on when user clicks on a destination square and toggles back off after the animation finishes. Next I tried to make the opponent piece move work through with the help of the lichess puzzle data. Before the opponent piece could only the first move to play. After connecting the moveOpponentPiece with puzzles data. I created a function to check whether the move made by user is correct or incorrect. This was also being checked with the data in constants.js file. The data is stored like this r3r1k1/p4ppp/2p2n2/1p6/3P1qb1/2NQR3/PPB2PP1/R1B3K1 w - - 5,e3g3 e8e1 g1h2 e1c1 a1c1 f4h6 h2g1 h6c1 The moves part start after the comma. First move is of opponent. It tells from which square to which square the piece is needs to be moved Eg(e3 to g3). The second move seperated by space is what the user need to play to move forward in the puzzle. So if the user’s move is correct then I move the opponent’s piece. But if it’s incorrect then I reset the board. I got lost in the reset part. I learned if the key of a element is changed the element kinda resets. When I started doing this I felt a little uneasy. I was figuring out the code I wrote was manipulating the dom which isn’t the best practice in react. Regardless, I added a fragment to the code that was generating the pieces with a key with the value of boardKey and updated the boardKey when the user’s move was incorrect. But in my mind a question was lingering "Should I redo this in the way how react wants it" . Seeing the functionality working I pushed off that question. But, when I captured a piece a error popped up. The ss is below. I tried to locate why was that error popping up. I’ve concluded that the bad code has started to show why it’s called bad code. Although I might find this solution to this issue I think it’s better for me to just rewrite the code. This is painful but it will make me a better developer. Also I found another bug, the error isn’t the only reason I’m making this decision. I’ll push the code upto what I’ve done right now and then I’ll start to fix what I’ve created.
Most rebuilding my broken code For context last devlog I took the decision to start rewriting the code to stop accessing dom directly by using states. Now the pieces are mapped from pieces state rather than directly from fen so that I can move the pieces from state instead of manipulating the dom. To achieve this I firstly created to convert the fen to pieces array. The pieces array looks something like this rn. [ {id: 'r-a8', pieceNotation: 'r', square: 'a8', coordOfFile: 0, coordOfRank: 0}, {id: 'r-e8', pieceNotation: 'r', square: 'e8', coordOfFile: 4, coordOfRank: 0} ] From this I learnt that setting the key attribute serves it’s own purpose in react. I don’t fully understand it rn but I’ll look into it. Now, the id of the piece serves as the key for the piece element and if I’ve understood correctly that will be vital in animating the piece moving. Yay the rook has been reestablished using react state without any dom manipulation. The reestablishment wasn’t too difficult as I thought due to the already existing code. All the changes now happen in the pieces state which then causes the react to repaint the pieces. Now the rook can move from one square to another and capture opponent’s pieces. Also I’ve made the reset squares function as it removes the destination squares, caputure squares, etc . Although there’s no animation during piece movement rn I’ll it add later. After making the rook work I stared making all other pieces work as they used to before. I thought I had to write most of the code to fix all the pieces but after finishing the rook other fix other pieces wasn’t that bad. I reused the code from the rook where I could, fixed some bugs and errors on the way and modified the code where necessary. Sometimes I got stuck due to my own stupidity but that’s nothing new 😆. The moveOpponentPiece function is rebuilt. Now the first opponent move will happen when the board is first loaded. While fixing this function I found out that I was able to select the opponent’s piece as well. This shouldn’t be the case cuz I had already put railguards for preventing this. After fixing the moveOpponentPiece function I checked why this was happenning and the cause was I put railguards only if user click on another piece when a piece was already selected and that code was also wrong. I fixed them both and now they work as expected. Another bug found. When I clicked on the first pawn it only created one destination square instead of two. This was happening because the for loop had only 7 iterations instead of 8 which added the starting pawn squares to the array. Also the user’s pawn were able to capture the user’s pieces which was a big nono so I quickly fixed that. Even thought the moveOpponentPiece is working for the first move it instantly breaks from the second move. I still fully don’t understand why this is happening. I know it has something to do with using setState and it not being synchronous. The code looks like this let updatedPieces = pieces.map((piece) => { if (piece.square === position) { return { ...piece, square: destination }; } return piece; }); setPieces((prev) => { console.log("updated", updatedPieces);// I don't understand how this value return updatedPieces; // and this are have different values}); I’ve fixed it while writing this devlog removing updatedPieces variable and mapping the value directly inside setPieces(). Now, the second move works but the third move is broken 😭 . I’ll look into this tomorrow. I’ll wrap this up for today. Also I’m changing my devlog style a little bit. I’m not telling you all the problems I ran into like I did before to keep the devlogs a little short.
I am stuck Ayy the opponent moves work as expected now. In last devlog I wasn’t able to capture opponent’s page because I accidentally didn’t filter the pieces, only moved the piece. Now the capturing system also works as normal. While talking about capturing pieces now the opponent can also capture pieces. If any of the player’s piece is on the destination of opponent’s piece then it will be captured. The main lesson learned here is to mostly use the previous data while changing the state’s value to avoid unnecessary bugs. I’ve made the reset board function work. This was the point where I decided to rebuilt the code by removing the use dom manipulation and looking back I think it was a great decision by me. (Context: 2, 3 devlogs ago I found out my code was really trash while creating the reset board function). While writing reset board function I did run into some weird bugs. The board is reset by reconverting the fen to pieces array. The first opponent move happens when the opponentMoveIndex is 0 now. In the reset function the opponentMoveIndex is set to zero. I’ll add a animation to indicate that the user’s move is incorrect later. For now I added the animation for the piece moving. I’ve learned that when moving the pieces by updating the state in react, the key of the element is what matters for animation to occur. If the key of the element is same and just the transform style has changed react knows that it’s the same piece that jumped from one place to another. Also now, the move transition doesn’t happen when the pieces are being place. Because the pieces are placed using the transfrom property, the same property used to move the piece. I took me a while to fix this. It seems that this was happening because the squareWidth was making the page re render. I’ve fixed it but I still I don’t completely understand it, which shows that I’ve a long way to go. This one is small but crucial. Now the user cannot select the opponent’s piece during opponent’s turn. I’ve added a 500 ms delay for opponent’s move so that it doesn’t feel things are happening really fast. In that timeframe user is not able to select any pieces now. I am now stuck at the part where I am trying to animate the pieces after checking the user input. Whether it’s correct or incorrect. I wanted to make the background green if the move was correct and red if it move user made was incorrect. Using states is proving to be tricky for me as they’re fully synchronous. My brain goes okay this will happen and that will happen but the code won’t have the updated data because of useState nature. Also I tried to change the background color same way I move the pieces. Now that I think I about it I just wasted time. I will try to do animations with gsap now but idk how to explain I can’t really think of a way to do it with these useStates. Okay this was more that enough yap for 2hr 30 mins of work. Let’s see if I figure out a way tomorrow. If you’re reading this love you man 💖.
Making good progress The piece background color now changes color depending upon the correct or incorrect move that the user makes. Last time I was trying to achieve this by just using useState hook. I’ve understood now that it was the wrong approach instead now gsap handles the animation part. The main issue with gsap I was having was I didn’t know how to select the exact piece for animation. I’ve achieved this by using useRef hook named pieceRefs containing an object will all the pieces on the board with their ids as key. I haven’t never used a ref like this before and it feels scary to write code in the unknown territory but ig it’s a part learning. Also I’ve removed the code that changed the backgroundColor using useState and used gsap. It was just waste of my time to try to use useState hook to change the backgroundColor . So now, piece toggling the highlighted bg color when a piece is selected or unselected will be handled through gsap. Ahhhhhhh.. Finally after a puzzle is completed successfully the the next puzzle will start. My brain feels like it’s melting after making this work. I struggled so much to make the work mainly due to react batching the state updates. Unexpected bugs came while coding this. So, basically a puzzle is considered finished if the moveOpponentPiece function has no moves left. Then, we change the fen state and also reset the board so that the pieces are placed again. After that when player reaches next level the opponent first move needs to take place. For that I have a useEffect hook to check if opponentMoveIndex and userMoveIndex value are default values. The values are set to default through resetBoard function and if the values are the default ones then the opponent pieces moves. One of the main issues I had with this was the moveOpponentPiece function was running twice. Due to which one of the opponent move was being skipped. I wasn’t able to locate why and was making so many unnecessary changes and console logging everywhere to fix this 😭 . The issue was that the useEffect that I talked about earlier had pieces in the dependency array making the moveOpponentPiece function to run twice. I’m really exhausted after doing this… Then after some relaxation I made a rough figma design for the puzzles sidebar. It was kinda relaxing to not worry about coding for a while. I had big plans for the sidebar like making candy crush type levels but I don’t think I’ve time for that so just basic buttons will have to do. I’ve tried creating the distuinguishing the levels based on completed levels, current level and locked levels. Back to coding again, I mostly copied the vision sidebar code for puzzles sidebar as the only difference is in the sidebar body. It seems that I’ve forgetten to use css grids. I wanted the buttons layout to be responsive. I took a quick revisit on how grids. Throwed random properties at the grid hoping it will work as I expected 😆. At last it was the auto-fill property I was looking for with a combination of minmax. I’ve tried created the css for completed, current and locked now I just have to hook them up to the buttons according to puzzle level reached by player. I’ll do that tomorrow, now I’ll stop writing. If you’re reading this, I hope your project is going well💖.
Learnt something valuable ✨ Okay now the puzzle buttons have dynamic ui. The puzzle button will have ui according to the puzzle level. I was confused on how to achieive because there were three condition instead of two. If there were only two coniditions then it would have be easy as I would have simply used ternary operator. I couldn’t use if condition inside jsx. After some time I figured that if could call a function and use if conditions inside the function and return the className. Also now the puzzle level is stored and fetched from the backend. After doing that a toast error popped up as you can see below. I didn’t know why this was showing up when the page is first loaded up but instead of fixing that I first moved on to make the start puzzle button work. I think my main problem is I get distracted easily. To make the start puzzles button work firstly I created puzzle context file . I was deciding to make the chesboard context the puzzlecontext as all the data needed for puzzles page was there but I think it’s better to seperate those things. So, I placed the puzzle context higher than chessboard context with that thought process. If the puzzle hasn’t started the fen value is set to default starting position. Then I again got distracted and thought why isn’t the vision context also above the chessboard context. So, I moved the vision context and the coordinates broke. The reason was color state so then I created different color states for vision and puzzle context. While writing this I don’t actually know what I’m really doing. I do one thing and jump onto another making writing the devlog very hard. I think I can do better… 🙁 After learning the lesson, doing thing one at a time. I only focused on making the start button work. So I moved some values inside puzzles context for this to work and everything broke. But, I wasn’t feeling overwhelmed as my focus on only one thing. Slowly but surely I fixed the pieces moving, capturing and the first opponent move. I think my main issue is dealing with useState hook updating in batches. Ig I will just get better with time. Still the backgroundColor animation is broken which I need to fix. Also while doing this I found out why the toast error was occurring. Silly me didn’t add method post to update the puzzle level. Now after the puzzle finishes the puzzle levels value updates and the updated value persists. I should definitely do things one at a time. Getting distracted and doing multiple things will just make me feeling overwhelmed and will make it harder for me to devlog as well.
Two steps forward, Four steps backwards 😭 Firstly, I’ve fixed the gsap animations not working. This happened because last time I renamed all the color state into chessboardColor. Due to this the gsap backgroundColor css property turned into backgroundchessboardColor. Ig the lesson here is think before using change all occurences feature in vscode. The sidebar now changes. If puzzle hasn’t started then it’s the same old ui. If the puzzle starts the level btns disappear along with start puzzle button. If user makes incorrect move the sidebar show retry puzzle button and if the puzzle is completed successfully then next puzzle button shows up. One thing I learned here is making one button use different className, onClick handler and text easily by storing all data in object. The retry and completed onClick function looks empty. So, I decided to work on the retry puzzle button functionality. To make the functionality work I imported the resetBoard function from chessboard context. Calling the function directly didn’t work because setState function doesn’t apparently update if the value is same. I fixed that by passing {retryLevel: true} or false to the function. After doing this the first opponent move did break and I did fix it but I think with bad code. Looking at the code now I’ve been calling resetting the board and setting default position using the chessboardColor seems wrong. So, then I started cleaning the code. I guess I was correct and things needed to change. I would say these are mostly small changes and don’t need explanation but it seems that the chessboardColor had an actually bug and it took my soul away trying to fix that 😭 . So, the opponent move was capturing it’s own piece meaning that the piece which moved at the beginning would automatically disappear. This was happening because the moveOpponentPiece function ran before the chessboardColor could change when the puzzle is first started. To fix this I had used useEffect hook with chessboardColor in the dependency array to reset the board. But only works if I have the black pieces. If I have the white pieces the chessboardColor doesn’t update because useState doesn’t update when the value is same. The value is white at first because of the default position set when puzzle hasn’t started. I don’t even know how to explain the fix i used. I just chained state updates from file to file to have colorUpdated state value updated in chessboard context.jsx. Basically I had a rough time fixing the resetBoard function running before chessboard color was updated. This time even pen and paper also couldn’t help me solve this 😭 😭 but it did help me to understand the problem on a deeper level. I tried adding next puzzle button functionality. “I tried” 😭 cuz I couldn’t get it to work and on top of that when I tested the retry button it didn’t work. Don’t know how but the retry button also broke. Now, I’m taking a huge decision again. I think some of the problems can be reduced if the chessboard wasn’t a single component that works on both puzzle page and vision page. I think I was too ambitious but now seeing these issues I think it’s better for me to have to separate chessboard components. This might not be the best practice, but this will probably make my life easier. I just read the “Devlogs that get noticed” in the resources page and I think I should make my devlogs a little shorter. I said this in one of my previous blocks as well, but it seems that I am explaining too much. So let’s see what will happen tomorrow. Okay bieeee….
Ayy good progress today I created a separate chessboard component for puzzles page only. Before both puzzles page and vision page were using the same chessboard component making the code complex, hard to read and hard to debug. Firstly I decided to move all the chessboard functions and states into puzzle context but later changed my mind midway. I decided the chessboard functions and states make more sense to be in it’s own folder. Everything broke while doing as expected but I fixed them one by one. Now the puzzles chessboard is functional and it’s code looks a little less overwhelming to me. Now the vision page also needed a separate a chessboard. It wasn’t as easy as just copying and pasting most of the code into vision chessboard because the data was connected to more components of the sidebar such as progress timer, color Menu, etc. I don’t if I should separate the functions to components that they server of just dump it all into the vision context file. What I did was keep functions into their respective folders cuz I think the vision context file looks really cluttered doing that. Everything broke here as well but as before I fixed things one by one. Now I really believe it will be much easier for me to work on chessboards as they’ve been seperated. Also I deleted the original chessboard component and chessboard context after that. On clicking the sidebar button the reset board function is called and the function came from chessboard context. As there is no chessboard context now you can see that there’s a problem here. The reset board function in now in PuzzlesChessboard.jsx which means we can’t access it from PuzzlesSidebarBody.jsx. To solve this I just made the board reset everytime when hasPuzzleStarted is true. We do have the access to hasPuzzleStarted from puzzle context. Fixing that somehow broke the piece transition though. After that I mostly worked on the small things. Such as fixing no transition during piece, fixing the progress timer staring with 2 seconds less than the time set, adding chessboard size to puzzles chessboard in a better way, etc… Now the next puzzle and retry puzzle buttons also work. The next puzzle button works as expected. The retry puzzle button also works but the pieces move to their repective place with animation when the board resets which I don’t wan’t. To prevent this specific thing I have already written some code before and it’s working when starting the puzzle, moving to next puzzle, rendering the default pieces on first load. I can’t figure out why it’s specifically working for retrying a puzzle. I spend a good amount of time looking but idk. I’ll look into this tomorrow. I think the devlogs are still pretty long. I’ll try to keep the devlogs shorter on future devlogs. Okay bie…
Finally, I present to you a short devlog 😆 I have fixed the issue of pieces moving with transition when pieces are being placed after clicking on retry puzzle. To prevent this I already written code which worked perfectly but when only on retry puzzle it wasn’t working. This solution was simple but figuring out the issue took time. To fix the issue I used a useState hook to set hasPiecesPlaced to true only after pieces state updated. Also, I’ve already written code for handling page change in the middle of vision practice. I think this doesn’t work after I removed Chessboard.jsx and ChessboardContext.jsx. Not sure when this broke . I found better way to do this using the useEffect hook cleanup function. I learned that when adding setState directly in cleanup function it throws at recurring error 😭 . I felt my laptop heating up 😭 😭 . But there’s no error when adding setState inside the function and then running the function in the cleanup function. That’s all for today. Couldn’t do as much as would like today cuz a rat bit me 😭. Bye…
Interesting updates I added back button in puzzles sidebar with functionality. Before there was not way to go to the default sidebar (the notStarted state). Now after messing up or completing a puzzle there’s a back button which sets the board to default postion and set sidebarMode to “notStarted”. I wanted both buttons to be taking up equal space but later thought the smaller back button is better. Also now, puzzleLevel updates instantly updates after solving a puzzle instead of updating only after clicking next puzzle button. User can now select and play any completed puzzle by clicking level btns in sidebar. Previously user can only start the puzzle Level user has reached which meant no puzzle 1 and 2 resolving puzzle after user has reached level 3. I split the puzzleLevel state into selectedLevel and highestReachedLevel. The puzzle is set to the selectedLevel and the buttons aren’t clickable above the highestReachedLevel. The ui of level buttons is changed. I made the buttons smaller and made the selected level more distinct by adding a inner glow to the button. We’ve upto 30 levels now . I downloaded the lichess puzzles database for this project but whenever I opened the file my laptop will just heat as there were more than 69 millions data 💀 . I did try to use the lichess data but I didn’t actually like the progression of difficulty so I used chatgpt to make puzzles. I’ve played upto 21 levels and I think it’s good so far. That’s all for now, okay bie….
A little rest from programming I’ve added hint button in the puzzles sidebar. I had been trying to avoid working on this but I couldn’t avoid it forever. Also the puzzles sidebar looked really empty without the hint button. In chess.com the hint button highlights the correct. I did things a little differently, the hint is communicated via text to user. The text animates during first appearance and I’ve made it so that user gets only one hint. After the hint the button goes gray indicating it’s not clickable anymore. I made puzzles sidebar code better to display buttons and also added replay button with functionality on successful puzzle complete. I mainly made the code better cuz I need to add the replay button. The replay button is same as retry button for replaying the puzzle after completion. I made next button do nothing if user reaches the last level. Before when completing the last puzzle level we would reach the next level automatically which is prevented now. I’ve been sick for 2-3 days now and am just writing this devlog. Hopefully from tomorrow I will be working on the project more seriously.
I’m so sloppy now I’ve added sounds for piece movement, capturing piece and completed puzzle. I spent more time than I should’ve finding the sounds. I am still not sure about the sounds that I’ve added expect completed puzzle sound. There was issue with playing sounds during opponent move cuz unlike moving player’s piece where there are seperate function for moving and capturing pieces, the moving and capturing logic is inside the same function. After thinking a while I did solve the issue. It seems mac default recording doesn’t capture sounds so you just have to trust me here 😅. I’ve made hint button disabled when pieces are moving (Both player and opponent piece). I did this after figuring out if user click the hint button quickly after the last puzzle move then we get an error. Although this thing happening is very unlikely but it’s better to always fix bugs. Also I don’t know what happens if user clicks on hint inbetween moves so I think preventing it is better. A small change, I’ve added better hover transition to logout button. I didn’t add a red background during making it cuz I had issue with chaning the svg color. I’ve learned that if I make the svg inline in the jsx and set fill to currentColor then I can change the svg color through css and add transitions. Also, I’ve added popup animations to time menu and color menu. I was even struggling with this even though I’ve added those kind of animations before. I was using the new Activity element in react to toggle the menus but to for adding the animations I’ve removed the Activity element cuz the menu would disappear before animating. I took some break from coding cuz I got sick. I think I’m really sloppy now. Imo these changes shouldn’t have taken me 2hrs. Hope I will be able to shake off this sloppiness.
Wow! This is the 51th devlog I’ve added the player color indicator in the sidebar. It tells you which color you’re playing. Before coding this I just complicating things in my head by thinking of creating new unnecessary states. I used pen and paper to think and realized why not use the color state already available in chessboard. To access the state I moved it up to the puzzles context file where both sidebar and chessboard could get and change the color. I also moved the hint down as it look clutter both color and hint together in the sidebar. Two quick small fixes. I fixed retry and back button not working and fixed replay button not playing the same level only on last level. I’ve added pawn promotions functionality to the opponent’s pawns. In puzzle 17 and 26 there are promotions that happen but without the promotion part it just looks weird to look at. Especially in level 26 where the pawn promotes to a knight and without having that knowledge the user will just get confused. I haven’t added promotion functionality for the user pawns because there is no puzzle that requires it. I will add it if I have the time to but rn i am going to just ignore it. One of the bugs I faced while doing this was the knight promotion worked fine but the queen promotion at level 17 wasn’t. The pawn was just disappearing because the pawn was capturing itself cuz the promotion only work for black pieces which is now fixed. Next I fixed the random color option color menu not working. Idk when and how it broke I thought it was working fine but it seems not. It seems it was not working because the element was being unmounted before running the selectRandomColor function. So, I moved it to vision context and with a useEffect hook it runs every time hasStarted is true. A small change but which I feel great that it’s solved. When clicking on accordion or pieces twice sometimes it selects the icon and other things which was just annoying. The fix was just two lines of css which I learned from a random dude on the internet. Really thank that random dude. I’ve now added functionality for adding multiple bestScore for according to the time and color. Before the highest score in vision would be the score scored across any time or color. So if you were to score 5 point in 45 seconds and score 5 points in 30 seconds they were treated as the same thing which imo opinion isn’t fair. To achieve this I used object inside a object unlike the single number representing the bestScore like before. The object looks like this. { white: { 15: 0, 30: 0, 45: 0, }, black: { 15: 0, 30: 0, 45: 0, } } I did have a very hard time figuring out how to update the state like this as I had to change the specific time score within the correct color. One thing I did learn from this is we can use square brackets for using a variable’s value as key while manipulating the useState object. I also encountered some errors while trying to implement this functionality. Now everything is working as expected.
Many small improvements 🙂 I’ve added transition to level btns and added icons and different ui to puzzle sidebar button. I am using an array inside objects to display all buttons. So to customize the buttons I manipulated the array.Some button have only text, some have both text and img and some have only img. Also the main button is wider and other buttons are gray in background color. For this I used the className like in tailwind to add the styling meaning the buttons which need gray color will have the className gray. The size of the buttons is differentiated using different values of flex grow. I think the buttons look way better now. I’ve added reset if user changes from puzzles page to other page. The is to avoid any unnecessary bugs and error. I had already done this in vision page now it was the turn of the puzzles page. I have been avoiding this for so long but finally I’ve done it. I added the videos for professional course (or should I say advance course). I changed the name to advance cuz professional is just the wrong word to use here. I also moved some videos from beginner to intermediate. Now that the courses are in place I can finally write what you’ll learn in the information section. I’ve added numbers such as 0 - 1000 representing what I mean by beginner. I’ve tried to match videos to the elo level. The data in courses section in the home page is also change from placeholder data. Looking back at the code they are really bad but I’ll leave it as it is not broken 😁. Now I think the project is coming to it’s final stages I do need to add things but after that ig all I need is to polish the website and make website responsive. I’ve also fixed progress bar animation happening everytime on reload. This was a small thing but it was bugging me so I decided to fix it. Fixing it was annoying as I had expected to fix this easily. After some trial and error I fixed it using a hasCompleted state which is set to true after finish lesson button is click. Only when the hasCompleted is true the animation occurs. Some other changes I did were fixing only displaying highest achieved medal in course page and adding background color transitions to buttons. Enought yapping. I don’t feel like coding and I think I should take some rest for the next two days. Hope the rest reset my feelings and returns me to my prime stardance days 😆.
The website is live guys I used vercel to deploy my mern stack project and it was rough . I first tried deploying the the frontend and the backend separately. After reading blogs and trying I ended up deploying the express backend but at that point I had learned that there’s vercel cli with which I don’t have to push commits everytime to find out errors in production. I can just use “vercel dev” command to create a production like environment but for development and testing out. I couldn’t figure out how to run frontend and backend seperately using vercel cli. I then tried deploying the whole repo. The issue with this was I couldn’t configure the website with folder structure like this chess-website ----frontend ----backend Maybe there’s a way to make this work (I couldn’t ), I chose the easier path which I’m kinda familiar with. In this approach there’s no frontend and backend directory. The backend is renamed to api which allows vercel to recognize that it’s the backend and all the contents of the frontend folder will be moved up to the root directory. Errors came as I changed the folder structure but fixed on after another. The backend wasn’t working which got me really confused. There were many issues in this approach as well but atlast the website is running and backend is working properly . The two days break I took from coding is over and i think I feel better. Here’s the link to the website: https://evochess.vercel.app/
Starting making the website responsive Before starting on making the website responsive I saw that when logging in or signing up there is some delay before redirection where people might click the login button several times thinking that it it’s working which is bad ux. In development there was almost no delay because I was using local mongodb. To let the user know that the button has been clicked successfully and to prevent multiple login/signup button clicks the buttons are disabled as soon as user clicks any button in login or signup page while turning the buttons color into gray. Now on to the reponsive ui part. I first tried making the navbar responsive but it didn’t look right in small screens. I was also trying to make the hero section responsive but without any design to follow. So realizing that I needed a design first I then hopped onto figma to design the navbar and hero section. I changed the ui of the navbar ig to make it easier to make it responsive but I don’t know if the navbar ui got better or worse. I know one thing and that is the navbar has got simpler. The design on the mobile is pretty simple imo but that’s the best I could do to make it look decent. I used flex property to make all the text align vertically in phones and decided to remove the image in phone screens. I’ve have currently hidden all sections below 1024px except the hero section to focus only on the hero section without other sections interference. I’ve mostly used hardcoded values to make hero section which I will change to clamp css propery for smoother hero section responsiveness. I have just eyeballed the sizes and paddings which is a bad idea but I’m just lazy to create figma design for every layouts. Now, I’ll make the hamburger menu working. Uhh, I hate making website responsive but it has to be done. If you’ve any suggestion feel free to leave it down in the comments.
More website responsive stuff Firstly, I removed the animations from home and courses section below 768px of screen size. I didn’t remove the hero section starting animation cuz it’s nice. I used gsap matchMedia to achieve this. While removing the animations a funny thing happened, the matchMedia wasn’t working and then I was reading this a gsap forum hoping to see where did I go wrong. I later found that I was doing things correctly but instead of looking at localhost I was looking at live website. Obviously the changes didn’t appear 🤦♂️ Then, I made the courses section kinda resposive. Firstly I went to figma to design the mobile version of courses section as I was mainly unsure of what to do with the thumbnail cards. I decided to turn them into carousel which imo was a great idea. First, I turned turned the main courses section text smaller and then started working on the carousel. The making of carousel was rough. Firstly I was reading stuff online on how the sliding thing works. I think I somewhat figured that out but what I couldn’t figure out is the aligning the cards perfectly. The issue was I was going for a style where the first and the last card aren’t centered alight while the rest of them are. The swiping snapped the cards into place and some parts of the left and right cards would also be visible. I couldn’t figure out how to make this and was about to making hamburger menu but coincidentally while scrolling the stardance home page I saw recommended projects section where it’s like a carousel without the snapping thing. It was way easier to achieve than what I was thinking so even though I didn’t make what I wanted the carousel isn’t bad. The overall the courses section felt responsive so I started working on the hamburger menu. Working on hamburger menu went pretty smoothly except for some things going wrong here and there. I first roughly designed the the menu in figma and then wrote the code.
Worked on hero and puzzles section (Responsiveness) The puzzles section was the easier that hero and courses section for making it responsive cuz puzzles section doesn’t contain any animations or any special thing. After several trials of adjusting the fonts and image I stopped after it looked quite decent. Before working on the visualization section I decided to polish the hero section first. My main goal with polishing the hero sectino was mainly using clamp() css function for smooth responsive text. Although the text are responsive using media queries in hero section, the text look kinda odd in some screens. After using clamp the website feels better that before. Also I changed the width of image with % values which does feel better. I also used clamp for some vertical padding as well cuz it was looking bad for devices with smaller vertical heights. I thought from 425px to 768px was tablet screen size but it seems the tablet screen size starts from 768px. So now upto 768px the website follows the mobile design. Now I’ll polishing courses section and puzzles sections just like the hero section. Wish me luck 😄. Bye I wanted to add more images but it seems 4 is the limit .
This was a rough one One a good note I’ve completed making the home page responsive (for now). After making the hero section more responsive last time I then proceeded with making the courses and puzzles page more responsive. I mainly used the clamp css funciton to make the course and puzzles section responsive. The courses section remained the same as I am quite happy wiht how it turn out but I didn’t like how the puzzles section was looking after testing the website out in my phone. It looked to small for a section so below 768px instead of the text and image being horizontally aligned it’s now vertically aligned. The clamp part was similar to the courses section. Finally after completing those two I started working on the visualization section. I was the hardest section to make responsive due to the absolute positioning of the moves. Firstly I only focused on bigger screens as I had no idea how it would look on smaller devices. The moves were positioned before by mapping an array with the move notation and the css of top and right/left with percent values. I tried to remove that and instead of mapping the elements I thought of manually placing them and giving the ids by which I could have greater control over the css. While trying that I couldn’t make it work as in smaller screen heights it still looked terrible. At this point I was losing hope. I was wasting time watching a anime series just so I could avoid working on this. I tried thinking out the solution but nothing came in mind. Later when I was messing around with css throught the developer tools on the browser I realized the I could change the height of the image container to change the positioning of the moves as the moves are postioned on the basis of the image container. Now below 1440px the height of image container is 90% and below 1024px it’s 80% and I have a max-height value set for safety. It’s not prefect but it’s much better and I’m relieved 😌 . The mobile design uses a image contaning the main image and all the moves as there’s no animation on mobile devices. I made the image in fimga and using clamps and % values I think it’s decently responsive. To make the pages responsive I am using the developer tool in browser to first figure out the min and max values and the putting that value into clamp calculator to generate values. I am constantly switching between vscode and browser for this and if you have a better way to do it please lemme know. Okay the devlog has turned very long so biee…
We’ve reached 200 hours It’s a big milestone that I’ve finally reached . I’ve made the whole course page responsive. This took me longer than I’ve expected. But before that I was getting 404 not found when visiting locations like /course directly but it was working normally when I was navbar to navigate. I’ve seen this issue before as well so I kinda knew that this was because of react SPA (Single Page Application) thing. To fix this I configured the vercel.json file and now it works as expected. So onto the course page. Firstly I made the accordions responsive on mobile screens using css clamp function. I removed the course info section for mobile devices. I didn’t touch the course card as they were a future problem for me to do. But the basic idea was the image with take up the whole width and the image and the text will be vertically aligned instead of the default horizontal alignment. Between 1024px and 768px one of the issues was the course info was looking crammed on the smaller side. so I reduced the padding and font-sizes with clamp css function so that it still looks good on the bigger screens. I also made the progress bar slimmer and badges smaller. Another issue were the course cards. One the bigger screens they looked find but on smaller screens the text were taking up more height than the image itself. I changed the value of thumbnail image from fixed value to %. Also I reduced the massive 1.75rem padding on the course card container for smaller screens. Also for all screens sizes below768px I made the banner slightly bigger vertically as the previous banner was looking very slim on mobile devices. I scraped the idea of making course cards vertically aligned and stayed with the horizontal alignment. I somehow managed the cards to look decent on smaller screens as well by using clamp(). The things I needed to do were similar but I guess it took me long as I was first checking the min and max values using browser dev tools and then putting that into clamp calculator and then pasting the value into vscode. Basically I had to constantly switch between things. In the end, I went to sleep but couldn’t fall asleep so I decided to complete the course page reponsiveness and do on last thing which was making the loading spinner responsive. Then, I peacefully went to bed .
Gosh I’m so dumb Last time I thought I had fixed 404 page issue when visiting paths like course directly. I did fix it for local development but not for production which is really dumb, shouldn’t the development environment be the same as deployment when using vercel cli. I tweaked the vercel.json to fix the issue in production now but now in the development the website didn’t work. The fix that I’m now using is leaving the production as it is and in devlopment using the environment created by vercel cli only as backend and running the frontend seperately using pnpm run dev. To connect both backend and frontend I configured the vite.config.js to redirect every /api request to localhost:3000(this is running throught vercel cli) Most of the time was spent on making the signup page responsive. The login page is also now responsive but it’s just a copy paste of signup page css. I am quite dissapointed in myself because it took me so long to do this and still I don’t like how it looks on certain screens. As I realized that I was spending too much time on making signup page responsive I panicked and just rushed the process. As a result a have a reponsive signup and login page that I’m not very proud of. I fixed the signup not working. While signing up there it showed user already exist error everytime. The fix was quite simple, I had missed await keyword when checking for user with same email in database. Due to which the userExists variable was always true. Then I did something really dumb. I tried to fix something that was already working. I was worried that if I delete a user from database and then if that user tries to login then it would throw an error so without even checking if that was true I started making changes to the protectRoute.js file. I was thinking after the token is verified then I’ll just check if the user exists or not. In the process I deleted one important line of code because of which I wasn’t able to login now and I didn’t know why. I tried made the code as before not knowing the line is still missing so the error still persisted. After giving up and doing ctrl + z undo the previous code returned I finally realized the missing line of code. Also the feature was already there when fetching user data so none of this was necessary 🫠 .
Worked on the drag and drop feature Although it’s not fully complete and polished, it’s kinda working. I stopped working on the feature and started writing this devlog cuz It has been 3hrs I’m forgetting what I did while working on it. Firstly I wasn’t even going to implement this on the first place as I thought this was outside my coding capability but someone gave me a feedback that I should add this feature so I decided to give it a shot. I found out about the dnd-kit package for implementing drag and drop. I was skeptical of using it at first. I was reading their docs to figure out the package. My main concern was how would I implement the feature with the already existing click to move feature. They provide a useDraggable hook for making any element draggable. The useDraggable was used to make the piece draggable. I had to convert the piece code into a component for it to work. To drop something into another thing there’s useDropable hook which as the piece I made square, destSquares and captureSquares into components. If I were a good react dev I would’ve already did those things ig the using the package is some what helping my code to be cleaner. I used the useDroppable hook inside destinationSquares and captureSquares. I was concerned that we couldn’t actually drop the piece as it doesn’t live inside the square rather it lives on top of the board using position absolute. But, I had gotten dnd-kit wrong. I element does need go inside the element if useDroppable is used. There’s DragDropProvider that connects both draggable and droppable hook. Let’s just say DragDropProvider gave me all the function such as dragEnd and values needed to move the piece. Later I changed the useDroppable to be inside all squares cuz after dragging the piece there was some issues when dropping the piece in it’s original square if the user wanted to cancel the move. I didn’t really have to write new code for moving, capturing and resettingSquare as the code I wrote previously worked fine with the drag and drop functionality. There were many issues while trying to add this feature. Still there are issues I need to fix such as the highlighting the square bg color instead of the piece bg color when selecting piece and other bugs I’ve found. Also transition when opponent captures pieces doesn’t working also need to fix that. But, I’m really glad I tried to add this feature as I’ve learned alot and the puzzles board now feels more fun because of the feature. Thanks @PAPER_01 for suggesting the feature 💖 Okay, I’ll stop yapping. Have a good time
Omg how does changing the color model solve the issue Before that I fixed the black piece being upside down when dragging. You can see it in my last devlog’s video. I was only happening with black pieces because to make the board work when user got the black pieces I just rotated the board 180 degree. This made all the pieces upside down and to fix that I again rotated the piece’s img 180 degree. Ig when dragging using dnd-kit (npm package) the transform value was being overwritten causing this issue. To fix the issue rather the rotating with board using css I changed the order of files and ranks. I used flex-direction column replacing column-reverse for the rank to start from 1 to 8. Then for reversing the files when color is black then I mapped squares from reversed files array using toReversed array method. I thought by doing this I’ll make the code cleaner but I think it’s more messy now 😭 . Also I did have hard time understanding my own code when trying to solve the issue 😭 . I fixed the pieces, destSquares and captureSquares being generated on the wrong squares. I realized the piece transition wasn’t working when capturing piece both for user’s piece and opponent’s piece. The transition only happens if hasPlacedPieces is set to true and isDragging is false. So, my first assumption the hasPlacedPieces was being turned to false only when capturing pieces but I was wrong. I was checked if it had something to do with the value of isDragging. I found the isDragging was never turned false so I fixed it but still the main issue wasn’t resolved. I was console logging things and just trying to figure out what was actually causing the issue. The fix was really simple. To implement the drag and drop feature I’ve broken down piece code into it’s own component. There inside the component I have added the key attribute and it was the issue. The key attribute is supposed to be used on the component itself instead of inside the component div. (Eg.) I don’t know why it only broke the capture transition but anyways it’s fixed Now to the part where I don’t even understand how does this even happen. Hopefully you understood what I was saying in the video btw please unmute the video as I am talking in that video. So what happened was the piece img bg color changes when it’s selected. This was working fine until I added the dragging feature. When the piece is dragged you see the background color comes along with the piece. So I decided that the square should change it’s color rather than the img inside the piece. I was going to create squareRefs for holding all the values of sqaures and then select the square using gsap to change the color but I realized a easier way would be to just target the square id. It worked so I also decided to use for changing background color of square when user move was either correct or incorrect. On light squares it worked great and it also fixed the animation as the same animation was working a little weirdly when using pieceRefs. I was happy that it was better but then I found the bug from the video. I tried different things and just couldn’t figure out what was the issue but when I decided to change the color from var(–c-red) to yellow it worked as intended. Then I changed the same hsl color into hex and it also worked but I don’t know whyyyy. If someone knows why this happened please tell me cuz it’s ridiculous. Most of the issue had a simple solution but learning what caused the issue what the difficult part.
We’re close to the end First I fixed the buggy dropping piece. I fixed this when I first worked on drag and drop piece feature but I don’t know how it broke again. When trying different things to fix it I tried to move the setIsDragging(false) lower inside dragEnd function below movePiece and capturePiece function calls. Surprisingly it worked 😄. I fixed light square being dark and vise versa if user had the black pieces. I found out this issue because the coordinates colors were mismatched. So my first intuition was changing the color of coords.jsx. I got really confused as the changes did nothing in the browser. I am so dumb I was changing the vision page chessboard’s coords.jsx instead of puzzles page chessboard’s coords.jsx. It worked but then I realized the coordinates color weren’t wrong square colors were. I undid the changes made to coords.jsx. I also seperated the coords.jsx but adding puzzles and vision in the name. Then I fixed the squares color for black’s board. I’ve figured out the mobile design for puzzle section. First the idea was that the chessboard and sidebar would be stacked on top of each other. This was the easy route but if I did that then it would add friction to the mobile players as they would have to scroll all the way down to start the puzzles. Then I looked at chess.com and they were doing it really well where only after clicking start puzzle the chessboard will appear. So I removed the chessboard below 425px first and then made the button text, size and gap smaller. I also removed the aspect ratio of 1/1 from the buttons as the buttons were ruining the gaps between them in certain screen sizes. Now for the first challenge I faced. How do I only make the chessboard appear and disappear when clicking start puzzle only on mobile devices. As I used gsap matchMedia to make the chessboard’s container display none or block according to hasPuzzleStarted for mobile screens. The chessboardSize is calculated according to chessboard container so that the chessboard is divisible by 4. When first loading the chessboard if the container has display none then the chessboardSize becomes zero and when setting the container to block will only show empty chessboard container without a board. I tried using the autoAlpha property of gsap hoping that it will do that same job as display none but without remove the element. It was making the container invisible but the container would still retain it’s height and width. I was starting to doubt myself here and was thinking to take the easy route but just stacking the board and sidebar vertically. After thinking for a while I came up with a breakthrough I made the position of chessboard container to absolute and visibility to invisible. Now the chessboard container won’t be visible and won’t take up any space as it is absolute. When the board used absolute position idk why but the board container got so bigger. It also distorted the pieces when puzzle started. To fix it I ran the gsapMatchMedia code only after chessboardSize is calculated which was a great idea. It fixed the board when the puzzle started but when it was hidden it was still large. I just replaced the absolute and visibility with display: none as it only runs after the chessboardSize is calculated, that’s why there is no issue with display:none. Last change is when sidebarMode is notStarted then only chessboard is hidden. I know that 80% of the things I say won’t be understood but I’m not a good explainer so you have do deal with it 😅. Were really close to the end now I just have to make puzzles page and vision page responsive and just polish the website and then click the ship button
Made puzzles page responsive and bugs fixes Puzzles page responsive Most the time was spent making the puzzles page responsive. As always it took more time than expected. There were many issue that popped up and slowly but surely I fixed them. One of the issues was in bigger mobile screens the sidebar was being squished because the chessboard was getting really big but puzzles page has height of 100dvh as the chesboard in mobile phones is calculated according to width. To fix it I tried adding min-height to the sidebar for not getting squished and height of auto to puzzles page but this broke the sidebar when puzzles is not started cuz there’s no chessboard. The height of sidebar is 100% so due to the parent’s height being auto the sidebar height was about as didn’t fill the whole screen. To fix this I used overflow: scroll to puzzles page and it’s height to 100dvh. Another issue came when trying to make chessboard and sidebar look decent in different laptop sizes. I made it somehow work but using clamp, min-height, max-height, min-width and max width. It was kind of a pain to solve all the issues that came while doing this. That’s why I’ve rushed making the puzzles page responsive. My plan is to come and polish it after I’ve made the course page responsive as well. It shouldn’t be too difficult imo as it’s very similar to puzzles page. Fixed user being able to drag and drop opponent’s pieces It was a quite dumb bug. I had prevented this for click to move feature but I didn’t think about it in drag and drop. The fix was quite simple as dnd-kit (npm package) provides a disabled property in useDraggble. I disabled it for the pieces for dragging which had the opposite color of chessboard. Fix next puzzle button not working on second last level I didn’t actually know about this bug. A friend of mine told me about this issue while testing the website. After level 29 is completed a state is toggled to true which prevents the next button from not working. The next button is now only supposed to not work after completed the last level. I haven’t used fixed values for fixing this so in future if I decide to add or remove puzzles it shouldn’t break. The fix was a little more complex than I anticipated. 9 days of stardance remain now. So, I have to lock in now. Okay bie
Changed some puzzles and more responsiveness work Copied the puzzles page and it’s component’s media query css So after making puzzles page somewhat responsive last time, the first thing I decided to do after that was copying puzzles page media query css and just paste it in vision page as both of pages are very similar. This made the vision page and it’s components a little responsive. Puzzle changes I’ve changed the puzzle from level 12, 23 and 30. The 12 and 23 level had 2 ways to deliver checkmate and only one of them counted as correct. I changed them as user might get frustrated seeing that. My code doesn’t handle that so I just changed them. Level 30 was changed cuz it wasn’t really difficult. I don’t think I’m satisfied with the new level 30 puzzle either. One issue while polishing signup page I didn’t want the form to look squished on devices with small vertical screen size. Due to this last time I generally kept things smaller than what I wanted to make sure it looks okay for those devices. To fix that I added min-height to the form-container. It prevented the form from squishing but the form-container was overflowing as the puzzles page has 100dvh. What I wanted was just the form scrolling using overflow: scroll but this probably took me about 20-30 mins to make it work 😭 . I set overflow to scroll to form-container it didn’t work, added it to form which also didn’t work and then I added it to puzzles page. The scroll part was working when I added it on puzzles page but not what I was looking. Then I created a wrapper div to hold the img container and form container hoping now adding overflow:scroll to form container will do the job. After trying all things things I realized that the min-height was set to form container instead of form. The fix was to adding min-height to form and set overflow scroll to form-container. I removed the wrapper div after that as it was unnecessary and also hid the scrollbar that appears in form-container. Signup and login page polish after that annoying issue After that annoying issue I’d say things went pretty smoothly. I mainly used clamp as always for making things responsive. And as always it took me longer that expected. After polishing up the signup page I copied the code to login page and just changed signup to login. Vision page responsive on mobile devices Making the vision page responsive for mobile device was really similar as polishing signup page. I just used clamp for everything and made sure everything looked good. Now that I think about it i only made the sidebar responsive including the popup menu as only that is displayed on mobile devices and chessboard is hidden. The chessboard is also kinda responsive due to the copy pasting the puzzles page media query css. The making of sidebar responsive was just trying out different sizes and then putting the value into clamp calculator and copy pasting the value. Now, I’ll work on the vision page responsiveness for bigger devices and then if everything looks great after testing then I’ll ship the project
This devlog is a short one I’ve made the vision page responsive for larger screens. Last time I made the page responsive for mobile screens. I made some small changes in puzzles page while doing this for maintaining similar code . I ran into some issues such as css not working due to incorrect nesting and writing the writing the css on wrong file. Also, I removed media query for 1440px as the default css will work between 1024px and 1440px using clamp css functions and by doing that, above 1440px the css will stay the largest clamp value. I think I will do the same in puzzles page as well. 2hrs wen’t so quickly mainly cuz of my stupidity as I broke things that already was working fine. Also, I don’t think I like the mobile responsiveness that much but i don’t think i’ll change it now (or maybe I will). While writing this devlog I just realize that I’ve make the sidebar responsive after vision page has started. Uhhh i hate responsive design
Fixing things and some more responsive things I’ve fixed chessboard displaying multiple selected squares. This happened when user selected a piece and then selected another piece by dragging. The fix was really simple. I just added resetSquares function when piece on drag start. I’ve also fixed pieces stacking on top of each other if user drags and drops a piece on another piece quickly before the opponents move happens. This was prevented when pieces are moved only by clicking but I forgot to prevent this if pieces were dragged and dropped. I did two things to prevent this: I reduced the time for opponent piece to move after the first move. I disabled the piece from dragging if it wasn’t the player’s turn. It seems the first fix wasn’t sufficient as it created another bug. So, if user selected a piece by clicking or dragging and then dragged the same piece then the destination squares and captureSquare will just completely disappear. The occurred due to resetSquares function that I had added. I thought for a while and came up with this solution. The resetSquares function only executes if user selects another piece on drag. However the function won’t execute if the selected Piece is being dragged. The selected piece state null at first so resetSquares() won’t also execute if selected piece is null. Now, it works as expected until and unless I find some bugs. Now returning back to the responsiveness. I fixed the puzzles button to be equal width and height. I had made the level buttons responsive before but they weren’t the same size. I had tried the aspect ratio last time as well but it was breaking the layout. Basically I used aspect ratio, removed the grid templated rows and changed some clamp values. Also I removed the media query below 1440px and integrated it as default css. After doing that, I started to fix the attempts in in vision sidebar. I thought it would take me two seconds to do it as I just had to apply the puzzle button knowledge here. I thought just doing this will work grid-template-columns: repeat(auto-fit, minmax(40px, 1fr)); I was wrong 😭 This worked fine for level buttons cuz the number of buttons were static. Here the attempts squares increases as the user clicks on the chessboard. If there’s only one attempt square then it will take the whole width. I was stuck after this. I tried different things such as using max-width, trying to add width: fit-content, etc. but nothing worked. At last I thought of reverting back to what the code orginally was which just used flex and flex wrap but coming this far I just used grid and used different values with height to make the attemps square kinda responsive. I still need to use clamp or something to make this look good. Uhhhhhh this is so frustrating… . I think I’m overexplaining things. I should just simplify down things
THIS MIGHT BE THE LAST DEVLOG First I polished the puzzles sidebar. I made the sidebar width to be same as vision page sidebar. Then I changed the level button size as they were too small for larger screens. I also made the level button container scrollable if the level buttons overflow. This took the most time because the whole puzzles sidebar body was overflowing pushing down that start button. I just wanted the sidebar body to not overflow which would make the levels container to be scrollable. The fix at last was using min-height: 0 to the sidebar body. Idk how the min-height: 0 is helping here 😭 . Next I made the visualization section animation (The last section of the home page) to appear quicker. This was a recommendation from my brother as when scrolling previously the section might seem like it contained nothing until you scroll fully. I faced issued mainly with the section not pinning to the top of screen when trying to move the animation timeline starting point. Also I tried to placing text higher on y axis and animate it coming down with the user scroll which produce the result I was expecting. So, I split the timeline into two. The first one reveals the text and the second one shows a person visualizing. The tex revealing animation ends when the section top hits the top of the screen which makes the section pin to the top exactly how I wanted it to be. Then I polished vision page sidebar as follows: Made the sidebar responsive after user has clicked on start Made the sidebar header look better and fix mismatch of padding from body Returned to using flex for the attempts and mad them responsive Tweaked the options and info as they were looking odd in some screen sizes (mainly the tablet one which looked really bad) I then copied some of these changes to the puzzles sidebar for maintaining similarity. Lastly I capped the width of course, puzzles and vision page to 1600px by adding a wrapper element. It acted weird on puzzles and vision page sidebar as there was already a element named wrapper and so I changed the classname to page-wrapper.
Ships:
Let’s ship 🚢 This is a website where people can learn and improve their chess skills by watching courses, solving puzzles and practicing their vision. The website was overall really challenging to build. If I had do pick, it would definitely be making a working chessboard for puzzles. At the beginning of the project I didn’t even know if I was capable of building one but I am really glad I tried as I’ve learned so much. Another challenging thing would definitely be making the website responsive. I don’t like making website responsive and in this project animations added another layer of complexity. I’ve tried my best to keep things responsive though. I am really proud of completing the project and mainly working chessboard as this is my first time building something like this. I am also proud of the animations and the ui of the website. To test my website some knowledge of chess is preferred but even if you have zero knowledge about chess you can test out my project as there are courses which will teach you about chess. Thanks stardance for everything 💖💖. I probably would never have created or completed this project without stardance😄...
|
1792615697.091723
|
1792702097.091723
|
|
1562
|
SuperNewRoles by @yoking | Stardance
|
yoking
|
0
|
220.15
|
0
|
[]
|
[{"post_id": 50428, "ts": "202 [{"post_id": 50428, "ts": "2026-08-19T16:26:01Z", "hours": 9.1528, "text": "The latest version of Among Us, v18, has been released, so I worked on updating it. (For both the client and the server!)"}, {"post_id": 47863, "ts": "2026-08-16T03:14:40Z", "hours": 15.0264, "text": "Merging stacked PRs is fun! (I might have worked a bit too much…)"}, {"post_id": 47397, "ts": "2026-08-15T09:48:20Z", "hours": 13.4536, "text": "Preparing features for the upcoming update👀"}, {"post_id": 45253, "ts": "2026-08-11T16:31:25Z", "hours": 15.3244, "text": "First time using stacked PRs for a fairly big refactor."}, {"post_id": 41913, "ts": "2026-08-06T13:02:57Z", "hours": 8.9292, "text": "I spent the whole day just fixing and testing the bugs A found… but on the bright side, we got so many of them sorted, which means much better quality modding from here on!"}, {"post_id": 41252, "ts": "2026-08-05T10:55:49Z", "hours": 8.7486, "text": "Asked AI to spot some bugs and it found 52, and they were pretty major ones too. 😭"}, {"post_id": 38854, "ts": "2026-08-01T12:44:14Z", "hours": 8.5133, "text": "A bit of refactoring"}, {"post_id": 35638, "ts": "2026-07-27T06:11:51Z", "hours": 8.1333, "text": "Two hotfixes for way too many bugs lol https://supernewroles.com/releases"}, {"post_id": 33403, "ts": "2026-07-23T10:06:49Z", "hours": 7.8878, "text": "v3.1.5.4 has been released (hotfixes 3.1.5.5 and 3.1.5.6 are also included)! Tasks are now displayed for the “Home Guard” (a role with no tasks, which basically refers to a NEET who stays home all the time (lol))!"}, {"post_id": 32150, "ts": "2026-07-21T03:37:02Z", "hours": 8.1486, "text": "Adding more features to Custom Cosmetics & fixing about 6 bugs!"}, {"post_id": 28957, "ts": "2026-07-15T15:59:04Z", "hours": 80.7908, "text": "Reworking the Wiki, etc. https://wiki.supernewroles.com"}, {"post_id": 9036, "ts": "2026-06-15T02:24:06Z", "hours": 21.7083, "text": "I added a new mode and new settings. I will introduce them in a new devlog once they are released 👀. It is a lot of fun!"}, {"post_id": 2576, "ts": "2026-06-05T04:44:51Z", "hours": 14.3325, "text": "Many bugs fixed and the “Tasker” role ported! https://supernewroles.com/v3.1.5.1"}]...
|
Title: SuperNewRoles by @yoking | Stardance
Devlo Title: SuperNewRoles by @yoking | Stardance
Devlogs:
Many bugs fixed and the “Tasker” role ported! https://supernewroles.com/v3.1.5.1
I added a new mode and new settings. I will introduce them in a new devlog once they are released 👀. It is a lot of fun!
Reworking the Wiki, etc. https://wiki.supernewroles.com
Adding more features to Custom Cosmetics & fixing about 6 bugs!
v3.1.5.4 has been released (hotfixes 3.1.5.5 and 3.1.5.6 are also included)! Tasks are now displayed for the “Home Guard” (a role with no tasks, which basically refers to a NEET who stays home all the time (lol))!
Two hotfixes for way too many bugs lol https://supernewroles.com/releases
A bit of refactoring
Asked AI to spot some bugs and it found 52, and they were pretty major ones too. 😭
I spent the whole day just fixing and testing the bugs A found… but on the bright side, we got so many of them sorted, which means much better quality modding from here on!
First time using stacked PRs for a fairly big refactor.
Preparing features for the upcoming update👀
Merging stacked PRs is fun! (I might have worked a bit too much…)
The latest version of Among Us, v18, has been released, so I worked on updating it. (For both the client and the server!)...
|
1791824391.7003748
|
1792688391.7003748
|
|
30756
|
Stardancer (formerly Unnamed Platformer) by @zahra Stardancer (formerly Unnamed Platformer) by @zahran | Stardance...
|
zahran
|
1
|
220.0
|
3505
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T20:37:52Z", "hours": 220.0, "multiplier": 13.35, "payout": 3505, "blessing": "neutral", "text": "For HackClub Stardance, I created Stardancer , a 30-level platformer featuring a unique mechanic: mid-level shapeshifting to unlock new abilities and powers! I used C++ and SFML (the Simple and Fast Multimedia Library) to code this game. During the development of this game, I ran into a couple of technical challenges. Collision was among the biggest; I had initially decided on AABB (Axis-Aligned Bounding Box) collision, but after implementing that I realized that it led to erroneous collision interactions, misalignments, and more issues. So, I switched to SAT (Separating Axis Theorem) collision instead. This, combined with general collision response logic, made coding collision one of the hardest endeavours of this project. There were many other challenges throughout development, however none are too disruptive to the experience of the final game. I’m still extremely proud of myself and this project for many reasons: This is the largest project I’ve ever made; Despite many challenges, bugs, and pieces of complex logic to work through, I made a fully functional and complete game; I managed to make this with no external engines; I was able to use my C++ and new SFML skills to create something I can proudly say I made! IMPORTANT NOTE FOR REVIEWERS!! PLEASE READ!!! A complete playthrough of the game takes a large amount of time due to how levels are structured: to play a level, you must beat the level before it, which poses an issue for one of the shapes which is only unlocked in the last set. I realize most reviewers do not have the time required to play through the full game and gain a complete understanding of its features. For this reason, I strongly urge reviewers to skim through/watch my full walkthrough video linked in my README, as well as check out the “Credits Easter Egg” section in that video. Playing through all 30 levels sequentially takes time, but you can unlock every level directly from the Credits screen so you can test all shape powers hands-on right away! This way, a reviewer will be able to understand the scope and gameplay of the game in a short amount of time. With that being said, I truly hope you enjoy my game.", "repo": "https://github.com/HughMann635/Stardancer", "demo": "https://zahran-635.itch.io/stardancer"}]...
|
[{"post_id": 79153, "ts": "202 [{"post_id": 79153, "ts": "2026-10-12T20:35:30Z", "hours": 8.0819, "text": "Unnamed Platformer - Devlog 27 WE’RE FINALLY HERE! What I did: I did a lot of final polish and testing before getting the game ready for release. Initially I was going to use Emscripten to port my game over to web assembly (inspired by this video: https://www.youtube.com/watch?v=1kiwpAIU454 ) but I soon realized that it was much more complex than it looked, and kind of took away from the spirit of being entirely made out of C++ and SFML. So, I decided to simply publish an executable rather than port the game over to web. I set up the release build and whatnot (which took a while because of cmake config issues and whatnot) but I finally got a release build working n it feels great! I ported to itch.io, now I just gotta finish up the itch page and readme, as well as record a walkthrough video for macOS and Linux users as I couldn’t figure out how to configure the game for either. Challenges: The whole odyssey of deciding how to port my game over was a slight hassle, but nothing too bad. Also, while recording my walkthrough vid, I ended up discovering A LOT of hidden bugs, so I managed to pick all those off and there shouldn’t be any left…hopefully. Plans for next time: Ship! This devlog will be my last for this project, and for this challenge. Aside from being done with everything, I accidentally created a completely new project according to Hackatime when I was renaming the file folder, executable, etc. from “WorldofBlockman” (my placeholder name) to Stardancer so everything would be more consistent with my final title. so any work I do on my project won’t count towards heartbeats and thus I can’t post another devlog (15 minutes minimum/devlog). Still, it’s been such an amazing journey, I learned so much and I made this game that I’m super proud of 🥹 even though this game gave me hell sometimes, I have virtually no regrets about any of it. This has been my biggest project ever, and many more to come in the future hopefully. K…bye guys."}, {"post_id": 74692, "ts": "2026-09-28T00:34:26Z", "hours": 9.5458, "text": "Unnamed Platformer - Devlog 26 Stardance extension + fatigue = holy procrastination 😂✌️ What I did: More random stuff: Level timer that stores each level’s personal best, displays a live timer in the level, and lets you access your PR for each level from level select menu Fixed issue where you couldn’t close game while in settings menu Death count (it just tracks deaths over every single level, accessed from level select menu, manual restarts count as death too) and coin count as well Adjusted some levels a bit Added a feature to handbook where items you haven’t come across yet are blacked out and have hidden descs, and add notification to handbook when you unlock these items Update README a little bit cause I was feeling lazy and didn’t want to do anything else Fix some bugs concerning rotation and tipping, as well as making it so you do not rotate when passing thru a 1 tile high gap (this is specially an issue with the square where it can feel a bit janky otherwise) I will note that some of these were multifaceted changes that took quite a bit of effort and iterations, but I couldn’t be bothered explaining everything I did here. And more playtesting too. Challenges: Probably the handbook feature…it was the longest one out of all of them. Plans for next time: I want to be done with pretty much everything related to the actual game by next devlog, so I can focus on the README and finally shipping! K bye guys"}, {"post_id": 70860, "ts": "2026-09-19T21:41:39Z", "hours": 9.0317, "text": "Unnamed Platformer - Devlog 25 I’m so tired omg What I did: Bunch of miscellaneous stuff: Added basic vfx: so far we only have a click sound, I’ll add more later but it took me a while to figure out how to get SFML’s audio system working since I also had to find out why my audio files weren’t loading in either. Added coins to every level: added new tile type for coin, added a coin into each level, added effects, etc. Fix bugs/gameplay issues such as the triangle being unable to teleport after a restart/new level, rearrange some levels to fit coin placements, find out some new bugs and try (and fail) to fix them, so decide to deal with them another day. Add simple death animation to the player. Make it so levels must be completed in progressive order (e.g. you start at level 1, cannot progress till you have completed), also add different colors to boxes on level select menu (check vid) Probably a few more things related to general playtesting but i can’t remember Challenges: Making level buttons in the levelmenu was kind of frustrating not only because of the selection aspect but also getting them to visually render in the proper colors. Honestly though, now the main challenge is dealing with my own fatigue, especially since I’ve been joining more clubs and getting more homework, so hopefully I can clutch up over the final few days cuz I highkey need that framework 13 🥺✌️ Plans for next time: I added a list of bugs I want to tackle/stuff I want to add: //BUGS!!!!! //cant close window while in settings menu //rotation bugs //levels 13, 17, 26, 4, 8, look into //as well as other levels but these ones I can remember //TO ADD!!!!! //speedrun timer //death count //updating handbook (notif icon, hidden objects) //more sfx (death especially) K bye guys"}, {"post_id": 68850, "ts": "2026-09-15T21:16:00Z", "hours": 7.4011, "text": "Unnamed Platformer - Devlog 24 The game is finally coming together… 🥹🔥 What I did: All the menus in the game are completed! Ngl, credits was really easy ofc, but I was deciding how I should go about doing it, still didnt take too long tho. Then settings was a lot harder 😭 volume adjustment was quite easy, but the real problem came with creating the keybind section, since I had already coded hard inputs all throughout my code. So I pretty much had to add a new system + helper func in vars.h, then replace every instance of isKeyPressed with that system+helper, then code the menu in the ui file (Which took forever cuz of bugs with msg updating + event handling + key updates + etc.). Well, it’s (mostly) done now, which is good. And ofc I was also testing the game for general bugs too. Challenges: The keybind menu took me a hella long time to get done…thats about it, aside from some other tiny bugs. Plans for next time: add vfx, polish up every single one of the menus…and then I’ll see where to go from there. Hopefully I can finish most of my stuff by the start of next week. K bye guys"}, {"post_id": 66830, "ts": "2026-09-12T19:00:20Z", "hours": 9.0458, "text": "Unnamed Platformer - Devlog 23 Hey guys. What I did: I did a lot of playtesting/bug hunting as usual, but I was mainly creating the entire handbook menu. Which took surprisingly long, cuz of designing the menu + figuring out how to include all the different tile icons + creating descriptions + making stuff functional + formatting + colors + bugs + you get the idea. Anyway I’m pretty happy with how it looks so far, I doubt I’ll make any major changes in the future. Also I did find a couple of bugs while testing, but i didn’t really do anything about them, I want to completely create all the core functions before tackling any small bugs/issues. Challenges: There were a few bugs and I went through a few designs for the menu, but overall everything was hella light so I wouldn’t say there were any real challenges. Plans for next time: Create credits menu, then work on adding vfx, add settings menu (thinking of adding volume + keybind toggles), polish up all the menus…and then I’ll see where to go from there. I’m pretty worried cuz now that school’s started (im in gr11 now) I’m probably gonna have a good amount of schoolwork, clubs, etc. that I’ll also have to make time for…so wish me luck ig. K bye guys"}, {"post_id": 63924, "ts": "2026-09-07T23:45:05Z", "hours": 6.8869, "text": "Unnamed Platformer - Devlog 22 School starts tomorrow ✌️so i decided to make a shorter devlog…also I’m so tired What I did: Honestly you can’t really tell that I did much at first glance. I was mainly playtesting a lot and polishing stuff up, and making sure all the background stuff was fine. For now I dont think I’ll return to background stuff for a while. Although I did manage to add a particle effect for the black holes (both the ones in the background as well as the actual obstacles). I was also experimenting with a horizon for a bit, but then I decided I don’t want it and scrapped a good chunk of time worth of changes. Challenges: Deciding how to add in particles was a bit challenging, specially the math part. But other than that it was a pretty chill 7 hours. Plans for next time: Hopefully finish menus, then: work on vfx, polish up all the menus, tackle any big issues with levels or physics, and finally work on bringing my game onto itch.io! not all in one go, though. K bye guys"}, {"post_id": 61060, "ts": "2026-09-03T19:34:17Z", "hours": 9.8472, "text": "Unnamed Platformer - Devlog 21 Background design is a bit easier now that I have a plan…also I did not lose track of time 👍 What I did: I added in every single sky element I want to have: comets, planets, black holes, stars, floating rocks, and a moon. I think I might tweak some elements later down the line (specifically the moon(adding craters) and black holes(I’ll think of some extra effects) ), but for now I’m fairly satisfied with how far I’ve come. Looking at the game now gives me a sense of pride at seeing everything finally come together after so long 🥹✌️ Challenges: Making comets was a bit of a hassle, because I had to decide how to do it (which took me some time for brainstorming + more time cuz of discarded changes + even more minutes of brainstorming), and implement it. It’s pretty complex cuz there’s a cooldown on each comet, then you have to set the spawn point and angle/speed, calculate the trail’s points, draw them, draw the head too etc etc…so it was pretty tedious, but comets are the most rewarding visually imo out of all the features. Other than that, I spent a bit of time per other feature figuring out how to implement each of them, but none of them were as complex as the comet. Plans for next time: Finish up any bugs or other issues in sky-related stuff, then I’ll try to make a visible horizon again and see if I’ve changed my mind since last time. Either that or I’ll start working more on smaller vfx, specially trying to find out how to make a particle effect. K bye guys"}, {"post_id": 59814, "ts": "2026-09-01T19:29:23Z", "hours": 11.1828, "text": "Unnamed Platformer - Devlog 20 Background design is a hell of a lot harder than I thought it would be…also I lost track of time 😭😭 What I did: I got started on background design, and partially implemented a background. I actually had a pretty different idea in mind compared to what I have now: the rest of the planet visible, stretching into the horizon, with mountains and volcanoes etc etc. scattered along its surface. After spending a while implementing that, I realized it a) didn’t look right, since everything was just following the player around at normal cam speed, and b) I didn’t like the idea anymore to begin with. So after scrapping all those changes, I started researching how to add a scrolling effect so it would look more natural. I found out how to implement a parallax scroll effect, which basicallymeans that objects in the background move along slower than objects closer to the front of the screen. I also restructured my scenes.h file which contains all background-related stuff, and made a couple of other small changes and fixes with certain levels. I know I don’t have much to show for it, but that’s mainly because I spent a lot of time tweaking certain elements and just undoing backgrounds I ended up not liking 😭🥀 Challenges: Deciding what to do visuals-wise cost me some time bcuz I kept going back on my old ideas, but restructuring scenes.h was the hardest part since after deciding what to do for visuals, I had to base the logic in scenes.h off that. Also it took me a while to decide how to add in a parallax scroll system. Plans for next time: Work on more background stuff. right now I’ve set up a lot of background elements’ structs and whatnot, but I’ve only redrawn the stars and added a rough brightening/dimming effect. Also Im gonna have to start thinking about what I’m going to add on each of the sub-menus accessible from the main menu (credits, handbook, and settings). K bye guys"}, {"post_id": 56961, "ts": "2026-08-29T00:22:59Z", "hours": 9.99, "text": "Unnamed Platformer - Devlog 19 The UI is coming along pretty nicely! Pt. 2 What I did: I believe I’ve fully created everything UI- and menu-wise, aside from 3 additional menus (credits, a ‘handbook’ that contains info about stuff, and a settings page) that are currently blank. I created a hovering effect for buttons that makes it so when you hover over a button, the button goes downward slightly and the shadow moves to match. Aside from that, I polished up/tweaked some minor details, and the only things I’ll add menu wise are probably those 3 sub-menus on the main menu and a universal backwards-nav button. The biggest thing (time-wise) was figuring out how to make the code more readable and actually making it more readable. I created two new functions for making text and button objects which made my life a lot easier, also the button-hover code took quite a few lines so I put that into a function too. Aside from that, I made a couple fixes here and there to make it more efficient memory wise. And even then, I ended up breaking stuff which took me a while to fix, such as the issue with unpausing ur game in the vid. Challenges: Probably efficiency stuff, since deciding how to do it + implementation took a while and had a couple of bugs due to me not accounting for stuff. For example: my hover function would change states on its own, but since sometimes you don’t need to directly change state or you need to do other things too, I made it into a boolean that each individual case takes and does its own thing with. Plans for next time: Start on background stuff probably, I don’t want to do anymore UI stuff for now. I have a fewideas in mind for my background visuals, but I hope they won’t be too hard/impossible to implement. K bye guys"}, {"post_id": 55174, "ts": "2026-08-26T17:32:12Z", "hours": 9.9275, "text": "Unnamed Platformer - Devlog 18 The UI is coming along pretty nicely! What I did: Designed a full level select menu (there are a couple more things left to add), add a heads up display for the current level, and add proper mouse input and extra details to buttons such as shadows (havent implemented shadows for everything, I’ll explain why) and changing color when hovering. Even though it doesn’t sound like much, it took me a surprisingly long time because my text wasn’t centering…What I didn’t realize is that sf::Text creates invisible offsets for some reason, so when I used getGlobalBounds() it would return that offset too and mess up the centering. I ended up doing some research and realized I had to use the local bounds (i.e. untransformed) when centering. Challenges: Ig the biggest ‘challenge’ was centering buttons with text, because at first I actually tried to manually fine tune coordinates and whatnot. But then I found out I had to use localbounds and blah blah. Another thing is, I spent a lot of time fine tuning sizes, colors, shadow darknesses and depths, etc. which took a lot of my time. Also no ai used this time either, although I did spend a lot of time researching why my text wouldn’t center itself. Plans for next time: I’ll just polish up existing menus, and work on background elements. Also I want to add a kind of handbook accessible from the main menu that tells you what stuff does, different powerups, etc. But most importantly, I’m gonna try to find out how to make shadow creation more efficient. For every text/button, I need a shadow. That means I have to add it as a member in the class, copy the actual object, change the color and offset it, then draw it too. Since I have so many objects that make shadows (all of them in the end, ideally), I’m probably going to make a shadow-making function for readability. Other than that I’ll just play the game and test levels a bunch, which I’ve already been doing a lot to make sure everything is as it should be. K bye guys P.S. there’s also still a couple bugs ( UI-related or otherwise) that I have to fix as well"}, {"post_id": 53440, "ts": "2026-08-24T00:04:55Z", "hours": 9.9042, "text": "Unnamed Platformer - Devlog 17 It’s actually no longer “Unnamed Platformer”, it’s “Worlds of Blockman”, I might change that later idk What I did: I designed level 30, playtested every level extensively and tweaked some levels, and made a basic main menu, level hud and pause menu. And it took me ~10 hours. Well, that’s not all I did. I also changed up the colors of the square to differentiate it from spikes and buttons, and I added a visual indicator for the triangle’s teleport. When you tp the triangle fades to a darker shade of green, and when it gets off cooldown (3 secs) it fades back to its normal color and then you can tp again. Also, level design took quite a long time since I was kind of making it up as I went along, and the whole game states implementation wasn’t too hard in itself, but I ran into errors with loading my font. I added the .ttf file to my assets folder and wrote the correct file name in font.loadFromFile() and whatnot, but turns out I didn’t have the actual font downloaded in the build folder or my project. So after a bit less than an hour I added it in and it fixed the issue. also I spent a bit of time deciding how the different menus would actually look which ate up some time. Challenges: ngl the font-loading thing was kind of the only hard part 😭most other stuff was solved relatively quickly and easily AI used, if any: None, also most likely no AI will be used in the future since the future just holds visual stuff which should not be hard enough to merit the help of AI. Plans for next time: Level select menu, add more stuff to main menu, also make it so the current level shows in the background when you go to the pause menu. also add mouse inputs so you can use those instead of kb inputs in the menu, and start on some more vfx and sfx. I’m also really tired"}, {"post_id": 51378, "ts": "2026-08-21T01:20:51Z", "hours": 9.9719, "text": "Unnamed Platformer - Devlog 16 Actually didn’t get a lot done over the last few days, let me explain. What I did: The biggest and only new feature I added was a major adjustment to black holes. Earlier they were just 2 tile x 2 tile circles that killed you upon touching. I’ve reworked them to how they’re supposed to be: 6 px x 6 px black circles, with a surrounding 6 tile x 6 tile ring. now if you enter the ring, you lose the ability to move normally (you can still jump tho) get pulled toward the black center, which kills you if you touch it Which is how it’s supposed to be (nevermind the astrophysical inaccuracy lmao). This took me 2 hours 😭 and then I designed levels 26 and 27. I also re-added the old texture system I implemented and then took down earlier cuz it was making things look hella grainy, but only for environment tiles cuz there’s no big changes visually compared to redrawing them every frame. Unfortunately it doesn’t seem to be doing much in terms of efficiency. I also designed levels 28 and 29 (ss of level 29 attached), and playtested every level from 1 to 28 and adjusted each one to remove any unwanted ways you can cheese a level, as well as to just make some of them less punishing for small mistakes. I also (FINALLY) designed level 6. I added extra sections and polished up some elements that were making the level impossible if you didn’t play it perfectly. I did 2 other things as well: I made it so blocks can’t be pushed by any character other than the square (before you could just push blocks w/ anything) and I reduced horizontal movespeed in zero-g. There’s still a lot more I have to do, mainly ui/menu stuff and visual polish. Challenges: Black hole physics took me a while since my first few implementations were completely wrong, and then I locked in nd figured out how to make it pull correctly. Also, level design is proving to be surprisingly challenging, I rly didn’t think it would take this long, but what with conceptualizing + creating + playtesting each level, especially the later ones where I want to make them more complex and difficult, it eats up a lot of time per level. Even going back through older levels and tweaking them can take a while, cuz you gotta track down all the problematic sections and figure out how to fix them. I also have a humble 18 more days till school starts so I gotta lock in🙏 AI used, if any: None, level design is hard but its not THAT hard Plans for next time: Finish level 30, playtest levels 29 and 30, and hopefully get started on + finish a main menu and level select menu. Im so behind on my schedule it aint even funny so wish me luck"}, {"post_id": 49286, "ts": "2026-08-18T00:22:13Z", "hours": 10.0053, "text": "Unnamed Platformer - Devlog 15 Actually got a lot done over the last few days ig What I did: first off, I reset my old changes and made it so env tiles layer over obstacles. At first I tried to assign an individual character to each combination (spike in water, block in zero-gravity, etc etc) but that didn’t work since I couldn’t get them to lay over each other. So what I did is I split my statictilelist into two: statictilelist now held all non-moving entities like spikes, ground, etc. while envtilelist held all my environment tiles. Then I changed my map loading function to take two map strings: one assigned tiles based on entities and the other pass assigned them based on environment. And now I can lay environments over things without breaking my game! Yippee! I also fixed an issue where blocks could clip through obstacles in zero-g when you moved them upward. The issue was blocks unconditionally being mtv-moved when the player was below them, so the player forced them through anything. I added an extra check before mtv-moving and made obstacle detection variables global to fix it. I also ran into an issue where spikes would incorrectly kill you even if you were not touching them, just near: the issue was that I wasn’t running SAT collision, just going straight to death logic if the initial AABB check turned out true (I run an AABB check first because running SAT for everything makes the game super laggy). both of these lowkey took me a while 😭 As for level design I reworked level 6 (still can’t play it) and level 17 (finished), and I designed levels 18-25 (I attached a video of level 24). Also in the vid I switched shapes randomly, that’s just because I had different keybinds earlier and it was js muscle memory kicking in. Challenges: Aside from a bunch of small bugs, the biggest challenges were the issue where spikes would kill you even if you weren’t touching them and the issue with blocks being pushed up forever in zerog. Even then, for both issues it was still easy to fix since it was easy to diagnose and a few lines per fix, even if it took me a while to find those few lines 🥀🥀 However, there’s still an issue where blocks sink slightly upon spawning in zero-g. This makes it impossible to play level 6, so I’ll have to look into/rework/do something to zero-g logic because I really want to keep its existing level mechanic. AI used, if any: None 🔥 Plans for next time: Finish levels 26-30, finish level 6, and test all the levels to make sure they’re not too hard/impossible/possible to cheese. Aside from that, I’ll most likely bring back the texture thing I implemented last time cuz it did actually make the game run a bit smoother, but I’ll only do it for environment tiles. K bye guys"}, {"post_id": 46621, "ts": "2026-08-14T00:27:19Z", "hours": 10.0767, "text": "Unnamed Platformer - Devlog 14 I’m genuinely so done What I did: I designed levels 5 and 7-16 (ss of a few levels should be attached idk which they are). I have a cool idea in mind for level 6 but my current code makes it hard to implement, and I also have a cool idea in mind for level 17 but my code made it hard to implement. So I changed everything up like an idiot. My 17th level features a massive pool, but that requires me to draw 1000+ water tiles. Since I redraw tiles every frame, it causes a big load on the computer. So I had the brilliant idea of creating an sf::RenderTexture . spoiler it’s not so brilliant. That led to a massive chain reaction where there were a bunch of nullptr issues at first, which I spent about 40 minutes on before actually getting the game to run. Then everything was super grainy due to aliasing issues caused by drawing everything to a RenderTexture, PLUS since I was drawing everything at the start of the frame and not updating it, stuff like buttons and doors would never update. SO, my dumb ahh moved half my static/environment tiles to dynamictilelist , reserved for strictly blocks which are the only tiles that can change position, and I did this cuz these would draw every frame and they didn’t have the same grainy look as the ones drawn to a texture. the result is probably self explanatory. That caused SO MANY ISSUES that I can’t even begin to describe them all, so after 50 minutes I undid 50 minutes worth of changes, added some spaghetti code to make it a bit more presentable, and call it a day. Challenges: Level design was fun, and easy. I did that for all of yesterday and the first half-ish of today. The vain attempt at making my code more efficient by changing how static tiles were drawn and then going on to deeply regret it and consider undoing it all the next day, was not. Also I probably shouldn’t have bothered trying seeing as I was pretty tired anyway, but ig my stupidity/ambition/idek led me to try. I’m genuinely too tired to bother elaborating, but it goes somewhat like this: I started on the texture-caching thing -> I ran into nullptr errors -> I got those out of the way -> I ran into issues with rendering and updating -> out of frustration I undid all my progress and started anew -> I decided to implement anti-aliasing -> I will probably(definitely) reset my code to where I had been right before I decided to do this stupid implementation AI used, if any: none. If I had I would’ve probably been done with this bs by now. Plans for next time: Realistically I’ll likely just undo all the changes I made to drawing processes, find out how to draw environment tiles underneath other entities/obstacles (which will be useful for many of my levels with spikes or the like in environments), and…thats it. Also, for level design, I want to have all preliminary designs down by the end of this Sunday (3 more days), and then I can playtest and refine later. I wanna cry P.S. the level with the white room is level 6 and it’s currently unfinished lmao"}, {"post_id": 44761, "ts": "2026-08-10T19:13:08Z", "hours": 9.9139, "text": "Unnamed Platformer - Devlog 13 No motivation… What I did: I solved the issue of vertically stacked blocks clipping through each other and through the player, which was a pretty big chunk of my time since I went through like 10 different approaches and changed up a bunch of stuff along the way. I ended up taking out the SAT collision function I had built and just plugging mtvCheck() (which checks the mtv( )) and the movement logic straight into the collision loops instead. I had to reorder a good chunk of logic too since a lot of the clipping was coming from stuff resolving in the wrong order relative to other stuff. Also did some cleanup: deleted the grounded member off the block class since entity already has one and I was just using two variables for the same thing like an idiot. I added an R keybind so I can restart instantly instead of walking into a spike every time I want to reset (useful for testing + as an actual game feature). I also made the player’s rotation reset on spawn so you don’t respawn tilted at some weird angle from your last death and shrunk the spike hitbox down a bit from 20x20 to 18x18 because I was dying to one-pixel overlaps that looked like it shouldn’t have counted and that are pretty frustrating to deal with. Also did a bunch of level design. I’ve only done levels 1 through 4 so I lowkey gotta lock in. Challenges: The stacked block thing took forever because the symptoms kept changing depending on how many blocks were stacked, which direction they were pushed from, whether the player was involved, etc etc, so it never felt like I was chasing ONE bug, more like four bugs wearing a trenchcoat. Eventually I just started brute-force testing every combo I could think of (2 stacked, 3 stacked, stacked + pushed, stacked + player jumping into it) until I ran out of ways to break it. Also I ran into some issues when designing levels: blockonhead , which makes it so you cannot jump if a block is on your head, was triggering if any block was lined up above your head, even if it was like on a platform way above you. I managed to fix that, and other than that + the block issue there wasn’t too many big obstacles this time. AI used, if any: none, since I’m not using it at all for game design and didn’t need to use it to solve block clipping issues since I just brute forced a bunch of possible solutions. Plans for next time: More level design…I’ll try to get most of the levels done by next devlog. K bye guys"}, {"post_id": 37384, "ts": "2026-07-30T02:06:51Z", "hours": 9.8561, "text": "Unnamed Platformer - Devlog 12 Man* Realizes True Meaning of ‘If it ain’t broke, don’t fix it’ What I did: First I ported pushable blocks to SAT collision so they use the same system as the player and it’s not split between two systems. Well. That broke blocks. so I spent 2 hours or so cross referencing my old versions and adding and deleting changes till it started working again. After that, I made sure blocks moved properly in zero-g. (they didn’t so I had to fix that too) Aside from that, I made a bunch of miscellaneous changes, such as fixing level progression bugs and altering player constants, but most importantly making sure blocks worked properly. Somewhere along the line I was investigating how stacked blocks interacted. I noticed they were clipping through the ground because of collision checks happening after the position of blocks was updated, and after some thought I tried adding another collision check pass to my main game loop. It worked like a charm! I added two extra checks for safety and it stopped working like a charm. The issue is my checkCollisions function is hella inefficient. 500+ lines of searching through every character in the tilemap (36x64, plus an extra column for new lines making it 36x65=2340) 6 times (!!!) Not only that, in some cases (block/player collision detection) I was nesting full passes within full passes, which caused insane lag, especially with my SAT collision which does a lot of math each frame. So I decided I wanted it to be more efficient (spoiler: it’s not efficient yet). I split my old tilelist into static tiles and dynamic tiles…and instantly regretted it. Challenges: Basically when I split tilelist into two separate vectors ( statictilelist which is everything except for blocks + dynamictilelist which is just blocks since nothing else moves lmao), I think I accidentally deleted a lot of existing logic that was the duct tape to my spaghetti code**. Aside from that, when I passed through tilelist it always passed through every tile, but with my new logic I had to decide which one to use. my stupid ahh didnt realize that there might be a chance I have to pass through both of them though 😭 well guess what there were a lot more gaps in my logic. All of these combined into the logic I had spent the last few hours working so hard to perfect, falling apart in 5 seconds. Similar to the whole block to SAT thing I worked out most of the issues just by adding, tweaking, and removing a bunch of checks as well as looking back at my old logic to figure out what I forgot. Among these general changes I also added a new grounded member to the block class, and tried to get it to register if it’s on top of a player. Unfortunately it didn’t work. It’s ok I’ll brute force my way to the root of the problem tomorrow. (Btw this doesn’t even cover the issues I faced prior to this😭 ✌️ ) AI used, if any: Now that the core elements of the game (physics) are out of the way, I’ve pretty much been grinding through bugs myself since it’s just existing logic and I’m not really adding much that’s new or unfamiliar. Honestly, I think it’s gonna stay this way because I don’t intend to use AI to design the game, I was using it more to help solve physics issues and the like. Plans for next time: I’ll try to hopefully fix the new block clipping issues. then idek anymore. Maybe i shouldn’t have tried to build the engine from scratch. K bye guys *I’m not actually over 18 **Tuff line?"}, {"post_id": 35959, "ts": "2026-07-27T19:01:15Z", "hours": 9.8747, "text": "Unnamed Platformer - Devlog 11 Rotation is finally working! Mostly. Anyway I have to post now cuz of the 10 hour limit per devlog. What I did: I fully implemented rolling and rotation physics across all player shapes! Shapes now physically rotate based on movement speed, tip over cliff edges, and smoothly snap back to a flat face when you stop moving. I also added a feature where shapes automatically realign when entering water or zero-G. To make everything smooth and frame-rate independent, I overhauled the settling and snapping math using fmod for shortest-path rotation and wrap-around handling. Challenges: Getting the angle snapping and tipping logic to work was the biggest hurdle. Non-square shapes were getting locked out of tipping due to floating-point issues, which I fixed with an epsilon tolerance check. There are still a couple of bugs that I’ll tackle later, notably the fact that shapes sometimes spin an extra time upon settling. but the core system is more or less functional now. AI used, if any: I managed to work out the math myself but I needed to ask AI with help debugging. Plans for next time: I’ll probably work on some visual effects for the next couple days + fine-tune and debug my physics a bit more. K bye guys"}, {"post_id": 33845, "ts": "2026-07-24T02:43:36Z", "hours": 7.1331, "text": "Unnamed Platformer - Devlog 10 I’m tired 😭 What I did: I ported the rest of my entities over to SAT collision. Every tile that can be collided with now uses SAT. I refactored some of my functions to handle the new logic properly across the board, and got rid of the old standalone AABB collision code for ground tiles. I also decided to make pushable blocks hybrid for simplicity: aside from general environment collisions which use SAT, I didn’t change much of the old AABB code. I also added an O(1) center/radius projection for circles to fix random micro-stutters, and updated drawdebug() so it stops drawing every vertex and instead renders one dynamic vector targeting the nearest tile vertex. (Circles in SFML are actually 30-sided polygons, so earlier the collision checks were looking at 15 different axes + all those axes were being drawn in the debug overlay.) Challenges: Thankfully most of the porting to SAT stuff was easy, I only had a couple of minor setbacks here and there. However, the harder part was getting the circle center-to-vertex collision logic down. I had to find out how to do it + add completely new logic to my function + add checks in my collision code to determine if the shape was a circle + rewrite my drawdebug() code. It took a while and a lot of my sanity but I got it done in the end AI used, if any: Used AI to help debug the updated circle collision detection system + its separate debug overlay code. Plans for next time: I’m going to work on rolling physics for real. I hope it goes well 👍 K bye guys"}, {"post_id": 32739, "ts": "2026-07-22T02:37:49Z", "hours": 9.0553, "text": "Unnamed Platformer - Devlog 9 I was “busy” watching the World Cup bronze/final matches over the weekend. No way we got a 10 goal third place game while everyone started throwing hands at the end of the final😭 What I did: I finally got started on SAT collision like I said I would, and it’s actually working! Mostly. I built all the fundamentals so far: vertex extraction, edge normal calculation, projection ranges, minimum translation vector (MTV) calculation, etc etc. I hooked it into checkCollisions for ground tiles, and the MTV push resolution actually stops shapes from clipping through geometry now, and it’s also sign-corrected and whatnot so it always pushes the right direction. I also made a debug overlay that draws vertices and axis normals directly in the game window, which saved my sanity countless times and looks pretty cool too. On top of collision math I had to go back and fix 3 out of my 5 characters’ movement code because switching to SAT caused bugs in features that worked just fine under the old AABB system, aside from all the general bugs I had to deal with. The hexagon’s double jump stopped working entirely, circle’s acceleration started randomly resetting mid-sprint, and octagon’s wall jump turned into an absolute mess (more on that below). The main thing was that my old flags for checking wall collisions were set with assumptions that crumble once you switch from checking 4 fixed direction to a bunch of axes. Challenges: Oh boy… The wall jump bug was hella frustrating: after switching to SAT, the octagon would do exactly one wall jump and then just slide down the second, no matter how many times I hit jump. It took me forever to figure out it was a chain of three separate bugs stacked on top of each other: wall contact flags getting cleared before the function ever read them, my walljumped flag never resetting between wall touches so it permanently locked my horizontal movement, and then once THAT was fixed, SAT was re-zeroing my wall-jump velocity on the same frame it fired because the player was technically still overlapping the wall geometry. So I fixed those and immediately got a NEW bug where wall jumping turned into a pogo stick that spam-bounced me up the wall, because a vertical MTV was getting misread as “landed on the ground,” which reset the wall jump lock and let it refire every single frame. Also spent quite a bit of time before realizing this one line I had, if (grounded) velocity.y = 0 , worked fine with AABB but not so much with SAT’s own grounding logic, since my SAT function sets grounded = true when it sees downward velocity, and that line was zeroing velocity before SAT checked it. Removed it and a lot of my bugs disappeared. AI used, if any: SAT math I mostly figured out myself, after reading through a ton of Stack Overflow threads, articles, watching a lot of YT videos, etc. on my own time. I did use AI to clarify/debug a couple of parts though. However, I ended up needing it a lot more for debugging the problems that stemmed from it, i.e. the octagon, hexagon and circle issues. Plans for next time: SAT works for ground tiles but I’ve still got all my other entities on the old AABB system so I gotta port those over. Although, probably the biggest thing is trying to make my code more efficient because sometimes the game randomly slows down/freezes and makes random clips occur. If this isn’t lag (which it might not be, I could just be stupid) I’ll still have to look into whats happening. Then, once ground collision is 100% finished: rolling physics, aka the reason I made this change in the first place. Gonna have to look into the math/physics behind that, but it should be pretty easy since I already got this down. Once this is done, the shapes should be tipping and rolling around instead of just sliding around like ice cubes. We’ll see how that goes. K bye guys"}, {"post_id": 30455, "ts": "2026-07-18T00:46:19Z", "hours": 6.8525, "text": "Unnamed Platformer - Devlog 8 Bro idk What I did: I finally wrapped up the character roster by implementing and debugging the last two shapes: the hexagon and the octagon. The biggest milestone was completely overhauling and fixing the wall jump implementation for the octagon (which took me like 1.5 hrs out of which 50 minutes worth of changes were discarded). I ended up shifting all the wall-jump physics directly into the jump event handler, rather than splitting the logic between two different functions (my jump and updatepos functions). This allowed me to make it so I can properly maintain and destroy momentum for wall bounces On top of physics stuff, I built the level progression system. When you touch the exit tile, the game increases your level index and loads the next stage. It’s finally starting to feel like a real game! Although, not really, since every level after the second is the exact same weird ahh testing level cuz I needed to make sure my system worked. Challenges: The real nightmare was the octagon’s wall jump. I spent about 50 minutes writing changes because the physics wouldn’t cooperate, only to discard them because I got too confused 🥀I had half of the wall jump math in jump() and the other half in updatepos() and it was making the normal movement code immediately overwrite/neutralize the walljump code the very next frame. Another thing was making it so you couldnt just hold down the w or up key and automatically bounce up forever. I had to add an input debounce check so you have to release+re-tap the key to jump again. Everything else was honestly smooth sailing and any other bugs took maybe <15 mins to solve. AI used, if any: I didn’t use much AI, since the two big features I added were pretty easy to implement/debug, but I did ask it to help me a bit with wall jump logic since I was pretty fried. Plans for next time: Now that the physics is working, I’ve decided I want to get rid of it all. Sliding shapes feel hella unnatural (also the hitboxes are pretty weird), so I’ve decided on making the shapes roll around/have accurate hitboxes using SAT (Separating Axis Theorem) vector math. I asked Gemini how long it would take and it literally told me to avoid it if I can 😭 so we’ll see how many hairs I lose over the course of trying to implement SAT. It’ll probably be all I do from now until around the start of August when I’ll be going on vacation K bye guys"}, {"post_id": 29243, "ts": "2026-07-16T00:59:37Z", "hours": 6.4681, "text": "Unnamed Platformer - Devlog 7 I typed words into a code editor and made shapes move around What I did: I finally took on the shape-switching system and got it working! I had to completely change how the player class worked, so I made it into a pure virtual class to handle polymorphism (which lets me switch between different shapes) and replaced the old static player setup with a dynamic shape-switching state w/ unique pointers. For shapes so far I implemented the circle with rolling physics and friction, and the triangle which can teleport forward a short distance. Also, keeping source code in header files was causing circular include errors, so I reorganized all the player class code into a brand new players.cpp file. And finally I made it so falling below the screen kills the player, which is a pretty small feature but still. Pretty much what was happening was that I needed to access my tilesettings.h file in my players.h class for movement-related checks, but tilesettings.h also needed players.h for hitbox/collision stuff. So I had to take out my code from my player header file and move it to player.cpp , which was lowkey a nightmare since I ran into a bunch of compiler and linker errors that took me an hour to fix😭 Anyway, Gemini helped rescue me (since my Claude 5-hour limit somehow ended after the first question I asked it today), so thanks Gemini. Challenges: Pretty chill today, since today was more designing and testing new features that were easy to implement; however the real nightmare was splitting my files. Moving code to players.cpp broke everything with a bunch of “multiple definition” linker errors. I didn’t define my global variables as inline at first, but since they were getting defined across many files I had mark them as inline. Also, the triangle’s teleport mechanic let you phase into solid tiles at first, so I made a position prediction system using swept AABB bounds. In fact, creating this swept check was the feature that needed me to call tilesettings.h in players.h in the first place, which led to my cortisol spiking when the compiler stopped working for an hour AI used, if any: Used Gemini to help me figure out why the compiler+linker were throwing errors, and some basic debugging in my other features. Plans for next time: I’m gonna design my other two shapes now (octagon and hexagon), then start making this into an actual game with multiple levels, progressing to the next level when you reach the finish, etc etc. Also, I feel like the sliding movement is kinda unnatural, but idk if I’m going to change it because I already have a whole system down and starting from scratch would be a chore. Anyway, I’ll think about it. K bye guys"}, {"post_id": 28035, "ts": "2026-07-14T01:42:05Z", "hours": 4.6406, "text": "Unnamed Platformer - Devlog 6 Guess what? More block physics issues! I’m gonna lose my mind! What I did: Implemented logic with the buttons and doors; now, being on a button opens a corresponding door. Also fixed EVEN MORE BUGS with block pushing logic. I also resolved block-block vertical clipping and horizontal stacking bugs. I replaced the ground collision function I had made with a manual check for blocks landing on other blocks; groundCollide (that function) was not accounting for if a block landed on top of the player. This fixes vertical clipping through players and blocks and unintentional behavior with horizontally stacked blocks. Additionally, I added a system to make sure you can’t get crushed by a door too. When I first discovered that could happen, I implemented a half baked system, but it didn’t work since it pretty much made the block/player fall through the door even if the button hadn’t been pressed prior. I replaced the old block-crush prevention logic with a new system. Now the button class has another variable, presscheck , which acts like sticky keys (idk how else to put it) even after you’re not on the button. It checks for if a player or block is within the closed door’s hitbox and if so props the door open until they leave, but it can only register that after you push the button. Challenges: Buttons not changing color; color change logic was in my constructor and not the draw function so it never updated. Other than that, general implementation was also tricky to plan out because I had to decide how they were gonna work (how buttons would be linked to doors; decided on an ID system) and then how to implement that (using dynamic casts just as my button class uses). And then the block clipping glitch was another nightmare, though it did take me less than an hour which is nice. Also, it took me a while to think of how I would figure out how to make doors not close on players/blocks, but I thought up a solution pretty quickly which is nice 👍 AI used, if any: Used Claude to help me figure out the part that stops the block from falling through the player (I was genuinely™ too exhausted with dealing with bugs to try to solve it myself 😭😭) + used Gemini and a bit of Claude for general debugging. Plans for next time: I’ll polish up some visual stuff, but I think I’ll leave block-related bugs alone for now. As you can see there are some clipping issues still with the door, but idk if I want to tackle those right now. Either way my main focus for next time (and like all of the next week or two) will be getting the shape-switching system down. I’ll also try to create some map layouts that force the player to utilize block placement on buttons to navigate doors, because it would be a shame for me to have spent all my sanity on a feature only like 5 levels use. K bye guys P.S. Last time, when I said I spent all weekend working on button-related stuff, I meant the pushable blocks too (since those can activate the buttons)"}, {"post_id": 27428, "ts": "2026-07-12T23:59:57Z", "hours": 5.0344, "text": "Unnamed Platformer - Devlog 5 I pretty much spent the last weekend working entirely on button-related stuff. Turns out there were a lot of bugs and other physics-related issues I had to address. Anyway I think they’re all good now. What I did: Day 1: I fixed a bug where nested loops using the same name (pos) caused only the first pushable block to register collisions. I also implemented a side-detection fix so the player doesn’t accidentally push blocks when standing on top of them + added a border/outline to pushable blocks for visual clarity. I also started work on button and door tile classes. Day 2: I made it so you can push blocks vertically in zero-gravity. A really big fix was a global physics bug. I had been using a gravity called blockgravity for block physics, but since it was a global variable, one block’s position dictated all the other’s physics. E.g. one block in a zero-g tile meant everything else was now unable to fall. I moved blockgravity into the block class and now a block entering a zero-g zone floats without shutting off gravity for every other block on the map. I also decided on two new features: a button that can be stood upon/have a block placed on it, and a door that opens when its button is pushed. I added each one’s sprite and loaded them into my map. Also, I made another big change to my plans: having spend so much time on block physics, I’ve decided they’ll become a core feature of the game and not just a small gimmick of the triangle shape. Challenges: The hardest problem (by miles) was the block push collision. the issue turned out to be one loop variable shadowing another, which meant only the first block in the list was ever processed. Another tricky bug was zerogactive being reset before the block push loop ran, meaning zero-g vertical pushing never triggered. Ironically I ended up removing the zero-g check because if you’re going to push a block vertically, you’re not going to be on solid ground anyway. Also I accidentally mismatched curly brackets so that made life a lot harder. Also, I faced a bunch of other bugs while trying to polish up collision. Imma be honest, about an hour or so from this devlog was useless cuz it was me trying to implement a solution, confusing myself, and just discarding all my changes😭💔 Also, I spent like 20 minutes trying to get the button looking good (it’s supposed to be an octagon, but the sides are uneven). AI used, if any: I used Claude for debugging my physics code, as well as helping me figure out why the upwards/downwards block push wasn’t working. Plans for next time: I’m going to try and begin implementing the 5 player shapes and their power-ups. I’ll start with the circle probably, since it seems the simplest (just get faster over time). Also, I’m going to make it so that each button actually is linked to a door, since right now they’re just visuals. K bye guys"}, {"post_id": 26274, "ts": "2026-07-10T23:35:39Z", "hours": 8.5728, "text": "Unnamed Platformer - Devlog 4 I hate AABB with a passion. I spent 8.5 hours over 2 days (hardest lock in yet 🔥) on 2 features and Im pretty sure there are still bugs in each. What I did: On day 1 I added collision detection for pretty much all my objects, added some custom physics (e.g. water and zero g now have custom physics), and implemented AABB collision. Since I got it working yesterday(mostly), I deleted the initial ground class I had for testing SFML and most features, as well as any related functions like the check ground function in the player class. On day 2 I spent 4 hours trying to get the block to push. It took me a while cuz I initially tried to just copy the groundcollide() function and tweak whatever I needed to. However that didn’t work, so after hitting up Stack Overflow + Claude I realized I had to change up a LOT of my pre existing code. I added a master entity class for anything that is affected by physics (all players + the block + more features in the future probably) then added more functions and commands in my checkCollisions function in order to get my block mechanic mostly working. I also ended up adding many more features to my block class(velocity, gravity, and a grounded check) since it has to react to physics and the environment. Overall the introduction of an entity class that everything else inherits from was a big help in getting the game to work properly. Challenges: my game crashed when I attempted to put the check collision function in main.cpp; then, implementing water and zero-g was a lot of trial and error not only to find physics that felt fluid but also because there were a lot of bugs in the logic as well as bugs that stopped the game from running at all. Also, it took me a while to wrap my head around AABB collision; I literally had to draw it out on a piece of paper and ask Claude to grasp the concept 😭 During bug fixes, I ended up breaking a bunch of stuff/realizing a bunch of stuff was still broken and spending a bunch of time fixing it. For example, while trying to fix collision, I ended up discovering a bug in my water/zero-g physics, and then while trying to fix that I broke my spring logic too. And creating the logic for pushing the block is a whole other can of worms. It took me 4 hours of implementing different strategies and adding different functions only to have a half baked block-pushing function. 😭 It does kind of work, but you can only push one block: any other blocks act like normal ground tiles. AI used, if any: I asked Claude for help on how to tackle block pushing logic, as well as helping me understand AABB collision. Plans for next time: I’m going to try and hopefully get all the block-pushing logic done without any issues, then fix up any collision-based bugs and work on implementing the rest of my player shapes. K bye guys"}, {"post_id": 25091, "ts": "2026-07-09T02:23:55Z", "hours": 4.3644, "text": "Unnamed Platformer - Devlog 3 My game is kind of coming together! It’ll still be many weeks, but I did something! What I did: finished my tile map parser (I decided to use a unique pointer to parse through each tile type and draw the according one, after a bit of thought). I also started working on collision detection. I created a basic checkCollisions function and added getGlobalBounds to every tile class. Before I did that though I had to do some research on Axis-Aligned Bounding Box collision, and how to implement it in SFML. I’m still far from done, but that’s tomorrow’s problem. Challenges: implementing the map drawing functions (couldn’t figure out how to get the draw functions in the classes to match up with the main class), and after that I was having a lot of trouble with the pointer logic I had implemented (had to use std::move, also there were errors in my file importing structure); then after I got that to work, and implemented the parser into main.cpp, it ended up causing my entire program to crash when I ran build 😭Ended up asking Claude for help for how to fix it; it turned out to be how I had formatted my levels and my level-parsing loop for assigning tile types to tilemap characters. Then lava, water, and zero-g block weren’t drawing properly either. After spending like an hour trying to decode why, I realized sf::Color’s transparency had to be an 8-bit integer rather than a decimal between 0 and 1. Also my doublespike was not drawing properly, so I made it 2 separate convexShape’s rather than 1. Apparently you can’t have mere points holding a single convexShape together, which kind of sucks. AI used, if any: Like I mentioned, I asked Claude for help on how to fix my level loading feature (it ended up being like 3 minute details) and also used it when debugging my initial collision functions (I ended up replacing <10 lines total by its suggestion). Plans for next time: I’m going to try to finish collision. That’s my entire goal, since I still don’t know entirely how I’m gonna deal with every collision possible and it might end up taking me a long time depending on the number of mistakes I make/bugs that pop up. K bye guys (btw the music in the background is because I was listening to music while I was working on this)"}, {"post_id": 23883, "ts": "2026-07-07T02:36:17Z", "hours": 3.9897, "text": "Unnamed Platformer - Devlog 2 I was a little busy yesterday but we’re back on track now. What I did: I think I got a solid amount done today and for a bit of time yesterday: I added a camera feature that scrolls with the player, created the tile map and tile types, and designed the first part of the tile map parser; also changed the background slightly and researched more on building tilemap loaders in SFML (YouTube videos + looking at Github repos and articles). Challenges: For a zero-gravity section I’m thinking of adding, I wanted to put thin gray stripes in those sections. I couldn’t figure out how to do that, so I just decided to depict it as a translucent white block. Also determining the coordinates of the spring pad in the game took a while too. Overall, my other challenges were mostly small bugs and didnt stand out too much. AI used, if any: Used Claude for debugging the switch case for my tile map parser. Also, not AI, but my camera system was more or less entirely designed using a YouTube video that I’ll credit in my readme later. Plans for next time: I want to finish my tile map parser and get an actual level loaded. I’m also going to start deciding what the UI will look like for the main menu, level selects, and pause menu. K bye guys"}, {"post_id": 22443, "ts": "2026-07-04T22:13:21Z", "hours": 3.4311, "text": "Unnamed Platformer - Devlog 1 It’s finally time for me to lock in. This is gonna be a big project to which I hope to add a lot of content, and I’m hoping I can accumulate a lot of good hours from this project. What I did: I set up SFML (the library I’m using to code this game), set up the required files, watched a lot of YouTube videos to get more familiar with SFML, and coded a basic thing where you control a square and jump around. Challenges: This is like my second time using SFML (I used it once for a small project a while ago), so I’m not that familiar with it. No worries though, as it’s nothing a bunch of YouTube videos can’t fix. Also, today was kind of a refresher for my barely existent SFML skills. AI used, if any: I used Claude for learning how to set up SFML and asking it for help on how to fix my jump button not working. (I was missing two characters. : \\ ) Plans for next time: I’ll try to add actual platforms, maybe working obstacles as well. I’ll focus on adding a menu some other time, and actual styling will come much later so the game is gonna look ahh for now. All my devlogs will pretty much follow the format of this one(accomplishments, challenges, plans, additional notes) so that I can lazily copy-paste the same template when I don’t feel like writing a whole new devlog each devlog will feel connected/cohesive and make it easier for readers to follow along on my journey."}]...
|
Title: Stardancer (formerly Unnamed Platformer) by Title: Stardancer (formerly Unnamed Platformer) by @zahran | Stardance
Devlogs:
Unnamed Platformer - Devlog 1 It’s finally time for me to lock in. This is gonna be a big project to which I hope to add a lot of content, and I’m hoping I can accumulate a lot of good hours from this project. What I did: I set up SFML (the library I’m using to code this game), set up the required files, watched a lot of YouTube videos to get more familiar with SFML, and coded a basic thing where you control a square and jump around. Challenges: This is like my second time using SFML (I used it once for a small project a while ago), so I’m not that familiar with it. No worries though, as it’s nothing a bunch of YouTube videos can’t fix. Also, today was kind of a refresher for my barely existent SFML skills. AI used, if any: I used Claude for learning how to set up SFML and asking it for help on how to fix my jump button not working. (I was missing two characters. : \ ) Plans for next time: I’ll try to add actual platforms, maybe working obstacles as well. I’ll focus on adding a menu some other time, and actual styling will come much later so the game is gonna look ahh for now. All my devlogs will pretty much follow the format of this one(accomplishments, challenges, plans, additional notes) so that I can lazily copy-paste the same template when I don’t feel like writing a whole new devlog each devlog will feel connected/cohesive and make it easier for readers to follow along on my journey.
Unnamed Platformer - Devlog 2 I was a little busy yesterday but we’re back on track now. What I did: I think I got a solid amount done today and for a bit of time yesterday: I added a camera feature that scrolls with the player, created the tile map and tile types, and designed the first part of the tile map parser; also changed the background slightly and researched more on building tilemap loaders in SFML (YouTube videos + looking at Github repos and articles). Challenges: For a zero-gravity section I’m thinking of adding, I wanted to put thin gray stripes in those sections. I couldn’t figure out how to do that, so I just decided to depict it as a translucent white block. Also determining the coordinates of the spring pad in the game took a while too. Overall, my other challenges were mostly small bugs and didnt stand out too much. AI used, if any: Used Claude for debugging the switch case for my tile map parser. Also, not AI, but my camera system was more or less entirely designed using a YouTube video that I’ll credit in my readme later. Plans for next time: I want to finish my tile map parser and get an actual level loaded. I’m also going to start deciding what the UI will look like for the main menu, level selects, and pause menu. K bye guys
Unnamed Platformer - Devlog 3 My game is kind of coming together! It’ll still be many weeks, but I did something! What I did: finished my tile map parser (I decided to use a unique pointer to parse through each tile type and draw the according one, after a bit of thought). I also started working on collision detection. I created a basic checkCollisions function and added getGlobalBounds to every tile class. Before I did that though I had to do some research on Axis-Aligned Bounding Box collision, and how to implement it in SFML. I’m still far from done, but that’s tomorrow’s problem. Challenges: implementing the map drawing functions (couldn’t figure out how to get the draw functions in the classes to match up with the main class), and after that I was having a lot of trouble with the pointer logic I had implemented (had to use std::move, also there were errors in my file importing structure); then after I got that to work, and implemented the parser into main.cpp, it ended up causing my entire program to crash when I ran build 😭Ended up asking Claude for help for how to fix it; it turned out to be how I had formatted my levels and my level-parsing loop for assigning tile types to tilemap characters. Then lava, water, and zero-g block weren’t drawing properly either. After spending like an hour trying to decode why, I realized sf::Color’s transparency had to be an 8-bit integer rather than a decimal between 0 and 1. Also my doublespike was not drawing properly, so I made it 2 separate convexShape’s rather than 1. Apparently you can’t have mere points holding a single convexShape together, which kind of sucks. AI used, if any: Like I mentioned, I asked Claude for help on how to fix my level loading feature (it ended up being like 3 minute details) and also used it when debugging my initial collision functions (I ended up replacing <10 lines total by its suggestion). Plans for next time: I’m going to try to finish collision. That’s my entire goal, since I still don’t know entirely how I’m gonna deal with every collision possible and it might end up taking me a long time depending on the number of mistakes I make/bugs that pop up. K bye guys (btw the music in the background is because I was listening to music while I was working on this)
Unnamed Platformer - Devlog 4 I hate AABB with a passion. I spent 8.5 hours over 2 days (hardest lock in yet 🔥) on 2 features and Im pretty sure there are still bugs in each. What I did: On day 1 I added collision detection for pretty much all my objects, added some custom physics (e.g. water and zero g now have custom physics), and implemented AABB collision. Since I got it working yesterday(mostly), I deleted the initial ground class I had for testing SFML and most features, as well as any related functions like the check ground function in the player class. On day 2 I spent 4 hours trying to get the block to push. It took me a while cuz I initially tried to just copy the groundcollide() function and tweak whatever I needed to. However that didn’t work, so after hitting up Stack Overflow + Claude I realized I had to change up a LOT of my pre existing code. I added a master entity class for anything that is affected by physics (all players + the block + more features in the future probably) then added more functions and commands in my checkCollisions function in order to get my block mechanic mostly working. I also ended up adding many more features to my block class(velocity, gravity, and a grounded check) since it has to react to physics and the environment. Overall the introduction of an entity class that everything else inherits from was a big help in getting the game to work properly. Challenges: my game crashed when I attempted to put the check collision function in main.cpp; then, implementing water and zero-g was a lot of trial and error not only to find physics that felt fluid but also because there were a lot of bugs in the logic as well as bugs that stopped the game from running at all. Also, it took me a while to wrap my head around AABB collision; I literally had to draw it out on a piece of paper and ask Claude to grasp the concept 😭 During bug fixes, I ended up breaking a bunch of stuff/realizing a bunch of stuff was still broken and spending a bunch of time fixing it. For example, while trying to fix collision, I ended up discovering a bug in my water/zero-g physics, and then while trying to fix that I broke my spring logic too. And creating the logic for pushing the block is a whole other can of worms. It took me 4 hours of implementing different strategies and adding different functions only to have a half baked block-pushing function. 😭 It does kind of work, but you can only push one block: any other blocks act like normal ground tiles. AI used, if any: I asked Claude for help on how to tackle block pushing logic, as well as helping me understand AABB collision. Plans for next time: I’m going to try and hopefully get all the block-pushing logic done without any issues, then fix up any collision-based bugs and work on implementing the rest of my player shapes. K bye guys
Unnamed Platformer - Devlog 5 I pretty much spent the last weekend working entirely on button-related stuff. Turns out there were a lot of bugs and other physics-related issues I had to address. Anyway I think they’re all good now. What I did: Day 1: I fixed a bug where nested loops using the same name (pos) caused only the first pushable block to register collisions. I also implemented a side-detection fix so the player doesn’t accidentally push blocks when standing on top of them + added a border/outline to pushable blocks for visual clarity. I also started work on button and door tile classes. Day 2: I made it so you can push blocks vertically in zero-gravity. A really big fix was a global physics bug. I had been using a gravity called blockgravity for block physics, but since it was a global variable, one block’s position dictated all the other’s physics. E.g. one block in a zero-g tile meant everything else was now unable to fall. I moved blockgravity into the block class and now a block entering a zero-g zone floats without shutting off gravity for every other block on the map. I also decided on two new features: a button that can be stood upon/have a block placed on it, and a door that opens when its button is pushed. I added each one’s sprite and loaded them into my map. Also, I made another big change to my plans: having spend so much time on block physics, I’ve decided they’ll become a core feature of the game and not just a small gimmick of the triangle shape. Challenges: The hardest problem (by miles) was the block push collision. the issue turned out to be one loop variable shadowing another, which meant only the first block in the list was ever processed. Another tricky bug was zerogactive being reset before the block push loop ran, meaning zero-g vertical pushing never triggered. Ironically I ended up removing the zero-g check because if you’re going to push a block vertically, you’re not going to be on solid ground anyway. Also I accidentally mismatched curly brackets so that made life a lot harder. Also, I faced a bunch of other bugs while trying to polish up collision. Imma be honest, about an hour or so from this devlog was useless cuz it was me trying to implement a solution, confusing myself, and just discarding all my changes😭💔 Also, I spent like 20 minutes trying to get the button looking good (it’s supposed to be an octagon, but the sides are uneven). AI used, if any: I used Claude for debugging my physics code, as well as helping me figure out why the upwards/downwards block push wasn’t working. Plans for next time: I’m going to try and begin implementing the 5 player shapes and their power-ups. I’ll start with the circle probably, since it seems the simplest (just get faster over time). Also, I’m going to make it so that each button actually is linked to a door, since right now they’re just visuals. K bye guys
Unnamed Platformer - Devlog 6 Guess what? More block physics issues! I’m gonna lose my mind! What I did: Implemented logic with the buttons and doors; now, being on a button opens a corresponding door. Also fixed EVEN MORE BUGS with block pushing logic. I also resolved block-block vertical clipping and horizontal stacking bugs. I replaced the ground collision function I had made with a manual check for blocks landing on other blocks; groundCollide (that function) was not accounting for if a block landed on top of the player. This fixes vertical clipping through players and blocks and unintentional behavior with horizontally stacked blocks. Additionally, I added a system to make sure you can’t get crushed by a door too. When I first discovered that could happen, I implemented a half baked system, but it didn’t work since it pretty much made the block/player fall through the door even if the button hadn’t been pressed prior. I replaced the old block-crush prevention logic with a new system. Now the button class has another variable, presscheck , which acts like sticky keys (idk how else to put it) even after you’re not on the button. It checks for if a player or block is within the closed door’s hitbox and if so props the door open until they leave, but it can only register that after you push the button. Challenges: Buttons not changing color; color change logic was in my constructor and not the draw function so it never updated. Other than that, general implementation was also tricky to plan out because I had to decide how they were gonna work (how buttons would be linked to doors; decided on an ID system) and then how to implement that (using dynamic casts just as my button class uses). And then the block clipping glitch was another nightmare, though it did take me less than an hour which is nice. Also, it took me a while to think of how I would figure out how to make doors not close on players/blocks, but I thought up a solution pretty quickly which is nice 👍 AI used, if any: Used Claude to help me figure out the part that stops the block from falling through the player (I was genuinely™ too exhausted with dealing with bugs to try to solve it myself 😭😭) + used Gemini and a bit of Claude for general debugging. Plans for next time: I’ll polish up some visual stuff, but I think I’ll leave block-related bugs alone for now. As you can see there are some clipping issues still with the door, but idk if I want to tackle those right now. Either way my main focus for next time (and like all of the next week or two) will be getting the shape-switching system down. I’ll also try to create some map layouts that force the player to utilize block placement on buttons to navigate doors, because it would be a shame for me to have spent all my sanity on a feature only like 5 levels use. K bye guys P.S. Last time, when I said I spent all weekend working on button-related stuff, I meant the pushable blocks too (since those can activate the buttons)
Unnamed Platformer - Devlog 7 I typed words into a code editor and made shapes move around What I did: I finally took on the shape-switching system and got it working! I had to completely change how the player class worked, so I made it into a pure virtual class to handle polymorphism (which lets me switch between different shapes) and replaced the old static player setup with a dynamic shape-switching state w/ unique pointers. For shapes so far I implemented the circle with rolling physics and friction, and the triangle which can teleport forward a short distance. Also, keeping source code in header files was causing circular include errors, so I reorganized all the player class code into a brand new players.cpp file. And finally I made it so falling below the screen kills the player, which is a pretty small feature but still. Pretty much what was happening was that I needed to access my tilesettings.h file in my players.h class for movement-related checks, but tilesettings.h also needed players.h for hitbox/collision stuff. So I had to take out my code from my player header file and move it to player.cpp , which was lowkey a nightmare since I ran into a bunch of compiler and linker errors that took me an hour to fix😭 Anyway, Gemini helped rescue me (since my Claude 5-hour limit somehow ended after the first question I asked it today), so thanks Gemini. Challenges: Pretty chill today, since today was more designing and testing new features that were easy to implement; however the real nightmare was splitting my files. Moving code to players.cpp broke everything with a bunch of “multiple definition” linker errors. I didn’t define my global variables as inline at first, but since they were getting defined across many files I had mark them as inline. Also, the triangle’s teleport mechanic let you phase into solid tiles at first, so I made a position prediction system using swept AABB bounds. In fact, creating this swept check was the feature that needed me to call tilesettings.h in players.h in the first place, which led to my cortisol spiking when the compiler stopped working for an hour AI used, if any: Used Gemini to help me figure out why the compiler+linker were throwing errors, and some basic debugging in my other features. Plans for next time: I’m gonna design my other two shapes now (octagon and hexagon), then start making this into an actual game with multiple levels, progressing to the next level when you reach the finish, etc etc. Also, I feel like the sliding movement is kinda unnatural, but idk if I’m going to change it because I already have a whole system down and starting from scratch would be a chore. Anyway, I’ll think about it. K bye guys
Unnamed Platformer - Devlog 8 Bro idk What I did: I finally wrapped up the character roster by implementing and debugging the last two shapes: the hexagon and the octagon. The biggest milestone was completely overhauling and fixing the wall jump implementation for the octagon (which took me like 1.5 hrs out of which 50 minutes worth of changes were discarded). I ended up shifting all the wall-jump physics directly into the jump event handler, rather than splitting the logic between two different functions (my jump and updatepos functions). This allowed me to make it so I can properly maintain and destroy momentum for wall bounces On top of physics stuff, I built the level progression system. When you touch the exit tile, the game increases your level index and loads the next stage. It’s finally starting to feel like a real game! Although, not really, since every level after the second is the exact same weird ahh testing level cuz I needed to make sure my system worked. Challenges: The real nightmare was the octagon’s wall jump. I spent about 50 minutes writing changes because the physics wouldn’t cooperate, only to discard them because I got too confused 🥀I had half of the wall jump math in jump() and the other half in updatepos() and it was making the normal movement code immediately overwrite/neutralize the walljump code the very next frame. Another thing was making it so you couldnt just hold down the w or up key and automatically bounce up forever. I had to add an input debounce check so you have to release+re-tap the key to jump again. Everything else was honestly smooth sailing and any other bugs took maybe <15 mins to solve. AI used, if any: I didn’t use much AI, since the two big features I added were pretty easy to implement/debug, but I did ask it to help me a bit with wall jump logic since I was pretty fried. Plans for next time: Now that the physics is working, I’ve decided I want to get rid of it all. Sliding shapes feel hella unnatural (also the hitboxes are pretty weird), so I’ve decided on making the shapes roll around/have accurate hitboxes using SAT (Separating Axis Theorem) vector math. I asked Gemini how long it would take and it literally told me to avoid it if I can 😭 so we’ll see how many hairs I lose over the course of trying to implement SAT. It’ll probably be all I do from now until around the start of August when I’ll be going on vacation K bye guys
Unnamed Platformer - Devlog 9 I was “busy” watching the World Cup bronze/final matches over the weekend. No way we got a 10 goal third place game while everyone started throwing hands at the end of the final😭 What I did: I finally got started on SAT collision like I said I would, and it’s actually working! Mostly. I built all the fundamentals so far: vertex extraction, edge normal calculation, projection ranges, minimum translation vector (MTV) calculation, etc etc. I hooked it into checkCollisions for ground tiles, and the MTV push resolution actually stops shapes from clipping through geometry now, and it’s also sign-corrected and whatnot so it always pushes the right direction. I also made a debug overlay that draws vertices and axis normals directly in the game window, which saved my sanity countless times and looks pretty cool too. On top of collision math I had to go back and fix 3 out of my 5 characters’ movement code because switching to SAT caused bugs in features that worked just fine under the old AABB system, aside from all the general bugs I had to deal with. The hexagon’s double jump stopped working entirely, circle’s acceleration started randomly resetting mid-sprint, and octagon’s wall jump turned into an absolute mess (more on that below). The main thing was that my old flags for checking wall collisions were set with assumptions that crumble once you switch from checking 4 fixed direction to a bunch of axes. Challenges: Oh boy… The wall jump bug was hella frustrating: after switching to SAT, the octagon would do exactly one wall jump and then just slide down the second, no matter how many times I hit jump. It took me forever to figure out it was a chain of three separate bugs stacked on top of each other: wall contact flags getting cleared before the function ever read them, my walljumped flag never resetting between wall touches so it permanently locked my horizontal movement, and then once THAT was fixed, SAT was re-zeroing my wall-jump velocity on the same frame it fired because the player was technically still overlapping the wall geometry. So I fixed those and immediately got a NEW bug where wall jumping turned into a pogo stick that spam-bounced me up the wall, because a vertical MTV was getting misread as “landed on the ground,” which reset the wall jump lock and let it refire every single frame. Also spent quite a bit of time before realizing this one line I had, if (grounded) velocity.y = 0 , worked fine with AABB but not so much with SAT’s own grounding logic, since my SAT function sets grounded = true when it sees downward velocity, and that line was zeroing velocity before SAT checked it. Removed it and a lot of my bugs disappeared. AI used, if any: SAT math I mostly figured out myself, after reading through a ton of Stack Overflow threads, articles, watching a lot of YT videos, etc. on my own time. I did use AI to clarify/debug a couple of parts though. However, I ended up needing it a lot more for debugging the problems that stemmed from it, i.e. the octagon, hexagon and circle issues. Plans for next time: SAT works for ground tiles but I’ve still got all my other entities on the old AABB system so I gotta port those over. Although, probably the biggest thing is trying to make my code more efficient because sometimes the game randomly slows down/freezes and makes random clips occur. If this isn’t lag (which it might not be, I could just be stupid) I’ll still have to look into whats happening. Then, once ground collision is 100% finished: rolling physics, aka the reason I made this change in the first place. Gonna have to look into the math/physics behind that, but it should be pretty easy since I already got this down. Once this is done, the shapes should be tipping and rolling around instead of just sliding around like ice cubes. We’ll see how that goes. K bye guys
Unnamed Platformer - Devlog 10 I’m tired 😭 What I did: I ported the rest of my entities over to SAT collision. Every tile that can be collided with now uses SAT. I refactored some of my functions to handle the new logic properly across the board, and got rid of the old standalone AABB collision code for ground tiles. I also decided to make pushable blocks hybrid for simplicity: aside from general environment collisions which use SAT, I didn’t change much of the old AABB code. I also added an O(1) center/radius projection for circles to fix random micro-stutters, and updated drawdebug() so it stops drawing every vertex and instead renders one dynamic vector targeting the nearest tile vertex. (Circles in SFML are actually 30-sided polygons, so earlier the collision checks were looking at 15 different axes + all those axes were being drawn in the debug overlay.) Challenges: Thankfully most of the porting to SAT stuff was easy, I only had a couple of minor setbacks here and there. However, the harder part was getting the circle center-to-vertex collision logic down. I had to find out how to do it + add completely new logic to my function + add checks in my collision code to determine if the shape was a circle + rewrite my drawdebug() code. It took a while and a lot of my sanity but I got it done in the end AI used, if any: Used AI to help debug the updated circle collision detection system + its separate debug overlay code. Plans for next time: I’m going to work on rolling physics for real. I hope it goes well 👍 K bye guys
Unnamed Platformer - Devlog 11 Rotation is finally working! Mostly. Anyway I have to post now cuz of the 10 hour limit per devlog. What I did: I fully implemented rolling and rotation physics across all player shapes! Shapes now physically rotate based on movement speed, tip over cliff edges, and smoothly snap back to a flat face when you stop moving. I also added a feature where shapes automatically realign when entering water or zero-G. To make everything smooth and frame-rate independent, I overhauled the settling and snapping math using fmod for shortest-path rotation and wrap-around handling. Challenges: Getting the angle snapping and tipping logic to work was the biggest hurdle. Non-square shapes were getting locked out of tipping due to floating-point issues, which I fixed with an epsilon tolerance check. There are still a couple of bugs that I’ll tackle later, notably the fact that shapes sometimes spin an extra time upon settling. but the core system is more or less functional now. AI used, if any: I managed to work out the math myself but I needed to ask AI with help debugging. Plans for next time: I’ll probably work on some visual effects for the next couple days + fine-tune and debug my physics a bit more. K bye guys
Unnamed Platformer - Devlog 12 Man* Realizes True Meaning of ‘If it ain’t broke, don’t fix it’ What I did: First I ported pushable blocks to SAT collision so they use the same system as the player and it’s not split between two systems. Well. That broke blocks. so I spent 2 hours or so cross referencing my old versions and adding and deleting changes till it started working again. After that, I made sure blocks moved properly in zero-g. (they didn’t so I had to fix that too) Aside from that, I made a bunch of miscellaneous changes, such as fixing level progression bugs and altering player constants, but most importantly making sure blocks worked properly. Somewhere along the line I was investigating how stacked blocks interacted. I noticed they were clipping through the ground because of collision checks happening after the position of blocks was updated, and after some thought I tried adding another collision check pass to my main game loop. It worked like a charm! I added two extra checks for safety and it stopped working like a charm. The issue is my checkCollisions function is hella inefficient. 500+ lines of searching through every character in the tilemap (36x64, plus an extra column for new lines making it 36x65=2340) 6 times (!!!) Not only that, in some cases (block/player collision detection) I was nesting full passes within full passes, which caused insane lag, especially with my SAT collision which does a lot of math each frame. So I decided I wanted it to be more efficient (spoiler: it’s not efficient yet). I split my old tilelist into static tiles and dynamic tiles…and instantly regretted it. Challenges: Basically when I split tilelist into two separate vectors ( statictilelist which is everything except for blocks + dynamictilelist which is just blocks since nothing else moves lmao), I think I accidentally deleted a lot of existing logic that was the duct tape to my spaghetti code**. Aside from that, when I passed through tilelist it always passed through every tile, but with my new logic I had to decide which one to use. my stupid ahh didnt realize that there might be a chance I have to pass through both of them though 😭 well guess what there were a lot more gaps in my logic. All of these combined into the logic I had spent the last few hours working so hard to perfect, falling apart in 5 seconds. Similar to the whole block to SAT thing I worked out most of the issues just by adding, tweaking, and removing a bunch of checks as well as looking back at my old logic to figure out what I forgot. Among these general changes I also added a new grounded member to the block class, and tried to get it to register if it’s on top of a player. Unfortunately it didn’t work. It’s ok I’ll brute force my way to the root of the problem tomorrow. (Btw this doesn’t even cover the issues I faced prior to this😭 ✌️ ) AI used, if any: Now that the core elements of the game (physics) are out of the way, I’ve pretty much been grinding through bugs myself since it’s just existing logic and I’m not really adding much that’s new or unfamiliar. Honestly, I think it’s gonna stay this way because I don’t intend to use AI to design the game, I was using it more to help solve physics issues and the like. Plans for next time: I’ll try to hopefully fix the new block clipping issues. then idek anymore. Maybe i shouldn’t have tried to build the engine from scratch. K bye guys *I’m not actually over 18 **Tuff line?
Unnamed Platformer - Devlog 13 No motivation… What I did: I solved the issue of vertically stacked blocks clipping through each other and through the player, which was a pretty big chunk of my time since I went through like 10 different approaches and changed up a bunch of stuff along the way. I ended up taking out the SAT collision function I had built and just plugging mtvCheck() (which checks the mtv( )) and the movement logic straight into the collision loops instead. I had to reorder a good chunk of logic too since a lot of the clipping was coming from stuff resolving in the wrong order relative to other stuff. Also did some cleanup: deleted the grounded member off the block class since entity already has one and I was just using two variables for the same thing like an idiot. I added an R keybind so I can restart instantly instead of walking into a spike every time I want to reset (useful for testing + as an actual game feature). I also made the player’s rotation reset on spawn so you don’t respawn tilted at some weird angle from your last death and shrunk the spike hitbox down a bit from 20x20 to 18x18 because I was dying to one-pixel overlaps that looked like it shouldn’t have counted and that are pretty frustrating to deal with. Also did a bunch of level design. I’ve only done levels 1 through 4 so I lowkey gotta lock in. Challenges: The stacked block thing took forever because the symptoms kept changing depending on how many blocks were stacked, which direction they were pushed from, whether the player was involved, etc etc, so it never felt like I was chasing ONE bug, more like four bugs wearing a trenchcoat. Eventually I just started brute-force testing every combo I could think of (2 stacked, 3 stacked, stacked + pushed, stacked + player jumping into it) until I ran out of ways to break it. Also I ran into some issues when designing levels: blockonhead , which makes it so you cannot jump if a block is on your head, was triggering if any block was lined up above your head, even if it was like on a platform way above you. I managed to fix that, and other than that + the block issue there wasn’t too many big obstacles this time. AI used, if any: none, since I’m not using it at all for game design and didn’t need to use it to solve block clipping issues since I just brute forced a bunch of possible solutions. Plans for next time: More level design…I’ll try to get most of the levels done by next devlog. K bye guys
Unnamed Platformer - Devlog 14 I’m genuinely so done What I did: I designed levels 5 and 7-16 (ss of a few levels should be attached idk which they are). I have a cool idea in mind for level 6 but my current code makes it hard to implement, and I also have a cool idea in mind for level 17 but my code made it hard to implement. So I changed everything up like an idiot. My 17th level features a massive pool, but that requires me to draw 1000+ water tiles. Since I redraw tiles every frame, it causes a big load on the computer. So I had the brilliant idea of creating an sf::RenderTexture . spoiler it’s not so brilliant. That led to a massive chain reaction where there were a bunch of nullptr issues at first, which I spent about 40 minutes on before actually getting the game to run. Then everything was super grainy due to aliasing issues caused by drawing everything to a RenderTexture, PLUS since I was drawing everything at the start of the frame and not updating it, stuff like buttons and doors would never update. SO, my dumb ahh moved half my static/environment tiles to dynamictilelist , reserved for strictly blocks which are the only tiles that can change position, and I did this cuz these would draw every frame and they didn’t have the same grainy look as the ones drawn to a texture. the result is probably self explanatory. That caused SO MANY ISSUES that I can’t even begin to describe them all, so after 50 minutes I undid 50 minutes worth of changes, added some spaghetti code to make it a bit more presentable, and call it a day. Challenges: Level design was fun, and easy. I did that for all of yesterday and the first half-ish of today. The vain attempt at making my code more efficient by changing how static tiles were drawn and then going on to deeply regret it and consider undoing it all the next day, was not. Also I probably shouldn’t have bothered trying seeing as I was pretty tired anyway, but ig my stupidity/ambition/idek led me to try. I’m genuinely too tired to bother elaborating, but it goes somewhat like this: I started on the texture-caching thing -> I ran into nullptr errors -> I got those out of the way -> I ran into issues with rendering and updating -> out of frustration I undid all my progress and started anew -> I decided to implement anti-aliasing -> I will probably(definitely) reset my code to where I had been right before I decided to do this stupid implementation AI used, if any: none. If I had I would’ve probably been done with this bs by now. Plans for next time: Realistically I’ll likely just undo all the changes I made to drawing processes, find out how to draw environment tiles underneath other entities/obstacles (which will be useful for many of my levels with spikes or the like in environments), and…thats it. Also, for level design, I want to have all preliminary designs down by the end of this Sunday (3 more days), and then I can playtest and refine later. I wanna cry P.S. the level with the white room is level 6 and it’s currently unfinished lmao
Unnamed Platformer - Devlog 15 Actually got a lot done over the last few days ig What I did: first off, I reset my old changes and made it so env tiles layer over obstacles. At first I tried to assign an individual character to each combination (spike in water, block in zero-gravity, etc etc) but that didn’t work since I couldn’t get them to lay over each other. So what I did is I split my statictilelist into two: statictilelist now held all non-moving entities like spikes, ground, etc. while envtilelist held all my environment tiles. Then I changed my map loading function to take two map strings: one assigned tiles based on entities and the other pass assigned them based on environment. And now I can lay environments over things without breaking my game! Yippee! I also fixed an issue where blocks could clip through obstacles in zero-g when you moved them upward. The issue was blocks unconditionally being mtv-moved when the player was below them, so the player forced them through anything. I added an extra check before mtv-moving and made obstacle detection variables global to fix it. I also ran into an issue where spikes would incorrectly kill you even if you were not touching them, just near: the issue was that I wasn’t running SAT collision, just going straight to death logic if the initial AABB check turned out true (I run an AABB check first because running SAT for everything makes the game super laggy). both of these lowkey took me a while 😭 As for level design I reworked level 6 (still can’t play it) and level 17 (finished), and I designed levels 18-25 (I attached a video of level 24). Also in the vid I switched shapes randomly, that’s just because I had different keybinds earlier and it was js muscle memory kicking in. Challenges: Aside from a bunch of small bugs, the biggest challenges were the issue where spikes would kill you even if you weren’t touching them and the issue with blocks being pushed up forever in zerog. Even then, for both issues it was still easy to fix since it was easy to diagnose and a few lines per fix, even if it took me a while to find those few lines 🥀🥀 However, there’s still an issue where blocks sink slightly upon spawning in zero-g. This makes it impossible to play level 6, so I’ll have to look into/rework/do something to zero-g logic because I really want to keep its existing level mechanic. AI used, if any: None 🔥 Plans for next time: Finish levels 26-30, finish level 6, and test all the levels to make sure they’re not too hard/impossible/possible to cheese. Aside from that, I’ll most likely bring back the texture thing I implemented last time cuz it did actually make the game run a bit smoother, but I’ll only do it for environment tiles. K bye guys
Unnamed Platformer - Devlog 16 Actually didn’t get a lot done over the last few days, let me explain. What I did: The biggest and only new feature I added was a major adjustment to black holes. Earlier they were just 2 tile x 2 tile circles that killed you upon touching. I’ve reworked them to how they’re supposed to be: 6 px x 6 px black circles, with a surrounding 6 tile x 6 tile ring. now if you enter the ring, you lose the ability to move normally (you can still jump tho) get pulled toward the black center, which kills you if you touch it Which is how it’s supposed to be (nevermind the astrophysical inaccuracy lmao). This took me 2 hours 😭 and then I designed levels 26 and 27. I also re-added the old texture system I implemented and then took down earlier cuz it was making things look hella grainy, but only for environment tiles cuz there’s no big changes visually compared to redrawing them every frame. Unfortunately it doesn’t seem to be doing much in terms of efficiency. I also designed levels 28 and 29 (ss of level 29 attached), and playtested every level from 1 to 28 and adjusted each one to remove any unwanted ways you can cheese a level, as well as to just make some of them less punishing for small mistakes. I also (FINALLY) designed level 6. I added extra sections and polished up some elements that were making the level impossible if you didn’t play it perfectly. I did 2 other things as well: I made it so blocks can’t be pushed by any character other than the square (before you could just push blocks w/ anything) and I reduced horizontal movespeed in zero-g. There’s still a lot more I have to do, mainly ui/menu stuff and visual polish. Challenges: Black hole physics took me a while since my first few implementations were completely wrong, and then I locked in nd figured out how to make it pull correctly. Also, level design is proving to be surprisingly challenging, I rly didn’t think it would take this long, but what with conceptualizing + creating + playtesting each level, especially the later ones where I want to make them more complex and difficult, it eats up a lot of time per level. Even going back through older levels and tweaking them can take a while, cuz you gotta track down all the problematic sections and figure out how to fix them. I also have a humble 18 more days till school starts so I gotta lock in🙏 AI used, if any: None, level design is hard but its not THAT hard Plans for next time: Finish level 30, playtest levels 29 and 30, and hopefully get started on + finish a main menu and level select menu. Im so behind on my schedule it aint even funny so wish me luck
Unnamed Platformer - Devlog 17 It’s actually no longer “Unnamed Platformer”, it’s “Worlds of Blockman”, I might change that later idk What I did: I designed level 30, playtested every level extensively and tweaked some levels, and made a basic main menu, level hud and pause menu. And it took me ~10 hours. Well, that’s not all I did. I also changed up the colors of the square to differentiate it from spikes and buttons, and I added a visual indicator for the triangle’s teleport. When you tp the triangle fades to a darker shade of green, and when it gets off cooldown (3 secs) it fades back to its normal color and then you can tp again. Also, level design took quite a long time since I was kind of making it up as I went along, and the whole game states implementation wasn’t too hard in itself, but I ran into errors with loading my font. I added the .ttf file to my assets folder and wrote the correct file name in font.loadFromFile() and whatnot, but turns out I didn’t have the actual font downloaded in the build folder or my project. So after a bit less than an hour I added it in and it fixed the issue. also I spent a bit of time deciding how the different menus would actually look which ate up some time. Challenges: ngl the font-loading thing was kind of the only hard part 😭most other stuff was solved relatively quickly and easily AI used, if any: None, also most likely no AI will be used in the future since the future just holds visual stuff which should not be hard enough to merit the help of AI. Plans for next time: Level select menu, add more stuff to main menu, also make it so the current level shows in the background when you go to the pause menu. also add mouse inputs so you can use those instead of kb inputs in the menu, and start on some more vfx and sfx. I’m also really tired
Unnamed Platformer - Devlog 18 The UI is coming along pretty nicely! What I did: Designed a full level select menu (there are a couple more things left to add), add a heads up display for the current level, and add proper mouse input and extra details to buttons such as shadows (havent implemented shadows for everything, I’ll explain why) and changing color when hovering. Even though it doesn’t sound like much, it took me a surprisingly long time because my text wasn’t centering…What I didn’t realize is that sf::Text creates invisible offsets for some reason, so when I used getGlobalBounds() it would return that offset too and mess up the centering. I ended up doing some research and realized I had to use the local bounds (i.e. untransformed) when centering. Challenges: Ig the biggest ‘challenge’ was centering buttons with text, because at first I actually tried to manually fine tune coordinates and whatnot. But then I found out I had to use localbounds and blah blah. Another thing is, I spent a lot of time fine tuning sizes, colors, shadow darknesses and depths, etc. which took a lot of my time. Also no ai used this time either, although I did spend a lot of time researching why my text wouldn’t center itself. Plans for next time: I’ll just polish up existing menus, and work on background elements. Also I want to add a kind of handbook accessible from the main menu that tells you what stuff does, different powerups, etc. But most importantly, I’m gonna try to find out how to make shadow creation more efficient. For every text/button, I need a shadow. That means I have to add it as a member in the class, copy the actual object, change the color and offset it, then draw it too. Since I have so many objects that make shadows (all of them in the end, ideally), I’m probably going to make a shadow-making function for readability. Other than that I’ll just play the game and test levels a bunch, which I’ve already been doing a lot to make sure everything is as it should be. K bye guys P.S. there’s also still a couple bugs ( UI-related or otherwise) that I have to fix as well
Unnamed Platformer - Devlog 19 The UI is coming along pretty nicely! Pt. 2 What I did: I believe I’ve fully created everything UI- and menu-wise, aside from 3 additional menus (credits, a ‘handbook’ that contains info about stuff, and a settings page) that are currently blank. I created a hovering effect for buttons that makes it so when you hover over a button, the button goes downward slightly and the shadow moves to match. Aside from that, I polished up/tweaked some minor details, and the only things I’ll add menu wise are probably those 3 sub-menus on the main menu and a universal backwards-nav button. The biggest thing (time-wise) was figuring out how to make the code more readable and actually making it more readable. I created two new functions for making text and button objects which made my life a lot easier, also the button-hover code took quite a few lines so I put that into a function too. Aside from that, I made a couple fixes here and there to make it more efficient memory wise. And even then, I ended up breaking stuff which took me a while to fix, such as the issue with unpausing ur game in the vid. Challenges: Probably efficiency stuff, since deciding how to do it + implementation took a while and had a couple of bugs due to me not accounting for stuff. For example: my hover function would change states on its own, but since sometimes you don’t need to directly change state or you need to do other things too, I made it into a boolean that each individual case takes and does its own thing with. Plans for next time: Start on background stuff probably, I don’t want to do anymore UI stuff for now. I have a fewideas in mind for my background visuals, but I hope they won’t be too hard/impossible to implement. K bye guys
Unnamed Platformer - Devlog 20 Background design is a hell of a lot harder than I thought it would be…also I lost track of time 😭😭 What I did: I got started on background design, and partially implemented a background. I actually had a pretty different idea in mind compared to what I have now: the rest of the planet visible, stretching into the horizon, with mountains and volcanoes etc etc. scattered along its surface. After spending a while implementing that, I realized it a) didn’t look right, since everything was just following the player around at normal cam speed, and b) I didn’t like the idea anymore to begin with. So after scrapping all those changes, I started researching how to add a scrolling effect so it would look more natural. I found out how to implement a parallax scroll effect, which basicallymeans that objects in the background move along slower than objects closer to the front of the screen. I also restructured my scenes.h file which contains all background-related stuff, and made a couple of other small changes and fixes with certain levels. I know I don’t have much to show for it, but that’s mainly because I spent a lot of time tweaking certain elements and just undoing backgrounds I ended up not liking 😭🥀 Challenges: Deciding what to do visuals-wise cost me some time bcuz I kept going back on my old ideas, but restructuring scenes.h was the hardest part since after deciding what to do for visuals, I had to base the logic in scenes.h off that. Also it took me a while to decide how to add in a parallax scroll system. Plans for next time: Work on more background stuff. right now I’ve set up a lot of background elements’ structs and whatnot, but I’ve only redrawn the stars and added a rough brightening/dimming effect. Also Im gonna have to start thinking about what I’m going to add on each of the sub-menus accessible from the main menu (credits, handbook, and settings). K bye guys
Unnamed Platformer - Devlog 21 Background design is a bit easier now that I have a plan…also I did not lose track of time 👍 What I did: I added in every single sky element I want to have: comets, planets, black holes, stars, floating rocks, and a moon. I think I might tweak some elements later down the line (specifically the moon(adding craters) and black holes(I’ll think of some extra effects) ), but for now I’m fairly satisfied with how far I’ve come. Looking at the game now gives me a sense of pride at seeing everything finally come together after so long 🥹✌️ Challenges: Making comets was a bit of a hassle, because I had to decide how to do it (which took me some time for brainstorming + more time cuz of discarded changes + even more minutes of brainstorming), and implement it. It’s pretty complex cuz there’s a cooldown on each comet, then you have to set the spawn point and angle/speed, calculate the trail’s points, draw them, draw the head too etc etc…so it was pretty tedious, but comets are the most rewarding visually imo out of all the features. Other than that, I spent a bit of time per other feature figuring out how to implement each of them, but none of them were as complex as the comet. Plans for next time: Finish up any bugs or other issues in sky-related stuff, then I’ll try to make a visible horizon again and see if I’ve changed my mind since last time. Either that or I’ll start working more on smaller vfx, specially trying to find out how to make a particle effect. K bye guys
Unnamed Platformer - Devlog 22 School starts tomorrow ✌️so i decided to make a shorter devlog…also I’m so tired What I did: Honestly you can’t really tell that I did much at first glance. I was mainly playtesting a lot and polishing stuff up, and making sure all the background stuff was fine. For now I dont think I’ll return to background stuff for a while. Although I did manage to add a particle effect for the black holes (both the ones in the background as well as the actual obstacles). I was also experimenting with a horizon for a bit, but then I decided I don’t want it and scrapped a good chunk of time worth of changes. Challenges: Deciding how to add in particles was a bit challenging, specially the math part. But other than that it was a pretty chill 7 hours. Plans for next time: Hopefully finish menus, then: work on vfx, polish up all the menus, tackle any big issues with levels or physics, and finally work on bringing my game onto itch.io! not all in one go, though. K bye guys
Unnamed Platformer - Devlog 23 Hey guys. What I did: I did a lot of playtesting/bug hunting as usual, but I was mainly creating the entire handbook menu. Which took surprisingly long, cuz of designing the menu + figuring out how to include all the different tile icons + creating descriptions + making stuff functional + formatting + colors + bugs + you get the idea. Anyway I’m pretty happy with how it looks so far, I doubt I’ll make any major changes in the future. Also I did find a couple of bugs while testing, but i didn’t really do anything about them, I want to completely create all the core functions before tackling any small bugs/issues. Challenges: There were a few bugs and I went through a few designs for the menu, but overall everything was hella light so I wouldn’t say there were any real challenges. Plans for next time: Create credits menu, then work on adding vfx, add settings menu (thinking of adding volume + keybind toggles), polish up all the menus…and then I’ll see where to go from there. I’m pretty worried cuz now that school’s started (im in gr11 now) I’m probably gonna have a good amount of schoolwork, clubs, etc. that I’ll also have to make time for…so wish me luck ig. K bye guys
Unnamed Platformer - Devlog 24 The game is finally coming together… 🥹🔥 What I did: All the menus in the game are completed! Ngl, credits was really easy ofc, but I was deciding how I should go about doing it, still didnt take too long tho. Then settings was a lot harder 😭 volume adjustment was quite easy, but the real problem came with creating the keybind section, since I had already coded hard inputs all throughout my code. So I pretty much had to add a new system + helper func in vars.h, then replace every instance of isKeyPressed with that system+helper, then code the menu in the ui file (Which took forever cuz of bugs with msg updating + event handling + key updates + etc.). Well, it’s (mostly) done now, which is good. And ofc I was also testing the game for general bugs too. Challenges: The keybind menu took me a hella long time to get done…thats about it, aside from some other tiny bugs. Plans for next time: add vfx, polish up every single one of the menus…and then I’ll see where to go from there. Hopefully I can finish most of my stuff by the start of next week. K bye guys
Unnamed Platformer - Devlog 25 I’m so tired omg What I did: Bunch of miscellaneous stuff: Added basic vfx: so far we only have a click sound, I’ll add more later but it took me a while to figure out how to get SFML’s audio system working since I also had to find out why my audio files weren’t loading in either. Added coins to every level: added new tile type for coin, added a coin into each level, added effects, etc. Fix bugs/gameplay issues such as the triangle being unable to teleport after a restart/new level, rearrange some levels to fit coin placements, find out some new bugs and try (and fail) to fix them, so decide to deal with them another day. Add simple death animation to the player. Make it so levels must be completed in progressive order (e.g. you start at level 1, cannot progress till you have completed), also add different colors to boxes on level select menu (check vid) Probably a few more things related to general playtesting but i can’t remember Challenges: Making level buttons in the levelmenu was kind of frustrating not only because of the selection aspect but also getting them to visually render in the proper colors. Honestly though, now the main challenge is dealing with my own fatigue, especially since I’ve been joining more clubs and getting more homework, so hopefully I can clutch up over the final few days cuz I highkey need that framework 13 🥺✌️ Plans for next time: I added a list of bugs I want to tackle/stuff I want to add: //BUGS!!!!! //cant close window while in settings menu //rotation bugs //levels 13, 17, 26, 4, 8, look into //as well as other levels but these ones I can remember //TO ADD!!!!! //speedrun timer //death count //updating handbook (notif icon, hidden objects) //more sfx (death especially) K bye guys
Unnamed Platformer - Devlog 26 Stardance extension + fatigue = holy procrastination 😂✌️ What I did: More random stuff: Level timer that stores each level’s personal best, displays a live timer in the level, and lets you access your PR for each level from level select menu Fixed issue where you couldn’t close game while in settings menu Death count (it just tracks deaths over every single level, accessed from level select menu, manual restarts count as death too) and coin count as well Adjusted some levels a bit Added a feature to handbook where items you haven’t come across yet are blacked out and have hidden descs, and add notification to handbook when you unlock these items Update README a little bit cause I was feeling lazy and didn’t want to do anything else Fix some bugs concerning rotation and tipping, as well as making it so you do not rotate when passing thru a 1 tile high gap (this is specially an issue with the square where it can feel a bit janky otherwise) I will note that some of these were multifaceted changes that took quite a bit of effort and iterations, but I couldn’t be bothered explaining everything I did here. And more playtesting too. Challenges: Probably the handbook feature…it was the longest one out of all of them. Plans for next time: I want to be done with pretty much everything related to the actual game by next devlog, so I can focus on the README and finally shipping! K bye guys
Unnamed Platformer - Devlog 27 WE’RE FINALLY HERE! What I did: I did a lot of final polish and testing before getting the game ready for release. Initially I was going to use Emscripten to port my game over to web assembly (inspired by this video: https://www.youtube.com/watch?v=1kiwpAIU454 ) but I soon realized that it was much more complex than it looked, and kind of took away from the spirit of being entirely made out of C++ and SFML. So, I decided to simply publish an executable rather than port the game over to web. I set up the release build and whatnot (which took a while because of cmake config issues and whatnot) but I finally got a release build working n it feels great! I ported to itch.io, now I just gotta finish up the itch page and readme, as well as record a walkthrough video for macOS and Linux users as I couldn’t figure out how to configure the game for either. Challenges: The whole odyssey of deciding how to port my game over was a slight hassle, but nothing too bad. Also, while recording my walkthrough vid, I ended up discovering A LOT of hidden bugs, so I managed to pick all those off and there shouldn’t be any left…hopefully. Plans for next time: Ship! This devlog will be my last for this project, and for this challenge. Aside from being done with everything, I accidentally created a completely new project according to Hackatime when I was renaming the file folder, executable, etc. from “WorldofBlockman” (my placeholder name) to Stardancer so everything would be more consistent with my final title. so any work I do on my project won’t count towards heartbeats and thus I can’t post another devlog (15 minutes minimum/devlog). Still, it’s been such an amazing journey, I learned so much and I made this game that I’m super proud of 🥹 even though this game gave me hell sometimes, I have virtually no regrets about any of it. This has been my biggest project ever, and many more to come in the future hopefully. K…bye guys.
Ships:
For HackClub Stardance, I created Stardancer , a 30-level platformer featuring a unique mechanic: mid-level shapeshifting to unlock new abilities and powers! I used C++ and SFML (the Simple and Fast Multimedia Library) to code this game. During the development of this game, I ran into a couple of technical challenges. Collision was among the biggest; I had initially decided on AABB (Axis-Aligned Bounding Box) collision, but after implementing that I realized that it led to erroneous collision interactions, misalignments, and more issues. So, I switched to SAT (Separating Axis Theorem) collision instead. This, combined with general collision response logic, made coding collision one of the hardest endeavours of this project. There were many other challenges throughout development, however none are too disruptive to the experience of the final game. I’m still extremely proud of myself and this project for many reasons: This is the largest project I’ve ever made; Despite many challenges, bugs, and pieces of complex logic to work through, I made a fully functional and complete game; I managed to make this with no external engines; I was able to use my C++ and new SFML skills to create something I can proudly say I made! IMPORTANT NOTE FOR REVIEWERS!! PLEASE READ!!! A complete playthrough of the game takes a large amount of time due to how levels are structured: to play a level, you must beat the level before it, which poses an issue for one of the shapes which is only unlocked in the last set. I realize most reviewers do not have the time required to play through the full game and gain a complete understanding of its features. For this reason, I strongly urge reviewers to skim through/watch my full walkthrough video linked in my README, as well as check out the “Credits Easter Egg” section in that video. Playing through all 30 levels sequentially takes time, but you can unlock every level directly from the Credits screen so you can test all shape powers hands-on right away! This way, a reviewer will be able to understand the scope and gameplay of the game in a short amount of time. With that being said, I truly hope you enjoy my game....
|
1792759984.4731371
|
1792846384.4731371
|
|
987
|
Oppurtunity OS by @dseshukumar2008 | Stardance
|
dseshukumar2008
|
1
|
219.84
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T15:28:16Z", "hours": 136.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built and refined OppurtunityOS , an AI powered career development platform designed to help students understand their skills, career paths, and can be more confident about the career . The platform includes the features such as Career Roadmaps, Project recommendations, AI Career coach, Resume Builder and Analyzer , Github Analyzer , Skill Gap Analysis , Career Explorer, and Analytics. One of the main challenges that I faced was handling API calls . I refined the interface , removed unnecessary features , and ensured final platform is deployed. I am proud of bringing the different career-development tools together into one working platform. To use the project , use the try project button to explore the deployed application , and see the source code to view the complete implementation and README.", "repo": "https://github.com/dseshukumar2008-hub/opportunityOS", "demo": "https://opportunity-os-rust.vercel.app/"}]...
|
[{"post_id": 69727, "ts": "202 [{"post_id": 69727, "ts": "2026-09-17T17:35:11Z", "hours": 9.6806, "text": "While working on OpportunityOS, I realized as the project grew , the CSS had become more complex , With repeated tailwind classes , different styling patterns, larger border radiuses. I decided to simplify the existing styling component by component, focusing on cleaner layouts, consistent colors, simpler borders and shadows, and more maintainable CSS while keeping the existing UI structure and functionality unchanged. I made changes and removed unnecessary repeated code."}, {"post_id": 64952, "ts": "2026-09-09T18:06:24Z", "hours": 11.1286, "text": "Fixed the local AI connection issue by routing frontend API requests through the vite proxy to the deployed backend . Debugged several issues including: -> offline fallback states -> Incorrect AI response handling -> stuck analysis / loading states scrolling and time stamp issues"}, {"post_id": 63536, "ts": "2026-09-07T13:33:53Z", "hours": 10.7625, "text": "Working on the project engine . The main page is taking step , but OppurtunityOS Copilot side panel still needs fixing - messages are not getting a proper response . Fixing the integration and working to get the proper response"}, {"post_id": 62056, "ts": "2026-09-05T09:06:42Z", "hours": 10.3364, "text": "Added the Career quiz to the Skill Arcade - a timed 10 question challenge designed to test challenge around coding and technology . Currently polishing the Skill arcade experience and getting oppurtunityOS closer to final submission."}, {"post_id": 60708, "ts": "2026-09-03T08:22:30Z", "hours": 11.0881, "text": "Build Tech Match for the Skill Arcade !!! A quick challenge where you match technologies with their correct categories and test your knowledge under time pressure."}, {"post_id": 58637, "ts": "2026-08-31T03:49:46Z", "hours": 10.4067, "text": "After spending time fixing the bugs - I decided to make finding bugs a game . So I added a new game to my skill arcade - bug hunter. The idea is simple , first the user have to select the programming language , and then have to select the toughness level , based on that there will be code snippets and options for that code snippets."}, {"post_id": 56740, "ts": "2026-08-28T16:48:24Z", "hours": 10.3039, "text": "After spending too much time fixing bugs , i got tired of debugging So instead of fixing another bug …. I tried to build something new . I implemented Skill Arcade in Opportunity OS - a small gamified section where users can test their skills through interactive games"}, {"post_id": 55130, "ts": "2026-08-26T16:22:11Z", "hours": 10.1347, "text": "I am continuing to manually refine and test the project feature by feature . I focused on debugging the Resume Analyzer , improving the error flow , and checking the complete analysis process . Still refining the project , making changes in the code , getting errors and fixing them ."}, {"post_id": 53102, "ts": "2026-08-23T15:17:00Z", "hours": 4.3336, "text": "finally OpportunityOS is deployed and it is live !!!"}, {"post_id": 52494, "ts": "2026-08-22T17:11:34Z", "hours": 9.8203, "text": "Recently I have been refining the career intelligence dashboard and improving the overall UI and user experience . I am also working on connecting the Analytics page with all the existing features , so users can get a complete view of their progress and activity across Opportunity OS . The focus is now on making the existing features feel more connected , polished , and product ready . Still Building … still improving !!!"}, {"post_id": 49693, "ts": "2026-08-18T16:16:04Z", "hours": 9.9183, "text": "Opportunity OS is getting closer to the finish line !!! The focus has now shifted from building features to make sure everything actually works as intended Currently working on : Fixing remaining bugs Testing complete user flows checking AI - powered features polishing UI Fixing navigation and state issues verifying existing features before release At this stage , it’s less about adding more and more features - and more about making the existing product reliable , consistent , and ready to ship . The final stretch is here ……."}, {"post_id": 38424, "ts": "2026-07-31T19:45:09Z", "hours": 10.7006, "text": "Opportunity OS has entered its final phase . Currently I am focusing on fixing the bugs , testing and ensuring every feature works before final release . The finish line is getting closer"}, {"post_id": 28867, "ts": "2026-07-15T12:57:36Z", "hours": 9.6481, "text": "continued refining the OpportunityOS onboarding experience by improving the overall UI, spacing, alignment, typography, and visual consistency across all onboarding steps. The focus wasn’t on adding new features but on creating a smoother, more intuitive, and premium experience that makes a great first impression. One step closer to a polished SaaS product!"}, {"post_id": 23475, "ts": "2026-07-06T14:05:30Z", "hours": 10.7319, "text": "I focused on improving the onboarding experience for OpportunityOS. I redesigned the Personal Details, Education, and Skills screens to create a cleaner and more premium user experience. I also introduced a new Career Interests step, allowing users to share their career goals so OpportunityOS can deliver more personalized opportunities and recommendations. The onboarding is becoming more intuitive, engaging, and aligned with the vision of building an AI-powered career platform for students"}, {"post_id": 15145, "ts": "2026-06-24T16:31:24Z", "hours": 8.7697, "text": "I focused on enhancing the Resume Builder in OpportunityOS. Improved the resume creation workflow, refined the live preview experience, strengthened Firebase data synchronization, and validated auto-save functionality for a smoother user experience. Also worked on ATS analysis improvements and overall stability to ensure users can build professional resumes seamlessly."}, {"post_id": 14465, "ts": "2026-06-23T16:26:54Z", "hours": 14.9064, "text": "Built the Career Explorer module in OpportunityOS to help users discover career paths based on their skills and profile. Added role-based career cards, skill gap insights, recommended projects, learning timelines, and roadmap generation for different career tracks. Currently focusing on improving matching accuracy, personalization, and overall user experience."}, {"post_id": 11928, "ts": "2026-06-19T13:37:55Z", "hours": 5.7172, "text": "Project Recommendation Engine in OpportunityOS. One problem I noticed is that many students know their dream role but have no idea what projects they should actually build. So I developed an AI-powered engine that analyzes a student’s target role and skill gaps, then recommends portfolio-worthy projects that can strengthen their profile and improve career readiness. Turning career goals into actionable projects, one recommendation at a time. user flow : user selects the specialization that he has choosen next user selects the target role Stay tuned for more updates !!!"}, {"post_id": 10024, "ts": "2026-06-16T16:13:40Z", "hours": 10.1594, "text": "After generating a personalized Career Roadmap, the next step is understanding what’s missing. The Skill Gap Analysis feature helps users compare their current skills with the skills required for their dream career. For example, if someone wants to become an AI Engineer, OpportunityOS can analyze their profile and show which skills they already have and which skills they still need to learn."}, {"post_id": 8533, "ts": "2026-06-14T06:06:49Z", "hours": 6.7772, "text": "Development Update: AI-Powered Career Roadmap in OpportunityOS One challenge students face is not knowing what to learn next after choosing a career path. Today, I worked on the Career Roadmap Module in OpportunityOS. How does it work : -> Lets users choose a target role (Software Engineer, AI Engineer, Full Stack Developer, etc.) -> Generates a structured learning roadmap Breaks the journey into clear phases and milestones -> Shows recommended learning resources for each phase -> Tracks roadmap progress over time Integrates with Skill Gap Analysis to recommend the next skills to learn Still improving the experience, but excited to see the roadmap becoming more interactive and personalized."}, {"post_id": 7300, "ts": "2026-06-12T05:14:32Z", "hours": 4.055, "text": "One of the biggest challenges students face is finding relevant opportunities scattered across multiple platforms. To solve this, I built the Opportunities Hub inside OpportunityOS , where students can discover internships, jobs, hackathons, scholarships, and competitions from a single platform."}, {"post_id": 4909, "ts": "2026-06-08T14:24:57Z", "hours": 3.5189, "text": "AI Resume Analysis is now live in OpportunityOS. One thing I’ve noticed is that many students apply for opportunities without knowing whether their resume is actually ATS-friendly or aligned with the role they’re targeting. To address this, I built an AI-powered Resume Analysis feature using Google Gemini, allowing users to upload a resume or analyze their OpportunityOS profile to receive ATS scoring, strengths and weaknesses analysis, missing skill detection, and personalized improvement suggestions. Stay tuned for more features !!!"}, {"post_id": 4726, "ts": "2026-06-08T05:04:03Z", "hours": 2.1067, "text": "Thinking a lot , I thought of building a OpportunityOS Copilot, a context-aware AI assistant built directly into the platform. Instead of acting like a generic chatbot, the Copilot is designed to understand a user’s profile, skills, career goals, resume insights, and opportunities data to provide personalized guidance. And Guess what the answer is insane !!!"}, {"post_id": 3598, "ts": "2026-06-06T16:25:34Z", "hours": 4.8642, "text": "Worked on OpportunityOS onboarding and authentication today. Implemented a first-time user onboarding flow that guides users through profile creation, skill selection, interests, and career goals setup after Google Sign In."}, {"post_id": 2781, "ts": "2026-06-05T16:10:58Z", "hours": 10.1692, "text": "Built and organized multiple settings components including Account Information, Password & Security, Notifications, Privacy, Integrations, Appearance, Data Storage, and Email Preferences. Next, I’ll connect these settings to live backend services and replace remaining placeholder functionality with real-time integrations. Stay tuned !!!!!"}, {"post_id": 1548, "ts": "2026-06-03T17:07:23Z", "hours": 4.4708, "text": "I worked on the login page of Oppurtunity OS . I added a branding section on the left side to highlight the main features of the platform . I also improved the login form layout and added google and github signin options to make the user interface look more good and efficient ."}, {"post_id": 935, "ts": "2026-06-02T18:06:06Z", "hours": 5.0983, "text": "I worked on the home page of Oppurtunity OS I improved the landing page design , navigation bar, overall layout . I also fixed alignment issues ."}, {"post_id": 228, "ts": "2026-06-01T10:39:24Z", "hours": 0.5008, "text": "I completed the foundation of OppurtunityOS, a platform designed to help students , discover the hackathons , internships , competitions and scholarships."}]...
|
Title: Oppurtunity OS by @dseshukumar2008 | Starda Title: Oppurtunity OS by @dseshukumar2008 | Stardance
Devlogs:
I completed the foundation of OppurtunityOS, a platform designed to help students , discover the hackathons , internships , competitions and scholarships.
I worked on the home page of Oppurtunity OS I improved the landing page design , navigation bar, overall layout . I also fixed alignment issues .
I worked on the login page of Oppurtunity OS . I added a branding section on the left side to highlight the main features of the platform . I also improved the login form layout and added google and github signin options to make the user interface look more good and efficient .
Built and organized multiple settings components including Account Information, Password & Security, Notifications, Privacy, Integrations, Appearance, Data Storage, and Email Preferences. Next, I’ll connect these settings to live backend services and replace remaining placeholder functionality with real-time integrations. Stay tuned !!!!!
Worked on OpportunityOS onboarding and authentication today. Implemented a first-time user onboarding flow that guides users through profile creation, skill selection, interests, and career goals setup after Google Sign In.
Thinking a lot , I thought of building a OpportunityOS Copilot, a context-aware AI assistant built directly into the platform. Instead of acting like a generic chatbot, the Copilot is designed to understand a user’s profile, skills, career goals, resume insights, and opportunities data to provide personalized guidance. And Guess what the answer is insane !!!
AI Resume Analysis is now live in OpportunityOS. One thing I’ve noticed is that many students apply for opportunities without knowing whether their resume is actually ATS-friendly or aligned with the role they’re targeting. To address this, I built an AI-powered Resume Analysis feature using Google Gemini, allowing users to upload a resume or analyze their OpportunityOS profile to receive ATS scoring, strengths and weaknesses analysis, missing skill detection, and personalized improvement suggestions. Stay tuned for more features !!!
One of the biggest challenges students face is finding relevant opportunities scattered across multiple platforms. To solve this, I built the Opportunities Hub inside OpportunityOS , where students can discover internships, jobs, hackathons, scholarships, and competitions from a single platform.
Development Update: AI-Powered Career Roadmap in OpportunityOS One challenge students face is not knowing what to learn next after choosing a career path. Today, I worked on the Career Roadmap Module in OpportunityOS. How does it work : -> Lets users choose a target role (Software Engineer, AI Engineer, Full Stack Developer, etc.) -> Generates a structured learning roadmap Breaks the journey into clear phases and milestones -> Shows recommended learning resources for each phase -> Tracks roadmap progress over time Integrates with Skill Gap Analysis to recommend the next skills to learn Still improving the experience, but excited to see the roadmap becoming more interactive and personalized.
After generating a personalized Career Roadmap, the next step is understanding what’s missing. The Skill Gap Analysis feature helps users compare their current skills with the skills required for their dream career. For example, if someone wants to become an AI Engineer, OpportunityOS can analyze their profile and show which skills they already have and which skills they still need to learn.
Project Recommendation Engine in OpportunityOS. One problem I noticed is that many students know their dream role but have no idea what projects they should actually build. So I developed an AI-powered engine that analyzes a student’s target role and skill gaps, then recommends portfolio-worthy projects that can strengthen their profile and improve career readiness. Turning career goals into actionable projects, one recommendation at a time. user flow : user selects the specialization that he has choosen next user selects the target role Stay tuned for more updates !!!
Built the Career Explorer module in OpportunityOS to help users discover career paths based on their skills and profile. Added role-based career cards, skill gap insights, recommended projects, learning timelines, and roadmap generation for different career tracks. Currently focusing on improving matching accuracy, personalization, and overall user experience.
I focused on enhancing the Resume Builder in OpportunityOS. Improved the resume creation workflow, refined the live preview experience, strengthened Firebase data synchronization, and validated auto-save functionality for a smoother user experience. Also worked on ATS analysis improvements and overall stability to ensure users can build professional resumes seamlessly.
I focused on improving the onboarding experience for OpportunityOS. I redesigned the Personal Details, Education, and Skills screens to create a cleaner and more premium user experience. I also introduced a new Career Interests step, allowing users to share their career goals so OpportunityOS can deliver more personalized opportunities and recommendations. The onboarding is becoming more intuitive, engaging, and aligned with the vision of building an AI-powered career platform for students
continued refining the OpportunityOS onboarding experience by improving the overall UI, spacing, alignment, typography, and visual consistency across all onboarding steps. The focus wasn’t on adding new features but on creating a smoother, more intuitive, and premium experience that makes a great first impression. One step closer to a polished SaaS product!
Opportunity OS has entered its final phase . Currently I am focusing on fixing the bugs , testing and ensuring every feature works before final release . The finish line is getting closer
Opportunity OS is getting closer to the finish line !!! The focus has now shifted from building features to make sure everything actually works as intended Currently working on : Fixing remaining bugs Testing complete user flows checking AI - powered features polishing UI Fixing navigation and state issues verifying existing features before release At this stage , it’s less about adding more and more features - and more about making the existing product reliable , consistent , and ready to ship . The final stretch is here …….
Recently I have been refining the career intelligence dashboard and improving the overall UI and user experience . I am also working on connecting the Analytics page with all the existing features , so users can get a complete view of their progress and activity across Opportunity OS . The focus is now on making the existing features feel more connected , polished , and product ready . Still Building … still improving !!!
finally OpportunityOS is deployed and it is live !!!
I am continuing to manually refine and test the project feature by feature . I focused on debugging the Resume Analyzer , improving the error flow , and checking the complete analysis process . Still refining the project , making changes in the code , getting errors and fixing them .
After spending too much time fixing bugs , i got tired of debugging So instead of fixing another bug …. I tried to build something new . I implemented Skill Arcade in Opportunity OS - a small gamified section where users can test their skills through interactive games
After spending time fixing the bugs - I decided to make finding bugs a game . So I added a new game to my skill arcade - bug hunter. The idea is simple , first the user have to select the programming language , and then have to select the toughness level , based on that there will be code snippets and options for that code snippets.
Build Tech Match for the Skill Arcade !!! A quick challenge where you match technologies with their correct categories and test your knowledge under time pressure.
Added the Career quiz to the Skill Arcade - a timed 10 question challenge designed to test challenge around coding and technology . Currently polishing the Skill arcade experience and getting oppurtunityOS closer to final submission.
Working on the project engine . The main page is taking step , but OppurtunityOS Copilot side panel still needs fixing - messages are not getting a proper response . Fixing the integration and working to get the proper response
Fixed the local AI connection issue by routing frontend API requests through the vite proxy to the deployed backend . Debugged several issues including: -> offline fallback states -> Incorrect AI response handling -> stuck analysis / loading states scrolling and time stamp issues
While working on OpportunityOS, I realized as the project grew , the CSS had become more complex , With repeated tailwind classes , different styling patterns, larger border radiuses. I decided to simplify the existing styling component by component, focusing on cleaner layouts, consistent colors, simpler borders and shadows, and more maintainable CSS while keeping the existing UI structure and functionality unchanged. I made changes and removed unnecessary repeated code.
Ships:
I built and refined OppurtunityOS , an AI powered career development platform designed to help students understand their skills, career paths, and can be more confident about the career . The platform includes the features such as Career Roadmaps, Project recommendations, AI Career coach, Resume Builder and Analyzer , Github Analyzer , Skill Gap Analysis , Career Explorer, and Analytics. One of the main challenges that I faced was handling API calls . I refined the interface , removed unnecessary features , and ensured final platform is deployed. I am proud of bringing the different career-development tools together into one working platform. To use the project , use the try project button to explore the deployed application , and see the source code to view the complete implementation and README....
|
1792824822.242663
|
1792911222.242663
|
|
10338
|
Liable For Damages by @wilson_brunner | Stardance
|
wilson_brunner
|
1
|
214.95
|
2560
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:08:06Z", "hours": 211.0, "multiplier": 13.61, "payout": 2560, "blessing": "neutral", "text": "I made something! This was my first time coding outside of Arduinos, and one of the biggest learning experiences of my life. There was stress, time crunches, and pain, but it all came down to the wire. The most challenging part was drawing, of course, I’m never going to do this again JUST because of the assets. Thanks for playing", "repo": "https://github.com/wilbot3000/Liable-For-Damages", "demo": "https://wilbot3000.itch.io/liable-for-damages"}]...
|
[{"post_id": 75085, "ts": "202 [{"post_id": 75085, "ts": "2026-09-29T03:15:45Z", "hours": 3.1931, "text": "Started working on Liable for Damages 2.0 Devlog #1 Started working on better settings, mostly just things for volume, fonhts, and scrolling things. Whipped up some basic sprites in aseprite and took a day to implement them and figure out bugs, which were very annoying, mostly just related to button sizing. Had to mess around with Godot’s “containers”, for the first time, and it was quite bad, I’ve got some more work to do before I can get the sliders to work, but I’m close! Next stuff’s: -format sliders -start creating settings related to different busses -create saves for the sliders -implement button to change font -make font-changed labels for all maps -do bum ahh drivers ed instead of W Stardance I’ll hopefully release 2.0 within October, and I’mma try and devlog more! ~Wil"}, {"post_id": 72459, "ts": "2026-09-23T00:48:57Z", "hours": 0.7572, "text": "devlog for projects i forgot to add, really just time from learning to export godot games, very annoying um, fun fact, if you create a web game, change the file to index.html, or it literally WON’T WORK!!! Play my game (now!)"}, {"post_id": 71208, "ts": "2026-09-20T13:27:09Z", "hours": 10.0756, "text": "Final Release (or close to it) Game will be out soon, I just gotta ship, but everythings done, I finished sounds, and the ending yesterday, like a 8 hour coding marathon, so i could get this out in time. PLEASE play it, it’s called Liable for Damages, I don’t know where I’ll post it yet, but It’ll probably be on Itch.io or just the game application file. It’s like 150,000 kilabytes, so it shouldn’t be too bad for any computer, hopefully (mines from like 2009 and it ran fine) P.S! Please, (if you do play), comment bugs, especially major things, EXCEPT: -Player dissapearing when opening menu in elevator (don’t try this, im not fixing it it’s funny) -Bugs on top of head, (js kill them) Anything else is bad and needs fix thanks. Also sorry no volume controls, I was crunching down to finish."}, {"post_id": 69943, "ts": "2026-09-18T03:13:43Z", "hours": 10.1883, "text": "SFX stuff, final thing before ending, just finishing sounds, really annoying though ngl. done soon, big update at end"}, {"post_id": 67708, "ts": "2026-09-13T22:09:54Z", "hours": 11.4017, "text": "FINAL STRETCH time to lock in please oh no Im finishing the last level, no time to talk, but got like 4 things to finish THINGS: -level -boss fight -sounds -ending -bugs"}, {"post_id": 59735, "ts": "2026-09-01T17:44:56Z", "hours": 10.84, "text": "WORKING ON MY FINAL STRETCH I’m going to be locked in for the next few days, school starts, so I’ll have less time, but I got a boss fight and then bug fixing and sound effects, hears a sneak peak and one of the many things ive worked on. Also, I came up for a name. Looked up the universal laws for space and saw something about how “Countries of Origin are Liable for Damages caused by their space debris” and said “dang, thas dope” so now i have a name. In my next log ill have a longer devlog like a lite trailer, but the games pretty short, more like a showcase of learning. Thanks!"}, {"post_id": 55339, "ts": "2026-08-27T02:45:42Z", "hours": 9.8842, "text": "quick stuff, nothing much Finished some updates, but I’m locked so don’t have time to write much"}, {"post_id": 53129, "ts": "2026-08-23T15:40:04Z", "hours": 10.67, "text": "Another devlog about levels. Started work on the second (this takes so long) I can’t say much for fear of spoilers, but just say this involves WAY to much code and sprites (I hate drawing so much)"}, {"post_id": 51334, "ts": "2026-08-20T22:46:55Z", "hours": 10.2436, "text": "quick devlog. I need to do this cause i got 10 hours, Im working on the level system and im so tired please why is htis so hard D: D: D: D: D: D: D: D: D: D: D: D:"}, {"post_id": 49718, "ts": "2026-08-18T17:06:16Z", "hours": 9.2325, "text": "keypads, doors, and beginning of the first level. Im actually making a game! contains spoilers First of many… keypads were really difficult, every button, when clicked, multiplies the correct number by a multiplier, and adds it to a “code” variable. the multiplier is chosen based on what step of the code you’re on, (e.g, 1: 10000, 2: 1000, 3: 100, 4: 10, 5: 1), when you click the green button, it cross checks another variable with the one you typed, and if they’re the same, it sends the function to open the doors, and if not, everything resets. The other terminals and what not just open things when clicked on, so it’s just an easier version of the keypad."}, {"post_id": 47241, "ts": "2026-08-15T01:07:13Z", "hours": 8.0058, "text": "Flying enemy is complete, in record time! wow, 8 hours for an enemy, how quick D: This was a challenge, but also really fun. This enemy is the flying one, which made it a little more difficult than just the copy and paste of old ones but still pretty cool. It works using a Navigation Agent, which is like Godot pathfinding. Fast forward three hours and a whole lot of troubleshooting, but that works. The enemy detects the player in the same fashion as the other enemies and then activates the nav-agent to being movement. It’ll follow the player through vents, passages and really anywhere. The fly has three main detection circles, the first one tells it to move towards the player, if the player enters the second one, it’ll freeze and stop moving, and if the player gets even closer, it’ll try to move away (by reversing the velocity var outputted by the nav-agent, iyc) the enemy’s one hit, acourse, but is really annoying to attack, (ill rework ground pounding to make this easier later). The enemy has a shooting attack, that is on a 6 second timer if it can see the player, otherwise it’s just on hold. its shots are pretty slow, so there easy to avoid, but in a crowded fight ya never know. The main quirk of this enemy is it has a really long forgetfulness timer, so even if it can’t see you, it’ll continue to follow for quite a long time, much longer than other enemies. Next:! -stationary, weird wall tentacle that shoots at you -egg spawner that hatches into 1 of three enemies (mystery ooh) -doors (ikr)"}, {"post_id": 44372, "ts": "2026-08-10T02:47:57Z", "hours": 2.9308, "text": "Enemy is complete: Chomper! Lot of work, but got it done. This is the, please avoid, very dangerous, you will die enemy. I haven’t balanced its health yet, and I’m not going to for a while, so it looks like an easy kill in the video. The weird quirks of this enemy are mostly in its charge attack, that rushes the player. It’s pretty easy to avoid, but once again i haven’t done attack balancing, so it may become harder later. The majority of the enemy works just like the lil guy, so idk read that devlog. But there is two major differences: LIST: gasp 1.!!!1! : idle stuff -really just a randomizer -if enemy is idling, starts a timer, and when it runs out of time, it does one of two things (using a randi() function) -if the outputs a 1, nothing happens, but if its a 2 it flips the enemy, thas all -the main reason for this is that since this enemy is so big, making it a tad more animated than the lil guy felt important to me, and also because the detection areas for the big guy are skewed towards the front, so him turning around makes the player sneaking up on him a little less common, it’s generally just for Q-O-l (slang btw) (only cool people understand) 2.!: dash -dear lord, why was hard so much D: -Wasn’t actually that difficult, I spent a lot of time trying stuff before realizing I just unleash my inner enginneer and do it step by step ’till it works, which it did. -first, theres three detection boxes, one for walking towards the player, one for the chomp, and one for dashing, if the player enters the dash-box, a timer will start -when the timer ends, the charge animation plays, which halfway through, activates a function too add velocity (actual charge part of charge) -If the enemy hits a wall, player, or box, it stops moving, but in the case of the player it plays a second animation (dash_hit) that looks like a chomp and kills the player if it hits them. Theres another If statement that sets velocity back to 0 when this happens also. OTHER CHANGES: -I removed the players health really, I like games that are one shot, because it’s subjectively more fun, I’ll make the player death a little more explosive if I have time. I’ll probably make them have three health but that’ll change when I do attack balancing -made the lil guys attack timer shorter, makes him more dangerous. NEXT TIME PLANS: -hopefully in one day (ima lock in rq) -gonna add a flying enemy, -literally just a tad fly, like 5x5 pixels, it’ll look at the player and fire acid that’ll kill you -i might change the death animation to be more BOOM (IYKWIM) :D -my goal is too complete the flying guy 100% tomorrow, but I got other stuff to do so we shall see -also it’ll be nice to not have to do major animating besides literally 6 pixels splaterring -if extra time, I’ll make a weird egg thing that turns into the fly THANKS FOR READING! as always (not really) go make some interesting, and uh learn something new every day please (P.S I made some changes after I took these videos so it still looks and feels kinda bad but not actually rn) ~Wilfred"}, {"post_id": 44000, "ts": "2026-08-09T14:18:20Z", "hours": 11.6767, "text": "Little enemy beginnings I haven’t actually finished anything yet, but I need to devlog anyways, but I have started to finish the second enemy, which is also the framework for more."}, {"post_id": 41460, "ts": "2026-08-05T17:57:18Z", "hours": 12.2908, "text": "player movement is complete!! went on vacation, so fell behind a bit, but finally got this done. I spent a lot of time thinking on how to make player movement good, and then thought of my BOTW playthroughs, where you can either hold your attack and have a powerful slash, or click fast and hit three in a row. First addition!: Ground pounds were pretty interesting, all it does is forces the player down hard if they attack in the air, decreases stamina, and then hits the ground, I added a dust cloud that explodes when he hits the ground, which just plays the animation and then disappears. I had to do some fenagling with this because the code knows when to start the animation because the player will be ground pounding and on the ground, which starts the poof and then stops ground pounding, which also keeps the animation from playing multiple times. SECOND: Annoying stupid player attacks. Tried to finish this in a day, so I was working till 11:00 at night, but I got the animations done and what not. When the player hits/holds the attack button, it starts a stopwatch that increases, when the player releases the button, depending on the time on this timer, it will either play the first of 3 quick attacks or the big attack, which does more damage. If the quick attacks are chosen, the first one will play, three things happen when thats starts, 2 timers start, and player velocity increases to 500. at the end of the attack, there are three things can happen, the player can wait until the animation ends, they can attack again, or they can walk to reset the attack earlier than waiting, the first timer forces the player to wait to cancel the attack by walking, and the second one stops their velocity so they jolt forward. at the end of the animation, a function is played that: starts the reset timer for the attack A variable increases that sets the next attack to be the second or third in the sequence, instead of the first and a if statement that resets the variable to 0 if it gets to 3. Theres some other details for weird situations, like falling off the edge and ground pounding while attacking, or the variable not resetting weirdly. But all of that was like an hour. Thanks for reading: Play my game when it comes out so I have a reason to finihs Also I need a name for the game (please, I suck at naming) and go play Legend of Zelda (or Just Cause 3) (or research operation Just Cause) #USinvadinglatinamericaAGAINfornoreason P.S (I was gonking on being up till eleven, but I did like 3 hours of animating and coding in like 30 minutes while being food deprived and barely awake because deadlines = lock in, so if you need to lock in just don’t sleep ig ) also, I’m technically not done ‘cause ma boy needs a sawed off before I’m done here Yee Haw"}, {"post_id": 35583, "ts": "2026-07-27T03:37:24Z", "hours": 1.1306, "text": "MOVEMENT PART # (3) les go took me short time, it’s ten o’clock im tired, pretty simple stuff. If player is sprinting and the crouch button is pressed, the normal function is overridden and a slide is activated, this just sets the animation to slide and the X velocity of the player to a high number. There’s some other code for just general quality of life, like stopping if you hit a wall and keeping you from changing directions, but the REALLLY cool part is jumping. Like in real life (trust), while sliding the player will jump further, which permits some cool movement combinations, like vaulting over gaps and climbing 4 block walls. I have to work out stamina changes depending on jump strength and stamina decrease for vaulting, but the movement getting pretty fleshed out. P.S, after I took the video, I changed the sprint stamina decrease to be a consistent decrease instead of being choppy like in the video, it’ll be in the next log, but it was just quality of life. NEXTS STUFFS: -dash -enemy lunge -stamina from hoisting and slide-jump stamina increase Thanks for reading!"}, {"post_id": 34965, "ts": "2026-07-26T03:00:51Z", "hours": 3.8936, "text": "Crouching! #2 in the player movement chronicles! Surprisingly, I also managed to create a whole new 5 animations! slide, crouch idle, crouch walk, and the sledge versions (not slide cause ya can’t sprint with sledge). I implemented all but the slide, which’ll take a long time, so I’m going to keep it off a bit. This was really straight forward to add, and for the first time in a long time, i had like only 1 problem . I really just had a piece of code that asks, “did ya click the crouch button?” and if so, it toggles crouch. IF (and only if!) the crouch is on (or “true”) the idle and walk animations are switched to their respective crouch variants, and the normal player hitbox is replaced by a shorter-er-est one. To bar the player from un-crouching in the midst of a tunnel, I added 2 new raycasts to the front and back of the players head facing up, these casts detect if there is a block above the player, and if either one of them detects anything, the player is unable to un-crouch until they are unshielded. Another quick thing I had to fix a bit was the raycasts detecting the player, which broke EVERYTHING so I just turned good ’ol collision mask/layer 20 into the super-cool (ALL-NEW !!) “player raycast collision!!!” which just only lets them interact with the floor and boxes, so yippee NEXT STEPeths!: -slide ): -enemy lunge -other player attacks (only hard attack right now which is bad)"}, {"post_id": 34347, "ts": "2026-07-24T23:18:41Z", "hours": 13.5214, "text": "Mantling and fixes Hi. I have had a very long week. I spent a lot of time working on sprites, mostly for the game 3rd level (no spoilers, (but that’s pretty boring) so heres the interesting part. I’ve been focusing on revamping player movement to make it feel more interesting and fun, and this is a good start. Mantling! if you don’t know what this is, it’s what you do when you get out of a pool without a ladder or staircase, pretty much just “pulling yourself up” The player does this by using raycasts, I added three, but one is for something else. One of them detects a wall in front of the player, and one detects a wall above. The code uses these casts to detect if the player is up against a wall, and if there is no wall above the player, pretty much checking if there is a mantalable ledge. If there is, the code says “you can mantle” Another line says: if you can mantle, and you are not on the ground, and if the player clicked space (Jump), then mantle. The annoying part was animations. When the player begins mantling, the hitbox and player position is frozen in space, and position is snapped to the nearest block to line up the animation. the only thing that moves during the animation is the player sprite, which means at the end of the animation, when the players position is finally changed, the player sprite needs to snap back at the EXACT same time, or it looks bad, which was hard. The other annoying part was the camera snapping randomly, as it moves with the player and not the sprite. I fixed this by just temporarily turning on the cameras position smoothing while the mantle is happening and then turning it off when the player moves again."}, {"post_id": 31003, "ts": "2026-07-19T01:34:03Z", "hours": 14.4064, "text": "sprites! done some stuff, mostly just game planning (sadly didn’t get time for because notes but I got a lot done, mostly just some serious drawing. I finished some tiles for the first and second levels, and some tiles for the next three."}, {"post_id": 26947, "ts": "2026-07-12T01:17:07Z", "hours": 4.2967, "text": "Quick hurt animations Main thing I added was animations for death and injury. I first added knockback when hit. It just takes the player’s scale.x (what i use for flipping the sprite) and multiplies it by 200 to the player velocity, since the scale is either 1 or -1, it changes the direction the player is thrown (in the future i’d like to make the scale the enemies direction, not the players, as if the player is flipped in the wrong direction, it could have knockback in the wrong direction (very bad) Theres was already a variable to detect if the player was being hit that was used for testing, so I just implemented that to play the injury animations. i also detected if the players health was zero or below after being hit, and if so it would make the player play the death animation instead of the injury. I have currently unimplemented animations for a before-death injured player, so after they are hit for the last time they will stand for a bit before collapsing. NEXT STUFF: (hast beeneth narrowed list) -add enemy knockback (only when injured, lok wierd when die) -fix player knockback thank yoh forth coming to my TED talk"}, {"post_id": 25010, "ts": "2026-07-08T22:32:29Z", "hours": 12.3911, "text": "I’m gonna start this by saying: I HATE animating! Aseprite made this so much easier, but GOD this was difficult… I think I had 5 situations this time around where the problem was the littlest change in the world, and I just needed to go to bed. I made 3 different walk cycles, before giving up and figuring out how to do it for real, it was only a little difficult after that. I have unused hurt, death, and push animations, and need to implement a shorter attack and smooth some things out still (jumping while attacking cough ) Almost all of these 12 hours was fixing stupid little problems and changing little pixels, probably some of the worst time ive spent on this project yet… (but still really interesting) NEXT STEPS::: -fix walk so it looks sensible (drifting) -make jumping illegal hwilst attacking -add short attack -customized tile map ????? Thank you for reading goodbye I want to stop animating"}, {"post_id": 21598, "ts": "2026-07-03T17:09:19Z", "hours": 4.0883, "text": "enemy attacks/better particles. This took some work, but not really… The enemy can now attack and hurt the player the codes really just the same as the player attacking the enemies. Theres a hurtbox in the player that gets hit by an area in the enemy that makes them take damage. The particles took some more difficult work. Godot has CPU and GPU particles, which apparently are different, it just depends on what in your computer renders them. I used GPU particles, because they run better and can collide with things. I whipped up a sprite sheet for the particles in Aseprite, which looked a lot better than the weird purple generic Godot things. The particles only collided with light occluders??, so I added an occlusion layer to the tile map, at some point I hope to create a better system for when they hit the ground, but thats not my priority right now. Next STEPS!!!!! -main thing is that the enemy has a lunge attack that I haven’t implemented yet, so thats next. -starting on the player sprites, this is a LOT of work, so its gonna take me a lot of time, but no time like the present"}, {"post_id": 20225, "ts": "2026-07-01T19:32:16Z", "hours": 5.3086, "text": "Some more enemy development! -first “enemy” in the game, a pretty basic little thing. -designed on Aseprite, took some time to set up with hakatime, but turns out I was using a version only used on Mac OS, so no kidding it was giving me trouble -I created unused animations for a lunge and whip attack animations that I will implement soon (?). NEXT STEPS :D : -stop the player from colliding with the enemy’s hitbox, it’s very annoying, and in the future will we a necessity for having many creatures in the same room -add the enemy attacks, I’ll probably just use a raycasy to see if the players close enough, and then make it hit, pretty simple… Also get Aseprite, it’s like 20 bucks but it’s a really good software, also it’s just really good for game making. gasp :D"}, {"post_id": 18857, "ts": "2026-06-30T01:51:26Z", "hours": 10.155, "text": "Basis of an enemy AI!!! the beginnings… I feel like ten hours is a little much for just this, but there was so much work to do. The main step began with a pretty simple area. It just detects if the player enters. The code uses the player position (or “target” position in the code), and subtracts it from the enemy position, if the numbers greater than 1 it moves one way and if less than -1 other. (The buffer in-between the 2 is just for smoothing) If the player is within the hitbox, the enemy shoots out a ray cast towards the player. If it touches the player, it lets the enemy move, if it hits a box or the ground first it doesn’t, pretty simple, till you realize what can go wrong… For clarification i have NO CLUE why any of what i did helped, but it did so yippee!!! The first problem was that the enemy would only detect the player if they were off the ground. I tried to fix this by forcing the ray cast to not interact with the Tile Map (which wouldn’t have worked anyways, because it still needs to so the objects can block the enemy’s sight). I set a piece of code to print what the enemy was interacting with, and it turns out it was the background? (I know, weird?) I seperated the background and collision ground into 2 tile layers, then turned of collisions for the back layer. After that there was some glitchy stuff which you can see in the video a bit, but I fixed almost all of it with literally one if statement that only lets the player become a target for the code (My code is a modified version from this website) / / / / / Godot 3.0: Visibility with Ray-casting · KCC Blog"}, {"post_id": 14832, "ts": "2026-06-24T02:59:54Z", "hours": 4.9869, "text": "Devlog #4? 3 big things this time, physics blocks, destructive blocks, and stamina upgrades. Physics!: -just a block but it’s a “rigid body”, so Godot gives it physics. -It uses some “borrowed code” to detect if the player is colliding with something and then add the players velocity to it.* -I had to change the hitbox of the floor to be a collision polygon, instead of one per block, which made the pushing kind of shotty.** Destruction!: -Really simple… just an enemy that can’t move or fight back. I added an animation so you can tell it’s getting hit but that’s the most complicated it got. Stamina! (it’s better): -I added 3 major things, though 2 of them are pretty small. First, I added a bar, Godot has a built-in progress bar node, so I just mapped the value from 0 - 10, and used the stamina value from the player as the value input -SECOND! I changed the recharge, instead of a variable that goes up when a timer ends, it now uses a move_toward() function to make the stamina tick up smoothly. -thirdibidily, a pause. Mainly because irl and in games you don’t just start recharging as soon as you stop moving. This uses a float that begins to tick up when the player starts moving, and when it surpasses a certain point, it allows the stamina to recharge. Final stuff!!! -I’ll start focusing on: -more indepth weapons -and maybe ai for enemies… probs something with raycasts……….."}, {"post_id": 13221, "ts": "2026-06-21T17:28:44Z", "hours": 1.7094, "text": "Sprinting! took a bit, but I finally got sprinting to work. Works pretty simply, the characters motion is determined by a speed variable, which just increases if the sprint button (shift) is held down. Here’s the code: if Input.is_action_just_pressed(“sprint”) and stamina >= 1: state_machine.travel(“sprint”) sprinting_timer.start() SPEED = 200 sprinting = true elif Input.is_action_just_released(“sprint”): SPEED = 75 sprinting = false sprinting_timer.stop() I’m using an animation_tree for my animations, instead of just a player, this helps the transitions from animations feel smoother, so thats what the “state_machine” is. The “sprinting” variable is used to force other animations (e.g, for idling and running) to check if the player is sprinting, and thus not override the animation (the sprinting animation currently is identical to running, but when I start designing the character i’ll change that). The timer is just on a .5 sec loop, and makes the stamina decrease when it ends, the second bit of code checks if you stopped sprinting, and returns the SPEED to normal and stops the timer loop. This code doesn’t actually fully work, as another if statement is needed. The extra “and” in the first check makes sure you can’t start sprinting if stamina is below one, but actually only checks once when you start sprinting, not constantly, so the sprinting doesn’t stop if stamina goes below 1 (like it should). if stamina < 1: SPEED = 75 sprinting_timer.stop() sprinting = false This code, unlike the first “if”, checks consistantly if stamina’s below one, and does the same job as if you let go of sprinting. This keeps stamina from going negative D: In the future I plan on adding a gradient to the effect, so the speed up isn’t as jarring, but this is a good start! Thanks to Brackeys for the current assets! (go watch his video on Godot, it’s very informative) ~wil"}, {"post_id": 12762, "ts": "2026-06-20T21:26:41Z", "hours": 13.1589, "text": "Finally started to develop a “game” made 3 things, Attacks, Stamina, and GUI Attacks: ->use hurtboxes detect if an area entered, if that area is_in_group(“attackarea”) the hurtbox takes a damage variable and applies it to the thing it’s attached too (Player, enemy, etc) Stamina: -> A timer slowly makes it tick upwards, starts at 10, and goes down if the player jumps or attacks, uses a Global Variable allow the GUI to display the stamina (there’s probably a better way but I’m lazy ¯ _ (ツ)_/¯) GUI: ->uses a canvas layer being displayed over a sub-viewport, which includes the coins and stamina, just displays text and then the quantities of each integer. next steps: ->destructible blocks ->physics blocks ->stamina bar (not integer) ->sprinting (and smoother movement. Thanks to Brackeys for the assets!"}, {"post_id": 5987, "ts": "2026-06-10T01:24:33Z", "hours": 4.8608, "text": "Finally done learning basic Godot!! My entire time has been dedicated to just learning how to use the software, and I’m glad to say I now have something to work off of. I still need to learn more, like GDscript, pixel art, and game design. Next Steps! -develop weapon (sledgehammer :D) -destructible terrain elements (fancy walls that get destroyed) -physics blocks -begin designing character and aliens"}]...
|
Title: Liable For Damages by @wilson_brunner | Sta Title: Liable For Damages by @wilson_brunner | Stardance
Devlogs:
Finally done learning basic Godot!! My entire time has been dedicated to just learning how to use the software, and I’m glad to say I now have something to work off of. I still need to learn more, like GDscript, pixel art, and game design. Next Steps! -develop weapon (sledgehammer :D) -destructible terrain elements (fancy walls that get destroyed) -physics blocks -begin designing character and aliens
Finally started to develop a “game” made 3 things, Attacks, Stamina, and GUI Attacks: ->use hurtboxes detect if an area entered, if that area is_in_group(“attackarea”) the hurtbox takes a damage variable and applies it to the thing it’s attached too (Player, enemy, etc) Stamina: -> A timer slowly makes it tick upwards, starts at 10, and goes down if the player jumps or attacks, uses a Global Variable allow the GUI to display the stamina (there’s probably a better way but I’m lazy ¯ _ (ツ)_/¯) GUI: ->uses a canvas layer being displayed over a sub-viewport, which includes the coins and stamina, just displays text and then the quantities of each integer. next steps: ->destructible blocks ->physics blocks ->stamina bar (not integer) ->sprinting (and smoother movement. Thanks to Brackeys for the assets!
Sprinting! took a bit, but I finally got sprinting to work. Works pretty simply, the characters motion is determined by a speed variable, which just increases if the sprint button (shift) is held down. Here’s the code: if Input.is_action_just_pressed(“sprint”) and stamina >= 1: state_machine.travel(“sprint”) sprinting_timer.start() SPEED = 200 sprinting = true elif Input.is_action_just_released(“sprint”): SPEED = 75 sprinting = false sprinting_timer.stop() I’m using an animation_tree for my animations, instead of just a player, this helps the transitions from animations feel smoother, so thats what the “state_machine” is. The “sprinting” variable is used to force other animations (e.g, for idling and running) to check if the player is sprinting, and thus not override the animation (the sprinting animation currently is identical to running, but when I start designing the character i’ll change that). The timer is just on a .5 sec loop, and makes the stamina decrease when it ends, the second bit of code checks if you stopped sprinting, and returns the SPEED to normal and stops the timer loop. This code doesn’t actually fully work, as another if statement is needed. The extra “and” in the first check makes sure you can’t start sprinting if stamina is below one, but actually only checks once when you start sprinting, not constantly, so the sprinting doesn’t stop if stamina goes below 1 (like it should). if stamina < 1: SPEED = 75 sprinting_timer.stop() sprinting = false This code, unlike the first “if”, checks consistantly if stamina’s below one, and does the same job as if you let go of sprinting. This keeps stamina from going negative D: In the future I plan on adding a gradient to the effect, so the speed up isn’t as jarring, but this is a good start! Thanks to Brackeys for the current assets! (go watch his video on Godot, it’s very informative) ~wil
Devlog #4? 3 big things this time, physics blocks, destructive blocks, and stamina upgrades. Physics!: -just a block but it’s a “rigid body”, so Godot gives it physics. -It uses some “borrowed code” to detect if the player is colliding with something and then add the players velocity to it.* -I had to change the hitbox of the floor to be a collision polygon, instead of one per block, which made the pushing kind of shotty.** Destruction!: -Really simple… just an enemy that can’t move or fight back. I added an animation so you can tell it’s getting hit but that’s the most complicated it got. Stamina! (it’s better): -I added 3 major things, though 2 of them are pretty small. First, I added a bar, Godot has a built-in progress bar node, so I just mapped the value from 0 - 10, and used the stamina value from the player as the value input -SECOND! I changed the recharge, instead of a variable that goes up when a timer ends, it now uses a move_toward() function to make the stamina tick up smoothly. -thirdibidily, a pause. Mainly because irl and in games you don’t just start recharging as soon as you stop moving. This uses a float that begins to tick up when the player starts moving, and when it surpasses a certain point, it allows the stamina to recharge. Final stuff!!! -I’ll start focusing on: -more indepth weapons -and maybe ai for enemies… probs something with raycasts………..
Basis of an enemy AI!!! the beginnings… I feel like ten hours is a little much for just this, but there was so much work to do. The main step began with a pretty simple area. It just detects if the player enters. The code uses the player position (or “target” position in the code), and subtracts it from the enemy position, if the numbers greater than 1 it moves one way and if less than -1 other. (The buffer in-between the 2 is just for smoothing) If the player is within the hitbox, the enemy shoots out a ray cast towards the player. If it touches the player, it lets the enemy move, if it hits a box or the ground first it doesn’t, pretty simple, till you realize what can go wrong… For clarification i have NO CLUE why any of what i did helped, but it did so yippee!!! The first problem was that the enemy would only detect the player if they were off the ground. I tried to fix this by forcing the ray cast to not interact with the Tile Map (which wouldn’t have worked anyways, because it still needs to so the objects can block the enemy’s sight). I set a piece of code to print what the enemy was interacting with, and it turns out it was the background? (I know, weird?) I seperated the background and collision ground into 2 tile layers, then turned of collisions for the back layer. After that there was some glitchy stuff which you can see in the video a bit, but I fixed almost all of it with literally one if statement that only lets the player become a target for the code (My code is a modified version from this website) / / / / / Godot 3.0: Visibility with Ray-casting · KCC Blog
Some more enemy development! -first “enemy” in the game, a pretty basic little thing. -designed on Aseprite, took some time to set up with hakatime, but turns out I was using a version only used on Mac OS, so no kidding it was giving me trouble -I created unused animations for a lunge and whip attack animations that I will implement soon (?). NEXT STEPS :D : -stop the player from colliding with the enemy’s hitbox, it’s very annoying, and in the future will we a necessity for having many creatures in the same room -add the enemy attacks, I’ll probably just use a raycasy to see if the players close enough, and then make it hit, pretty simple… Also get Aseprite, it’s like 20 bucks but it’s a really good software, also it’s just really good for game making. gasp :D
enemy attacks/better particles. This took some work, but not really… The enemy can now attack and hurt the player the codes really just the same as the player attacking the enemies. Theres a hurtbox in the player that gets hit by an area in the enemy that makes them take damage. The particles took some more difficult work. Godot has CPU and GPU particles, which apparently are different, it just depends on what in your computer renders them. I used GPU particles, because they run better and can collide with things. I whipped up a sprite sheet for the particles in Aseprite, which looked a lot better than the weird purple generic Godot things. The particles only collided with light occluders??, so I added an occlusion layer to the tile map, at some point I hope to create a better system for when they hit the ground, but thats not my priority right now. Next STEPS!!!!! -main thing is that the enemy has a lunge attack that I haven’t implemented yet, so thats next. -starting on the player sprites, this is a LOT of work, so its gonna take me a lot of time, but no time like the present
I’m gonna start this by saying: I HATE animating! Aseprite made this so much easier, but GOD this was difficult… I think I had 5 situations this time around where the problem was the littlest change in the world, and I just needed to go to bed. I made 3 different walk cycles, before giving up and figuring out how to do it for real, it was only a little difficult after that. I have unused hurt, death, and push animations, and need to implement a shorter attack and smooth some things out still (jumping while attacking cough ) Almost all of these 12 hours was fixing stupid little problems and changing little pixels, probably some of the worst time ive spent on this project yet… (but still really interesting) NEXT STEPS::: -fix walk so it looks sensible (drifting) -make jumping illegal hwilst attacking -add short attack -customized tile map ????? Thank you for reading goodbye I want to stop animating
Quick hurt animations Main thing I added was animations for death and injury. I first added knockback when hit. It just takes the player’s scale.x (what i use for flipping the sprite) and multiplies it by 200 to the player velocity, since the scale is either 1 or -1, it changes the direction the player is thrown (in the future i’d like to make the scale the enemies direction, not the players, as if the player is flipped in the wrong direction, it could have knockback in the wrong direction (very bad) Theres was already a variable to detect if the player was being hit that was used for testing, so I just implemented that to play the injury animations. i also detected if the players health was zero or below after being hit, and if so it would make the player play the death animation instead of the injury. I have currently unimplemented animations for a before-death injured player, so after they are hit for the last time they will stand for a bit before collapsing. NEXT STUFF: (hast beeneth narrowed list) -add enemy knockback (only when injured, lok wierd when die) -fix player knockback thank yoh forth coming to my TED talk
sprites! done some stuff, mostly just game planning (sadly didn’t get time for because notes but I got a lot done, mostly just some serious drawing. I finished some tiles for the first and second levels, and some tiles for the next three.
Mantling and fixes Hi. I have had a very long week. I spent a lot of time working on sprites, mostly for the game 3rd level (no spoilers, (but that’s pretty boring) so heres the interesting part. I’ve been focusing on revamping player movement to make it feel more interesting and fun, and this is a good start. Mantling! if you don’t know what this is, it’s what you do when you get out of a pool without a ladder or staircase, pretty much just “pulling yourself up” The player does this by using raycasts, I added three, but one is for something else. One of them detects a wall in front of the player, and one detects a wall above. The code uses these casts to detect if the player is up against a wall, and if there is no wall above the player, pretty much checking if there is a mantalable ledge. If there is, the code says “you can mantle” Another line says: if you can mantle, and you are not on the ground, and if the player clicked space (Jump), then mantle. The annoying part was animations. When the player begins mantling, the hitbox and player position is frozen in space, and position is snapped to the nearest block to line up the animation. the only thing that moves during the animation is the player sprite, which means at the end of the animation, when the players position is finally changed, the player sprite needs to snap back at the EXACT same time, or it looks bad, which was hard. The other annoying part was the camera snapping randomly, as it moves with the player and not the sprite. I fixed this by just temporarily turning on the cameras position smoothing while the mantle is happening and then turning it off when the player moves again.
Crouching! #2 in the player movement chronicles! Surprisingly, I also managed to create a whole new 5 animations! slide, crouch idle, crouch walk, and the sledge versions (not slide cause ya can’t sprint with sledge). I implemented all but the slide, which’ll take a long time, so I’m going to keep it off a bit. This was really straight forward to add, and for the first time in a long time, i had like only 1 problem . I really just had a piece of code that asks, “did ya click the crouch button?” and if so, it toggles crouch. IF (and only if!) the crouch is on (or “true”) the idle and walk animations are switched to their respective crouch variants, and the normal player hitbox is replaced by a shorter-er-est one. To bar the player from un-crouching in the midst of a tunnel, I added 2 new raycasts to the front and back of the players head facing up, these casts detect if there is a block above the player, and if either one of them detects anything, the player is unable to un-crouch until they are unshielded. Another quick thing I had to fix a bit was the raycasts detecting the player, which broke EVERYTHING so I just turned good ’ol collision mask/layer 20 into the super-cool (ALL-NEW !!) “player raycast collision!!!” which just only lets them interact with the floor and boxes, so yippee NEXT STEPeths!: -slide ): -enemy lunge -other player attacks (only hard attack right now which is bad)
MOVEMENT PART # (3) les go took me short time, it’s ten o’clock im tired, pretty simple stuff. If player is sprinting and the crouch button is pressed, the normal function is overridden and a slide is activated, this just sets the animation to slide and the X velocity of the player to a high number. There’s some other code for just general quality of life, like stopping if you hit a wall and keeping you from changing directions, but the REALLLY cool part is jumping. Like in real life (trust), while sliding the player will jump further, which permits some cool movement combinations, like vaulting over gaps and climbing 4 block walls. I have to work out stamina changes depending on jump strength and stamina decrease for vaulting, but the movement getting pretty fleshed out. P.S, after I took the video, I changed the sprint stamina decrease to be a consistent decrease instead of being choppy like in the video, it’ll be in the next log, but it was just quality of life. NEXTS STUFFS: -dash -enemy lunge -stamina from hoisting and slide-jump stamina increase Thanks for reading!
player movement is complete!! went on vacation, so fell behind a bit, but finally got this done. I spent a lot of time thinking on how to make player movement good, and then thought of my BOTW playthroughs, where you can either hold your attack and have a powerful slash, or click fast and hit three in a row. First addition!: Ground pounds were pretty interesting, all it does is forces the player down hard if they attack in the air, decreases stamina, and then hits the ground, I added a dust cloud that explodes when he hits the ground, which just plays the animation and then disappears. I had to do some fenagling with this because the code knows when to start the animation because the player will be ground pounding and on the ground, which starts the poof and then stops ground pounding, which also keeps the animation from playing multiple times. SECOND: Annoying stupid player attacks. Tried to finish this in a day, so I was working till 11:00 at night, but I got the animations done and what not. When the player hits/holds the attack button, it starts a stopwatch that increases, when the player releases the button, depending on the time on this timer, it will either play the first of 3 quick attacks or the big attack, which does more damage. If the quick attacks are chosen, the first one will play, three things happen when thats starts, 2 timers start, and player velocity increases to 500. at the end of the attack, there are three things can happen, the player can wait until the animation ends, they can attack again, or they can walk to reset the attack earlier than waiting, the first timer forces the player to wait to cancel the attack by walking, and the second one stops their velocity so they jolt forward. at the end of the animation, a function is played that: starts the reset timer for the attack A variable increases that sets the next attack to be the second or third in the sequence, instead of the first and a if statement that resets the variable to 0 if it gets to 3. Theres some other details for weird situations, like falling off the edge and ground pounding while attacking, or the variable not resetting weirdly. But all of that was like an hour. Thanks for reading: Play my game when it comes out so I have a reason to finihs Also I need a name for the game (please, I suck at naming) and go play Legend of Zelda (or Just Cause 3) (or research operation Just Cause) #USinvadinglatinamericaAGAINfornoreason P.S (I was gonking on being up till eleven, but I did like 3 hours of animating and coding in like 30 minutes while being food deprived and barely awake because deadlines = lock in, so if you need to lock in just don’t sleep ig ) also, I’m technically not done ‘cause ma boy needs a sawed off before I’m done here Yee Haw
Little enemy beginnings I haven’t actually finished anything yet, but I need to devlog anyways, but I have started to finish the second enemy, which is also the framework for more.
Enemy is complete: Chomper! Lot of work, but got it done. This is the, please avoid, very dangerous, you will die enemy. I haven’t balanced its health yet, and I’m not going to for a while, so it looks like an easy kill in the video. The weird quirks of this enemy are mostly in its charge attack, that rushes the player. It’s pretty easy to avoid, but once again i haven’t done attack balancing, so it may become harder later. The majority of the enemy works just like the lil guy, so idk read that devlog. But there is two major differences: LIST: gasp 1.!!!1! : idle stuff -really just a randomizer -if enemy is idling, starts a timer, and when it runs out of time, it does one of two things (using a randi() function) -if the outputs a 1, nothing happens, but if its a 2 it flips the enemy, thas all -the main reason for this is that since this enemy is so big, making it a tad more animated than the lil guy felt important to me, and also because the detection areas for the big guy are skewed towards the front, so him turning around makes the player sneaking up on him a little less common, it’s generally just for Q-O-l (slang btw) (only cool people understand) 2.!: dash -dear lord, why was hard so much D: -Wasn’t actually that difficult, I spent a lot of time trying stuff before realizing I just unleash my inner enginneer and do it step by step ’till it works, which it did. -first, theres three detection boxes, one for walking towards the player, one for the chomp, and one for dashing, if the player enters the dash-box, a timer will start -when the timer ends, the charge animation plays, which halfway through, activates a function too add velocity (actual charge part of charge) -If the enemy hits a wall, player, or box, it stops moving, but in the case of the player it plays a second animation (dash_hit) that looks like a chomp and kills the player if it hits them. Theres another If statement that sets velocity back to 0 when this happens also. OTHER CHANGES: -I removed the players health really, I like games that are one shot, because it’s subjectively more fun, I’ll make the player death a little more explosive if I have time. I’ll probably make them have three health but that’ll change when I do attack balancing -made the lil guys attack timer shorter, makes him more dangerous. NEXT TIME PLANS: -hopefully in one day (ima lock in rq) -gonna add a flying enemy, -literally just a tad fly, like 5x5 pixels, it’ll look at the player and fire acid that’ll kill you -i might change the death animation to be more BOOM (IYKWIM) :D -my goal is too complete the flying guy 100% tomorrow, but I got other stuff to do so we shall see -also it’ll be nice to not have to do major animating besides literally 6 pixels splaterring -if extra time, I’ll make a weird egg thing that turns into the fly THANKS FOR READING! as always (not really) go make some interesting, and uh learn something new every day please (P.S I made some changes after I took these videos so it still looks and feels kinda bad but not actually rn) ~Wilfred
Flying enemy is complete, in record time! wow, 8 hours for an enemy, how quick D: This was a challenge, but also really fun. This enemy is the flying one, which made it a little more difficult than just the copy and paste of old ones but still pretty cool. It works using a Navigation Agent, which is like Godot pathfinding. Fast forward three hours and a whole lot of troubleshooting, but that works. The enemy detects the player in the same fashion as the other enemies and then activates the nav-agent to being movement. It’ll follow the player through vents, passages and really anywhere. The fly has three main detection circles, the first one tells it to move towards the player, if the player enters the second one, it’ll freeze and stop moving, and if the player gets even closer, it’ll try to move away (by reversing the velocity var outputted by the nav-agent, iyc) the enemy’s one hit, acourse, but is really annoying to attack, (ill rework ground pounding to make this easier later). The enemy has a shooting attack, that is on a 6 second timer if it can see the player, otherwise it’s just on hold. its shots are pretty slow, so there easy to avoid, but in a crowded fight ya never know. The main quirk of this enemy is it has a really long forgetfulness timer, so even if it can’t see you, it’ll continue to follow for quite a long time, much longer than other enemies. Next:! -stationary, weird wall tentacle that shoots at you -egg spawner that hatches into 1 of three enemies (mystery ooh) -doors (ikr)
keypads, doors, and beginning of the first level. Im actually making a game! contains spoilers First of many… keypads were really difficult, every button, when clicked, multiplies the correct number by a multiplier, and adds it to a “code” variable. the multiplier is chosen based on what step of the code you’re on, (e.g, 1: 10000, 2: 1000, 3: 100, 4: 10, 5: 1), when you click the green button, it cross checks another variable with the one you typed, and if they’re the same, it sends the function to open the doors, and if not, everything resets. The other terminals and what not just open things when clicked on, so it’s just an easier version of the keypad.
quick devlog. I need to do this cause i got 10 hours, Im working on the level system and im so tired please why is htis so hard D: D: D: D: D: D: D: D: D: D: D: D:
Another devlog about levels. Started work on the second (this takes so long) I can’t say much for fear of spoilers, but just say this involves WAY to much code and sprites (I hate drawing so much)
quick stuff, nothing much Finished some updates, but I’m locked so don’t have time to write much
WORKING ON MY FINAL STRETCH I’m going to be locked in for the next few days, school starts, so I’ll have less time, but I got a boss fight and then bug fixing and sound effects, hears a sneak peak and one of the many things ive worked on. Also, I came up for a name. Looked up the universal laws for space and saw something about how “Countries of Origin are Liable for Damages caused by their space debris” and said “dang, thas dope” so now i have a name. In my next log ill have a longer devlog like a lite trailer, but the games pretty short, more like a showcase of learning. Thanks!
FINAL STRETCH time to lock in please oh no Im finishing the last level, no time to talk, but got like 4 things to finish THINGS: -level -boss fight -sounds -ending -bugs
SFX stuff, final thing before ending, just finishing sounds, really annoying though ngl. done soon, big update at end
Final Release (or close to it) Game will be out soon, I just gotta ship, but everythings done, I finished sounds, and the ending yesterday, like a 8 hour coding marathon, so i could get this out in time. PLEASE play it, it’s called Liable for Damages, I don’t know where I’ll post it yet, but It’ll probably be on Itch.io or just the game application file. It’s like 150,000 kilabytes, so it shouldn’t be too bad for any computer, hopefully (mines from like 2009 and it ran fine) P.S! Please, (if you do play), comment bugs, especially major things, EXCEPT: -Player dissapearing when opening menu in elevator (don’t try this, im not fixing it it’s funny) -Bugs on top of head, (js kill them) Anything else is bad and needs fix thanks. Also sorry no volume controls, I was crunching down to finish.
devlog for projects i forgot to add, really just time from learning to export godot games, very annoying um, fun fact, if you create a web game, change the file to index.html, or it literally WON’T WORK!!! Play my game (now!)
Started working on Liable for Damages 2.0 Devlog #1 Started working on better settings, mostly just things for volume, fonhts, and scrolling things. Whipped up some basic sprites in aseprite and took a day to implement them and figure out bugs, which were very annoying, mostly just related to button sizing. Had to mess around with Godot’s “containers”, for the first time, and it was quite bad, I’ve got some more work to do before I can get the sliders to work, but I’m close! Next stuff’s: -format sliders -start creating settings related to different busses -create saves for the sliders -implement button to change font -make font-changed labels for all maps -do bum ahh drivers ed instead of W Stardance I’ll hopefully release 2.0 within October, and I’mma try and devlog more! ~Wil
Ships:
I made something! This was my first time coding outside of Arduinos, and one of the biggest learning experiences of my life. There was stress, time crunches, and pain, but it all came down to the wire. The most challenging part was drawing, of course, I’m never going to do this again JUST because of the assets. Thanks for playing...
|
1792856909.6890633
|
1792943309.6890633
|
|
6431
|
luminal by @t3kkm0tt | Stardance
|
t3kkm0tt
|
0
|
214.16
|
0
|
[]
|
[{"post_id": 80812, "ts": "202 [{"post_id": 80812, "ts": "2026-10-18T21:03:58Z", "hours": 11.4214, "text": "What has changed I forgot to devlog (again) and I lost 1hr 21m I started working on registration (yey) I removed the login screen because it was a stupid concept because the identifiers are long as helllllll and they can be loaded from a file I added a registration screen that currently only shows that you can go to the list of public instances or host your own instance (with a link to the docs which don’t exist yet)"}, {"post_id": 79141, "ts": "2026-10-12T19:59:26Z", "hours": 10.5661, "text": "What has changed: I (once again) forgot to devlog in time so I lost about 33m I deleted the client because I hate css and html (making an iced ui in rust now) added more stuff to lcp (functions, yey) refined the login (I have no idea if I did it right, but I´ll see.)"}, {"post_id": 77670, "ts": "2026-10-07T19:45:36Z", "hours": 11.1578, "text": "what has changed I forgor to devlog so i lost 1h and 9m. I deleted major parts of lcp , instance and msgstorage , which I am rebuilding right now. I just installed another distro (guix system) so building doesn’t work right now"}, {"post_id": 74215, "ts": "2026-09-26T22:48:43Z", "hours": 10.9461, "text": "What has changed: not much, I had to get better at tauri and yew and had weird ownership errors i made a component that fetches the conversations (yay) i destroyed my table because I slammed on it too hard (not yay)"}, {"post_id": 70826, "ts": "2026-09-19T20:43:21Z", "hours": 6.1056, "text": "What has changed: I have stopped developing the tui and I´m focusing on a gui now. I also tried making a web-app but that didn´t really work :<"}, {"post_id": 68157, "ts": "2026-09-14T16:43:20Z", "hours": 8.6347, "text": "What has changed I changed the logo (someone on reddit drew it for me, big shoutout to them <3) I added a instance field to the Message struct so you can figure out what instance the Message was sent from (that´s useful for texting between instances (you send a Message to your instance, it sends it to your friend´s instance)) I fixed some bugs, but in its current state, the application won´t compile"}, {"post_id": 64195, "ts": "2026-09-08T12:54:10Z", "hours": 10.1464, "text": "What has changed I finally fixed a stupid bug by using DER instead of PEM I cleaned up a bit and added custom errors using thiserror I started implementing Communities and Groups"}, {"post_id": 59606, "ts": "2026-09-01T14:55:07Z", "hours": 9.5381, "text": "What has changed basically nothing, had multiple problems that I couldn´t fix, so I just used certbot to get the certs did some config system fixes for the instance wrote some comments/docs"}, {"post_id": 52550, "ts": "2026-08-22T18:29:24Z", "hours": 8.9558, "text": "What has changed: I made the TUI better and also made one for the instance I had multiple mental breakdowns trying to understand TLS I started implementing Let´s encrypt certs instead of self-signed ones for usability. Right now, I cannot show a screenshot of the stuff because it´s not compiling (yet)"}, {"post_id": 49214, "ts": "2026-08-17T21:24:41Z", "hours": 3.6575, "text": "What has changed: I added more customization options to the messagestorage, it was pretty hard to do that with ratatui I wrote some comments in the code I found a bug where the font is the same colour as the background, so the font is unreadable. I gotta fix that bug now."}, {"post_id": 47772, "ts": "2026-08-15T22:49:38Z", "hours": 4.4378, "text": "What has changed: I continued making the TUI and it now has color schemes, stats and settings. I will continue making the TUI for the instance later. I migrated the project to an organization to get luminal.codeberg.page as the domain of the website"}, {"post_id": 46282, "ts": "2026-08-13T12:31:37Z", "hours": 5.9986, "text": "What has changed: tried implementing a resource monitoring widget on the messagestorage dashboard and failed to do so, so I deleted it again (there were bugs I was unable to fix)"}, {"post_id": 43021, "ts": "2026-08-08T02:03:47Z", "hours": 8.3433, "text": "What has changed: continued making the TUI to a point where it was usable until I put a bug somewhere in the code. I will have to fix that soon updated the messagestorage replaced some .unwrap() s"}, {"post_id": 41644, "ts": "2026-08-06T00:15:22Z", "hours": 5.8672, "text": "What has changed: I started making a TUI using ratatui, focusing on minimalism and simplicity fixed some bugs"}, {"post_id": 40965, "ts": "2026-08-04T20:47:01Z", "hours": 5.7975, "text": "What has changed: I implemented and tested encryption (it still has some minor bugs, but it works) I stopped using userids and started using RSA keys for identification since that´s way more efficient"}, {"post_id": 39821, "ts": "2026-08-03T02:11:26Z", "hours": 8.9131, "text": "What has changed: I lost my mind trying to use the wtransport crate (it will work, trust (cope)) continued working on the messaging part refined the authentication stuff"}, {"post_id": 37227, "ts": "2026-07-29T19:35:16Z", "hours": 8.2822, "text": "What has changed: created a SQLite database for users and messages “offloaded” more code to LCP (Luminal Communication Protocol) started making the messaging part"}, {"post_id": 36057, "ts": "2026-07-27T22:01:52Z", "hours": 7.29, "text": "What has changed: Made a basic session-based authentication system (harder than I thought) using JWT Fixed and created some bugs Created unnecessary debug messages before I noticed that the hex decoding fails because I put something like ¨adasdasd¨ into my config instead of a hex string"}, {"post_id": 33264, "ts": "2026-07-23T01:24:33Z", "hours": 7.1994, "text": "What changed: continued making lcp (took longer as expected because the wtransport crate is poorly documented) started making messagestorage use lcp everything has become a mess, I gotta clean up next time I work on luminal Sidenote: I cannot commit to codeberg as I am writing this, they reported that they have an outage. I will push the code when codeberg is back up."}, {"post_id": 31853, "ts": "2026-07-20T15:54:01Z", "hours": 8.6744, "text": "What has changed Structure Started making libs and mods for the separate parts ( l uminal c ommunication p rotocol, etc.) changed the architecture from: Client <-> Messagestorage <-> Instance to: Messagestorage <- Client <-> Instance Bugfixes Fixed various bugs, but the compiler throws errors right now, so I cannot show a working version in the screenshot."}, {"post_id": 29139, "ts": "2026-07-15T20:31:15Z", "hours": 8.5089, "text": "What changed started making a bash-like shell for managing and controlling the instance rewrote the config system to use the toml crate instead of config fixed multiple bugs started making cert verification smol sidenote: I cannot work as fast as the last weeks right now because I’m on vacation and only have a dual-core ThinkPad with me."}, {"post_id": 26334, "ts": "2026-07-11T02:05:48Z", "hours": 8.7136, "text": "What changed added automatic port fetching for better ux fixed multiple bugs made the code very messy (gonna clean everything up tomorrow)"}, {"post_id": 15708, "ts": "2026-06-25T15:38:56Z", "hours": 7.2625, "text": "What changed: Took out ml-kem for now because it was causing rust-analyzer to be slow as hell Switched to RSA encryption because I was stupid fixed many bugs (not running right now - gotta fix that now) And a small information at the bottom: I am making this project to learn cryptography and get a Framework 12"}, {"post_id": 10286, "ts": "2026-06-16T22:32:02Z", "hours": 5.1903, "text": "Things that changed: I went back to BiStreams because I was dumb and didn’t realize that what I wanted to do was way easier with BiStreams . I started working on the backend, which can receive BiStreams from the selfhost-server as of now."}, {"post_id": 7109, "ts": "2026-06-11T21:35:55Z", "hours": 4.3564, "text": "Things that changed: Used multiple UniStreams instead of a single BiStream because its easier, made the functions more usable, removed unused dependencies."}, {"post_id": 6298, "ts": "2026-06-10T16:25:13Z", "hours": 5.8919, "text": "Started cleaning up and structuring the project. I also made a basic account system which will need some tuning later."}, {"post_id": 5589, "ts": "2026-06-09T13:19:23Z", "hours": 10.8408, "text": "After trying different protocols for literal hours , I finally settled on WebTransport. Its safer than WebSocket, I believe. I now have to make it send the json instead of “HELLO”."}, {"post_id": 1604, "ts": "2026-06-03T18:51:18Z", "hours": 1.4583, "text": "This is my first devlog of this project. I’ve always wanted to make a chat app since they are one of the most used tools today. Every attempt of making one failed and I was really frustrated. Now, I have motivation to make it and get something for free ."}]...
|
Title: luminal by @t3kkm0tt | Stardance
Devlogs:
Title: luminal by @t3kkm0tt | Stardance
Devlogs:
This is my first devlog of this project. I’ve always wanted to make a chat app since they are one of the most used tools today. Every attempt of making one failed and I was really frustrated. Now, I have motivation to make it and get something for free .
After trying different protocols for literal hours , I finally settled on WebTransport. Its safer than WebSocket, I believe. I now have to make it send the json instead of “HELLO”.
Started cleaning up and structuring the project. I also made a basic account system which will need some tuning later.
Things that changed: Used multiple UniStreams instead of a single BiStream because its easier, made the functions more usable, removed unused dependencies.
Things that changed: I went back to BiStreams because I was dumb and didn’t realize that what I wanted to do was way easier with BiStreams . I started working on the backend, which can receive BiStreams from the selfhost-server as of now.
What changed: Took out ml-kem for now because it was causing rust-analyzer to be slow as hell Switched to RSA encryption because I was stupid fixed many bugs (not running right now - gotta fix that now) And a small information at the bottom: I am making this project to learn cryptography and get a Framework 12
What changed added automatic port fetching for better ux fixed multiple bugs made the code very messy (gonna clean everything up tomorrow)
What changed started making a bash-like shell for managing and controlling the instance rewrote the config system to use the toml crate instead of config fixed multiple bugs started making cert verification smol sidenote: I cannot work as fast as the last weeks right now because I’m on vacation and only have a dual-core ThinkPad with me.
What has changed Structure Started making libs and mods for the separate parts ( l uminal c ommunication p rotocol, etc.) changed the architecture from: Client <-> Messagestorage <-> Instance to: Messagestorage <- Client <-> Instance Bugfixes Fixed various bugs, but the compiler throws errors right now, so I cannot show a working version in the screenshot.
What changed: continued making lcp (took longer as expected because the wtransport crate is poorly documented) started making messagestorage use lcp everything has become a mess, I gotta clean up next time I work on luminal Sidenote: I cannot commit to codeberg as I am writing this, they reported that they have an outage. I will push the code when codeberg is back up.
What has changed: Made a basic session-based authentication system (harder than I thought) using JWT Fixed and created some bugs Created unnecessary debug messages before I noticed that the hex decoding fails because I put something like ¨adasdasd¨ into my config instead of a hex string
What has changed: created a SQLite database for users and messages “offloaded” more code to LCP (Luminal Communication Protocol) started making the messaging part
What has changed: I lost my mind trying to use the wtransport crate (it will work, trust (cope)) continued working on the messaging part refined the authentication stuff
What has changed: I implemented and tested encryption (it still has some minor bugs, but it works) I stopped using userids and started using RSA keys for identification since that´s way more efficient
What has changed: I started making a TUI using ratatui, focusing on minimalism and simplicity fixed some bugs
What has changed: continued making the TUI to a point where it was usable until I put a bug somewhere in the code. I will have to fix that soon updated the messagestorage replaced some .unwrap() s
What has changed: tried implementing a resource monitoring widget on the messagestorage dashboard and failed to do so, so I deleted it again (there were bugs I was unable to fix)
What has changed: I continued making the TUI and it now has color schemes, stats and settings. I will continue making the TUI for the instance later. I migrated the project to an organization to get luminal.codeberg.page as the domain of the website
What has changed: I added more customization options to the messagestorage, it was pretty hard to do that with ratatui I wrote some comments in the code I found a bug where the font is the same colour as the background, so the font is unreadable. I gotta fix that bug now.
What has changed: I made the TUI better and also made one for the instance I had multiple mental breakdowns trying to understand TLS I started implementing Let´s encrypt certs instead of self-signed ones for usability. Right now, I cannot show a screenshot of the stuff because it´s not compiling (yet)
What has changed basically nothing, had multiple problems that I couldn´t fix, so I just used certbot to get the certs did some config system fixes for the instance wrote some comments/docs
What has changed I finally fixed a stupid bug by using DER instead of PEM I cleaned up a bit and added custom errors using thiserror I started implementing Communities and Groups
What has changed I changed the logo (someone on reddit drew it for me, big shoutout to them <3) I added a instance field to the Message struct so you can figure out what instance the Message was sent from (that´s useful for texting between instances (you send a Message to your instance, it sends it to your friend´s instance)) I fixed some bugs, but in its current state, the application won´t compile
What has changed: I have stopped developing the tui and I´m focusing on a gui now. I also tried making a web-app but that didn´t really work :<
What has changed: not much, I had to get better at tauri and yew and had weird ownership errors i made a component that fetches the conversations (yay) i destroyed my table because I slammed on it too hard (not yay)
what has changed I forgor to devlog so i lost 1h and 9m. I deleted major parts of lcp , instance and msgstorage , which I am rebuilding right now. I just installed another distro (guix system) so building doesn’t work right now
What has changed: I (once again) forgot to devlog in time so I lost about 33m I deleted the client because I hate css and html (making an iced ui in rust now) added more stuff to lcp (functions, yey) refined the login (I have no idea if I did it right, but I´ll see.)
What has changed I forgot to devlog (again) and I lost 1hr 21m I started working on registration (yey) I removed the login screen because it was a stupid concept because the identifiers are long as helllllll and they can be loaded from a file I added a registration screen that currently only shows that you can go to the list of public instances or host your own instance (with a link to the docs which don’t exist yet)...
|
1792612413.4905527
|
1793217213.4905527
|
|
50158
|
Kazi by @Bianca | Stardance
|
Bianca
|
1
|
212.74
|
407
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-20T21:14:41Z", "hours": 30.0, "multiplier": 13.9, "payout": 407, "blessing": "neutral", "text": "What I made: Kazi connects skilled trade workers with customers who need their services, making the process faster and easier. Workers are electricians, plumbers, builders, welders, mechanics, and other professionals who create profiles, showcase their skills, and find relevant jobs. Customers can use Kazi to discover skilled workers, view their profiles, and find the right person for the work they need. The challenges I faced: The challenges I faced were setting up the Google API to allow for Google sign-up and making sure the frontend and backend were communicating. Additionally, making a polished, well-thought-out app with minimal bugs was another challenge. Things I accomplished that I am proud of: Before starting this challenge, using the terminal felt like a foreign language and I didn’t know why the backend and frontend had to be separate. Now I can confidently say that the terminal is my best friend, and I don’t need to watch YouTube tutorials on the difference between an API and an SDK. Things to know: On the demo the google sign in does not work only on emulators it does. Taking photos and contact via phone is not supported on the demo as well. Using th README file has a lot of additional tips. If you create an account even if you close the file will be saved in the database and you can log in, if you have trouble deleting the account you made email me the email you used and ill do it manually.", "repo": "https://github.com/PhantomJelly/Kazi-Cursor.git", "demo": "https://phantomjelly.github.io/Kazi-Cursor/"}]...
|
[{"post_id": 65589, "ts": "202 [{"post_id": 65589, "ts": "2026-09-10T20:37:40Z", "hours": 9.9253, "text": "Dev vlog 21 - I didnt like the first iteration of the subsriptions screen so I made it more personalised to the specific industry im targeting. I changed words like “Pro plan” to “Artisan plan” and “Free plan” to “Apprentice plan”. The reason there is some what space is because I’ll be adding some assets what I’m still designing in procreate and Lottie."}, {"post_id": 65015, "ts": "2026-09-09T20:11:12Z", "hours": 10.4989, "text": "Dev vlog 20 - Today I made the workers job screen more interactable and customizable. I’m going through day by day to improve each screen’s UI. I’m honestly quite happy with how the app is coming up even though I’ve only done 2 screens im slowly getting to a completed version 1."}, {"post_id": 64677, "ts": "2026-09-09T08:33:15Z", "hours": 10.4519, "text": "Dev vlog 19 - I added a pay wall on the worker account that limits theamount of jobs a worker can recieve and and the features they have. It costs $3.00 (I converted it) which is a small amount for the workers, I dont want it to be too high as in Namibia subscriptions is not something people are willing to pay. Especially low wage workers and unemployed people"}, {"post_id": 64413, "ts": "2026-09-08T19:39:24Z", "hours": 6.9683, "text": "Dev vlog 18 - I’ve been making some assets to use for the UI and testing the app to find more areas I’d like to add more features and animations."}, {"post_id": 63751, "ts": "2026-09-07T18:24:22Z", "hours": 9.5639, "text": "Dev vlog 17 - Hi I made good progress with the UI, I started with the splash screen and I’m working my way from there, the animation was a bit glitchy and i fexed the issue. Additionally, the letters were not lined up which was quite a task to do, i though it would be easier but when importing the animation it would keep changing it so I had to make tha letters separate to the animation. I used Mobbin to get references and I saw most we’re too flashy so i made mine simple but enjoyable. Next I’ll be working on the user onboardeing, im currently preparing a lot of assets as I want it to be interactive and unique."}, {"post_id": 62718, "ts": "2026-09-06T06:43:31Z", "hours": 9.8536, "text": "Dev vlog 16 - After adding the Didit verification the SQL database was not syncing, a had to make 2 separate databses to make it work, now im able to make an account again."}, {"post_id": 62449, "ts": "2026-09-05T19:59:59Z", "hours": 9.1511, "text": "Dev post 15 - Hey everyone, I spent the day improving the web experience for testers and you guys :). Im still having troubles with the google sign in but ill try and address it tomorrow. My favourite thing i did was limiting the web screen so that it gives more of that app feel."}, {"post_id": 61380, "ts": "2026-09-04T08:21:31Z", "hours": 10.3572, "text": "Dev post 14 - Hi everyone I spent the whole day polishing up Kazi, fixing bugs, and just improving the overall experience. Now im going to add more features I’m planning on adding a paywall to start making some income from this, and im now brainstorming the features I should add."}, {"post_id": 60515, "ts": "2026-09-02T22:09:05Z", "hours": 10.7911, "text": "Dev vlog 13 - I caught a bug which was actually quite critical. When the user would delete their account, their information would not get deleted, so if they made an account with same old email all the past information would still be there."}, {"post_id": 59122, "ts": "2026-08-31T19:07:19Z", "hours": 9.1975, "text": "Dev post 12 - I added back the google sign in and polished up the rest of the verification setup."}, {"post_id": 58193, "ts": "2026-08-30T15:27:10Z", "hours": 9.7597, "text": "Dev vlog 11 - I’m building the a better workflow in Figma and iy was been taking quite a long time to implement and I want to change some of the things I’ve build. I also want to make the UI animations in Figma instead of Lottie because I know how to use Figma more and you can add an extension to export your work as .lottie files (a type of file that allows your animation to run on your app without taking much storage)."}, {"post_id": 57327, "ts": "2026-08-29T13:23:34Z", "hours": 9.3769, "text": "Dev vlog 10 - Hi there I’ve been finalising the setup of the workers ID verification. I ran into some problems but I found this site that allows ID verification (can use passports, drivers licenses) for free for your first 500 verification every month, essentially meaning that if you stay below 500 verifications per month its completely free. Its called Didit. After setting up I’ll go on tosetting up analytics to track onboarding and activity of users."}, {"post_id": 56479, "ts": "2026-08-28T08:06:11Z", "hours": 12.835, "text": "Dev vlog 9 - Hi and thank you to everyone who voted for my project and all the tips you’ve given me. I have a few challenges I’m tackling at the moment: 1. Google sign it, it works with then mobile version (if I test with an APK) but not on web like in the demo. 2. The ID verification, it needs to be able to authenticate yours profiles which seems so complex. 3. The UI and making animations, I dont have much time as I have my A-level exams soon."}, {"post_id": 55756, "ts": "2026-08-27T18:56:17Z", "hours": 10.3631, "text": "Dev vlog 8 - I made some changes to the assistant section so that the questions asked by agent is more conscience and more interactive. Where the user can just tap on the screen and not type."}, {"post_id": 54739, "ts": "2026-08-25T20:25:24Z", "hours": 10.1636, "text": "Dev vlog 7 - After I made a basic AI chat assist, I made some minor UI improvements. I mainly focused on the inquiry generation, I’m not 100% there but I’m trying to make it as quick and easy as possible for users to easily send a detailed inquiries with minimal effort."}, {"post_id": 54310, "ts": "2026-08-25T08:13:39Z", "hours": 11.7128, "text": "Dev vlog 6 - Hi there, I’ve made a drastic change as I’ve descided to add an AI chat bot to the app to make it even more easier to send workers inquiries. It will be a place where you just describe the issue and it will automatically find the best worker and send them an inquiry for you after you give it all the necessary information."}, {"post_id": 53196, "ts": "2026-08-23T17:12:34Z", "hours": 10.9467, "text": "Dev vlog 6 - I finished with the official Beta version of Kazi and will be launching soon to the play store. After launching and getting my first wavy of users I’ll launch the official version 1."}, {"post_id": 52272, "ts": "2026-08-22T11:49:28Z", "hours": 2.8028, "text": "Dev vlog 5 - I set up notifications that pop up when a user opens the app, next I want to make it more interactive and add custom icons. Also for when allowing for photos I’ll add some humor when asking for permission and more custom icons. I’ll be making the icon on procreate then use Lottie to turn it into files that can be used on the app."}, {"post_id": 51479, "ts": "2026-08-21T06:40:27Z", "hours": 8.0186, "text": "Dev vlog 4 - Im now focusing on making the UI more unique and interactive. For planning im using Figma and for animations im using Lottie. I added some coloured elements so that its easier to see the difference between features more easily, like if your inquiry is pending or has been answered."}, {"post_id": 50803, "ts": "2026-08-20T06:37:08Z", "hours": 9.8239, "text": "Dev vlog 3 - I started using emulator, it took a while to install and setup. I made worker accounts have bonuses feature to get more clients, but now I want to improve the UI and add custom badges and animations, I started learning how to use Lottie to do that."}, {"post_id": 50478, "ts": "2026-08-19T17:19:01Z", "hours": 10.575, "text": "Dev vlog 2 - I made the customer side of the app but I used dummy data and didn’t connect any APIs yet so I need to do that. I also need to fix bugs and allow customers to contact the workers."}, {"post_id": 49519, "ts": "2026-08-18T12:07:28Z", "hours": 9.4683, "text": "Dev vlog 1 - I’m building a mobile app to help trade workers like plumbers, electricians, and cleaners find work. In the same light to help people find someone who can fix their leaky tap or install a cupboard. This is the workers side that I’ve built, I used my brothers phone to help me make a demo account and test out the features. The key features are different languages, photo verification, and google sign up."}]...
|
Title: Kazi by @Bianca | Stardance
Devlogs:
Dev v Title: Kazi by @Bianca | Stardance
Devlogs:
Dev vlog 1 - I’m building a mobile app to help trade workers like plumbers, electricians, and cleaners find work. In the same light to help people find someone who can fix their leaky tap or install a cupboard. This is the workers side that I’ve built, I used my brothers phone to help me make a demo account and test out the features. The key features are different languages, photo verification, and google sign up.
Dev vlog 2 - I made the customer side of the app but I used dummy data and didn’t connect any APIs yet so I need to do that. I also need to fix bugs and allow customers to contact the workers.
Dev vlog 3 - I started using emulator, it took a while to install and setup. I made worker accounts have bonuses feature to get more clients, but now I want to improve the UI and add custom badges and animations, I started learning how to use Lottie to do that.
Dev vlog 4 - Im now focusing on making the UI more unique and interactive. For planning im using Figma and for animations im using Lottie. I added some coloured elements so that its easier to see the difference between features more easily, like if your inquiry is pending or has been answered.
Dev vlog 5 - I set up notifications that pop up when a user opens the app, next I want to make it more interactive and add custom icons. Also for when allowing for photos I’ll add some humor when asking for permission and more custom icons. I’ll be making the icon on procreate then use Lottie to turn it into files that can be used on the app.
Dev vlog 6 - I finished with the official Beta version of Kazi and will be launching soon to the play store. After launching and getting my first wavy of users I’ll launch the official version 1.
Dev vlog 6 - Hi there, I’ve made a drastic change as I’ve descided to add an AI chat bot to the app to make it even more easier to send workers inquiries. It will be a place where you just describe the issue and it will automatically find the best worker and send them an inquiry for you after you give it all the necessary information.
Dev vlog 7 - After I made a basic AI chat assist, I made some minor UI improvements. I mainly focused on the inquiry generation, I’m not 100% there but I’m trying to make it as quick and easy as possible for users to easily send a detailed inquiries with minimal effort.
Dev vlog 8 - I made some changes to the assistant section so that the questions asked by agent is more conscience and more interactive. Where the user can just tap on the screen and not type.
Dev vlog 9 - Hi and thank you to everyone who voted for my project and all the tips you’ve given me. I have a few challenges I’m tackling at the moment: 1. Google sign it, it works with then mobile version (if I test with an APK) but not on web like in the demo. 2. The ID verification, it needs to be able to authenticate yours profiles which seems so complex. 3. The UI and making animations, I dont have much time as I have my A-level exams soon.
Dev vlog 10 - Hi there I’ve been finalising the setup of the workers ID verification. I ran into some problems but I found this site that allows ID verification (can use passports, drivers licenses) for free for your first 500 verification every month, essentially meaning that if you stay below 500 verifications per month its completely free. Its called Didit. After setting up I’ll go on tosetting up analytics to track onboarding and activity of users.
Dev vlog 11 - I’m building the a better workflow in Figma and iy was been taking quite a long time to implement and I want to change some of the things I’ve build. I also want to make the UI animations in Figma instead of Lottie because I know how to use Figma more and you can add an extension to export your work as .lottie files (a type of file that allows your animation to run on your app without taking much storage).
Dev post 12 - I added back the google sign in and polished up the rest of the verification setup.
Dev vlog 13 - I caught a bug which was actually quite critical. When the user would delete their account, their information would not get deleted, so if they made an account with same old email all the past information would still be there.
Dev post 14 - Hi everyone I spent the whole day polishing up Kazi, fixing bugs, and just improving the overall experience. Now im going to add more features I’m planning on adding a paywall to start making some income from this, and im now brainstorming the features I should add.
Dev post 15 - Hey everyone, I spent the day improving the web experience for testers and you guys :). Im still having troubles with the google sign in but ill try and address it tomorrow. My favourite thing i did was limiting the web screen so that it gives more of that app feel.
Dev vlog 16 - After adding the Didit verification the SQL database was not syncing, a had to make 2 separate databses to make it work, now im able to make an account again.
Dev vlog 17 - Hi I made good progress with the UI, I started with the splash screen and I’m working my way from there, the animation was a bit glitchy and i fexed the issue. Additionally, the letters were not lined up which was quite a task to do, i though it would be easier but when importing the animation it would keep changing it so I had to make tha letters separate to the animation. I used Mobbin to get references and I saw most we’re too flashy so i made mine simple but enjoyable. Next I’ll be working on the user onboardeing, im currently preparing a lot of assets as I want it to be interactive and unique.
Dev vlog 18 - I’ve been making some assets to use for the UI and testing the app to find more areas I’d like to add more features and animations.
Dev vlog 19 - I added a pay wall on the worker account that limits theamount of jobs a worker can recieve and and the features they have. It costs $3.00 (I converted it) which is a small amount for the workers, I dont want it to be too high as in Namibia subscriptions is not something people are willing to pay. Especially low wage workers and unemployed people
Dev vlog 20 - Today I made the workers job screen more interactable and customizable. I’m going through day by day to improve each screen’s UI. I’m honestly quite happy with how the app is coming up even though I’ve only done 2 screens im slowly getting to a completed version 1.
Dev vlog 21 - I didnt like the first iteration of the subsriptions screen so I made it more personalised to the specific industry im targeting. I changed words like “Pro plan” to “Artisan plan” and “Free plan” to “Apprentice plan”. The reason there is some what space is because I’ll be adding some assets what I’m still designing in procreate and Lottie.
Ships:
What I made: Kazi connects skilled trade workers with customers who need their services, making the process faster and easier. Workers are electricians, plumbers, builders, welders, mechanics, and other professionals who create profiles, showcase their skills, and find relevant jobs. Customers can use Kazi to discover skilled workers, view their profiles, and find the right person for the work they need. The challenges I faced: The challenges I faced were setting up the Google API to allow for Google sign-up and making sure the frontend and backend were communicating. Additionally, making a polished, well-thought-out app with minimal bugs was another challenge. Things I accomplished that I am proud of: Before starting this challenge, using the terminal felt like a foreign language and I didn’t know why the backend and frontend had to be separate. Now I can confidently say that the terminal is my best friend, and I don’t need to watch YouTube tutorials on the difference between an API and an SDK. Things to know: On the demo the google sign in does not work only on emulators it does. Taking photos and contact via phone is not supported on the demo as well. Using th README file has a lot of additional tips. If you create an account even if you close the file will be saved in the database and you can log in, if you have trouble deleting the account you made email me the email you used and ill do it manually....
|
1792878526.8970366
|
1793742526.8970366
|
|
9492
|
GLM5.3 on AMD CDNA4 by @EOBD | Stardance
|
EOBD
|
0
|
207.36
|
0
|
[]
|
[{"post_id": 57250, "ts": "202 [{"post_id": 57250, "ts": "2026-08-29T11:12:01Z", "hours": 30.3531, "text": "ohhhhh MY ooh My I got CDNA4 And GLM5.3 it’s a party NOW!! I’ma first find the best way to quantize the experts than we go swimming in Aiter to find A8W4 for the experts and A8WA for the rest we then benchmark plain torch – probably 20% work for 80% performance we then squeeze the residuals into a fused kernel + proper grouped gemm for the MLA + fp4 indexer keys and then, finally, see if it all comes under one launch, and does a pretty spin to become a 100% resident, HBM synced pipeline system. it’s no longer a kernel, but an async token horse I did fail my tests but worth it I tell ya!"}, {"post_id": 43316, "ts": "2026-08-08T14:47:22Z", "hours": 18.5081, "text": "Huge Pain with tile schedule for the MLP. huge. still haven’t fully figured it out, but getting there"}, {"post_id": 37908, "ts": "2026-07-30T22:06:51Z", "hours": 9.4236, "text": "Don’t leave XNACK on 🤦🏽 It’s been like a whole day trying to understand why I have these idles (not a stall) Hate myself so much. And mannnn – AMD – why nooooo documentation whatsoever as to how yor MMU works ?? 😭 not sure if I’d feel better, learning that they are willing to share this – but you’d just need to sign off your grandma as collateral on an NDA Or maybe show somewhere that there was a fault 😭😭😭 (could also be me not knowing where to look…) ….but…. while breaking my head, I also improved rocprof compute viewer 🎉 and it’s going GPL until AMD gives me access to CDNA4 and 5 hardware😇 Because they are so so nice and willing to support a budding kernel developer ♥️ or I’ll stop being lazy and write a PR which ever comes first I guess"}, {"post_id": 36315, "ts": "2026-07-28T11:05:53Z", "hours": 16.4278, "text": "Going to do the MoE next (HipKittens sync first) And so before I commit to a very complex design that would piggyback low-token-experts on ones that can fill the 16 rows for the matrix cores – though I should what the distrebution actually looks like… ): complex design will be needed ): Expected but still a bummer. My sample space is tiny because GPUs are expensive as hell. But I imagine it’s a good proxy because the curve looks right. maybe a bit more concentrated across a large chat focused on coding."}, {"post_id": 33588, "ts": "2026-07-23T17:11:44Z", "hours": 5.1664, "text": "Well. That’s been a huge pain. But I’s got a native unix shell Should be amazing to not rely on this slugish p9 windows is like sweet poison so nice but so sloowwwww bitlocker is scary guys ubuntu is the best – linux without the added pain of knowing how linux works (:"}, {"post_id": 31945, "ts": "2026-07-20T19:17:20Z", "hours": 9.6733, "text": "last 6 spills super nasty. LLVM be complex should also hoist the loads before the stores (ugly stalls are swaits). but look at that pretty no-sigpgmend-barrier work"}, {"post_id": 30824, "ts": "2026-07-18T19:18:20Z", "hours": 12.7942, "text": "I don’t hate LLVM anymore!! So easy to just hook up to its headers and do what the hell I want with it (mostly in terms of what opt passes to run on the device code because I’m scared of that fat binary linking 😭) LICM is being stupid? Kick that sucker off the top the stairs!! possibly could have also done this with opt but C++ is way cooler and going to pay off once I really dig deep into this. Ima get my 0 spills even if it’s going to cost me all my finals. probably already did 🥲 phhh that poor-people normal kernel… Hardware scheduled… Meh. No match for my persistent kernel! not actually sure why I beat it, shouldn’t have. Stores are not acked on at the end of the kernel. But we first smile, then run them back to back and earn that smile! Look at me utilizing smile debt like finance bro. Maybe its my very cool scheduling algo. but I doubt it."}, {"post_id": 29330, "ts": "2026-07-16T06:19:01Z", "hours": 10.5694, "text": "I know how I’ll do it! We will unfraternally have to have kernel boundaries but really just because the L1i cache is too small (and GPU architecture is too dumb) But it’s fine for now. Going to have the following kernels: 1:1 Residual + Norm 8:1 Residual + Norm (for the MoE summing) 1:1 Residual + Norm + MPT norm MoE Full DSA Fused attention (with or without indexer) Head + Sampling +Embedding retrieval + normed MTP embedding EH_Proj + MLP And then! For the HBM sync we need between so many things (mostly the attention kernel) I’m going to extend HipKittens with a flagging mechanism that latches onto the stores, and add many more load methods that depend on it (like a stream of available blocks. the coolest thing is that I can have the flagging work at a certain granularity, and the load can infer if it’s OK based on a different one! Don’t do kernels kids."}, {"post_id": 27336, "ts": "2026-07-12T20:26:58Z", "hours": 94.4428, "text": "(90h) I don’t like LLVM! fun! Have you ever written manual ASM loops because it hoists like there’s no tomorrow? and can’t handle a back edge?? And since it’s impossible to get CDNA4 hardware, will be moving forward with MI300s. All my ❤️ to RunPod and HotAisle (and AMD dev cloud) Still a bit annoying because I much rather pay 5x and get access to CDNA4 then free credits. But also nice ! THANKS ! And to whoever is hogging all the capacity from from cloudrift – pig (: EDIT: llvm is very nice I love anyone who has ever worked on LLVM it was the AMD backend hoisting my licm figured it out though And ASM loops are a really bad idea"}]...
|
Title: GLM5.3 on AMD CDNA4 by @EOBD | Stardance
D Title: GLM5.3 on AMD CDNA4 by @EOBD | Stardance
Devlogs:
(90h) I don’t like LLVM! fun! Have you ever written manual ASM loops because it hoists like there’s no tomorrow? and can’t handle a back edge?? And since it’s impossible to get CDNA4 hardware, will be moving forward with MI300s. All my ❤️ to RunPod and HotAisle (and AMD dev cloud) Still a bit annoying because I much rather pay 5x and get access to CDNA4 then free credits. But also nice ! THANKS ! And to whoever is hogging all the capacity from from cloudrift – pig (: EDIT: llvm is very nice I love anyone who has ever worked on LLVM it was the AMD backend hoisting my licm figured it out though And ASM loops are a really bad idea
I know how I’ll do it! We will unfraternally have to have kernel boundaries but really just because the L1i cache is too small (and GPU architecture is too dumb) But it’s fine for now. Going to have the following kernels: 1:1 Residual + Norm 8:1 Residual + Norm (for the MoE summing) 1:1 Residual + Norm + MPT norm MoE Full DSA Fused attention (with or without indexer) Head + Sampling +Embedding retrieval + normed MTP embedding EH_Proj + MLP And then! For the HBM sync we need between so many things (mostly the attention kernel) I’m going to extend HipKittens with a flagging mechanism that latches onto the stores, and add many more load methods that depend on it (like a stream of available blocks. the coolest thing is that I can have the flagging work at a certain granularity, and the load can infer if it’s OK based on a different one! Don’t do kernels kids.
I don’t hate LLVM anymore!! So easy to just hook up to its headers and do what the hell I want with it (mostly in terms of what opt passes to run on the device code because I’m scared of that fat binary linking 😭) LICM is being stupid? Kick that sucker off the top the stairs!! possibly could have also done this with opt but C++ is way cooler and going to pay off once I really dig deep into this. Ima get my 0 spills even if it’s going to cost me all my finals. probably already did 🥲 phhh that poor-people normal kernel… Hardware scheduled… Meh. No match for my persistent kernel! not actually sure why I beat it, shouldn’t have. Stores are not acked on at the end of the kernel. But we first smile, then run them back to back and earn that smile! Look at me utilizing smile debt like finance bro. Maybe its my very cool scheduling algo. but I doubt it.
last 6 spills super nasty. LLVM be complex should also hoist the loads before the stores (ugly stalls are swaits). but look at that pretty no-sigpgmend-barrier work
Well. That’s been a huge pain. But I’s got a native unix shell Should be amazing to not rely on this slugish p9 windows is like sweet poison so nice but so sloowwwww bitlocker is scary guys ubuntu is the best – linux without the added pain of knowing how linux works (:
Going to do the MoE next (HipKittens sync first) And so before I commit to a very complex design that would piggyback low-token-experts on ones that can fill the 16 rows for the matrix cores – though I should what the distrebution actually looks like… ): complex design will be needed ): Expected but still a bummer. My sample space is tiny because GPUs are expensive as hell. But I imagine it’s a good proxy because the curve looks right. maybe a bit more concentrated across a large chat focused on coding.
Don’t leave XNACK on 🤦🏽 It’s been like a whole day trying to understand why I have these idles (not a stall) Hate myself so much. And mannnn – AMD – why nooooo documentation whatsoever as to how yor MMU works ?? 😭 not sure if I’d feel better, learning that they are willing to share this – but you’d just need to sign off your grandma as collateral on an NDA Or maybe show somewhere that there was a fault 😭😭😭 (could also be me not knowing where to look…) ….but…. while breaking my head, I also improved rocprof compute viewer 🎉 and it’s going GPL until AMD gives me access to CDNA4 and 5 hardware😇 Because they are so so nice and willing to support a budding kernel developer ♥️ or I’ll stop being lazy and write a PR which ever comes first I guess
Huge Pain with tile schedule for the MLP. huge. still haven’t fully figured it out, but getting there
ohhhhh MY ooh My I got CDNA4 And GLM5.3 it’s a party NOW!! I’ma first find the best way to quantize the experts than we go swimming in Aiter to find A8W4 for the experts and A8WA for the rest we then benchmark plain torch – probably 20% work for 80% performance we then squeeze the residuals into a fused kernel + proper grouped gemm for the MLA + fp4 indexer keys and then, finally, see if it all comes under one launch, and does a pretty spin to become a 100% resident, HBM synced pipeline system. it’s no longer a kernel, but an async token horse I did fail my tests but worth it I tell ya!...
|
1792792331.883065
|
1793397131.883065
|
|
13808
|
My very own WebOS by @mohitkrr2557 | Stardance
|
mohitkrr2557
|
2
|
205.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T23:55:17Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Cyber OS is a fully client-side, browser-based desktop OS simulation — built from scratch in vanilla HTML, CSS, and JavaScript, with zero frameworks, zero backend, and zero build step. It boots like a real machine: a login screen with custom profiles and emoji avatars, then a working desktop with draggable/resizable windows, a taskbar (search, start menu, system tray, flyouts for network/battery/volume), alt-tab switching, and snap layouts. Underneath that shell is a real virtual file system — files are persistent node objects you can actually create, open, edit, rename, and delete through File Explorer, not just decorative icons — plus a full app suite (Notepad, Calculator, To-Do, AI Chat, three different terminal shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games and persistent high scores. The newest piece, Brave, is a working in-OS browser: type any URL and it renders the live page, with real back/forward history and a clean fallback for sites that block embedding. The hardest part wasn’t any single feature — it was making the OS hold up under real use instead of just looking right in a screenshot. The file system needed an actual state machine: every file had to round-trip correctly through open → edit → save → delete → restore-from-recycle-bin without corrupting other files or colliding on names, all serialized into per-user local storage. Getting the animations to feel native took its own full pass — swapping synchronous style writes on every mouse move for transform updates inside the animation frame loop, and replacing scattered ad hoc transition values with one shared eased curve so windows, menus, and flyouts all move consistently instead of half snapping and half easing. Brave was its own rabbit hole — handling X-Frame-Options and CSP headers that block embedding without the iframe just going silently blank took a lot of trial and error to land on a clean “open in a new tab” fallback instead of a broken-looking pane. I’m proud that this stopped being a mock-up somewhere around the file system rewrite. Most “fake OS” projects let you click icons that don’t actually do anything; Cyber OS persists real state — files, sessions, high scores, notes, to-do items — all of it survives a refresh because it’s genuinely saved, not just rendered. ~205 hours across four devlogs went into getting from a static desktop image to something that behaves like a real, if small, operating system. Try it live, no install needed: https://mohitkrr2557.github.io/CyberOS/ . Sign in with any username — it spins up a fresh local profile — then open File Explorer and actually create, edit, and delete a file; drop into Space Notepad or the To-Do app and refresh to watch your state survive; launch a couple of games from the Gaming Hub; and try Brave with a real URL to see the live in-OS browser. Everything is stored locally to your own browser profile, so nothing you do will affect anyone else testing it.", "repo": "https://github.com/Mohitkrr2557/CyberOS", "demo": "https://mohitkrr2557.github.io/CyberOS/"}, {"ship_num": 2, "ts": "2026-06-27T14:30:14Z", "hours": 205.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Cyber OS — a browser-based desktop operating system simulation, built from scratch in vanilla HTML/CSS/JS with zero frameworks and no backend. Boot in as a Space Cadet, and you get a full desktop: draggable/resizable windows, a taskbar with live search, a start menu, alt-tab switching, and snap layouts — plus a real virtual file system where you can actually create, open, edit, and delete files (not just decorative icons). It comes loaded with built-in apps (Notepad, Calculator, To-Do, AI Chat, Terminal/PowerShell/Ubuntu shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games — Snake, 2048, Minesweeper, Blackjack, Pac-Man, and more — each with persistent high scores. Everything — user sessions, files, game scores — persists locally per profile, so it survives a refresh and feels like an actual OS rather than a mock-up. ~200 hours in so far, most recently spent building out the real file engine and smoothing every window/drag animation so it doesn’t feel laggy under real use. Built with: HTML5, CSS3 (custom theming engine), vanilla JavaScript, html2canvas.", "repo": "https://github.com/Mohitkrr2557/CyberOS", "demo": "https://mohitkrr2557.github.io/CyberOS/"}]...
|
[{"post_id": 17261, "ts": "202 [{"post_id": 17261, "ts": "2026-06-27T23:51:27Z", "hours": 0.2633, "text": "Today’s update closes one of the biggest gaps in Cyber OS’s in-browser experience: Brave is no longer a static prop showing a handful of hardcoded mock pages — type literally any URL into the address bar and it now resolves to a real page rendered live inside the browser window, with a proper loading state in the tab while it fetches and a working back/forward history stack once it’s in. Sites that refuse to be embedded (anything sending X-Frame-Options or a frame-ancestors CSP header) now fail gracefully into a clear “this site won’t load here — open it in a new tab” message instead of the silent blank pane the old build used to choke on. It sounds like a small change on paper, but it’s the difference between Brave being decoration on the desktop and an actual working browser — you can search, click through, and browse the real web without ever leaving the simulated OS."}, {"post_id": 16924, "ts": "2026-06-27T14:16:40Z", "hours": 162.6578, "text": "Cyber OS v2.1 Devlog: After roughly 150 hours since the last milestone, Cyber OS has moved from “looks like a desktop” to “behaves like one.” Where the previous release solved identity, session persistence, and the visual shell, this cycle was almost entirely focused on giving the file layer real teeth and giving the entire interaction surface a pass for latency, jank, and visual inconsistency. The result is a build that no longer just simulates file management and motion — it actually performs both. The single biggest structural addition is a genuine virtual file system sitting underneath File Explorer, replacing what was previously a static icon list with no backing state. Every file is now a real node object — name, type, parent-directory reference, content payload, and a last-modified timestamp — serialized directly into the user’s persistent profile store instead of hardcoded into the DOM. Opening a file resolves its type against an app-association table and routes the payload into the correct handler, so text-type nodes stream straight into Space Notepad’s editable surface with two-way binding: in-app edits write back to the node’s content field on a debounced save cycle rather than firing a disk write on every keystroke. Deletion no longer just yanks a DOM element; it stages the node into a true Recycle Bin queue with restore and permanent-purge paths, and renaming is now an in-place editable operation with collision checks against sibling nodes so a file can’t silently clobber another with the same name. None of this existed before — files were effectively props with no underlying state machine. Now they’re a small but real persistence layer with actual create, open, edit, and delete semantics behind it. On the visual side, the focus was smoothing every interaction that previously felt jarring or laggy under real use. Window open, close, and minimize transitions were rebuilt around a single eased transform-and-opacity curve instead of mismatched linear defaults, so windows scale and fade consistently rather than snapping into place. Drag and resize logic was rewritten to update transforms through the animation frame loop instead of writing styles synchronously on every pointer move, which cut visible stutter substantially on larger windows. Hover, focus, and active states across buttons, taskbar icons, and context menu items now pull from one shared elevation and shadow scale instead of ad hoc values scattered across components built at different times, so the desktop finally reads as one coherent surface instead of a patchwork of UI built in different sessions. Scrollbars, focus rings, and context menu animations were rebuilt to match the neon/glass aesthetic instead of falling back to browser defaults — one of the more obvious “unfinished” tells before, now gone. Underneath the visible layer, a meaningful share of those 150 hours went into cleanup nobody sees directly but that the whole experience depends on: debouncing the autosave scrapers so they stop thrashing local storage on every keystroke, validating file payloads before they ever reach the profile serializer so a malformed or oversized entry can’t corrupt a session, and trimming redundant reflows that were firing every time a window gained focus or a flyout opened. None of it shows up in a screenshot, but it’s the difference between an OS that feels responsive under sustained use and one that only feels responsive in a thirty-second demo. Taken together, the file engine and the motion pass were the two threads tying this update together — files now persist and behave like real file management instead of a mock-up, and the chrome around them finally moves the way a native desktop would. Next up: drag-and-drop file moves between folders, and carrying this same eased-transform approach into the snap-layout and alt-tab overlays, which still run on the older, snappier logic and now visibly lag behind everything else."}, {"post_id": 6576, "ts": "2026-06-11T01:33:05Z", "hours": 30.7583, "text": "I have officially completed a massive architectural refactor of Cyber OS v2.0, transforming a simple frontend mock-up into a highly interactive, stateful, and secure multi-user desktop simulation environment. This milestone release successfully bridges a secure boot kernel, an encrypted local file engine, and a fully reactive visual compositing layer. The core JS script now treats user sessions as persistent sandbox environments by running a secure boot cycle tied to browser local storage and custom profile serialization. To make the OS feel truly functional, I engineered automated data scrapers that continuously track and save a user’s local application modifications, including text inside the Space Notepad, active items within the Todo list, and chat logs inside the AI interface. These sessions are mapped directly to the authorized user’s profile and fully restored upon login, while strict kernel state flags manage layout depth and window minimizing queues. Visually, the entire desktop environment has been upgraded to a hardware-accelerated layout pipeline powered by a modular CSS variable architecture. This decoupled theme system allows the entire UI to instantly toggle between a neon terminal space and a sleek light mode theme through a single class injection. The styling rules supply high-fidelity interactive state vectors for active running applications, introducing translucent container overlays, distinct border changes, and neon glow vectors for active or minimized windows. Finally, the HTML scaffolding has been expanded to support modern desktop components, introducing a custom profile customizer on the boot screen and an advanced taskbar system. This taskbar hosts an active search utility, application launcher shortcuts, a terminal clock, and a hardware simulation tray complete with placeholder nodes for network, battery, and notification toggles. The system markup is fully optimized with hidden containment hooks, perfectly primed to anchor background canvas animation loops and edge-drag window snapping logic next. I am going to continue advancing this OS to reach a windows desktop experties!"}, {"post_id": 5780, "ts": "2026-06-09T18:10:25Z", "hours": 12.0811, "text": "Project Update: Cyber OS I’m stoked to share the progress on my custom WebOS! I’ve built a futuristic, space-themed desktop environment from scratch using pure HTML, CSS, and JavaScript, designed to feel like a high-performance digital cockpit running in the heart of a nebula. I’ve engineered a custom window manager that handles dragging, closing, and dynamic z-index layering. This is paired with a built-in utility suite featuring a Space Notepad for captain’s logs, a dynamic Star-Date Calendar, and a functional Todo list for managing station operations. Looking ahead, I’m preparing to launch a Wallpaper Engine for custom cosmic backgrounds and an AI Navigator Chatbot with a terminal-style interface. Can’t wait to see this OS fully powered up!"}]...
|
Title: My very own WebOS by @mohitkrr2557 | Starda Title: My very own WebOS by @mohitkrr2557 | Stardance
Devlogs:
Project Update: Cyber OS I’m stoked to share the progress on my custom WebOS! I’ve built a futuristic, space-themed desktop environment from scratch using pure HTML, CSS, and JavaScript, designed to feel like a high-performance digital cockpit running in the heart of a nebula. I’ve engineered a custom window manager that handles dragging, closing, and dynamic z-index layering. This is paired with a built-in utility suite featuring a Space Notepad for captain’s logs, a dynamic Star-Date Calendar, and a functional Todo list for managing station operations. Looking ahead, I’m preparing to launch a Wallpaper Engine for custom cosmic backgrounds and an AI Navigator Chatbot with a terminal-style interface. Can’t wait to see this OS fully powered up!
I have officially completed a massive architectural refactor of Cyber OS v2.0, transforming a simple frontend mock-up into a highly interactive, stateful, and secure multi-user desktop simulation environment. This milestone release successfully bridges a secure boot kernel, an encrypted local file engine, and a fully reactive visual compositing layer. The core JS script now treats user sessions as persistent sandbox environments by running a secure boot cycle tied to browser local storage and custom profile serialization. To make the OS feel truly functional, I engineered automated data scrapers that continuously track and save a user’s local application modifications, including text inside the Space Notepad, active items within the Todo list, and chat logs inside the AI interface. These sessions are mapped directly to the authorized user’s profile and fully restored upon login, while strict kernel state flags manage layout depth and window minimizing queues. Visually, the entire desktop environment has been upgraded to a hardware-accelerated layout pipeline powered by a modular CSS variable architecture. This decoupled theme system allows the entire UI to instantly toggle between a neon terminal space and a sleek light mode theme through a single class injection. The styling rules supply high-fidelity interactive state vectors for active running applications, introducing translucent container overlays, distinct border changes, and neon glow vectors for active or minimized windows. Finally, the HTML scaffolding has been expanded to support modern desktop components, introducing a custom profile customizer on the boot screen and an advanced taskbar system. This taskbar hosts an active search utility, application launcher shortcuts, a terminal clock, and a hardware simulation tray complete with placeholder nodes for network, battery, and notification toggles. The system markup is fully optimized with hidden containment hooks, perfectly primed to anchor background canvas animation loops and edge-drag window snapping logic next. I am going to continue advancing this OS to reach a windows desktop experties!
Cyber OS v2.1 Devlog: After roughly 150 hours since the last milestone, Cyber OS has moved from “looks like a desktop” to “behaves like one.” Where the previous release solved identity, session persistence, and the visual shell, this cycle was almost entirely focused on giving the file layer real teeth and giving the entire interaction surface a pass for latency, jank, and visual inconsistency. The result is a build that no longer just simulates file management and motion — it actually performs both. The single biggest structural addition is a genuine virtual file system sitting underneath File Explorer, replacing what was previously a static icon list with no backing state. Every file is now a real node object — name, type, parent-directory reference, content payload, and a last-modified timestamp — serialized directly into the user’s persistent profile store instead of hardcoded into the DOM. Opening a file resolves its type against an app-association table and routes the payload into the correct handler, so text-type nodes stream straight into Space Notepad’s editable surface with two-way binding: in-app edits write back to the node’s content field on a debounced save cycle rather than firing a disk write on every keystroke. Deletion no longer just yanks a DOM element; it stages the node into a true Recycle Bin queue with restore and permanent-purge paths, and renaming is now an in-place editable operation with collision checks against sibling nodes so a file can’t silently clobber another with the same name. None of this existed before — files were effectively props with no underlying state machine. Now they’re a small but real persistence layer with actual create, open, edit, and delete semantics behind it. On the visual side, the focus was smoothing every interaction that previously felt jarring or laggy under real use. Window open, close, and minimize transitions were rebuilt around a single eased transform-and-opacity curve instead of mismatched linear defaults, so windows scale and fade consistently rather than snapping into place. Drag and resize logic was rewritten to update transforms through the animation frame loop instead of writing styles synchronously on every pointer move, which cut visible stutter substantially on larger windows. Hover, focus, and active states across buttons, taskbar icons, and context menu items now pull from one shared elevation and shadow scale instead of ad hoc values scattered across components built at different times, so the desktop finally reads as one coherent surface instead of a patchwork of UI built in different sessions. Scrollbars, focus rings, and context menu animations were rebuilt to match the neon/glass aesthetic instead of falling back to browser defaults — one of the more obvious “unfinished” tells before, now gone. Underneath the visible layer, a meaningful share of those 150 hours went into cleanup nobody sees directly but that the whole experience depends on: debouncing the autosave scrapers so they stop thrashing local storage on every keystroke, validating file payloads before they ever reach the profile serializer so a malformed or oversized entry can’t corrupt a session, and trimming redundant reflows that were firing every time a window gained focus or a flyout opened. None of it shows up in a screenshot, but it’s the difference between an OS that feels responsive under sustained use and one that only feels responsive in a thirty-second demo. Taken together, the file engine and the motion pass were the two threads tying this update together — files now persist and behave like real file management instead of a mock-up, and the chrome around them finally moves the way a native desktop would. Next up: drag-and-drop file moves between folders, and carrying this same eased-transform approach into the snap-layout and alt-tab overlays, which still run on the older, snappier logic and now visibly lag behind everything else.
Today’s update closes one of the biggest gaps in Cyber OS’s in-browser experience: Brave is no longer a static prop showing a handful of hardcoded mock pages — type literally any URL into the address bar and it now resolves to a real page rendered live inside the browser window, with a proper loading state in the tab while it fetches and a working back/forward history stack once it’s in. Sites that refuse to be embedded (anything sending X-Frame-Options or a frame-ancestors CSP header) now fail gracefully into a clear “this site won’t load here — open it in a new tab” message instead of the silent blank pane the old build used to choke on. It sounds like a small change on paper, but it’s the difference between Brave being decoration on the desktop and an actual working browser — you can search, click through, and browse the real web without ever leaving the simulated OS.
Ships:
Cyber OS — a browser-based desktop operating system simulation, built from scratch in vanilla HTML/CSS/JS with zero frameworks and no backend. Boot in as a Space Cadet, and you get a full desktop: draggable/resizable windows, a taskbar with live search, a start menu, alt-tab switching, and snap layouts — plus a real virtual file system where you can actually create, open, edit, and delete files (not just decorative icons). It comes loaded with built-in apps (Notepad, Calculator, To-Do, AI Chat, Terminal/PowerShell/Ubuntu shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games — Snake, 2048, Minesweeper, Blackjack, Pac-Man, and more — each with persistent high scores. Everything — user sessions, files, game scores — persists locally per profile, so it survives a refresh and feels like an actual OS rather than a mock-up. ~200 hours in so far, most recently spent building out the real file engine and smoothing every window/drag animation so it doesn’t feel laggy under real use. Built with: HTML5, CSS3 (custom theming engine), vanilla JavaScript, html2canvas.
Cyber OS is a fully client-side, browser-based desktop OS simulation — built from scratch in vanilla HTML, CSS, and JavaScript, with zero frameworks, zero backend, and zero build step. It boots like a real machine: a login screen with custom profiles and emoji avatars, then a working desktop with draggable/resizable windows, a taskbar (search, start menu, system tray, flyouts for network/battery/volume), alt-tab switching, and snap layouts. Underneath that shell is a real virtual file system — files are persistent node objects you can actually create, open, edit, rename, and delete through File Explorer, not just decorative icons — plus a full app suite (Notepad, Calculator, To-Do, AI Chat, three different terminal shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games and persistent high scores. The newest piece, Brave, is a working in-OS browser: type any URL and it renders the live page, with real back/forward history and a clean fallback for sites that block embedding. The hardest part wasn’t any single feature — it was making the OS hold up under real use instead of just looking right in a screenshot. The file system needed an actual state machine: every file had to round-trip correctly through open → edit → save → delete → restore-from-recycle-bin without corrupting other files or colliding on names, all serialized into per-user local storage. Getting the animations to feel native took its own full pass — swapping synchronous style writes on every mouse move for transform updates inside the animation frame loop, and replacing scattered ad hoc transition values with one shared eased curve so windows, menus, and flyouts all move consistently instead of half snapping and half easing. Brave was its own rabbit hole — handling X-Frame-Options and CSP headers that block embedding without the iframe just going silently blank took a lot of trial and error to land on a clean “open in a new tab” fallback instead of a broken-looking pane. I’m proud that this stopped being a mock-up somewhere around the file system rewrite. Most “fake OS” projects let you click icons that don’t actually do anything; Cyber OS persists real state — files, sessions, high scores, notes, to-do items — all of it survives a refresh because it’s genuinely saved, not just rendered. ~205 hours across four devlogs went into getting from a static desktop image to something that behaves like a real, if small, operating system. Try it live, no install needed: https://mohitkrr2557.github.io/CyberOS/ . Sign in with any username — it spins up a fresh local profile — then open File Explorer and actually create, edit, and delete a file; drop into Space Notepad or the To-Do app and refresh to watch your state survive; launch a couple of games from the Gaming Hub; and try Brave with a real URL to see the live in-OS browser. Everything is stored locally to your own browser profile, so nothing you do will affect anyone else testing it....
|
1792820875.3729985
|
1792907275.3729985
|
|
42272
|
+1 Jump Skate Escape by @Wontonify | Stardance
|
Wontonify
|
0
|
203.24
|
0
|
[]
|
[{"post_id": 61890, "ts": "202 [{"post_id": 61890, "ts": "2026-09-05T01:48:50Z", "hours": 9.2422, "text": "Devlog #042 Race world is now officially out! Sorry it took so long, these past days I have been really busy with school and haven’t worked on much. I think this will be my last proper devlog of the game, the next will probably just be preparing the project for shipping."}, {"post_id": 60031, "ts": "2026-09-02T04:25:41Z", "hours": 7.7886, "text": "Devlog #041 Changes More analytics More badges OP daily rewards to increase retention Map improvements Revive and Race UI Re-implementation of revive popup"}, {"post_id": 56973, "ts": "2026-08-29T00:50:21Z", "hours": 4.4531, "text": "Devlog #040 World 2 is now officially out! Stayed up late yesterday to get some bug fixes in straight after publish but we should be good for now."}, {"post_id": 56468, "ts": "2026-08-28T07:47:54Z", "hours": 3.7669, "text": "Devlog #039 Added in funnels so that I can see where the users are leaving and why are they are leaving. Hopefully this can help me decide what to add to improve game stats."}, {"post_id": 55513, "ts": "2026-08-27T12:33:37Z", "hours": 4.9758, "text": "Devlog #038 Took a temporary detour to make the race map and also improved upon World 2. Every 5 minutes, the user can choose to participate in a “Race” with other people. The winner of the race will receive wins (I haven’t really decided what to give yet) and its sort of just like a fun little event."}, {"post_id": 55405, "ts": "2026-08-27T06:50:48Z", "hours": 2.1469, "text": "Devlog #037 Fully finished up the balancing, so that World 2 takes 2x the time to beat as World 1."}, {"post_id": 55368, "ts": "2026-08-27T04:35:52Z", "hours": 8.6767, "text": "Devlog #036 Changes This devlog was supposed to be out yesterday but HackaTime servers were down and so I couldn’t post. Anyways, the entirely of W2 is now complete (aside from balancing) which I still have to do. The issue is that WalkSpeed is locked to +1 per level, but the world two map is the same size so you start slamming into walls. Game Stats We have almost 10k people signed up for the World 2 release date in a few days (WHICH IS CRAZY)! And we also hit 20k home recommendations which is nice and hopefully that number keeps growing."}, {"post_id": 53652, "ts": "2026-08-24T09:46:54Z", "hours": 2.5603, "text": "Devlog #035 Got the rest of the spawn done including new skateboards and training areas!"}, {"post_id": 53597, "ts": "2026-08-24T06:48:48Z", "hours": 1.4014, "text": "Devlog #034 Finished up the entirety of the main map! Got the spawn to do (new training areas + skateboard models) and I should be good to start scripting the second world!"}, {"post_id": 53020, "ts": "2026-08-23T12:27:36Z", "hours": 4.1781, "text": "Devlog #033 Finished up 4 more sections! I just got the “Black Hole” section to do now and the main build for W2 is done!"}, {"post_id": 52870, "ts": "2026-08-23T07:41:29Z", "hours": 1.0503, "text": "Devlog #032 Finished up the 6th section! This one is definitely one of the more unique ones out of the batch, and I think I’m going to do something similar for the ones after that as well. World 1 had like a biome sort of theme such areas such as “Forest”, “Ice”, “Dune” and “Sakura” so the theme for World 2 would be planets. 🪐 So far I’ve completed Earth, Moon, Mercury, Mars, Venus and Saturn. I’ve also tried to implement details of each planet inside the build itself, so for Saturn (shown in image) I added arches above the top since it has rings and also added a bunch of small floating rocks as “moons”"}, {"post_id": 52850, "ts": "2026-08-23T06:35:47Z", "hours": 3.8669, "text": "Devlog #031 Finished the first 5 sections of W2! I added these cross sectioned lasers just to mix it up and make world two a little more different than world 1. Also some guy has 41 hours on the game lol"}, {"post_id": 52089, "ts": "2026-08-22T05:02:06Z", "hours": 0.97, "text": "Devlog #030 Working on World TWO!"}, {"post_id": 52061, "ts": "2026-08-22T03:43:27Z", "hours": 4.7569, "text": "Devlog #029 There’s been a major bug with the UI on top of the skateboards where sometimes it just wouldn’t show. I think this is something do with the Roblox glyph engine, I’ve had an issue similar to this before but it was with another game and it has significantly more textlabels, and the text was flickering instead of just blatantly not showing. I’ve added adonis with dex which lets me view studio properties inside of Roblox so I can see whether its a studio issue or just my code. Additional Changes Added group reward with brand new skateboard Added badges"}, {"post_id": 51608, "ts": "2026-08-21T11:41:11Z", "hours": 3.1489, "text": "Devlog #028 Added in some more thumbnails and am also in the process of trialing different titles. Somehow this thumbnail is leading by far with 4% CTR."}, {"post_id": 51499, "ts": "2026-08-21T07:49:16Z", "hours": 2.1506, "text": "Devlog #027 Just realised that this entire time I haven’t been uploading to github. Unfortunately there isn’t an easy way to upload files to git directly from the studio but I do now have script sync enabled and will try to commit at least once every devlog. Not really sure about the times when the devlog is mainly about building, as I can’t just directly upload the rbxm file since I use so many bought assets. Eventually during the final ship I will spend the time to create a map with the assets stripped out. Changes Added admin command system Added daily rewards Fixed major bugs regarding shop + boosts Added friend boosts and train area boost when multiple people are training on the same rail Right now I’m working on the map for W2, hopefully I can get this finished fast!"}, {"post_id": 51438, "ts": "2026-08-21T04:37:21Z", "hours": 0.8681, "text": "Devlog #026 Not really a devlog lol but we just hit all ages!"}, {"post_id": 50871, "ts": "2026-08-20T10:13:32Z", "hours": 4.825, "text": "Devlog #025 Massive overhaul. Before there were way too many different values for the user to handle, so I decided to simplify it. Now, every single obtainable item in the game revolves around XP. XP is obtained by moving or being at one of the training grounds. Obtaining XP increase progress towards your LEVEL, which controls things like WalkSpeed, Jumps, Ramp Boost."}, {"post_id": 50776, "ts": "2026-08-20T04:40:27Z", "hours": 6.8889, "text": "Devlog #024 Testing some more thumbnails for maximum click rate. I’m working on a pretty big rework change right now which is why this devlog has so much time attached to it but I wanted to let yall know."}, {"post_id": 50070, "ts": "2026-08-19T03:49:00Z", "hours": 3.2386, "text": "Devlog #023 THUMBNAILS + RELEASE! Game link: https://www.roblox.com/games/92438199141937/1-Skate-Obby-Escape"}, {"post_id": 49431, "ts": "2026-08-18T08:27:23Z", "hours": 9.9875, "text": "Devlog #022 New UI + Polish Changes! Honestly these past few devlogs I kinda got no idea what to say, I could go on about the thousands of tiny value changes I did but that’d be boring so here’s the more important things. Changes You can now choose your own speed, as long as it is lower than your max New hazard systems, such as the floor rising and platforms suddenly dropping Bunch of bug fixes and polish changes WE ARE SO SO SO CLOSE TO RELEASE! Thumbnails are being made as I speak!"}, {"post_id": 48069, "ts": "2026-08-16T11:01:26Z", "hours": 11.5511, "text": "Devlog #021 Changes Added more monetization Added revive system Scripted upgrade machine More polish changes The game is nearing its complete! Hopefully I am able to release soon once I get some thumbnails made."}, {"post_id": 47251, "ts": "2026-08-15T01:46:11Z", "hours": 3.4672, "text": "Devlog #020 Finished up the final two sections!"}, {"post_id": 46876, "ts": "2026-08-14T12:43:32Z", "hours": 1.6408, "text": "Devlog #019 Believe it or not but this upgrade machine took me nearly 2 hours 😭"}, {"post_id": 46826, "ts": "2026-08-14T10:57:52Z", "hours": 10.6086, "text": "Devlog #018 MASSIVE MAP IMPROVEMENTS P.S. THERE ARE MORE THAN 1 IMAGE"}, {"post_id": 45685, "ts": "2026-08-12T10:34:44Z", "hours": 5.0622, "text": "Devlog #017 Continued working on the map! All walls are up now just working on decoration and other small map improvements!"}, {"post_id": 45579, "ts": "2026-08-12T05:13:00Z", "hours": 3.0192, "text": "Devlog #016 Got awesome asset pack 🔥and continuing work on completing the map expansion + revamp!"}, {"post_id": 45106, "ts": "2026-08-11T11:49:48Z", "hours": 8.6303, "text": "Devlog #015 Changes Expanded and Reworked Map Reworked Boost Mechanism (AGAIN!) More Polishing Made the map significant bigger to encompass new and improved boosting mechanism. I cannot tell you how many times I have rewrote the boost mechanism so HOPEFULLY this is the last time 🤞"}, {"post_id": 43888, "ts": "2026-08-09T10:28:53Z", "hours": 9.9439, "text": "** Devlog #014** Did a bunch more polishing / doc work and continue worked on improving current map and world 2 map."}, {"post_id": 43232, "ts": "2026-08-08T11:35:27Z", "hours": 9.9789, "text": "Devlog #013 Trails and Monetization are now complete!. I also did a LOT more polishing and also started on the build for World 2!"}, {"post_id": 42510, "ts": "2026-08-07T09:39:12Z", "hours": 9.9669, "text": "Devlog #012 Changes Scripted level and click system Finalised boost system Scripted rebirth Training zones now work Skateboards are purchasable and affect your power per click Scripted 3 leaderboards, playtime, power and wins Pads at every island give wins upon contact and teleport back to spawn The majority of the game is complete, all that’s left is the monetization and the trails. The work detailed within this devlog has been spread out across some of the previous sessions so they were definitely not all done in this time!"}, {"post_id": 41792, "ts": "2026-08-06T06:23:30Z", "hours": 5.1358, "text": "Devlog #011 Got some trails made! There hasn’t been much action in the last few devlogs especially on the scripting side because I’m waiting for the completion of a few more systems before summarizing them all."}, {"post_id": 41204, "ts": "2026-08-05T08:59:44Z", "hours": 5.0711, "text": "Devlog #010 MASSIVE MAP REWORK + EXPANSION!"}, {"post_id": 40680, "ts": "2026-08-04T11:27:47Z", "hours": 5.8708, "text": "Devlog #009 Changes Implemented animations Refined and polished boost ramp system Added skateboard (upgrades coming soon!)"}, {"post_id": 40041, "ts": "2026-08-03T12:05:30Z", "hours": 5.1867, "text": "Devlog #008 Got some skateboard animations made! RIP Robux 🥲"}, {"post_id": 39361, "ts": "2026-08-02T09:10:02Z", "hours": 5.1403, "text": "Devlog #007 Additions Setup backend data saving using ProfileStore Setup communication via Knit Scripted clicking system to obtain “Power” every time you click Started on ramp boosts (still needs significant polishing) Physics isn’t my strong suit so hopefully I can figure this out soon!"}, {"post_id": 38674, "ts": "2026-08-01T05:43:05Z", "hours": 2.7356, "text": "Devlog #006 Changes Improved main map FINALLY! Map is basically done. I can finally move on to the scripting."}, {"post_id": 38599, "ts": "2026-08-01T02:32:35Z", "hours": 1.8689, "text": "Devlog #005 Changes Revamped spawn area Placed new skateboards in their designated location Added AFK zone models (will place later) Finally nearing the completion of the map! Although basic, I think it looks pretty good for my first time. Can’t wait to get started on the scripting side, everything should be a lot more smooth there."}, {"post_id": 38546, "ts": "2026-08-01T00:40:31Z", "hours": 2.7036, "text": "Devlog #004 Changes Revamped Map Received commission for skateboards and UI Hopefully I’m near the completion of the map, apologies if these last few devlogs have been rather slow since its my first time building an entire map. I have a commercial license for the skateboard models and the UI but I unfortunately cannot share them in a github public repo."}, {"post_id": 38160, "ts": "2026-07-31T12:32:05Z", "hours": 1.1008, "text": "Devlog #003 Finished off the spawn area"}, {"post_id": 38137, "ts": "2026-07-31T11:20:20Z", "hours": 1.8019, "text": "Devlog #002 Continued expanding the map and now there’s slopes going higher and higher. This is my first time officially building a full map for the first time, so I decided to do something simple for now."}, {"post_id": 38081, "ts": "2026-07-31T09:23:27Z", "hours": 1.8181, "text": "Devlog #001 This is my first time learning BUILDING in Roblox Studio, so I chose a relatively simple game. I’m mainly a scripter, so this is a new experience for me. The idea for this game is basically like a simulator where the player can get further and further."}]...
|
Title: +1 Jump Skate Escape by @Wontonify | Starda Title: +1 Jump Skate Escape by @Wontonify | Stardance
Devlogs:
Devlog #001 This is my first time learning BUILDING in Roblox Studio, so I chose a relatively simple game. I’m mainly a scripter, so this is a new experience for me. The idea for this game is basically like a simulator where the player can get further and further.
Devlog #002 Continued expanding the map and now there’s slopes going higher and higher. This is my first time officially building a full map for the first time, so I decided to do something simple for now.
Devlog #003 Finished off the spawn area
Devlog #004 Changes Revamped Map Received commission for skateboards and UI Hopefully I’m near the completion of the map, apologies if these last few devlogs have been rather slow since its my first time building an entire map. I have a commercial license for the skateboard models and the UI but I unfortunately cannot share them in a github public repo.
Devlog #005 Changes Revamped spawn area Placed new skateboards in their designated location Added AFK zone models (will place later) Finally nearing the completion of the map! Although basic, I think it looks pretty good for my first time. Can’t wait to get started on the scripting side, everything should be a lot more smooth there.
Devlog #006 Changes Improved main map FINALLY! Map is basically done. I can finally move on to the scripting.
Devlog #007 Additions Setup backend data saving using ProfileStore Setup communication via Knit Scripted clicking system to obtain “Power” every time you click Started on ramp boosts (still needs significant polishing) Physics isn’t my strong suit so hopefully I can figure this out soon!
Devlog #008 Got some skateboard animations made! RIP Robux 🥲
Devlog #009 Changes Implemented animations Refined and polished boost ramp system Added skateboard (upgrades coming soon!)
Devlog #010 MASSIVE MAP REWORK + EXPANSION!
Devlog #011 Got some trails made! There hasn’t been much action in the last few devlogs especially on the scripting side because I’m waiting for the completion of a few more systems before summarizing them all.
Devlog #012 Changes Scripted level and click system Finalised boost system Scripted rebirth Training zones now work Skateboards are purchasable and affect your power per click Scripted 3 leaderboards, playtime, power and wins Pads at every island give wins upon contact and teleport back to spawn The majority of the game is complete, all that’s left is the monetization and the trails. The work detailed within this devlog has been spread out across some of the previous sessions so they were definitely not all done in this time!
Devlog #013 Trails and Monetization are now complete!. I also did a LOT more polishing and also started on the build for World 2!
** Devlog #014** Did a bunch more polishing / doc work and continue worked on improving current map and world 2 map.
Devlog #015 Changes Expanded and Reworked Map Reworked Boost Mechanism (AGAIN!) More Polishing Made the map significant bigger to encompass new and improved boosting mechanism. I cannot tell you how many times I have rewrote the boost mechanism so HOPEFULLY this is the last time 🤞
Devlog #016 Got awesome asset pack 🔥and continuing work on completing the map expansion + revamp!
Devlog #017 Continued working on the map! All walls are up now just working on decoration and other small map improvements!
Devlog #018 MASSIVE MAP IMPROVEMENTS P.S. THERE ARE MORE THAN 1 IMAGE
Devlog #019 Believe it or not but this upgrade machine took me nearly 2 hours 😭
Devlog #020 Finished up the final two sections!
Devlog #021 Changes Added more monetization Added revive system Scripted upgrade machine More polish changes The game is nearing its complete! Hopefully I am able to release soon once I get some thumbnails made.
Devlog #022 New UI + Polish Changes! Honestly these past few devlogs I kinda got no idea what to say, I could go on about the thousands of tiny value changes I did but that’d be boring so here’s the more important things. Changes You can now choose your own speed, as long as it is lower than your max New hazard systems, such as the floor rising and platforms suddenly dropping Bunch of bug fixes and polish changes WE ARE SO SO SO CLOSE TO RELEASE! Thumbnails are being made as I speak!
Devlog #023 THUMBNAILS + RELEASE! Game link: https://www.roblox.com/games/92438199141937/1-Skate-Obby-Escape
Devlog #024 Testing some more thumbnails for maximum click rate. I’m working on a pretty big rework change right now which is why this devlog has so much time attached to it but I wanted to let yall know.
Devlog #025 Massive overhaul. Before there were way too many different values for the user to handle, so I decided to simplify it. Now, every single obtainable item in the game revolves around XP. XP is obtained by moving or being at one of the training grounds. Obtaining XP increase progress towards your LEVEL, which controls things like WalkSpeed, Jumps, Ramp Boost.
Devlog #026 Not really a devlog lol but we just hit all ages!
Devlog #027 Just realised that this entire time I haven’t been uploading to github. Unfortunately there isn’t an easy way to upload files to git directly from the studio but I do now have script sync enabled and will try to commit at least once every devlog. Not really sure about the times when the devlog is mainly about building, as I can’t just directly upload the rbxm file since I use so many bought assets. Eventually during the final ship I will spend the time to create a map with the assets stripped out. Changes Added admin command system Added daily rewards Fixed major bugs regarding shop + boosts Added friend boosts and train area boost when multiple people are training on the same rail Right now I’m working on the map for W2, hopefully I can get this finished fast!
Devlog #028 Added in some more thumbnails and am also in the process of trialing different titles. Somehow this thumbnail is leading by far with 4% CTR.
Devlog #029 There’s been a major bug with the UI on top of the skateboards where sometimes it just wouldn’t show. I think this is something do with the Roblox glyph engine, I’ve had an issue similar to this before but it was with another game and it has significantly more textlabels, and the text was flickering instead of just blatantly not showing. I’ve added adonis with dex which lets me view studio properties inside of Roblox so I can see whether its a studio issue or just my code. Additional Changes Added group reward with brand new skateboard Added badges
Devlog #030 Working on World TWO!
Devlog #031 Finished the first 5 sections of W2! I added these cross sectioned lasers just to mix it up and make world two a little more different than world 1. Also some guy has 41 hours on the game lol
Devlog #032 Finished up the 6th section! This one is definitely one of the more unique ones out of the batch, and I think I’m going to do something similar for the ones after that as well. World 1 had like a biome sort of theme such areas such as “Forest”, “Ice”, “Dune” and “Sakura” so the theme for World 2 would be planets. 🪐 So far I’ve completed Earth, Moon, Mercury, Mars, Venus and Saturn. I’ve also tried to implement details of each planet inside the build itself, so for Saturn (shown in image) I added arches above the top since it has rings and also added a bunch of small floating rocks as “moons”
Devlog #033 Finished up 4 more sections! I just got the “Black Hole” section to do now and the main build for W2 is done!
Devlog #034 Finished up the entirety of the main map! Got the spawn to do (new training areas + skateboard models) and I should be good to start scripting the second world!
Devlog #035 Got the rest of the spawn done including new skateboards and training areas!
Devlog #036 Changes This devlog was supposed to be out yesterday but HackaTime servers were down and so I couldn’t post. Anyways, the entirely of W2 is now complete (aside from balancing) which I still have to do. The issue is that WalkSpeed is locked to +1 per level, but the world two map is the same size so you start slamming into walls. Game Stats We have almost 10k people signed up for the World 2 release date in a few days (WHICH IS CRAZY)! And we also hit 20k home recommendations which is nice and hopefully that number keeps growing.
Devlog #037 Fully finished up the balancing, so that World 2 takes 2x the time to beat as World 1.
Devlog #038 Took a temporary detour to make the race map and also improved upon World 2. Every 5 minutes, the user can choose to participate in a “Race” with other people. The winner of the race will receive wins (I haven’t really decided what to give yet) and its sort of just like a fun little event.
Devlog #039 Added in funnels so that I can see where the users are leaving and why are they are leaving. Hopefully this can help me decide what to add to improve game stats.
Devlog #040 World 2 is now officially out! Stayed up late yesterday to get some bug fixes in straight after publish but we should be good for now.
Devlog #041 Changes More analytics More badges OP daily rewards to increase retention Map improvements Revive and Race UI Re-implementation of revive popup
Devlog #042 Race world is now officially out! Sorry it took so long, these past days I have been really busy with school and haven’t worked on much. I think this will be my last proper devlog of the game, the next will probably just be preparing the project for shipping....
|
1792889421.5578184
|
1793753421.5578184
|
|
44760
|
NHNK by @bali0531 | Stardance
|
bali0531
|
3
|
203.0
|
3419
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T17:48:14Z", "hours": 85.0, "multiplier": 19.62, "payout": 1664, "blessing": "neutral", "text": "Last ship was about optimizing stuff and fixing small bugs, while this ship is a bit more focused on new features, a new OOBE page, dev mode for advanced statistics about the application, and another batch of bug and UI fixes. So the main goal was to make the app look better and provide a better experience while using it overall + making it easier to diagnose possible problems through the devmode. UI/UX fixes include a new OLED theme, fixed overlapping elements, fixed contrast of the pages. For the UX part a new Out Of Box Experience, its basically a new login/info flow on first start, so now instead of separate pages for TOS/PP login, institution search etc, everything is on one seemless experience. It had some bug fixes too, like the .ics calendar exporting and auto-updating has been fixed now. Also fixed the broken widgets too so now it actually shows what classes you have that day. In terms of New Functions this ship introduces a new Dev mode by clicking the version number fast multiple times, it has a lot of informations about the startup, resource usage etc. For the future plans, I don’t have any new idea for now, the ones I had turned out to be not possible because of the api I have to use, I will probably fix the findings from the reviews of this ship + google playstore closed testing findings too. If you have any good idea make sure to write it down in the reviews / on the github page. (or on discord at @ bali411)", "repo": "https://github.com/Bali0531-RC/NHNK", "demo": "https://github.com/Bali0531-RC/NHNK/releases"}, {"ship_num": 2, "ts": "2026-08-29T18:07:52Z", "hours": 59.0, "multiplier": 18.22, "payout": 934, "blessing": "neutral", "text": "The previous ship was about fixing up the basics and making everyting work as intended. If you are interested in the main points of this project etc make sure to read the previous ship description too. In this ship I focused on optimizing the app, making the load time shorter, fixing some bugs like haptics etc, also logged the readme and website rework too. This ship is mainly for ending this stage before I start working on new features and more fixes. I optimized almost everything I can, made loading parallel where it was possible etc. Next ship will be packed with new features, I plan to add a dev mode to help find and debug edge cases or loading issues / resource leaks, also planning to add an “OOBE” to make the onboarding more seamless and modern. (No new images for this ship, since most of the changes are code related and not cosmetical. )", "repo": "https://github.com/Bali0531-RC/NHNK", "demo": "https://github.com/Bali0531-RC/NHNK/releases"}, {"ship_num": 3, "ts": "2026-08-11T18:50:41Z", "hours": 59.0, "multiplier": 17.56, "payout": 821, "blessing": "neutral", "text": "This project’s (NHNK = “Nem Hivatalos Neptun Kliens”, or in english “Unofficial Neptun Client” so you can say unc) goal is to make the life of university students easier, by creating a mobile app that lets them view their schedule, grades, statistics, upcoming events, messages and a lot more in one place, without the need to login every 30 minutes. The main problem was figuring out how the official university system “Neptun” works, and finding their API routes, but after figuring that out, the app works perfectly fine. This project makes major improvements over the official websites, First of all, every university has their own URL for the management site, that the students have to find / memorize, my app only needs the name of the university, and it automatically uses the saved address(es) from our list. Most universities have multiple urls/servers for “Neptun”, so if one is down, there is another. This again requires the users to figure out which server is up and usable, my app auto selects a server from the fallback list, if the default website is not available, and makes the switching seamless without even the users notice. The “Neptun” website also require users to login after 30min inactivity again, while in the same time most universities enabled the function to require 2fa for all accounts. While this is good for security, it makes checking your schedule grades etc a hassle. My app only needs users to enter their details once, and it wont ask for them again (except if the auth fails because of invalid credentials.), I know it might seems a security issue, that the app wont log users out, but the app is fully read only, as its only meant to check your data. these are the main improvements, but there are a lot more fun and usable features in the app, like detailed statistics etc. You can try the app out on https://nhnk.bali0531.hu via the live demo, or you can download it from github releases (and google play store too soon), but it requires a hungarian university student status to log in. (For non hungarian people who are interested in the app, a DEMO mode is also available in the app itself, but at that point you can just check it out on the website without downloading anything.", "repo": "https://github.com/Bali0531-RC/NHNK", "demo": "https://github.com/Bali0531-RC/NHNK/releases"}]...
|
[{"post_id": 63063, "ts": "202 [{"post_id": 63063, "ts": "2026-09-06T17:32:06Z", "hours": 5.5081, "text": "Added an OLED theme, picked it on my phone, and most of the screen was still grey. Rather than argue with my own eyes I took a screenshot and read the actual pixel values out of it, which took about a minute and saved me a lot of guessing. The background was 121212 when I had asked for pure black. Turned out the theme was never reaching the screen. The app builds its colour scheme without setting a surface colour, so every page fell back to Material’s own default grey and quietly ignored the palette it had been handed. One line, and the background went to 000000 and the cards to 080808. The bit I liked was the leftovers. A few tiles stayed light and I was about to go and edit the seventy something places that paint card backgrounds by hand, until I noticed the colour was 3B4548. That is not grey. Grey has equal channels. It was the teal accent bleeding in, because Material tints raised surfaces with your primary colour, so that was one setting too rather than an afternoon of find and replace. Also checked the contrast while I was in there and every accent clears AA on black between 9.37 and 18.80 to one, and found that choosing OLED did not survive the phone flipping to light mode and back, because the theme listener was overwriting whatever you picked. Not finished yet, the tile fix still needs a look on a real device."}, {"post_id": 62859, "ts": "2026-09-06T12:01:46Z", "hours": 9.5653, "text": "The old setup opened with a page of legal text and then asked whether you wanted to pick your school from a list or type in a Neptun URL, which is a strange thing to ask someone who has not been told what the app does yet. One of the reviews said it was a bit hard to set up and that was the honest version of it. It is four steps now with a bar across the top so you can see where the end is. Terms first, then a screen that actually says what NHNK is, then your school, then the login. The school search used to live behind that how do you want to log in question and now it is just the third step, so there is one less screen to get through. While testing it I typed obuda and got nothing back, because the school is called Óbudai Egyetem and I had not thought about accents. Nobody types those into a search box. It folds them now and there are tests so it stays that way. The screen I deleted was also quietly running the update check and the language prompt, which I only noticed on the last read through before removing it. Testing any of this used to mean wiping my own login, so debug builds install separately now."}, {"post_id": 62309, "ts": "2026-09-05T16:43:11Z", "hours": 5.9292, "text": "The next release replaces the login flow, so before touching anything I sat down and read the one I already have. It is four screens before anyone sees a timetable, all of them living in a single file of 2148 lines with five page classes in it. Disclosure, then pick how you want to log in, then find your university, then your Neptun code and password. The university list is 54 entries that I typed in by hand, and the app openly admits in its own description that your school might not be there. That is the part I keep coming back to, because someone whose university is missing has to understand what a Neptun URL is before they can get in. I also found out I had a note wrong. I had written down that the app forces Hungarian and needs country detection added. It does not. It already reads the phone language and falls back to English for anything it does not have. Good thing I checked before building a feature that exists. The genuinely awkward bit is the disclaimer. Translations get downloaded from GitHub while the app runs, which is lovely for adding languages and completely wrong for legal text, since nothing downloaded should be able to rewrite what the disclaimer says. So it is compiled in, and the one screen that most needs to be understood is the one screen stuck in two languages. I do not have a clean answer for that yet. Smaller things I wrote down. A class called SetupPageInstitudeSelection, spelled that way in eleven places. One university with its URL fixed up by hand inside the login handler. The Linux desktop build does not compile at all, which I only discovered because I tried to run the first-run flow there rather than wipe my own account off my phone. Four screens is not really the problem. Not knowing which of them people give up on is."}, {"post_id": 62096, "ts": "2026-09-05T10:46:49Z", "hours": 6.6283, "text": "Someone sent me a screenshot of the home screen widget saying they had no classes, last updated 00:00. They had a class at nine. The 00:00 was not a rounding problem or a timezone problem, it was every day, for everyone, since the widget shipped. When the app caches your week it stores the date as midnight on purpose, because the check for whether the cache is a day old compares whole days. The widget read that same value and printed the clock part of it, so it was showing you the definition of midnight rather than when anything happened. Reading the fetch path to fix it turned up a worse one. If a refresh fails the app puts the old rows back so you still have something to look at, which is right, but then it saves them again with today’s date on them. A week of failed refreshes and the cache still swears it is current. Restored rows keep their original timestamp now. The widget cannot fetch anything by itself, so past a day it says to open the app instead of telling you your day is empty. I nearly shipped that badly too, because the new timestamp only gets written on a real fetch, so every existing user would have been told to refresh the moment they updated. It falls back to the old date for them until their next fetch. An empty widget is fine. An empty widget that looks confident is not."}, {"post_id": 61698, "ts": "2026-09-04T18:56:47Z", "hours": 2.2917, "text": "The statistics page asks you to type how many credits your degree is, which has always annoyed me because Neptun obviously knows. So I went looking, and it will not tell me. There is an endpoint for it sitting in my own code that I have never called, except it only exists on the old API and the modern one has no equivalent among the ten endpoints I use. The one call that touches your programme at all already runs on every startup, and it returns three fields: whether the training is current, its id, and its name. Not a credit count anywhere. I even tried working it out from the programme name and that failed too, because it is a plain string with no BSc or MSc in it. So the box where you type 180 stays, and the release that was going to remove it does not exist. An evening to find that out is a lot cheaper than half a feature."}, {"post_id": 61464, "ts": "2026-09-04T12:10:44Z", "hours": 10.0589, "text": "Tap the version seven times and the app now has a developer tab: startup timings, every request it makes, how stale each cache is, and how many frames it dropped. The interesting part was not building it, it was working out what it is allowed to say, because this thing is holding somebody’s Neptun password. So the list of stored keys is an allowlist rather than a blocklist, meaning a key I add next year is hidden until I say otherwise, and the cached grades and messages only ever show their size. The redaction lives in the recorder instead of the screen, which matters more than it sounds, because one of my own URLs turned out to be a credential and a log that printed URLs would have published it."}, {"post_id": 60573, "ts": "2026-09-03T00:32:04Z", "hours": 10.0933, "text": "Next release I want a developer tab that shows what the app is storing and every request it makes, which sounds harmless right up until you remember my app is holding somebody’s Neptun password. So before writing any of it I went through all 77 things it keeps on disk, and only 46 can have their value put on screen. The trap was sorting by key name, because CachedMarkbook_3 sounds like nothing and is actually somebody’s grades, so that whole group gets to show its size and age and nothing else. The one that nearly got me is the calendar export link, which keeps working with no session at all, meaning the URL is the credential, and a network log that prints URLs would have published it in plain text."}, {"post_id": 60246, "ts": "2026-09-02T14:26:30Z", "hours": 5.3231, "text": "Someone reviewing the last ship said my contrast was bad, the corners did not match and things needed more padding, so instead of squinting at it I went and measured all three. Every accent colour in the light theme failed WCAG AA, and the worst was the one I use for links and section headers, sitting at 1.43 to 1, which is pale blue text on pale grey. Then I counted the corner radii and found fifteen different values across 88 places, which is exactly the kind of thing you stop seeing in your own app. The padding one turned out to be a single number, the search box above the message list had zero bottom padding, and while I was looking at spacing I finally noticed the week switcher on the timetable has always been two separate boxes of different widths with mismatched corners, pretending to be one panel."}, {"post_id": 59878, "ts": "2026-09-01T21:18:00Z", "hours": 10.0089, "text": "I added screen reader labels to the payments, messages and periods cards, then dumped the accessibility tree off the phone to actually hear what came out. Good thing, because the order was backwards: every card read its details first and the name of the thing last, so a subject announced itself as “6 credits, not completed, Introduction to Programming”. That was true of the markbook labels I shipped months ago as well, which nobody had ever mentioned to me. Also finished the calendar export fix from last time, so exporting your timetable no longer tells you the file type is unsupported."}, {"post_id": 59071, "ts": "2026-08-31T17:55:45Z", "hours": 9.8689, "text": "Spent this one adding screen reader labels to the cards that never had any, and then dumping the accessibility tree off the phone to check what actually comes out. Two things fell out of that: the order was backwards everywhere, so cards read their details before the name of the thing, and that was true of labels I shipped months ago too. The honest scoreboard is three of seven card types verified, payments is impossible for me to check because my account has no bills on it, and I have not run an actual screen reader yet, only read the tree, which tells me nothing about focus order or whether you can even swipe to them. So this one is going into closed testing before it gets a tag."}, {"post_id": 58018, "ts": "2026-08-30T11:09:29Z", "hours": 9.7206, "text": "Someone told me the timetable export says “unsupported file type” on their phone, and then mine did it too, which at least made it easy to chase. Turns out the plugin I use picks the file type from a big list of extensions and there is no entry for ics, so it falls through to / and Android hands that to whatever generic file previewer the manufacturer ships, which obviously cannot read a calendar. The annoying part is the phone had the right app the whole time, because Honor’s calendar registers itself for text/calendar and I just never asked for it. One extra argument and the export now offers the calendar first, which ships in the next update."}, {"post_id": 57516, "ts": "2026-08-29T18:00:19Z", "hours": 2.3325, "text": "Last time I said the real problem was that startup waits for the keystore at all, and that fixing it meant making six getters async across a pile of call sites. Did it, and it went from 239ms to 144ms because the timetable comes out of the cache and never needed a password in the first place. What I did not expect was that the compiler only caught 22 of the 27 places that broke, because the last five build the old API request body by gluing strings together, and a string is happy to take a Future and turn it into “Instance of ‘Future<String?>’”. So those five would have quietly posted that to the university as my password instead of failing, which I only found because I went looking after the analyser had already gone green."}, {"post_id": 57413, "ts": "2026-08-29T15:39:47Z", "hours": 9.7889, "text": "Last release I added timers to the app. This one I finally pointed them at startup, and the answer was annoying: 153ms of a 251ms cold start was one function, and 128ms of that was six separate trips to the Android keystore to read six saved values one at a time. None of which the timetable needs, because it draws from cache. I have a fix half done that reads them once and starts before anything asks, but while measuring I noticed the bigger problem is that startup waits for those values at all, and unpicking that means changing six getters used in 46 places, so that is the next few evenings."}, {"post_id": 56915, "ts": "2026-08-28T22:43:52Z", "hours": 9.1436, "text": "I have been shipping features for weeks without ever measuring any of them. So I plugged the phone in and actually timed things, and the Upcoming screen I added last week turned out to fire eight calendar requests one after another. One slow week took 3.2 seconds and the other seven just sat in the queue behind it. Sending them four at a time took the whole thing from 3987ms to 297ms. Then while I was reading the log I noticed every haptic in the app has been throwing an exception instead of vibrating, because I gave Android an amplitude list of the wrong length in all seven places, so vibration has never once worked."}, {"post_id": 56621, "ts": "2026-08-28T13:34:18Z", "hours": 10.9206, "text": "My app ships a 22.9 MB emoji font to draw 28 emoji. It’s bundled on purpose, so the icons look identical on every phone instead of Samsung doing its own thing. Fine goal. But it’s the whole font, 1485 codepoints, sitting in the base module so every single user downloads all of it. Subset it to the ones I actually use and it’s 1.93 MB.Most of what was left after subsetting turned out to be the SVG table. Google ships every glyph twice, once as COLR and once as SVG, and Skia only draws the COLR one, so 6.1 MB of it was duplicate artwork nothing would ever read.Also learned to measure the thing that matters. Uncompressed it’s a 21 MB saving, which sounds great, but the font compresses inside the APK so the real number is 7.30 MB to 1.01 MB, and the APK went 67.6 to 61.0. Still good, just not the number I wanted to write. Separately, my last release failed twice for reasons that had nothing to do with me: CI tracked Flutter stable, stable moved to 3.47, and it raised the minimum Gradle and then the minimum AGP. Pinned CI to the version I actually build with."}, {"post_id": 56177, "ts": "2026-08-27T20:14:51Z", "hours": 10.6, "text": "Last ship’s feedback was blunt: five people said they couldn’t tell what the project was because they don’t read Hungarian. The UI switched to English fine, but the demo data never did, so you’d open it and still get “Analízis I. (előadás)” and “bejelentkezési időszak”. So every bit of fake data the demo makes up now follows the app language. Timetable, exams, deadlines, grades, four semesters of history, payments, periods, mail. Two things had to stay Hungarian underneath though: the period icons are picked by string-matching the period name (Neptun only ever replies in Hungarian), and the “is this payment cancelled” check keys off the word “törölt”. Translating those naively would’ve silently killed every period icon and made cancelled payments look paid. Kept the raw values for the logic, translate only what’s on screen.Found a bug doing it too. Switched to Hungarian and half the demo stayed English, because markbook/payments/periods cache their data for 24h and nobody had exempted demo mode. The calendar already did. Now they all do.Also killed 9 languages. German, Romanian, Russian, Turkish, Ukrainian, Arabic, Spanish, Chinese and Pirate were all downloadable and all mostly half-translated, so picking one left you in a mix of two languages, which is worse than just being in one. Magyar and English only now."}, {"post_id": 55132, "ts": "2026-08-26T16:25:24Z", "hours": 16.6372, "text": "Spent the last stretch on the parts of the project that aren’t the app itself. Rewrote the README three times. First pass just bolted an English version onto the Hungarian one and it ballooned to 351 lines. Second pass I tried to make it “proper” and somehow ended up at 3,185 words, which is longer than most of my essays and nobody was ever going to read it. Third pass I threw that out and wrote it like I’d explain the thing to a friend. Ended up at 184 lines, shorter than what I started with, in two languages instead of one.Then rewrote the whole website. The old one had a big slogan hero, “Neptun, the way it should work on your phone”, which sounds nice but doesn’t tell you what the thing actually is. New one just says it: an unofficial Neptun client for Android, with a little spec row underneath (platform, licence, tracking, price) so you get the whole picture in about two seconds. 13 files, ~5k lines. Also finally wired the site into the app repo as a submodule so they stop drifting apart. Not the most exciting work but the feedback from last ship was that people couldn’t tell what the project was if they didn’t speak Hungarian, so this was the fix."}, {"post_id": 45330, "ts": "2026-08-11T18:32:36Z", "hours": 11.6211, "text": "Your exams were always in the app, you just had to guess which week to scroll to. Built an Upcoming screen that pulls every exam, deadline and open registration period into one list with countdowns, plus a degree progress ring and proper subject pages that finally put the grade, the classes and the exam together."}, {"post_id": 44854, "ts": "2026-08-10T21:49:43Z", "hours": 7.0381, "text": "Was adding a stats page and realised the app had been downloading all 6 of my semesters this whole time and then throwing away everything except the last one. So now there’s actual history: semester averages, credits, grade distribution, on charts I painted by hand because adding a chart library for two graphs felt dumb.Also found out cancelled payments were counting as money you’d spent, so it was telling you that you’d paid 5000 Ft you never paid. Fixed that too. 1.2.3 is out."}, {"post_id": 44620, "ts": "2026-08-10T14:47:36Z", "hours": 8.6858, "text": "I was shipping 20 MB that nobody downloads"}, {"post_id": 44179, "ts": "2026-08-09T19:26:38Z", "hours": 8.5783, "text": "Added live demo for the app to the website."}, {"post_id": 43585, "ts": "2026-08-08T22:40:44Z", "hours": 20.7336, "text": "Fixed some bugs, added widgets, offline mode and a lot more stuff. 5/14 days done until playstore prod release."}, {"post_id": 42540, "ts": "2026-08-07T10:46:27Z", "hours": 2.4797, "text": "Play Store closed testing is in progress!"}]...
|
Title: NHNK by @bali0531 | Stardance
Devlogs:
Pla Title: NHNK by @bali0531 | Stardance
Devlogs:
Play Store closed testing is in progress!
Fixed some bugs, added widgets, offline mode and a lot more stuff. 5/14 days done until playstore prod release.
Added live demo for the app to the website.
I was shipping 20 MB that nobody downloads
Was adding a stats page and realised the app had been downloading all 6 of my semesters this whole time and then throwing away everything except the last one. So now there’s actual history: semester averages, credits, grade distribution, on charts I painted by hand because adding a chart library for two graphs felt dumb.Also found out cancelled payments were counting as money you’d spent, so it was telling you that you’d paid 5000 Ft you never paid. Fixed that too. 1.2.3 is out.
Your exams were always in the app, you just had to guess which week to scroll to. Built an Upcoming screen that pulls every exam, deadline and open registration period into one list with countdowns, plus a degree progress ring and proper subject pages that finally put the grade, the classes and the exam together.
Spent the last stretch on the parts of the project that aren’t the app itself. Rewrote the README three times. First pass just bolted an English version onto the Hungarian one and it ballooned to 351 lines. Second pass I tried to make it “proper” and somehow ended up at 3,185 words, which is longer than most of my essays and nobody was ever going to read it. Third pass I threw that out and wrote it like I’d explain the thing to a friend. Ended up at 184 lines, shorter than what I started with, in two languages instead of one.Then rewrote the whole website. The old one had a big slogan hero, “Neptun, the way it should work on your phone”, which sounds nice but doesn’t tell you what the thing actually is. New one just says it: an unofficial Neptun client for Android, with a little spec row underneath (platform, licence, tracking, price) so you get the whole picture in about two seconds. 13 files, ~5k lines. Also finally wired the site into the app repo as a submodule so they stop drifting apart. Not the most exciting work but the feedback from last ship was that people couldn’t tell what the project was if they didn’t speak Hungarian, so this was the fix.
Last ship’s feedback was blunt: five people said they couldn’t tell what the project was because they don’t read Hungarian. The UI switched to English fine, but the demo data never did, so you’d open it and still get “Analízis I. (előadás)” and “bejelentkezési időszak”. So every bit of fake data the demo makes up now follows the app language. Timetable, exams, deadlines, grades, four semesters of history, payments, periods, mail. Two things had to stay Hungarian underneath though: the period icons are picked by string-matching the period name (Neptun only ever replies in Hungarian), and the “is this payment cancelled” check keys off the word “törölt”. Translating those naively would’ve silently killed every period icon and made cancelled payments look paid. Kept the raw values for the logic, translate only what’s on screen.Found a bug doing it too. Switched to Hungarian and half the demo stayed English, because markbook/payments/periods cache their data for 24h and nobody had exempted demo mode. The calendar already did. Now they all do.Also killed 9 languages. German, Romanian, Russian, Turkish, Ukrainian, Arabic, Spanish, Chinese and Pirate were all downloadable and all mostly half-translated, so picking one left you in a mix of two languages, which is worse than just being in one. Magyar and English only now.
My app ships a 22.9 MB emoji font to draw 28 emoji. It’s bundled on purpose, so the icons look identical on every phone instead of Samsung doing its own thing. Fine goal. But it’s the whole font, 1485 codepoints, sitting in the base module so every single user downloads all of it. Subset it to the ones I actually use and it’s 1.93 MB.Most of what was left after subsetting turned out to be the SVG table. Google ships every glyph twice, once as COLR and once as SVG, and Skia only draws the COLR one, so 6.1 MB of it was duplicate artwork nothing would ever read.Also learned to measure the thing that matters. Uncompressed it’s a 21 MB saving, which sounds great, but the font compresses inside the APK so the real number is 7.30 MB to 1.01 MB, and the APK went 67.6 to 61.0. Still good, just not the number I wanted to write. Separately, my last release failed twice for reasons that had nothing to do with me: CI tracked Flutter stable, stable moved to 3.47, and it raised the minimum Gradle and then the minimum AGP. Pinned CI to the version I actually build with.
I have been shipping features for weeks without ever measuring any of them. So I plugged the phone in and actually timed things, and the Upcoming screen I added last week turned out to fire eight calendar requests one after another. One slow week took 3.2 seconds and the other seven just sat in the queue behind it. Sending them four at a time took the whole thing from 3987ms to 297ms. Then while I was reading the log I noticed every haptic in the app has been throwing an exception instead of vibrating, because I gave Android an amplitude list of the wrong length in all seven places, so vibration has never once worked.
Last release I added timers to the app. This one I finally pointed them at startup, and the answer was annoying: 153ms of a 251ms cold start was one function, and 128ms of that was six separate trips to the Android keystore to read six saved values one at a time. None of which the timetable needs, because it draws from cache. I have a fix half done that reads them once and starts before anything asks, but while measuring I noticed the bigger problem is that startup waits for those values at all, and unpicking that means changing six getters used in 46 places, so that is the next few evenings.
Last time I said the real problem was that startup waits for the keystore at all, and that fixing it meant making six getters async across a pile of call sites. Did it, and it went from 239ms to 144ms because the timetable comes out of the cache and never needed a password in the first place. What I did not expect was that the compiler only caught 22 of the 27 places that broke, because the last five build the old API request body by gluing strings together, and a string is happy to take a Future and turn it into “Instance of ‘Future<String?>’”. So those five would have quietly posted that to the university as my password instead of failing, which I only found because I went looking after the analyser had already gone green.
Someone told me the timetable export says “unsupported file type” on their phone, and then mine did it too, which at least made it easy to chase. Turns out the plugin I use picks the file type from a big list of extensions and there is no entry for ics, so it falls through to / and Android hands that to whatever generic file previewer the manufacturer ships, which obviously cannot read a calendar. The annoying part is the phone had the right app the whole time, because Honor’s calendar registers itself for text/calendar and I just never asked for it. One extra argument and the export now offers the calendar first, which ships in the next update.
Spent this one adding screen reader labels to the cards that never had any, and then dumping the accessibility tree off the phone to check what actually comes out. Two things fell out of that: the order was backwards everywhere, so cards read their details before the name of the thing, and that was true of labels I shipped months ago too. The honest scoreboard is three of seven card types verified, payments is impossible for me to check because my account has no bills on it, and I have not run an actual screen reader yet, only read the tree, which tells me nothing about focus order or whether you can even swipe to them. So this one is going into closed testing before it gets a tag.
I added screen reader labels to the payments, messages and periods cards, then dumped the accessibility tree off the phone to actually hear what came out. Good thing, because the order was backwards: every card read its details first and the name of the thing last, so a subject announced itself as “6 credits, not completed, Introduction to Programming”. That was true of the markbook labels I shipped months ago as well, which nobody had ever mentioned to me. Also finished the calendar export fix from last time, so exporting your timetable no longer tells you the file type is unsupported.
Someone reviewing the last ship said my contrast was bad, the corners did not match and things needed more padding, so instead of squinting at it I went and measured all three. Every accent colour in the light theme failed WCAG AA, and the worst was the one I use for links and section headers, sitting at 1.43 to 1, which is pale blue text on pale grey. Then I counted the corner radii and found fifteen different values across 88 places, which is exactly the kind of thing you stop seeing in your own app. The padding one turned out to be a single number, the search box above the message list had zero bottom padding, and while I was looking at spacing I finally noticed the week switcher on the timetable has always been two separate boxes of different widths with mismatched corners, pretending to be one panel.
Next release I want a developer tab that shows what the app is storing and every request it makes, which sounds harmless right up until you remember my app is holding somebody’s Neptun password. So before writing any of it I went through all 77 things it keeps on disk, and only 46 can have their value put on screen. The trap was sorting by key name, because CachedMarkbook_3 sounds like nothing and is actually somebody’s grades, so that whole group gets to show its size and age and nothing else. The one that nearly got me is the calendar export link, which keeps working with no session at all, meaning the URL is the credential, and a network log that prints URLs would have published it in plain text.
Tap the version seven times and the app now has a developer tab: startup timings, every request it makes, how stale each cache is, and how many frames it dropped. The interesting part was not building it, it was working out what it is allowed to say, because this thing is holding somebody’s Neptun password. So the list of stored keys is an allowlist rather than a blocklist, meaning a key I add next year is hidden until I say otherwise, and the cached grades and messages only ever show their size. The redaction lives in the recorder instead of the screen, which matters more than it sounds, because one of my own URLs turned out to be a credential and a log that printed URLs would have published it.
The statistics page asks you to type how many credits your degree is, which has always annoyed me because Neptun obviously knows. So I went looking, and it will not tell me. There is an endpoint for it sitting in my own code that I have never called, except it only exists on the old API and the modern one has no equivalent among the ten endpoints I use. The one call that touches your programme at all already runs on every startup, and it returns three fields: whether the training is current, its id, and its name. Not a credit count anywhere. I even tried working it out from the programme name and that failed too, because it is a plain string with no BSc or MSc in it. So the box where you type 180 stays, and the release that was going to remove it does not exist. An evening to find that out is a lot cheaper than half a feature.
Someone sent me a screenshot of the home screen widget saying they had no classes, last updated 00:00. They had a class at nine. The 00:00 was not a rounding problem or a timezone problem, it was every day, for everyone, since the widget shipped. When the app caches your week it stores the date as midnight on purpose, because the check for whether the cache is a day old compares whole days. The widget read that same value and printed the clock part of it, so it was showing you the definition of midnight rather than when anything happened. Reading the fetch path to fix it turned up a worse one. If a refresh fails the app puts the old rows back so you still have something to look at, which is right, but then it saves them again with today’s date on them. A week of failed refreshes and the cache still swears it is current. Restored rows keep their original timestamp now. The widget cannot fetch anything by itself, so past a day it says to open the app instead of telling you your day is empty. I nearly shipped that badly too, because the new timestamp only gets written on a real fetch, so every existing user would have been told to refresh the moment they updated. It falls back to the old date for them until their next fetch. An empty widget is fine. An empty widget that looks confident is not.
The next release replaces the login flow, so before touching anything I sat down and read the one I already have. It is four screens before anyone sees a timetable, all of them living in a single file of 2148 lines with five page classes in it. Disclosure, then pick how you want to log in, then find your university, then your Neptun code and password. The university list is 54 entries that I typed in by hand, and the app openly admits in its own description that your school might not be there. That is the part I keep coming back to, because someone whose university is missing has to understand what a Neptun URL is before they can get in. I also found out I had a note wrong. I had written down that the app forces Hungarian and needs country detection added. It does not. It already reads the phone language and falls back to English for anything it does not have. Good thing I checked before building a feature that exists. The genuinely awkward bit is the disclaimer. Translations get downloaded from GitHub while the app runs, which is lovely for adding languages and completely wrong for legal text, since nothing downloaded should be able to rewrite what the disclaimer says. So it is compiled in, and the one screen that most needs to be understood is the one screen stuck in two languages. I do not have a clean answer for that yet. Smaller things I wrote down. A class called SetupPageInstitudeSelection, spelled that way in eleven places. One university with its URL fixed up by hand inside the login handler. The Linux desktop build does not compile at all, which I only discovered because I tried to run the first-run flow there rather than wipe my own account off my phone. Four screens is not really the problem. Not knowing which of them people give up on is.
The old setup opened with a page of legal text and then asked whether you wanted to pick your school from a list or type in a Neptun URL, which is a strange thing to ask someone who has not been told what the app does yet. One of the reviews said it was a bit hard to set up and that was the honest version of it. It is four steps now with a bar across the top so you can see where the end is. Terms first, then a screen that actually says what NHNK is, then your school, then the login. The school search used to live behind that how do you want to log in question and now it is just the third step, so there is one less screen to get through. While testing it I typed obuda and got nothing back, because the school is called Óbudai Egyetem and I had not thought about accents. Nobody types those into a search box. It folds them now and there are tests so it stays that way. The screen I deleted was also quietly running the update check and the language prompt, which I only noticed on the last read through before removing it. Testing any of this used to mean wiping my own login, so debug builds install separately now.
Added an OLED theme, picked it on my phone, and most of the screen was still grey. Rather than argue with my own eyes I took a screenshot and read the actual pixel values out of it, which took about a minute and saved me a lot of guessing. The background was 121212 when I had asked for pure black. Turned out the theme was never reaching the screen. The app builds its colour scheme without setting a surface colour, so every page fell back to Material’s own default grey and quietly ignored the palette it had been handed. One line, and the background went to 000000 and the cards to 080808. The bit I liked was the leftovers. A few tiles stayed light and I was about to go and edit the seventy something places that paint card backgrounds by hand, until I noticed the colour was 3B4548. That is not grey. Grey has equal channels. It was the teal accent bleeding in, because Material tints raised surfaces with your primary colour, so that was one setting too rather than an afternoon of find and replace. Also checked the contrast while I was in there and every accent clears AA on black between 9.37 and 18.80 to one, and found that choosing OLED did not survive the phone flipping to light mode and back, because the theme listener was overwriting whatever you picked. Not finished yet, the tile fix still needs a look on a real device.
Ships:
This project’s (NHNK = “Nem Hivatalos Neptun Kliens”, or in english “Unofficial Neptun Client” so you can say unc) goal is to make the life of university students easier, by creating a mobile app that lets them view their schedule, grades, statistics, upcoming events, messages and a lot more in one place, without the need to login every 30 minutes. The main problem was figuring out how the official university system “Neptun” works, and finding their API routes, but after figuring that out, the app works perfectly fine. This project makes major improvements over the official websites, First of all, every university has their own URL for the management site, that the students have to find / memorize, my app only needs the name of the university, and it automatically uses the saved address(es) from our list. Most universities have multiple urls/servers for “Neptun”, so if one is down, there is another. This again requires the users to figure out which server is up and usable, my app auto selects a server from the fallback list, if the default website is not available, and makes the switching seamless without even the users notice. The “Neptun” website also require users to login after 30min inactivity again, while in the same time most universities enabled the function to require 2fa for all accounts. While this is good for security, it makes checking your schedule grades etc a hassle. My app only needs users to enter their details once, and it wont ask for them again (except if the auth fails because of invalid credentials.), I know it might seems a security issue, that the app wont log users out, but the app is fully read only, as its only meant to check your data. these are the main improvements, but there are a lot more fun and usable features in the app, like detailed statistics etc. You can try the app out on https://nhnk.bali0531.hu via the live demo, or you can download it from github releases (and google play store too soon), but it requires a hungarian university student status to log in. (For non hungarian people who are interested in the app, a DEMO mode is also available in the app itself, but at that point you can just check it out on the website without downloading anything.
The previous ship was about fixing up the basics and making everyting work as intended. If you are interested in the main points of this project etc make sure to read the previous ship description too. In this ship I focused on optimizing the app, making the load time shorter, fixing some bugs like haptics etc, also logged the readme and website rework too. This ship is mainly for ending this stage before I start working on new features and more fixes. I optimized almost everything I can, made loading parallel where it was possible etc. Next ship will be packed with new features, I plan to add a dev mode to help find and debug edge cases or loading issues / resource leaks, also planning to add an “OOBE” to make the onboarding more seamless and modern. (No new images for this ship, since most of the changes are code related and not cosmetical. )
Last ship was about optimizing stuff and fixing small bugs, while this ship is a bit more focused on new features, a new OOBE page, dev mode for advanced statistics about the application, and another batch of bug and UI fixes. So the main goal was to make the app look better and provide a better experience while using it overall + making it easier to diagnose possible problems through the devmode. UI/UX fixes include a new OLED theme, fixed overlapping elements, fixed contrast of the pages. For the UX part a new Out Of Box Experience, its basically a new login/info flow on first start, so now instead of separate pages for TOS/PP login, institution search etc, everything is on one seemless experience. It had some bug fixes too, like the .ics calendar exporting and auto-updating has been fixed now. Also fixed the broken widgets too so now it actually shows what classes you have that day. In terms of New Functions this ship introduces a new Dev mode by clicking the version number fast multiple times, it has a lot of informations about the startup, resource usage etc. For the future plans, I don’t have any new idea for now, the ones I had turned out to be not possible because of the api I have to use, I will probably fix the findings from the reviews of this ship + google playstore closed testing findings too. If you have any good idea make sure to write it down in the reviews / on the github page. (or on discord at @ bali411)...
|
1792878441.7529333
|
1793742441.7529333
|
|
4431
|
Geared Reversible CVT by @packager | Stardance
|
packager
|
0
|
202.39
|
0
|
[]
|
[{"post_id": 64554, "ts": "202 [{"post_id": 64554, "ts": "2026-09-09T01:51:47Z", "hours": 7.6675, "text": "Finished tolerancing the holes, and I added the pulley to the input gear. I also changed the large bearing mount for the gear shifter and also redid the lead screw mount because stuff was hitting. Here’s what I did: I went through like 70 holes, compared it to the toleranced version that was assembled. Lots of problems happened when I had to oversize the holes. For example, the linear bearing holes on the gear shifter mount had to be oversized, which made the thickness of the wall like 0.8mm thick. I then had to go into my mastersketch and change up the dimensions which took a stupidly long time. Regeneration times are hitting near 2 minutes (300 features isn’t good, plus tons of dependencies, and so many dimensions that it takes up the entire sketch). I added the pulley to the input gear. I had to switch to a different featurescript because the one I was using didn’t have GT2. After that it was pretty easy, just had to cad the walls, chamfer a bit and boolean and bore it. The most annoying part was that the copper lead screw nut (on the mount) was hitting the 1:1 gears completely ruining the whole thing. I basically had to redo the shaping of the lead screw mount. I moved the copper part further up the part, keeping the standoffs at basically the same level. As a result, I had more space at the bottom for two screws instead of 1. Also, now all the constraints are fully dependent on the external parts, so there’s no random dimensions I did just to make stuff look good, which is good because it means if I change the gearing or something in the mastersketch, the mount should update accordingly. This also took a pretty long time and 2 min regeneration doesn’t help."}, {"post_id": 62711, "ts": "2026-09-06T06:17:18Z", "hours": 8.0844, "text": "Cleaned up a lot of the stuff hitting and a lot of the tolerances too. I also had to do some cooked surface modeling with onshape (I have never surface modeled before). Here’s what I did: The blue pieces were also hitting at the bottom, so I had to make the material even thinner than it was (really cooked, near 1.5mm thickness and barely clearing eachother). The standoff placements really cook everything so I’ll probably just extend the plate and move the standoffs further from the gears. However it will be uglier, and I would rather have a good looking cvt that doesn’t work than a ugly cvt that works. I had to do some really cooked stuff with surface modeling. Basically, the wrap feature wasn’t working. I spent like an hour or two trying to learn surface modeling, but nothing was working because the shape was weird, so I ended up just doing 8 separate revolutes, boolean, and then some move faces. Also, the bumps can’t be radial because the bearing isn’t radial (it faces horizontal, so the edge closer to the center moves up first which causes the whole thing to jam). To fix that I had to do even more cooked remove revolutes, then bridge curving and then knitting (I had never used these before) and fileting. I need to figure out a clearer way to do it because it’s getting on my nerves. I went through the latest V3 and compared around half of the holes to the V2 (it turns out there’s like 3 holes per part and theres like 100 holes to go through, not including clearances). The clearances also cooked some of the spacing so I went and fixed that. I’ve been spending some time thinking about the 1way bearing solution, and I completely switched up and now think it’s impossible."}, {"post_id": 61667, "ts": "2026-09-04T18:15:01Z", "hours": 9.5906, "text": "Finished most of the cad, just need to clean up tolerances and split a few parts. Here’s what I did: I made the rings for the gearshifter bigger because the gear shifter mount on the lead screw was hitting the center 1:1 gears. This caused lots of issues with sketches breaking so I had to redo those. I had to change the gearing for the last stage. The 1:1 gears were hitting the bearings so the only solution is to move the bearings further from the center, hence change the gear ratio. This also caused tons of problems and I had to redo a lot of the parts again, especially the gear shifter mount that mounts onto the lead screw. I added cutouts onto the blue part (it’s gray now, but the one that houses the bearing that the dog clutch goes on. The blue parts used to be hitting the 1:1 gears but now it clears by like 0.5 mm. I’m still deciding whether I want to assemble this or not. I can’t figure out the 1way bearing based thing, and I’m starting to feel like it’s fundamentally impossible."}, {"post_id": 60403, "ts": "2026-09-02T18:22:52Z", "hours": 7.5178, "text": "I mirrored the whole thing, and the V3 looks complete but there’s some fundamental flaws. I also thopught a lot about the 1way bearing based solution. Here’s what I did: Mirrored the whole thing onto the other side. I didn’t run into any spacing issues which means I’m good at mastersketching. Currently, the 1:1 gears are hitting the big bearing that the dog clutch is in. I dont’ know how to fix this because it means I’ll have to change the gear ratios. I spent a lot of time thinking about the 1way cvt that doesn’t use clutching. I realized that I could put the input gear on a 1way bearing and somehow run different sets of gears based on the direction. However, everything is inevitably linked to the same output which jams everything. Also, the arm system is inherently not backdrivable which is makes the input on a 1way bearing solution not work. I’m gonna have to think more about a better solution. I need to do some finishing touches to the V3, but I’ll spend more of my time thinking about the 1way bearing cvt."}, {"post_id": 59751, "ts": "2026-09-01T17:59:00Z", "hours": 5.7678, "text": "Made the 1:1 gears to power the cam and made a new rail system for the ring. Today was really productive, here’s what I did: initially, I messed with a lot of the dimensioning and spacing with the rails on the outside. I realized there’s no way it was gonna work, and even if it could, it would take up tons of space. I needed a better solution. Having the rails on the outside makes everything really big which doesn’t fit. I figured out a way to add a rail inside the tube. Instead of the ring being constrained to a rail, the inside thick square piece is constrained to a rail. This leaves tons of space on the outside for gears (almost 6mm of space on each side). I finally added the gears. I had 6mm of space which is more than enough. However, the gears hit the bearings that track the ring, so I’ll probably end up making the ring bigger either way. Another terrible thing is that the gears hit the blue piece. It actually goes far enough to cut into the bearing. Either I shift into smaller bearings, or I change the spacing between the gears. I still have to decide which on to do. I don’t think I’ll be building this version in hopes of coming up with a way to use one-way bearings."}, {"post_id": 59002, "ts": "2026-08-31T16:09:51Z", "hours": 5.5344, "text": "More cad. I assembled the lead screw and gear shifter. Here’s some stuff I did: After building my v2, I realized the ring is super unstable and can easily tilt, causing the whole thing to jam. This is especially true because its only being pushed at one point (the contact of the bearing). Therefore, I added some holes for rails so it can slide along the holes. However the rails need mounts which take up space, taking away space for the gear, so I might switch the rails to something else. The rails made the ring bigger so it started hitting the blue piece again, so i changed the position of the standoff to create more distance. I assembled the center shaft, which includes the output gears and the perpendicular cam. I had to change up some of the dimensions because it wasn’t fitting. I also removed the from the part because it would make it hard to print, and instead used a separate spacer. I’m starting to become pretty unproductive at cad because almost 40-50% of the time spent is just thinking about how I can design it rather than actually designing it. I also spent some time thinking about the one-way bearing solution. I finally got my hands on them so I’ll be trying stuff out instead of just trying to visualize them."}, {"post_id": 57937, "ts": "2026-08-30T08:41:36Z", "hours": 9.2519, "text": "Did tons of cad, semi finished the parts (still need to fix some stuff) and started an assembly. Here’s some stuff I did/problems I ran into: I cadded the new lead screw mounts for the gearshifter. I lowk dont have any clue what I’ll do about it hitting the 1:1 gears. Hopefully there’s some geometry fixes I can make. The bottom moving piece (that moves back and forth following the cam) is oversized and will hit the ring for the ramp. I will change it tmmrw. I realized a lot of my new parts are gonna be really hard to print so I split them. I started the assembly. I finished the basic side (most of the rest should just be mirorred). I have to figure out a better way to transfer torque while also spinning (remember the linear bearings spinning smooth). The current method just has something sliding on a shaft which is high friction. There are actual linear bearings that prevent rotation, but they are crazy expensive and barely produced anymore. I’ve also been thinking more about the one-way bearing based solution. I realize that maybe the key is just to mirror the whole gearbox and change the direction that it’s clutched in."}, {"post_id": 55759, "ts": "2026-08-27T19:04:18Z", "hours": 7.1681, "text": "Did more cad, especially working on the gear shifter mechanism. I was having lapse and hackatime issues so I couldn’t really record much or post a devlog. Here’s what I worked on and some problems I ran into: chromebooks are slow as hell and are literally impossible to cad on (hence i need the macbook). This means the only time I can cad really productivley is at home which is annoying because I don’t do anything at school. For the gearshifter to work, it needs to be geared 1:1 with the tubes. This is a huge problem geometrically because it hits the blue piece. In fact, it goes into the bearing hole for the blue piece which means I can’t just cope and be lazy by making the piece thin. The closer I move the output gears to the dog clutch gears, the closer the blue piece moves to the center gear which cancels out making the 1:1 gears smaller. I have to figure out a solution soon. I swtched from the cam being sandwiched between bearings to the bearings being sandwiched between the cam because it gives space for the gears to be on the outisde. I’m pretty sure this is also better force wise because instead of pulling out each bearings individually when it moves side to side, the bearings are in contact so you effectively have to pull out both bearings at the same time. Also the lever arm for the center version looks smaller than the version with the separate gear just for the shifting which means less friction. I had to tweak the ratios and spacing a bit because the blue piece barely has space. Even now, it’s way too thin (1mm) which I don’t like. No, I haven’t forgotten the mythical one-way-bearing based concept, I’m still thinking about it. I have a vague idea of what it should kind of look like (somehow have two sets, both of them mirrored, each of them ratcheting the other way). I’m pretty sure there’s a solution but I’m not smart enough to figure it out."}, {"post_id": 54291, "ts": "2026-08-25T07:26:33Z", "hours": 5.0694, "text": "Finalized the sketching and starting making some parts. Here’s some stuff I did: I realized mod 1mm is way too small and I want the macbook more than a smaller cvt, so I’ll be sticking with mod 1.25mm. I basically went through like 35 features and redo them because of the new dimensions. I have yet to go through 210 more and add more features on top of that. Since I’m keeping the gears as mod 1.25mm, I increased the radius of the gear shifting from 9mm to 11mm (like it was originally). Based on how the built model performed, I redid a lot of the tolerances. I also needed to cad a new base plate because of the new shape. the gears were hitting so I changed the output and dog-clutch gear sizes. Now that I’m devlogging, I realize that I seriously need to lock in on the constant-speed gears. I’ll be spending lots of time tomorrow working on that."}, {"post_id": 53601, "ts": "2026-08-24T07:20:36Z", "hours": 6.5417, "text": "Look who’s back. Back again. I was banned from using my personal computer because my parents saw that I was cadding instead of studying for sat, but I just took it and I can finally cad now. I feel like I’m close to finding a way to eliminate the clutch but I can’t figure out how to yet. Therefore I decided to save it for a v4 and focus on other stuff for a v3. Here’s some stuff I did today: I sketched out what the v3 will look like. Instead of a pentagon it’ll look more like a trapezoid because I don’t need the 3rd gear anymore. I’m still not sure if it’s possible to gear the gear selector 1:1 with the outside gears because it has to be bigger than the tube. After building my v2, I realized my gearshifting mechanism was completely cooked. It jammed a ton because there was nothing stopping the ring from angling and binding with the tube. Adding fuel to the fire was the fact that the worm gear mech only pushed it from one side making it impossible to stop the ring from angling. I wanted to add support rods for my v2 but it was impossible because the gears were way too close, but now it’s possible because of the new spacing. Also, the worm gear is effectively moved downward, more in line with the centers of the rings, which lets me wrap it around the ring and make bending less easy. I still haven’t decided if I want to stick with ramps or switch to something else. I switched everything to 1mm mod gears, but I realized spacing was way too cooked because there’s PROBABLY no space for the cutout for the ramps (or whatever I choose to use, it’s just that I have no space for 2 linear bearings in a row). I still haven’t figured out the cutout dimension fully, but there’s a good chance that I’ll end up switching back to 1.25mm mod. Also, 1mm mod means I need to buy new bearings and stuff which are expensive and cut away money from my stardust payout (which I wanna maximize because I NEED THAT MACBOOK so I can cad during school)."}, {"post_id": 33928, "ts": "2026-07-24T07:36:27Z", "hours": 5.2675, "text": "Did tons of math and tons of brainstorming. The math is absolute hell and annoying but desmos is carrying. I got a shape for the non-circular gears for now (they can’t be called elliptical), see the first image. The sharp angles might be a problem with the gears depending on how many teeth are on them, so I may have to change a fully flat output to something very slightly oscillating. I spent a good amount of time thinking about how to eliminate the clutch. I am no longer as confident about there being a solution as right after opensauce, but I may be onto something. I came up with a mechanical “absolute value” system which takes an input and basically gives the absolute value of it. The input will be both geared and belted to an output shaft, and the recieving gear and pulley will have a one way bearing on them. Since the direction of each recieving thing is opposite to eachother (the gear changes direction while pulley keeps it the same), one bearing will always be ratcheting while the other is transmitting torque. Therefore, regardless of how you spin the input, the output always spins in the same direction. Also, after doing the math, it turns out that the output osciallting speeds isn’t symettric in both directions: it’s actually faster when spinning one way than the other. This is really good because it gives me a way to differentiate between the two directions. I sitll haven’t figured this out yet but I think I’m in the right direction. Overall, the math is complete hell and I’m not too sure whether it’s even possible to eliminate the clutch entirely and shift to a system of one-way bearings. However, I do feel like I’m somewhat onto something."}, {"post_id": 32569, "ts": "2026-07-21T20:40:47Z", "hours": 5.96, "text": "I haven’t devlogged in a while cuz I was busy with outpost/opensauce, but I almost finished the build. I had terrible printing problems (my parts were warping all over the place) and I basically had to print/build the entire thing in 2 nights. As a result i have rlly bad friction on the gear shifting mechanism. After talking to some people at outpost and opensauce, I believe it is possible replace the clutch with a system of one way bearings, so I will spend most of my time brainstorming solutions for a v3 or v4."}, {"post_id": 27538, "ts": "2026-07-13T05:55:23Z", "hours": 8.5006, "text": "I finished printing all the parts and tuned all of the tolerances. I ran into far too many printing issues (I probably wasted as much filament as will be used in the project), especially with bed adhesion. It was to the point where even a 10mm brim with 0 brim-object gap and increasing the bed temp by 5 degrees and washing the bed couldn’t stop warping. But at the end of the day I thugged through and got all my parts. I also ran into some cooked tolerancing with the bearings and even the screw holes for some reason. But all of that is behind me now cuz I can finally start building."}, {"post_id": 23948, "ts": "2026-07-07T05:04:04Z", "hours": 22.6917, "text": "I ordered all the parts and set stuff to print to test the tolerances and I ran into some pretty annoying issues. Here’s some of the issues I ran into: There was only 4 packs of 2 3x6 linear bearings in stock so I had to redesign the lead screw gear shifter to use 6x12 ones. 32x39 bearings are literally 12 bucks per and there’s only one singular vendor for it so I switched to 30x37 bearings which are way cheaper. In doing so I ran into really sketchy wall thicknesses. The slots for the 28mm dowel pins were way too close to the walls of the gear, so I had to change up some of the geometry so it doesn’t just print as a half circle. I spent a good amount of time tuning the tolerances so that the bearings would actually pressfit and not slide off easily. Same thing with the dowel pins. The biggest problem I ran into was that apparently you CAN rotate linear bearings around a shaft very smoothly. Every google search made it seems like I would break my wrist and explode trying to rotate a linear bearing, and it was pretty shocking to see it spinning smoother than a fidget spinner. This completely cooks my entire design and I still can’t figure out a good solution the second biggest problems was that, when switching from 32 to 30mm bearings, I forgot to change the dowel pin size so now they don’t fit in the bearings. I might just end up 3d printing pins if they’re too expensive/take too long to ship. a lot of the parts were really hard to 3d print so I split them into multiple to screw in. Apparently the maximum devlog time limit is 10 hrs. I had 22 hrs logged because I wanted to have some aura post with 40 hrs where the entire thing was built, but I ended up losing 12 hrs instead."}, {"post_id": 16824, "ts": "2026-06-27T10:00:06Z", "hours": 7.3842, "text": "another great lock in, the cad is done (finally). V2 seems like it could work IRL so I’m gonna actually order parts and build it. Today, I split the gray gears (with the tube) into two parts so I can actually assembly it, added countersinks to parts that need it, and fixed up some tolerances. I don’t have too many new ideas for the V3, but hopefully after I build/test V2 I can notice some key problems. Here’s the general gist of I’m aiming to accomplish: Obviously, I need to actually lock in with elliptical gears for the V3. This is the biggest problem with the V2. Because of the sinusoidal motion, the output gear isn’t constant speed (it oscillates slightly too). The whole extra gear for the CAM is super annoying, so I’m gonna keep it coaxial to the input/output shaft (running three things coaxial) and gear it from the tubes instead of a separate thing. I need a huge geometry change for this which is why I’m saving it for a V3. I want to figure out a better way to do the dog clutch system. I’m hoping there’s a smarter way which doesn’t rely on meshing/unmeshing but so far I couldn’t think of anything. I’m really happy with where this has come, and I can’t wait to start assembling this. For those who want to take a closer look, here is the link to the cad: https://cad.onshape.com/documents/c369754a085e1b437744081a/w/8784f23027b47ba880d55ef1/e/7f96dc46c879863ea30c1be9?renderMode=0&uiState=6a3f9f14c9069ebe4a356101"}, {"post_id": 16166, "ts": "2026-06-26T08:42:14Z", "hours": 8.2175, "text": "insane lock in, I finished the whole linear motion, and made tons of small changes. Here’s some of the bigger stuff I did: I was originally planning to use thrust bearings, but they were way too big. Instead, I just decided to use 3x6 bearings sideways (ball bearings are designed to handle radial load anyway). The packaging was cleaner than thrust bearings anyway. for the linear motion, I had to add more dowel pins - linear bearings to stop the thing from rotating with the lead screw. I ran into some really stupid onshape problems where everything was off by 0.088 degrees for some reason. I was messing with random parts and doing random mates for like 30 minutes until suddenly it worked. I have no clue how, but that doesn’t matter. The linear cams were hitting the 3mm dowel pins inside the gear so I cut out part of it. The linear cam seemed really weak, so I connected the bottom of the ramp to the main assembly. This was a huge pain because there’s barely any space, so tolerances had to be tight. Just one more day of cad and I will be done with it."}, {"post_id": 15541, "ts": "2026-06-25T08:19:43Z", "hours": 4.5006, "text": "Huge lock in, finished up the linear CAM so it should work now, and started the worm gear for the gear shifter. I realized I was doing the linear CAM wrong, and it has to be mirrored instead of just a 180 degree turn, so I fixed that and made a new part for the other side. I also added the lead screw and bearing for the gear shifting. Turns out everything packages nicely (i love uxcell) so I don’t have to do cooked stuff. Just another day or two of CAD and I should be ready to build."}, {"post_id": 14927, "ts": "2026-06-24T07:41:56Z", "hours": 10.0839, "text": "Did tons of changes to the design and continued procrastinating my devlogs. I realized the whole dog clutch thing was too cooked with that little space because it means less space between the bearings for the perpendicular cam. It was also better to change the angle of the linear cam to 45 degrees, and doing so gave me more space. I finished up the dog clutch stuff. I also spent some time cadding the perpendicular cam, and I ended up spending a couple of hours learning surface modeling in Onshape (it was super hard to get it to work). I also put tons of time into thinking about a better way to power the cam: having a whole separate gear is messy, so I wanted to keep it coaxial on the output shaft, but it turns out there isn’t enough space. Hopefully I can switch to this in a V3. I’m also saving elliptical gears for a V3 cuz I have to get this done by outpost. I just need to do some final touches and a full assembly check before I can start building."}, {"post_id": 11814, "ts": "2026-06-19T07:23:14Z", "hours": 4.7167, "text": "I added the dog clutches and realized there’s some big spacing issues. I mated the dog clutches and switched from a 19mm to 18mm length linear bearing. There’s some really bad spacing issues with the linear bearings: not only is it super long, but there also needs to be space between the two separate shafts so that the linear bearings don’t contact two at the same time. However, this distance can’t be too much or else the distance between the clutch and the gear in disengaged state will be too small. I spent some time searching for that balance only to realize that my linear bearing was contacting the flanged bearing, so I changed the lengths up but still no luck. I’m probably going to just make the whole thing a bit wider (because the angle for the linear motion is too steep right now anyway) which should make everything a lot easier."}, {"post_id": 11140, "ts": "2026-06-18T06:55:51Z", "hours": 6.8189, "text": "Finished around half of the assembly. I assembled some of the parts in onshape and realized there’s a few intersections and some of the spacings were off so I changed those. I didn’t run into much problems, but I had a few better ideas that I’ll try implementing in the future: It turns out I was being stupid and you need two separate dog clutches for each side. This might actually be better because since they just have to rotate differently but the spacing between them is constant, I can make that outer ring much thicker. This gives me space to bearing sandwich the cam instead of doing some other cooked stuff. However this also means you need two separate shafts which are cantilevered. I need to figure out a way to support the shafts from the inner end. While I was assembling, I realized I had done the linear cam (for the gear shifting) wrong because everything can be one part. This will make the entire thing thinner. I had a stroke of genius and realized that instead of using that fifth bottom gear which makes everything bigger and ugly, I can gear the perpendicular cam (for the dog clutches) to the gear shifting mechanism, making the entire gearbox so much cleaner. This is kinda cooked because it means the gears will be sliding on each other and because it relies on the tolerancing of 3d printed parts which I don’t trust too much. But if it means making the gearbox look much better, it may be worth it (aesthetics are the most important consideration when designing functional parts). I realized I could switch everything from mod 1.25mm to mod 1 or even mod 0.8 because there’s no more cooked gear meshing/unmeshing. However, it may be too late to do this for the V2, so I’ll probably save it for a V3. The gearbox is not only thinner than the V1, but is also much less cooked. And (probably best of all) the packaging will be really really clean. It does take up more space radially, but that can easily be fixed by switching from mod 1.25 to mod 0.8."}, {"post_id": 10511, "ts": "2026-06-17T08:13:48Z", "hours": 13.7492, "text": "I’ve been procrastinating my devlogs, but I finished up basically all the parts and fixed a ton of problems. Now I can get started with the assembly. I’ve been procrastinating way too much with devlogging because every time I finish recording its late at night and I’m too lazy to devlog but here’s a summary: I tried implementing the linear cam (which is just a fancy name for a sliding ramp) but I quit halfway through because there was barely any space and I was too lazy to make it work. I then implemented my old idea (the linkage) but when you mirror it, it takes up 50mm which is huge. I then decided to go back to the linear cam. I added two ramps and two slots instead of just one so its more stable. I plan to add a screwed in 3d print plate underneath so it doesn’t bend. Now it only takes up like 35mm which is slightly better. I mirrored the gear and realized the plate that switches the gear ratio will be hitting the outer bearing of the dog clutch, so I spaced out the gears a bit more. I’ll probably be switching away from the outer gear on the dog clutch because it takes up tons of space. The parts are basically done, I just have to see how everything works in an assembly."}, {"post_id": 7364, "ts": "2026-06-12T08:34:27Z", "hours": 2.0681, "text": "Figured out perpendicular cam geometry. I was running into quite a few issues and managed to find a solution that fixed most of them. I pivoted from 6mm ID bearings to 32mm for the second stage of gears (the oscillating ones). I also realized that instead of moving the dog clutch directly, I have to mount another bearing around it with a 3d print mount. This not only allowed me to save tons of space, but now I only have to use one perpendicular cam because I can make the 3d prints 90 degrees offset, preserving phase. Here are some problems I ran into and how I tried fixing them: The 32mm bearings were hitting, so I changed up the main geometry and will be alternately adding flange space on each side of the main plate. There isn’t enough space for 2 flanges to be next to each other, but there’s enough space for 1 flange and a normal bearing to be next to each other (0.1mm of space). With my old design (screwing a sidways bearing directly on the dog clutch), I had to use two separate cams because the phase was not 90 degrees offset. However, with another bearing around the whole thing, I can change the angle to not be radial, making it exactly 90 degrees. Looks like V2 will take the shape of a pentagon, and will soon look like a hexagon once I add the linear motion for the gear shifting mechanism."}, {"post_id": 6718, "ts": "2026-06-11T07:53:07Z", "hours": 3.0533, "text": "I did tons of brainstorming and came up with a better replacement for the meshing/unmeshing gears (I actually had 2.5 hours more recorded the night before but lapse ran into a problem so they aren’t counted for here). I realized I could keep the gears in contact the entire time, and instead use a perpendicular CAM (idk what it’s called, it’s basically a CAM that has its offsets parallel to its axis of rotation) to engage a dog clutch onto the gears. The dog clutch basically has 0 chance of bad alignment because the clutch will self align. This hopefully makes everything much more reliable and efficient. To power this, I need a third gear directly connected to the input gear that takes the linear CAM below the input shaft (you can’t run it coaxially). To make it fit, I changed up some of the gear ratios. I soon plan to switch from 1.25 mm to 1mm modulus."}, {"post_id": 5446, "ts": "2026-06-09T07:10:30Z", "hours": 5.2933, "text": "Continued sketching my V2. I spent most of my time visualizing the whole thing (I spent almost two hours sketching the thing out and doing the math). Here are some of the problems I ran into (and how I fixed them): I need the inputs on both sides to be powered, but I also want the output to be a pulley on the side (not in the center). This is impossible with a normal coaxial setup. Instead, I linked the first stage of gears (the one that has the ration changing mechanism) and will be changing up the linear motion mechanism. When connecting the first stage, it hit the output gear, so I had to change some of the geometry. As mentioned before, the radial force by the gear changing mechanism of V1 will probably cause the linear bearings to bind, so I’ll be changing this to a static linear-CAM type of motion for a constant force throughout the motion. Because I’m linking the first stage, everything will basically be inside a tube."}, {"post_id": 4760, "ts": "2026-06-08T07:08:52Z", "hours": 3.3856, "text": "Did some math for the V2. I want the output to be at a constant speed, which means the gears have to be noncircular. The output right now actually isn’t even sinusoidal, and Claude and I had to do tons of weird trig to find the angle as a function of time. After graphing everything on Desmos, I figured out the ideal shape of the gears. Next, I’ll do more mastersketching, and export the shapes from Desmos into Onshape. In the image, the black curve is the position as a function of time, and the blue and red curves are the ideal gear shapes. Actually, now that I think about it, this is wrong and I need to change the whole thing."}, {"post_id": 3356, "ts": "2026-06-06T07:38:50Z", "hours": 4.0761, "text": "I made some minor changes and I’m almost ready for a v2. I fixed up some of the spacers, changed the direction of the linkage that changes the ratio, changed some of the bearings. I also changed the coloring, and it looks much cleaner (I chose pink because I have pink filament loaded in, if you guys have any recommendations please tell me). Here are some fundamental problems with the current version and how I’ll fix them in the v2: The biggest problem is probably gears meshing. The entire thing has to be perfectly synchronized for the gears to mesh perfectly every time, which is obviously impossible. The only thing preventing jams right now is my prayers. However, backlash does give it some room for error. I’ll probably find a better gear tooth profile for my V2, but this is sort of a fundamental problems that will exist. The second biggest problem is that the gears oscillate from max speed to 0 speed every half-cycle, which means the speed will be constantly oscillating. This is easily fixable: in my V2, I’ll use more driving gears (probably 4) each active for a smaller fraction of their period. This combined with elliptical gears to counter the sine waves should make the output basically constant speed. The linkage for the gear changing has basically zero torque, and backlash will completely fry it. Also, this adds weird thrust forces on the linear bearings which will probably cause them to bind. In my V2, I’ll probably shift from a linkage to a linear CAM type of thing (I still have to figure it out). This is really big and wastes some space. My V2 will (hopefully) have better packaging and be smaller. This is achieved by putting the second layer of gears on the inside of the plate and praying there is enough space. The uniform coloring makes it look way better. Once again, if you have any colors you think would look better, please tell me."}, {"post_id": 2610, "ts": "2026-06-05T07:19:25Z", "hours": 4.9444, "text": "I basically finished up the linear motion for the CAM. All that remains is some minute adjustments. Here’s some problems I ran into: The geometry was incredibly hard due to the lack of space, and I ended up just trying a bunch of possibilities and landing on one that worked decently. While I was planning to use belts, I switched to gears after I saw how little space there was. Screws were hitting the servo for the gear changing mechanism, so I rearranged it so the lip is on the outside of the plate, giving me a precious 4mm to work with. It was hard to come up with a way to ensure the full range of motion always happens. There’s nothing pushing the gears up after the CAM pushes it down. Initially, I was planning to do some complex linkage relying on the definition of an ellipse (the sum of distances from the foci is constant). I tried sketching it out but there was literally no space. At the end, I thought of tying a string to both gears and wrap it around an idler to keep the constant sum of distances. This thing’s gonna look clean once everything is colored. All that remains is some minute adjustments and I can move on to a V2."}, {"post_id": 2001, "ts": "2026-06-04T08:28:28Z", "hours": 4.7186, "text": "Started the linear motion for the CAM. I was initially thinking about using MGN3 linear rails until a realized that each rail is over 100 bucks. Instead, I decided on linear bearing based motion with 3mm rods similar to how the ratio changes. Here’s some problems I ran into: Cheap MGN rails were way too big so I decided on the linear bearings (I spent way too long searching for cheap MGN3 linear rails) I initially wanted to put the rods between the yellow and blue plate, but after sketching it I realized the tolerances were too sketchy. Initially I was going to do one main CAM in the center, but I realized when the CAM is pushing the shaft to the outside, the angle is weird so the force is basically transmitted perpendicular to the direction of the motion, which really cooks efficiency. So instead I decided on 2 smaller CAMS that are belted to the main gear. some future/long term problems I need to fix: I don’t think there’s enough space for the belts and cams, so this whole design might be fried The 3mm rods aren’t constrained on their ends, so I have to figure out a way to do that (right now its only held by friction). The motion of the driven gear will oscillate a ton because of the CAM. One potential solution is to use elliptical gears and have the gears engage only in a certain phase where its speed is high (so its not stopping) There’s something similar to the coaxial effect from swerve drives in this gearbox too: I’m gonna call it the CVT effect. When the gear ratio changes, the linear motion makes the gear change phases. Something similar happens because of the CAM, but this isn’t that big of a problem. But when in doubt, assume software can account for it."}, {"post_id": 1318, "ts": "2026-06-03T07:33:32Z", "hours": 1.1881, "text": "Mounted the CAM gear, added a front plate, and added screws. I ran into a problem where one of the hubs hits the belt to the lead screw so I changed up some of the geometry. The gearbox is starting to look pretty complicated and dense without the second most complicated part (the CAM). I am holding off coloring everything and pocketing till the very end because it’ll be very satisfying."}, {"post_id": 1291, "ts": "2026-06-03T05:55:02Z", "hours": 3.5786, "text": "Finish up Linear Motion for CVT. Mounted the linear bearing, added the servo, and finalized the linkage so the actual CVT part now works. Now, I have to work on the CAM mechanism."}]...
|
Title: Geared Reversible CVT by @packager | Starda Title: Geared Reversible CVT by @packager | Stardance
Devlogs:
Finish up Linear Motion for CVT. Mounted the linear bearing, added the servo, and finalized the linkage so the actual CVT part now works. Now, I have to work on the CAM mechanism.
Mounted the CAM gear, added a front plate, and added screws. I ran into a problem where one of the hubs hits the belt to the lead screw so I changed up some of the geometry. The gearbox is starting to look pretty complicated and dense without the second most complicated part (the CAM). I am holding off coloring everything and pocketing till the very end because it’ll be very satisfying.
Started the linear motion for the CAM. I was initially thinking about using MGN3 linear rails until a realized that each rail is over 100 bucks. Instead, I decided on linear bearing based motion with 3mm rods similar to how the ratio changes. Here’s some problems I ran into: Cheap MGN rails were way too big so I decided on the linear bearings (I spent way too long searching for cheap MGN3 linear rails) I initially wanted to put the rods between the yellow and blue plate, but after sketching it I realized the tolerances were too sketchy. Initially I was going to do one main CAM in the center, but I realized when the CAM is pushing the shaft to the outside, the angle is weird so the force is basically transmitted perpendicular to the direction of the motion, which really cooks efficiency. So instead I decided on 2 smaller CAMS that are belted to the main gear. some future/long term problems I need to fix: I don’t think there’s enough space for the belts and cams, so this whole design might be fried The 3mm rods aren’t constrained on their ends, so I have to figure out a way to do that (right now its only held by friction). The motion of the driven gear will oscillate a ton because of the CAM. One potential solution is to use elliptical gears and have the gears engage only in a certain phase where its speed is high (so its not stopping) There’s something similar to the coaxial effect from swerve drives in this gearbox too: I’m gonna call it the CVT effect. When the gear ratio changes, the linear motion makes the gear change phases. Something similar happens because of the CAM, but this isn’t that big of a problem. But when in doubt, assume software can account for it.
I basically finished up the linear motion for the CAM. All that remains is some minute adjustments. Here’s some problems I ran into: The geometry was incredibly hard due to the lack of space, and I ended up just trying a bunch of possibilities and landing on one that worked decently. While I was planning to use belts, I switched to gears after I saw how little space there was. Screws were hitting the servo for the gear changing mechanism, so I rearranged it so the lip is on the outside of the plate, giving me a precious 4mm to work with. It was hard to come up with a way to ensure the full range of motion always happens. There’s nothing pushing the gears up after the CAM pushes it down. Initially, I was planning to do some complex linkage relying on the definition of an ellipse (the sum of distances from the foci is constant). I tried sketching it out but there was literally no space. At the end, I thought of tying a string to both gears and wrap it around an idler to keep the constant sum of distances. This thing’s gonna look clean once everything is colored. All that remains is some minute adjustments and I can move on to a V2.
I made some minor changes and I’m almost ready for a v2. I fixed up some of the spacers, changed the direction of the linkage that changes the ratio, changed some of the bearings. I also changed the coloring, and it looks much cleaner (I chose pink because I have pink filament loaded in, if you guys have any recommendations please tell me). Here are some fundamental problems with the current version and how I’ll fix them in the v2: The biggest problem is probably gears meshing. The entire thing has to be perfectly synchronized for the gears to mesh perfectly every time, which is obviously impossible. The only thing preventing jams right now is my prayers. However, backlash does give it some room for error. I’ll probably find a better gear tooth profile for my V2, but this is sort of a fundamental problems that will exist. The second biggest problem is that the gears oscillate from max speed to 0 speed every half-cycle, which means the speed will be constantly oscillating. This is easily fixable: in my V2, I’ll use more driving gears (probably 4) each active for a smaller fraction of their period. This combined with elliptical gears to counter the sine waves should make the output basically constant speed. The linkage for the gear changing has basically zero torque, and backlash will completely fry it. Also, this adds weird thrust forces on the linear bearings which will probably cause them to bind. In my V2, I’ll probably shift from a linkage to a linear CAM type of thing (I still have to figure it out). This is really big and wastes some space. My V2 will (hopefully) have better packaging and be smaller. This is achieved by putting the second layer of gears on the inside of the plate and praying there is enough space. The uniform coloring makes it look way better. Once again, if you have any colors you think would look better, please tell me.
Did some math for the V2. I want the output to be at a constant speed, which means the gears have to be noncircular. The output right now actually isn’t even sinusoidal, and Claude and I had to do tons of weird trig to find the angle as a function of time. After graphing everything on Desmos, I figured out the ideal shape of the gears. Next, I’ll do more mastersketching, and export the shapes from Desmos into Onshape. In the image, the black curve is the position as a function of time, and the blue and red curves are the ideal gear shapes. Actually, now that I think about it, this is wrong and I need to change the whole thing.
Continued sketching my V2. I spent most of my time visualizing the whole thing (I spent almost two hours sketching the thing out and doing the math). Here are some of the problems I ran into (and how I fixed them): I need the inputs on both sides to be powered, but I also want the output to be a pulley on the side (not in the center). This is impossible with a normal coaxial setup. Instead, I linked the first stage of gears (the one that has the ration changing mechanism) and will be changing up the linear motion mechanism. When connecting the first stage, it hit the output gear, so I had to change some of the geometry. As mentioned before, the radial force by the gear changing mechanism of V1 will probably cause the linear bearings to bind, so I’ll be changing this to a static linear-CAM type of motion for a constant force throughout the motion. Because I’m linking the first stage, everything will basically be inside a tube.
I did tons of brainstorming and came up with a better replacement for the meshing/unmeshing gears (I actually had 2.5 hours more recorded the night before but lapse ran into a problem so they aren’t counted for here). I realized I could keep the gears in contact the entire time, and instead use a perpendicular CAM (idk what it’s called, it’s basically a CAM that has its offsets parallel to its axis of rotation) to engage a dog clutch onto the gears. The dog clutch basically has 0 chance of bad alignment because the clutch will self align. This hopefully makes everything much more reliable and efficient. To power this, I need a third gear directly connected to the input gear that takes the linear CAM below the input shaft (you can’t run it coaxially). To make it fit, I changed up some of the gear ratios. I soon plan to switch from 1.25 mm to 1mm modulus.
Figured out perpendicular cam geometry. I was running into quite a few issues and managed to find a solution that fixed most of them. I pivoted from 6mm ID bearings to 32mm for the second stage of gears (the oscillating ones). I also realized that instead of moving the dog clutch directly, I have to mount another bearing around it with a 3d print mount. This not only allowed me to save tons of space, but now I only have to use one perpendicular cam because I can make the 3d prints 90 degrees offset, preserving phase. Here are some problems I ran into and how I tried fixing them: The 32mm bearings were hitting, so I changed up the main geometry and will be alternately adding flange space on each side of the main plate. There isn’t enough space for 2 flanges to be next to each other, but there’s enough space for 1 flange and a normal bearing to be next to each other (0.1mm of space). With my old design (screwing a sidways bearing directly on the dog clutch), I had to use two separate cams because the phase was not 90 degrees offset. However, with another bearing around the whole thing, I can change the angle to not be radial, making it exactly 90 degrees. Looks like V2 will take the shape of a pentagon, and will soon look like a hexagon once I add the linear motion for the gear shifting mechanism.
I’ve been procrastinating my devlogs, but I finished up basically all the parts and fixed a ton of problems. Now I can get started with the assembly. I’ve been procrastinating way too much with devlogging because every time I finish recording its late at night and I’m too lazy to devlog but here’s a summary: I tried implementing the linear cam (which is just a fancy name for a sliding ramp) but I quit halfway through because there was barely any space and I was too lazy to make it work. I then implemented my old idea (the linkage) but when you mirror it, it takes up 50mm which is huge. I then decided to go back to the linear cam. I added two ramps and two slots instead of just one so its more stable. I plan to add a screwed in 3d print plate underneath so it doesn’t bend. Now it only takes up like 35mm which is slightly better. I mirrored the gear and realized the plate that switches the gear ratio will be hitting the outer bearing of the dog clutch, so I spaced out the gears a bit more. I’ll probably be switching away from the outer gear on the dog clutch because it takes up tons of space. The parts are basically done, I just have to see how everything works in an assembly.
Finished around half of the assembly. I assembled some of the parts in onshape and realized there’s a few intersections and some of the spacings were off so I changed those. I didn’t run into much problems, but I had a few better ideas that I’ll try implementing in the future: It turns out I was being stupid and you need two separate dog clutches for each side. This might actually be better because since they just have to rotate differently but the spacing between them is constant, I can make that outer ring much thicker. This gives me space to bearing sandwich the cam instead of doing some other cooked stuff. However this also means you need two separate shafts which are cantilevered. I need to figure out a way to support the shafts from the inner end. While I was assembling, I realized I had done the linear cam (for the gear shifting) wrong because everything can be one part. This will make the entire thing thinner. I had a stroke of genius and realized that instead of using that fifth bottom gear which makes everything bigger and ugly, I can gear the perpendicular cam (for the dog clutches) to the gear shifting mechanism, making the entire gearbox so much cleaner. This is kinda cooked because it means the gears will be sliding on each other and because it relies on the tolerancing of 3d printed parts which I don’t trust too much. But if it means making the gearbox look much better, it may be worth it (aesthetics are the most important consideration when designing functional parts). I realized I could switch everything from mod 1.25mm to mod 1 or even mod 0.8 because there’s no more cooked gear meshing/unmeshing. However, it may be too late to do this for the V2, so I’ll probably save it for a V3. The gearbox is not only thinner than the V1, but is also much less cooked. And (probably best of all) the packaging will be really really clean. It does take up more space radially, but that can easily be fixed by switching from mod 1.25 to mod 0.8.
I added the dog clutches and realized there’s some big spacing issues. I mated the dog clutches and switched from a 19mm to 18mm length linear bearing. There’s some really bad spacing issues with the linear bearings: not only is it super long, but there also needs to be space between the two separate shafts so that the linear bearings don’t contact two at the same time. However, this distance can’t be too much or else the distance between the clutch and the gear in disengaged state will be too small. I spent some time searching for that balance only to realize that my linear bearing was contacting the flanged bearing, so I changed the lengths up but still no luck. I’m probably going to just make the whole thing a bit wider (because the angle for the linear motion is too steep right now anyway) which should make everything a lot easier.
Did tons of changes to the design and continued procrastinating my devlogs. I realized the whole dog clutch thing was too cooked with that little space because it means less space between the bearings for the perpendicular cam. It was also better to change the angle of the linear cam to 45 degrees, and doing so gave me more space. I finished up the dog clutch stuff. I also spent some time cadding the perpendicular cam, and I ended up spending a couple of hours learning surface modeling in Onshape (it was super hard to get it to work). I also put tons of time into thinking about a better way to power the cam: having a whole separate gear is messy, so I wanted to keep it coaxial on the output shaft, but it turns out there isn’t enough space. Hopefully I can switch to this in a V3. I’m also saving elliptical gears for a V3 cuz I have to get this done by outpost. I just need to do some final touches and a full assembly check before I can start building.
Huge lock in, finished up the linear CAM so it should work now, and started the worm gear for the gear shifter. I realized I was doing the linear CAM wrong, and it has to be mirrored instead of just a 180 degree turn, so I fixed that and made a new part for the other side. I also added the lead screw and bearing for the gear shifting. Turns out everything packages nicely (i love uxcell) so I don’t have to do cooked stuff. Just another day or two of CAD and I should be ready to build.
insane lock in, I finished the whole linear motion, and made tons of small changes. Here’s some of the bigger stuff I did: I was originally planning to use thrust bearings, but they were way too big. Instead, I just decided to use 3x6 bearings sideways (ball bearings are designed to handle radial load anyway). The packaging was cleaner than thrust bearings anyway. for the linear motion, I had to add more dowel pins - linear bearings to stop the thing from rotating with the lead screw. I ran into some really stupid onshape problems where everything was off by 0.088 degrees for some reason. I was messing with random parts and doing random mates for like 30 minutes until suddenly it worked. I have no clue how, but that doesn’t matter. The linear cams were hitting the 3mm dowel pins inside the gear so I cut out part of it. The linear cam seemed really weak, so I connected the bottom of the ramp to the main assembly. This was a huge pain because there’s barely any space, so tolerances had to be tight. Just one more day of cad and I will be done with it.
another great lock in, the cad is done (finally). V2 seems like it could work IRL so I’m gonna actually order parts and build it. Today, I split the gray gears (with the tube) into two parts so I can actually assembly it, added countersinks to parts that need it, and fixed up some tolerances. I don’t have too many new ideas for the V3, but hopefully after I build/test V2 I can notice some key problems. Here’s the general gist of I’m aiming to accomplish: Obviously, I need to actually lock in with elliptical gears for the V3. This is the biggest problem with the V2. Because of the sinusoidal motion, the output gear isn’t constant speed (it oscillates slightly too). The whole extra gear for the CAM is super annoying, so I’m gonna keep it coaxial to the input/output shaft (running three things coaxial) and gear it from the tubes instead of a separate thing. I need a huge geometry change for this which is why I’m saving it for a V3. I want to figure out a better way to do the dog clutch system. I’m hoping there’s a smarter way which doesn’t rely on meshing/unmeshing but so far I couldn’t think of anything. I’m really happy with where this has come, and I can’t wait to start assembling this. For those who want to take a closer look, here is the link to the cad: https://cad.onshape.com/documents/c369754a085e1b437744081a/w/8784f23027b47ba880d55ef1/e/7f96dc46c879863ea30c1be9?renderMode=0&uiState=6a3f9f14c9069ebe4a356101
I ordered all the parts and set stuff to print to test the tolerances and I ran into some pretty annoying issues. Here’s some of the issues I ran into: There was only 4 packs of 2 3x6 linear bearings in stock so I had to redesign the lead screw gear shifter to use 6x12 ones. 32x39 bearings are literally 12 bucks per and there’s only one singular vendor for it so I switched to 30x37 bearings which are way cheaper. In doing so I ran into really sketchy wall thicknesses. The slots for the 28mm dowel pins were way too close to the walls of the gear, so I had to change up some of the geometry so it doesn’t just print as a half circle. I spent a good amount of time tuning the tolerances so that the bearings would actually pressfit and not slide off easily. Same thing with the dowel pins. The biggest problem I ran into was that apparently you CAN rotate linear bearings around a shaft very smoothly. Every google search made it seems like I would break my wrist and explode trying to rotate a linear bearing, and it was pretty shocking to see it spinning smoother than a fidget spinner. This completely cooks my entire design and I still can’t figure out a good solution the second biggest problems was that, when switching from 32 to 30mm bearings, I forgot to change the dowel pin size so now they don’t fit in the bearings. I might just end up 3d printing pins if they’re too expensive/take too long to ship. a lot of the parts were really hard to 3d print so I split them into multiple to screw in. Apparently the maximum devlog time limit is 10 hrs. I had 22 hrs logged because I wanted to have some aura post with 40 hrs where the entire thing was built, but I ended up losing 12 hrs instead.
I finished printing all the parts and tuned all of the tolerances. I ran into far too many printing issues (I probably wasted as much filament as will be used in the project), especially with bed adhesion. It was to the point where even a 10mm brim with 0 brim-object gap and increasing the bed temp by 5 degrees and washing the bed couldn’t stop warping. But at the end of the day I thugged through and got all my parts. I also ran into some cooked tolerancing with the bearings and even the screw holes for some reason. But all of that is behind me now cuz I can finally start building.
I haven’t devlogged in a while cuz I was busy with outpost/opensauce, but I almost finished the build. I had terrible printing problems (my parts were warping all over the place) and I basically had to print/build the entire thing in 2 nights. As a result i have rlly bad friction on the gear shifting mechanism. After talking to some people at outpost and opensauce, I believe it is possible replace the clutch with a system of one way bearings, so I will spend most of my time brainstorming solutions for a v3 or v4.
Did tons of math and tons of brainstorming. The math is absolute hell and annoying but desmos is carrying. I got a shape for the non-circular gears for now (they can’t be called elliptical), see the first image. The sharp angles might be a problem with the gears depending on how many teeth are on them, so I may have to change a fully flat output to something very slightly oscillating. I spent a good amount of time thinking about how to eliminate the clutch. I am no longer as confident about there being a solution as right after opensauce, but I may be onto something. I came up with a mechanical “absolute value” system which takes an input and basically gives the absolute value of it. The input will be both geared and belted to an output shaft, and the recieving gear and pulley will have a one way bearing on them. Since the direction of each recieving thing is opposite to eachother (the gear changes direction while pulley keeps it the same), one bearing will always be ratcheting while the other is transmitting torque. Therefore, regardless of how you spin the input, the output always spins in the same direction. Also, after doing the math, it turns out that the output osciallting speeds isn’t symettric in both directions: it’s actually faster when spinning one way than the other. This is really good because it gives me a way to differentiate between the two directions. I sitll haven’t figured this out yet but I think I’m in the right direction. Overall, the math is complete hell and I’m not too sure whether it’s even possible to eliminate the clutch entirely and shift to a system of one-way bearings. However, I do feel like I’m somewhat onto something.
Look who’s back. Back again. I was banned from using my personal computer because my parents saw that I was cadding instead of studying for sat, but I just took it and I can finally cad now. I feel like I’m close to finding a way to eliminate the clutch but I can’t figure out how to yet. Therefore I decided to save it for a v4 and focus on other stuff for a v3. Here’s some stuff I did today: I sketched out what the v3 will look like. Instead of a pentagon it’ll look more like a trapezoid because I don’t need the 3rd gear anymore. I’m still not sure if it’s possible to gear the gear selector 1:1 with the outside gears because it has to be bigger than the tube. After building my v2, I realized my gearshifting mechanism was completely cooked. It jammed a ton because there was nothing stopping the ring from angling and binding with the tube. Adding fuel to the fire was the fact that the worm gear mech only pushed it from one side making it impossible to stop the ring from angling. I wanted to add support rods for my v2 but it was impossible because the gears were way too close, but now it’s possible because of the new spacing. Also, the worm gear is effectively moved downward, more in line with the centers of the rings, which lets me wrap it around the ring and make bending less easy. I still haven’t decided if I want to stick with ramps or switch to something else. I switched everything to 1mm mod gears, but I realized spacing was way too cooked because there’s PROBABLY no space for the cutout for the ramps (or whatever I choose to use, it’s just that I have no space for 2 linear bearings in a row). I still haven’t figured out the cutout dimension fully, but there’s a good chance that I’ll end up switching back to 1.25mm mod. Also, 1mm mod means I need to buy new bearings and stuff which are expensive and cut away money from my stardust payout (which I wanna maximize because I NEED THAT MACBOOK so I can cad during school).
Finalized the sketching and starting making some parts. Here’s some stuff I did: I realized mod 1mm is way too small and I want the macbook more than a smaller cvt, so I’ll be sticking with mod 1.25mm. I basically went through like 35 features and redo them because of the new dimensions. I have yet to go through 210 more and add more features on top of that. Since I’m keeping the gears as mod 1.25mm, I increased the radius of the gear shifting from 9mm to 11mm (like it was originally). Based on how the built model performed, I redid a lot of the tolerances. I also needed to cad a new base plate because of the new shape. the gears were hitting so I changed the output and dog-clutch gear sizes. Now that I’m devlogging, I realize that I seriously need to lock in on the constant-speed gears. I’ll be spending lots of time tomorrow working on that.
Did more cad, especially working on the gear shifter mechanism. I was having lapse and hackatime issues so I couldn’t really record much or post a devlog. Here’s what I worked on and some problems I ran into: chromebooks are slow as hell and are literally impossible to cad on (hence i need the macbook). This means the only time I can cad really productivley is at home which is annoying because I don’t do anything at school. For the gearshifter to work, it needs to be geared 1:1 with the tubes. This is a huge problem geometrically because it hits the blue piece. In fact, it goes into the bearing hole for the blue piece which means I can’t just cope and be lazy by making the piece thin. The closer I move the output gears to the dog clutch gears, the closer the blue piece moves to the center gear which cancels out making the 1:1 gears smaller. I have to figure out a solution soon. I swtched from the cam being sandwiched between bearings to the bearings being sandwiched between the cam because it gives space for the gears to be on the outisde. I’m pretty sure this is also better force wise because instead of pulling out each bearings individually when it moves side to side, the bearings are in contact so you effectively have to pull out both bearings at the same time. Also the lever arm for the center version looks smaller than the version with the separate gear just for the shifting which means less friction. I had to tweak the ratios and spacing a bit because the blue piece barely has space. Even now, it’s way too thin (1mm) which I don’t like. No, I haven’t forgotten the mythical one-way-bearing based concept, I’m still thinking about it. I have a vague idea of what it should kind of look like (somehow have two sets, both of them mirrored, each of them ratcheting the other way). I’m pretty sure there’s a solution but I’m not smart enough to figure it out.
Did tons of cad, semi finished the parts (still need to fix some stuff) and started an assembly. Here’s some stuff I did/problems I ran into: I cadded the new lead screw mounts for the gearshifter. I lowk dont have any clue what I’ll do about it hitting the 1:1 gears. Hopefully there’s some geometry fixes I can make. The bottom moving piece (that moves back and forth following the cam) is oversized and will hit the ring for the ramp. I will change it tmmrw. I realized a lot of my new parts are gonna be really hard to print so I split them. I started the assembly. I finished the basic side (most of the rest should just be mirorred). I have to figure out a better way to transfer torque while also spinning (remember the linear bearings spinning smooth). The current method just has something sliding on a shaft which is high friction. There are actual linear bearings that prevent rotation, but they are crazy expensive and barely produced anymore. I’ve also been thinking more about the one-way bearing based solution. I realize that maybe the key is just to mirror the whole gearbox and change the direction that it’s clutched in.
More cad. I assembled the lead screw and gear shifter. Here’s some stuff I did: After building my v2, I realized the ring is super unstable and can easily tilt, causing the whole thing to jam. This is especially true because its only being pushed at one point (the contact of the bearing). Therefore, I added some holes for rails so it can slide along the holes. However the rails need mounts which take up space, taking away space for the gear, so I might switch the rails to something else. The rails made the ring bigger so it started hitting the blue piece again, so i changed the position of the standoff to create more distance. I assembled the center shaft, which includes the output gears and the perpendicular cam. I had to change up some of the dimensions because it wasn’t fitting. I also removed the from the part because it would make it hard to print, and instead used a separate spacer. I’m starting to become pretty unproductive at cad because almost 40-50% of the time spent is just thinking about how I can design it rather than actually designing it. I also spent some time thinking about the one-way bearing solution. I finally got my hands on them so I’ll be trying stuff out instead of just trying to visualize them.
Made the 1:1 gears to power the cam and made a new rail system for the ring. Today was really productive, here’s what I did: initially, I messed with a lot of the dimensioning and spacing with the rails on the outside. I realized there’s no way it was gonna work, and even if it could, it would take up tons of space. I needed a better solution. Having the rails on the outside makes everything really big which doesn’t fit. I figured out a way to add a rail inside the tube. Instead of the ring being constrained to a rail, the inside thick square piece is constrained to a rail. This leaves tons of space on the outside for gears (almost 6mm of space on each side). I finally added the gears. I had 6mm of space which is more than enough. However, the gears hit the bearings that track the ring, so I’ll probably end up making the ring bigger either way. Another terrible thing is that the gears hit the blue piece. It actually goes far enough to cut into the bearing. Either I shift into smaller bearings, or I change the spacing between the gears. I still have to decide which on to do. I don’t think I’ll be building this version in hopes of coming up with a way to use one-way bearings.
I mirrored the whole thing, and the V3 looks complete but there’s some fundamental flaws. I also thopught a lot about the 1way bearing based solution. Here’s what I did: Mirrored the whole thing onto the other side. I didn’t run into any spacing issues which means I’m good at mastersketching. Currently, the 1:1 gears are hitting the big bearing that the dog clutch is in. I dont’ know how to fix this because it means I’ll have to change the gear ratios. I spent a lot of time thinking about the 1way cvt that doesn’t use clutching. I realized that I could put the input gear on a 1way bearing and somehow run different sets of gears based on the direction. However, everything is inevitably linked to the same output which jams everything. Also, the arm system is inherently not backdrivable which is makes the input on a 1way bearing solution not work. I’m gonna have to think more about a better solution. I need to do some finishing touches to the V3, but I’ll spend more of my time thinking about the 1way bearing cvt.
Finished most of the cad, just need to clean up tolerances and split a few parts. Here’s what I did: I made the rings for the gearshifter bigger because the gear shifter mount on the lead screw was hitting the center 1:1 gears. This caused lots of issues with sketches breaking so I had to redo those. I had to change the gearing for the last stage. The 1:1 gears were hitting the bearings so the only solution is to move the bearings further from the center, hence change the gear ratio. This also caused tons of problems and I had to redo a lot of the parts again, especially the gear shifter mount that mounts onto the lead screw. I added cutouts onto the blue part (it’s gray now, but the one that houses the bearing that the dog clutch goes on. The blue parts used to be hitting the 1:1 gears but now it clears by like 0.5 mm. I’m still deciding whether I want to assemble this or not. I can’t figure out the 1way bearing based thing, and I’m starting to feel like it’s fundamentally impossible.
Cleaned up a lot of the stuff hitting and a lot of the tolerances too. I also had to do some cooked surface modeling with onshape (I have never surface modeled before). Here’s what I did: The blue pieces were also hitting at the bottom, so I had to make the material even thinner than it was (really cooked, near 1.5mm thickness and barely clearing eachother). The standoff placements really cook everything so I’ll probably just extend the plate and move the standoffs further from the gears. However it will be uglier, and I would rather have a good looking cvt that doesn’t work than a ugly cvt that works. I had to do some really cooked stuff with surface modeling. Basically, the wrap feature wasn’t working. I spent like an hour or two trying to learn surface modeling, but nothing was working because the shape was weird, so I ended up just doing 8 separate revolutes, boolean, and then some move faces. Also, the bumps can’t be radial because the bearing isn’t radial (it faces horizontal, so the edge closer to the center moves up first which causes the whole thing to jam). To fix that I had to do even more cooked remove revolutes, then bridge curving and then knitting (I had never used these before) and fileting. I need to figure out a clearer way to do it because it’s getting on my nerves. I went through the latest V3 and compared around half of the holes to the V2 (it turns out there’s like 3 holes per part and theres like 100 holes to go through, not including clearances). The clearances also cooked some of the spacing so I went and fixed that. I’ve been spending some time thinking about the 1way bearing solution, and I completely switched up and now think it’s impossible.
Finished tolerancing the holes, and I added the pulley to the input gear. I also changed the large bearing mount for the gear shifter and also redid the lead screw mount because stuff was hitting. Here’s what I did: I went through like 70 holes, compared it to the toleranced version that was assembled. Lots of problems happened when I had to oversize the holes. For example, the linear bearing holes on the gear shifter mount had to be oversized, which made the thickness of the wall like 0.8mm thick. I then had to go into my mastersketch and change up the dimensions which took a stupidly long time. Regeneration times are hitting near 2 minutes (300 features isn’t good, plus tons of dependencies, and so many dimensions that it takes up the entire sketch). I added the pulley to the input gear. I had to switch to a different featurescript because the one I was using didn’t have GT2. After that it was pretty easy, just had to cad the walls, chamfer a bit and boolean and bore it. The most annoying part was that the copper lead screw nut (on the mount) was hitting the 1:1 gears completely ruining the whole thing. I basically had to redo the shaping of the lead screw mount. I moved the copper part further up the part, keeping the standoffs at basically the same level. As a result, I had more space at the bottom for two screws instead of 1. Also, now all the constraints are fully dependent on the external parts, so there’s no random dimensions I did just to make stuff look good, which is good because it means if I change the gearing or something in the mastersketch, the mount should update accordingly. This also took a pretty long time and 2 min regeneration doesn’t help....
|
1792716612.7587106
|
1793321412.7587106
|