|
19164
|
BadGPT by @28taidan | Stardance
|
28taidan
|
1
|
121.0
|
1974
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T22:47:09Z", "hours": 121.0, "multiplier": 16.85, "payout": 1974, "blessing": "neutral", "text": "badGPT is a conglomeration of sequential ML projects I did this summer, culminating in a chatbot like ChatGPT or Claude built from scratch using just python and numpy. I started off by building a name generation model, then a Shakespeare writing model, then finally a chatGPT-esque model. The model produces, for the most part, complete gibberish, so this was less a practical project and more an exercise in understanding how everything works. It performs so poorly because it’s so small. Models need a lot of parameters to be able to capture all the nuances required to produce coherent text, which makes the models much slower to train. The final model I made includes around 120,000 parameters, 4 transformer blocks of 4 attention heads each, and 64 tokens of context. It’s based largely on GPT-2, which for reference had about 1.5 billion parameters. Current frontier models, like Anthropic’s fable, have trillions of parameters and can have millions of input tokens, so it makes sense that my model is too small to make much sense at all. Even at its small size, it took my laptop more than 20 hours to train, so scaling up with my current hardware is not feasible. Many people like using libraries like pytorch and tensorflow, which include classes that handle backpropagation (the system that’s at the heart of letting the models learn), but I wanted to start from scratch so I wrote my own. If you wish to try any of my models out, you can visit the demo website (click try project), and click through the tabs to see each of the models. It all runs in your browser. You can also look through the Jupyter notebooks in the Github repository to get a sense of how everything works.", "repo": "https://github.com/Luchik28/BadGPT", "demo": "https://luchik28.github.io/BadGPT/"}]...
|
[{"post_id": 63888, "ts": "202 [{"post_id": 63888, "ts": "2026-09-07T22:03:29Z", "hours": 0.3219, "text": "Fixed up the readme a bit in preparation to ship. Specifically, I added info on what all the files do, but I named them poorly and then forgot what most of them do so it’s kind of confusing."}, {"post_id": 63871, "ts": "2026-09-07T21:24:10Z", "hours": 3.705, "text": "Trained the model a little more, exported it, wrote some UI to make it look more like a chatbot. It still sounds like gibberish. Sometimes I imagine that it’s output changes slightly depending on the context (for example, more numbers if I ask it a number related question, and a list if I ask it for a list, etc), but I’m probably just imagining it, it’s really just gibberish. Still kinda cool tho. You can check out the demo at https://luchik28.github.io/BadGPT/ ."}, {"post_id": 63606, "ts": "2026-09-07T15:13:11Z", "hours": 10.0569, "text": "Added an EOS ID, which is a special token that the model can output to indicate that it’s done. I built a script to insert this in between passages in the training data, so it can learn when it should shut up (otherwise it will yap forever, until it hits the max number of output tokens). This meant I had to retrain the entire model, but got it down to a loss of around 3.46. Obviously, it’s not very good. But I’m pretty sure the only way to improve is to scale up the model size and training time, something I don’t really have the capacity to do (this model trained for 15 hours on my laptop). I will probably continue by adding this model to my demo website, and build a chatGPT like UI, just for fun. After that, I think it might be time to ship!"}, {"post_id": 63248, "ts": "2026-09-06T23:29:21Z", "hours": 8.4769, "text": "Switched to using the fineweb edu dataset, instead of shakespear. This is the dataset I will use to train my actual model on. It’s a highly currated database of the internet, and is similar to what GPT2 was trained on (although the actual db they trained it on is closed source). I also reformated the sampling system so you can put in a query and get a response, as long as the query takes up less tokens than the context. Other than swapping out the training file, it’s the exact same. Next, I will probably implement a special ending token to my tokenizer, and also increase the scale of my model a little bit. I can’t increase it all the way to what Karpathy does in his tutorial (he uses cloud computing, so he paid to rent out like 8 64GB GPUs, or something like that), since I don’t want to spend money training it. However I think I can squeeze a little more out of my laptop."}, {"post_id": 49298, "ts": "2026-08-18T01:13:10Z", "hours": 9.3886, "text": "Started working on a more advanced tokenizer. The tokenizer is what splits the input text from words into numbers, and back again. Before, I was using a 10 dimensional embedding, where each letter is represented by a 10 long array (each value representing a dimension). But current models have much more advanced tokenizers, which often encompass entire words, or parts of words for longer words. This works using Byte Pair Encoding, which turns all of the letters pairs of letters into their utf encodings (usually 8), then iteratively merging the most common consecutive pairs into tokens to add to the vocabulary. You can see how tokenizers work at https://tiktokenizer.vercel.app/ , which is a cool website that lets you play around with stuff like that."}, {"post_id": 42029, "ts": "2026-08-06T16:03:32Z", "hours": 1.1833, "text": "Updated the demo website to include the wavenet model, and the new self-attention shakespear model. You can check it out here ."}, {"post_id": 41371, "ts": "2026-08-05T15:22:03Z", "hours": 1.2797, "text": "I finished training it! It finished with a val loss of around 1.76, it got down to 1.73 but ticked up at the end. The output is pretty good, but not substantially better than the wavenet model. However, it’s vaguely word-like, and took 20 hours to train so I’m not sure how much larger I can make the model before my laptop implodes. Next I will probably try to find a question-answer training dataset, so that I can start training it to answer questions. This step that I’ve been working on is the pre-training step, where I teach the model to basically spit out documents. Next, I have to have it spit out documents that happen to be question-answer documents."}, {"post_id": 41078, "ts": "2026-08-05T01:14:23Z", "hours": 9.7053, "text": "I made a bunch of tiny improvements. I didn’t change the architecture at all, but I did change the optimizer to AdamW. The optimizer is what controls how much each parameter is changed each epoch. Before, I was using a set learning rate, of about .1 for the first 80% of training then decreasing to .01 for the last 20%. Decreasing it at the end is important because as the loss settles into a local minimum, it might not be able to go to the lowest point because it keeps overshooting it since the lr is too high. Conversely, we can’t keep the lr too small the whole time because it might settle into a very tiny local minima that it might have been able to go over with a higher learning rate. It would also take forever. AdamW helps improve the optimizing step by changing the learning rate per parameter, helping the model train as fast as possible without overfitting. Overfitting isn’t really an issue I’m worrying about since my model is pretty small (around 56k params), so it’s not really large enough to learn the ins and outs of my dataset. Anyway I also changed the logging step, so it now logs validation dataset loss in addition to the training dataset loss. I split the dataset into train and validation so I can make sure it’s not overfitting. Currently the val loss is at 1.76, which is a lot better than where we were at before, which makes me hopeful. Training has around another 7,000 epochs to go, but Stardance is yelling at me I should write another devlog now so here you go, Stardance. I’m looking forward to sampling the model and seeing how much it’s improved!"}, {"post_id": 38899, "ts": "2026-08-01T14:11:19Z", "hours": 8.9297, "text": "I implemented self attention! I will try to explain here, but will do a terrible job: basically, what that is, is it lets the model decide what tokens in the input are more important than the others. The first thing I did was scrap the wavenet model, and switched to a simple bigram model. The second thing I implemented was bag of words, which edits the input tokens so every element is the average of that element and all that came before it. This lets all of the tokens “talk” to eachother. This is all fine and dandy but since all the things are averaged then you don’t know where things came from, and positional data is lost, so we lose a lot of resolution and data, so that sucks. So we have to encode positional data. So instead of just averaging all the elements that came before, we expand each averaged element into a list, which has all the elements in a row instead of averaging them into one number. So the first row could be [1, 0, 0] and the second [1, 2, 0] and the third [1, 2, 3], etc. We do this by masking it with the tril function, from numpy (very cool). But this is problematic, because all of the elements are given the exact same weight. A letter 34 characters back gets the same weight as the last character in the input (which is the letter immediately preceding the predicted letter, the output). To fix this, we add self attention! This is modeled after the groundbreaking paper Attention is All You Need, which started the whole AI hype thing. How it works is each token has a linear layer (that multiplies it by learned weights) called the key, and another called the query. The query is kind of like what that token is looking for, and the key is kind of like what that token has. And these can be multiplied with the keys and queries of all the other tokens, and that lets you know which token has the stuff that the most other tokens are looking for, and is thus more important and can be given more weight. That is a single head of attention, there are multiple heads that can specialize in different things. This, in theory, should increase performance. But it also drastically increases the amount of time it takes to train. The model only has ~56k parameters, which is less than half of the wavenet model, but takes a lot more time to do it’s thing. This is the output from the results of more than 13 hours of training. As you can see from the loss function, the loss was decreasing at a steady rate, so more training could probably improve it. Plus, this was at a highish learning rate the whole time (.1) so decreasing it would probably further improve it. But I can’t do anything on my computer while this is training or it runs out of RAM, and I have to use my computer now, so I will be moving on for now."}, {"post_id": 34926, "ts": "2026-07-26T01:22:29Z", "hours": 6.5472, "text": "I increased the block size from 8 characters to 64. This means that instead of the model taking in the previous 8 characters and outputting the next one, it takes in the previous 64 characters and outputs the next. This means that it should be able to keep track of longer words so it doesn’t get lost in them. However, it doesn’t seem to be improving the model too much, although that might be because I haven’t trained it as much as the others. I’ve done roughly 200,000 epochs, which took a long time, since this model is much larger (110,415 parameters vs 45,000), and has 6 hidden layers as apposed to 2, which means it is a lot slower. As you can see in the loss graph, it probably could make further gains, although it seems to be mostly good."}, {"post_id": 33555, "ts": "2026-07-23T16:18:09Z", "hours": 1.5631, "text": "Trained the wavenet architecture on a file with just shakespear in it. It’s got the structure down well, and sometimes can do words and wordlike outputs, but generally spouts straight gibberish. I will try to follow a lecture to build a better Tokenizer and Transformer next time. Right now each character is treated as a token, and embedded into 10 dimensions, it would be better if pairs of characters were treated as tokens and embedded. Increasing the context size could also help, it’s currently an input of the previous 8 characters and outputting 1. This is it’s output:"}, {"post_id": 32988, "ts": "2026-07-22T14:44:00Z", "hours": 8.5858, "text": "Implemented the wavenet architecture. Usually, during the flattening phase, the tensor goes from the shape (batch num, block size, embedding dimensions) to (batch num, block size * embedding dimensions). This squishes all of the embedded characters into one dimension. Wavenet does that more gradually, it slowly merges the different letters. So the first two letter embeddings get squished into one, then the next two, etc, and in the next layer then you have the first 4, then the next four, until by the final layer you have just one group of all the letters, which is the same as the original method, just a much more gradual approach. The first image is the training loss, the huge cliff is when the learning rate decreased. The second image is a visualization of the wavenet architecture from the paper. You can see that in each layer, nearby groups of input get merged together. In the original method, the graph would look like all of the inputs going to the 1st dot in the hidden layer, then continuing up. Next I will be actually building a GPT instead of this names project."}, {"post_id": 32125, "ts": "2026-07-21T02:19:34Z", "hours": 6.8089, "text": "I did a bunch of things to prep for implementing a wavenet architecture, which basically changes the model so instead of taking in all the characters of input at once and squishing them all into the first layer, it gradually puts them in at each separate layer. First, I put more stuff in classes! This didn’t really change the functionality, but instead of embedding the characters and flattening the model in separate chunks, I put them in their own classes so they can get put in the list of layers, and we can just run the input through each layer in the list, and compare it with the target at the end, instead of having half the layers in the list and half as separate chunks, which is a lot smoother. So the entire model is just: model = Sequential ([ Embedding ( vocab_size , n_embd ), FlattenConsecutive ( 2 ), Linear ( n_embd * 2 , n_hidden , bias = False ), BatchNorm1D ( n_hidden ), Tanh (), FlattenConsecutive ( 2 ), Linear ( n_hidden * 2 , n_hidden , bias = False ), BatchNorm1D ( n_hidden ), Tanh (), FlattenConsecutive ( 2 ), Linear ( n_hidden * 2 , n_hidden , bias = False ), BatchNorm1D ( n_hidden ), Tanh (), Linear ( n_hidden , vocab_size ), ]) Which I think is really cool. I also improved the loss graph, previously it looked like the screenshot on the right, because each iteration’s loss is graphed. Because our batch size is 32, which means in each iteration we look at just 32 inputs/output, a good deal of what the loss will be depends on how lucky we are with the input/output. Over a great number of iterations, it averages out into the correct value, though, so to fix the graph, we instead plot the average of every 1000 iterations, which lets us see a lot more detail that otherwise would be lost in the noise (the two loss graphs I added are not of the same model, but you get the idea). Anyway now I’m going to actually implement the wavenet architecture!"}, {"post_id": 29913, "ts": "2026-07-17T02:41:08Z", "hours": 3.23, "text": "I followed Karpathy’s lecture on backpropagation, where he implemented backpropagation manually. In the series, he’s using Pytorch, which does it for you, which is why he’s doing it manually. I’m not using Pytorch, so the only way to do it is to do it manually, so I didn’t get to add too much to the code, I just verified that I had implemented it correctly and learned a bunch. It is still pretty confusing though, and I couldn’t solve any of the exercises in the lecture without watching his explanations. Anyway here’s a name it generated that I think is pretty cool."}, {"post_id": 29276, "ts": "2026-07-16T02:51:51Z", "hours": 0.7719, "text": "Added a demo page! You can check it out here: https://luchik28.github.io/BadGPT/ . I saved the model weights, built a script that reconstructs the model using those weights, and hosted it using github pages."}, {"post_id": 29257, "ts": "2026-07-16T01:45:50Z", "hours": 3.1169, "text": "Put my model into the Layer class, so I can easily create lots of layers. The graph shows the activation distribution by layer. Each layer is pretty similar, as you can see. This devlog marks the end of the fourth lecture in Andrej Karpathy’s makemore series, out of 7, so we’re getting there! That’s just under 8 hours or lecture watched (so I spend roughly 5 minutes coding for every minute of lecture watched). Pretty interesting."}, {"post_id": 25900, "ts": "2026-07-10T12:09:18Z", "hours": 13.8508, "text": "I was playing around with how changing the number of epochs/other variable affected the output, and seeing how that differed to before I implemented Batch normalization, and so tried to put the epochs up a lot. I ended up training it for 20,000,000 epochs, which took like 8 hours, which is why this devlog has so much time logged. It didn’t really improve it much, you can see by the loss graph it didn’t go down very much at all, so I’ll need to change something in how the code works. It was still fun though."}, {"post_id": 24311, "ts": "2026-07-07T20:05:56Z", "hours": 2.4747, "text": "I worked on switching to a Jupyter notebook instead of just a python file, this made it easier since I didn’t have to constantly retrain the model, and also could print out stuff in line. I also added batch normalization, which helps change the range (really the standard deviation) of the values before going into the activation function (tanh) so that the values are more spread out. tanh squishes all values between -1 and 1, so if all of the numbers are greater than 1 or less than -1, then all of the values will essentially be squished to either -1 or 1, which makes the model lose a lot of the data. But if you divide all the numbers so that they are all closer to 0, then the activation function is a lot more spread out and the data is preserved. (I got the photo from google, I think it’s helpful when visualizing it)."}, {"post_id": 20360, "ts": "2026-07-01T22:48:01Z", "hours": 1.0503, "text": "I made a bunch of little improvements, including increasing the character encodings to 10 dimensions up from 2, increasing the epochs to 200,000, and also decreasing the learning rate from .1 to .01 for the laster 50,000 epochs. Although the loss is significantly lower than Andrej Karpathy’s makemore (which I modeled my model after), it’s names are worse. Karpathy got 2.17 ish on the testing dataset, while I got 1.776. However, Karpathy’s generated slightly abnormal but reasonably word-like names, like “jeron” and “ham” while mine where a little more random (“xxxhorlis” is one of them). I’m not sure how to improve from here, I don’t think increasing the epochs will do much, it already took around 10 minutes to train this model, I think we’ll get diminishing returns. I will, as always, continue on to the next video in Karpathy’s series, hoping that his tips will help improve it."}, {"post_id": 17855, "ts": "2026-06-28T19:57:08Z", "hours": 2.8889, "text": "I tuned the learning rate (The magnitude of how much it changes the weights, which is multiplied by the gradient of each weight to get the final change), added better printouts when training (Added a neat progress bar/tracking, output the loss, and a timer), and also using plotmatlib to plot the embeddings. The graph is how the model arranged each letter in space. What’s interesting is similar letters (like the ending character “.” and “e”, which both are commonly found near the end of the word) are in similar spots, so the model has sorted out some sort of meaning from their placements, which I think is pretty cool. The names are still quite nonsensicle, I think I might have to enlarge the model a little bit to improve performance, which means waiting longer for it to train :("}, {"post_id": 15817, "ts": "2026-06-25T18:20:16Z", "hours": 5.8631, "text": "I improved my model based off of Kerpathy’s makeMore part two tutorial and a 2003 paper by bengio et al (link is https://jmlr.org/papers/volume3/tmp/bengio03a.pdf ), it was really interesting. I increased the input size, so it takes in the previous 3 letters as an input instead of 1, and encoded each letter in a two dimensions instead of one hot encoding. I also had to start using numPy due to needing to do efficient matrix multiplication (numPy does it in C in a heavily optimized fashion, I considered trying to do this but decided it was out of the scope of the project). Doing it in just python would be way too slow. I also optimized it a little bit, having it select 32 examples randomly from the data set for each epoch, instead of just using the whole thing, which made it a lot faster while still training over the whole set. Hopefully this will make it produce more accurate results!"}, {"post_id": 12206, "ts": "2026-06-19T22:30:34Z", "hours": 1.1233, "text": "I finally got it to generate some names! They are sampled below. I watched the first half of Andrej Karpathy’s makemore video, and built a 2D array of the number of each instance of a letter following another instance. Then, when generating the name, it takes an array of the number of times in the training set each letter followed the previous letter in the name, multiplies that number by a random number 0 to 1, and chooses the highest number as the next letter in the name. This doesn’t work too well, as shown below, so I will spend some time improving, but it’s a start! Some names it generated are sampled below."}, {"post_id": 11053, "ts": "2026-06-18T02:41:06Z", "hours": 5.3719, "text": "Having completed the MLP I described in my last devlog, I set out to try to follow the next tutorial in the list I found. However, after I listened to the description of it, which is basically just a model that can take in a database of words and produce more words that sound similar, I foolishly believed I could try to build something similar without following the tutorial. I did take the database of names from the tutorial, since I will need those to train the model. I started by transforming the inputs (the previous letter in the word) into numbers, and then the output (a number) back into a letter. My first attempt just put in the ASCII code for the letter, and the rounded down output number. The first issue was I used the entire database to train, which took forever and quickly hit the maximum recursion depth, so I switched to using only the first 500 examples (using the entire database, combined with super high differences between the output and the expected output resulted in the initial loss being 1,934,198,245, compared to a loss of like 4 when just testing my MLP). After that, I got it to actually finish training without crashing, however, the loss didn’t go down, and it always outputted a null character. I realized I had been really stupid, as the tanh function at the end of every neuron in the MLP shrinks the result between -1 and 1, so the result could only ever be the ASCII codes 0 or 1, which are null. So instead, I changed it so instead of outputting the ASCII code directly, it outputs a 27 long array, each index representing a letter (and the last representing end of name), each value at an index represents the probability of that letter being chosen, so to decode the results it just has to find the highest probability, check that it’s not the last element, and add 97 to it’s index to get the ASCII codes (because the letter “a” is at 97, so if it’s index 0 and meant to be “a” it has to adjust). This led it to actually output letters, but it always outputted the same letter, as shown in the screenshot. The loss dropped rapidly and then plateaued at around 2000. I found some bugs (gradient accumilating over time instead of resetting each epoch) and made some changes (instead of inputting an ASCII code, it inputs in the same format as the output), but nothing had any effect. After thinking, I realized that the model is just picking the most common letter, and always outputting it. That’s why the loss can’t get any lower than 2000, because that’s the limit of how good this strategy can get. However, I have no idea how to fix this issue, and somehow teach the model the meaning behind the letters, so I will accept defeat and watch the tutorial, then implement what I learned."}, {"post_id": 9520, "ts": "2026-06-15T21:49:01Z", "hours": 4.8256, "text": "I implemented an MLP, I watched the entire Micrograd explanation by Andrej Karpathy, which was really interesting. I followed along, and played around with tuning my model (that does absolutely nothing useful) to predict stuff better. It has Value objects, which store the data, as well as gradients, and the operation/previous numbers used to create them, as well as all the operations. This can be used to calculate the gradient (or how much each Value object affected the last Value in the chain of operations), which is basically all you need for backpropogation (which is where it goes back and calculates how much each weight/bias affects the final output). It also has classes for each neuron, which is a collection of Values that act as the inputs, the weights (which are randomly generated at the start), and the bias for that nueron. These neurons make up layers, and the layers make up the MLP (multilayer perceptron). I created a couple arrays of inputs, and the desired output, which has the output for each input array. To train it, you have the model predict something, then calculate the loss (or the sum of how far away each prediction was squared), then do the backpropogation (go through each parameter, or each weight and bias), find out how much and in what direction it affected the loss function, and finally change each parameter slightly so it moves the loss in the right direction. As you can see in the screenshot, I got it down pretty low. This will be useful because when I am training my LLM, I will need to use a neural network like this, and get the loss down as low as possible so it predicts better words and produces better results. Karpathy’s video is at https://www.youtube.com/watch?v=VMj-3S1tku0&list=PLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ&index=2 , it’s really quite amazing, I learned so much from it, and I haven’t even learned Calculus yet, which he states is a prerequisite in the description, I highly recommend if you’re interested. Next I will need to work on implementing transformers (which takes in the input (words), and derives meaning from them by encoding them into a vector)."}]...
|
Title: BadGPT by @28taidan | Stardance
Devlogs:
I Title: BadGPT by @28taidan | Stardance
Devlogs:
I implemented an MLP, I watched the entire Micrograd explanation by Andrej Karpathy, which was really interesting. I followed along, and played around with tuning my model (that does absolutely nothing useful) to predict stuff better. It has Value objects, which store the data, as well as gradients, and the operation/previous numbers used to create them, as well as all the operations. This can be used to calculate the gradient (or how much each Value object affected the last Value in the chain of operations), which is basically all you need for backpropogation (which is where it goes back and calculates how much each weight/bias affects the final output). It also has classes for each neuron, which is a collection of Values that act as the inputs, the weights (which are randomly generated at the start), and the bias for that nueron. These neurons make up layers, and the layers make up the MLP (multilayer perceptron). I created a couple arrays of inputs, and the desired output, which has the output for each input array. To train it, you have the model predict something, then calculate the loss (or the sum of how far away each prediction was squared), then do the backpropogation (go through each parameter, or each weight and bias), find out how much and in what direction it affected the loss function, and finally change each parameter slightly so it moves the loss in the right direction. As you can see in the screenshot, I got it down pretty low. This will be useful because when I am training my LLM, I will need to use a neural network like this, and get the loss down as low as possible so it predicts better words and produces better results. Karpathy’s video is at https://www.youtube.com/watch?v=VMj-3S1tku0&list=PLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ&index=2 , it’s really quite amazing, I learned so much from it, and I haven’t even learned Calculus yet, which he states is a prerequisite in the description, I highly recommend if you’re interested. Next I will need to work on implementing transformers (which takes in the input (words), and derives meaning from them by encoding them into a vector).
Having completed the MLP I described in my last devlog, I set out to try to follow the next tutorial in the list I found. However, after I listened to the description of it, which is basically just a model that can take in a database of words and produce more words that sound similar, I foolishly believed I could try to build something similar without following the tutorial. I did take the database of names from the tutorial, since I will need those to train the model. I started by transforming the inputs (the previous letter in the word) into numbers, and then the output (a number) back into a letter. My first attempt just put in the ASCII code for the letter, and the rounded down output number. The first issue was I used the entire database to train, which took forever and quickly hit the maximum recursion depth, so I switched to using only the first 500 examples (using the entire database, combined with super high differences between the output and the expected output resulted in the initial loss being 1,934,198,245, compared to a loss of like 4 when just testing my MLP). After that, I got it to actually finish training without crashing, however, the loss didn’t go down, and it always outputted a null character. I realized I had been really stupid, as the tanh function at the end of every neuron in the MLP shrinks the result between -1 and 1, so the result could only ever be the ASCII codes 0 or 1, which are null. So instead, I changed it so instead of outputting the ASCII code directly, it outputs a 27 long array, each index representing a letter (and the last representing end of name), each value at an index represents the probability of that letter being chosen, so to decode the results it just has to find the highest probability, check that it’s not the last element, and add 97 to it’s index to get the ASCII codes (because the letter “a” is at 97, so if it’s index 0 and meant to be “a” it has to adjust). This led it to actually output letters, but it always outputted the same letter, as shown in the screenshot. The loss dropped rapidly and then plateaued at around 2000. I found some bugs (gradient accumilating over time instead of resetting each epoch) and made some changes (instead of inputting an ASCII code, it inputs in the same format as the output), but nothing had any effect. After thinking, I realized that the model is just picking the most common letter, and always outputting it. That’s why the loss can’t get any lower than 2000, because that’s the limit of how good this strategy can get. However, I have no idea how to fix this issue, and somehow teach the model the meaning behind the letters, so I will accept defeat and watch the tutorial, then implement what I learned.
I finally got it to generate some names! They are sampled below. I watched the first half of Andrej Karpathy’s makemore video, and built a 2D array of the number of each instance of a letter following another instance. Then, when generating the name, it takes an array of the number of times in the training set each letter followed the previous letter in the name, multiplies that number by a random number 0 to 1, and chooses the highest number as the next letter in the name. This doesn’t work too well, as shown below, so I will spend some time improving, but it’s a start! Some names it generated are sampled below.
I improved my model based off of Kerpathy’s makeMore part two tutorial and a 2003 paper by bengio et al (link is https://jmlr.org/papers/volume3/tmp/bengio03a.pdf ), it was really interesting. I increased the input size, so it takes in the previous 3 letters as an input instead of 1, and encoded each letter in a two dimensions instead of one hot encoding. I also had to start using numPy due to needing to do efficient matrix multiplication (numPy does it in C in a heavily optimized fashion, I considered trying to do this but decided it was out of the scope of the project). Doing it in just python would be way too slow. I also optimized it a little bit, having it select 32 examples randomly from the data set for each epoch, instead of just using the whole thing, which made it a lot faster while still training over the whole set. Hopefully this will make it produce more accurate results!
I tuned the learning rate (The magnitude of how much it changes the weights, which is multiplied by the gradient of each weight to get the final change), added better printouts when training (Added a neat progress bar/tracking, output the loss, and a timer), and also using plotmatlib to plot the embeddings. The graph is how the model arranged each letter in space. What’s interesting is similar letters (like the ending character “.” and “e”, which both are commonly found near the end of the word) are in similar spots, so the model has sorted out some sort of meaning from their placements, which I think is pretty cool. The names are still quite nonsensicle, I think I might have to enlarge the model a little bit to improve performance, which means waiting longer for it to train :(
I made a bunch of little improvements, including increasing the character encodings to 10 dimensions up from 2, increasing the epochs to 200,000, and also decreasing the learning rate from .1 to .01 for the laster 50,000 epochs. Although the loss is significantly lower than Andrej Karpathy’s makemore (which I modeled my model after), it’s names are worse. Karpathy got 2.17 ish on the testing dataset, while I got 1.776. However, Karpathy’s generated slightly abnormal but reasonably word-like names, like “jeron” and “ham” while mine where a little more random (“xxxhorlis” is one of them). I’m not sure how to improve from here, I don’t think increasing the epochs will do much, it already took around 10 minutes to train this model, I think we’ll get diminishing returns. I will, as always, continue on to the next video in Karpathy’s series, hoping that his tips will help improve it.
I worked on switching to a Jupyter notebook instead of just a python file, this made it easier since I didn’t have to constantly retrain the model, and also could print out stuff in line. I also added batch normalization, which helps change the range (really the standard deviation) of the values before going into the activation function (tanh) so that the values are more spread out. tanh squishes all values between -1 and 1, so if all of the numbers are greater than 1 or less than -1, then all of the values will essentially be squished to either -1 or 1, which makes the model lose a lot of the data. But if you divide all the numbers so that they are all closer to 0, then the activation function is a lot more spread out and the data is preserved. (I got the photo from google, I think it’s helpful when visualizing it).
I was playing around with how changing the number of epochs/other variable affected the output, and seeing how that differed to before I implemented Batch normalization, and so tried to put the epochs up a lot. I ended up training it for 20,000,000 epochs, which took like 8 hours, which is why this devlog has so much time logged. It didn’t really improve it much, you can see by the loss graph it didn’t go down very much at all, so I’ll need to change something in how the code works. It was still fun though.
Put my model into the Layer class, so I can easily create lots of layers. The graph shows the activation distribution by layer. Each layer is pretty similar, as you can see. This devlog marks the end of the fourth lecture in Andrej Karpathy’s makemore series, out of 7, so we’re getting there! That’s just under 8 hours or lecture watched (so I spend roughly 5 minutes coding for every minute of lecture watched). Pretty interesting.
Added a demo page! You can check it out here: https://luchik28.github.io/BadGPT/ . I saved the model weights, built a script that reconstructs the model using those weights, and hosted it using github pages.
I followed Karpathy’s lecture on backpropagation, where he implemented backpropagation manually. In the series, he’s using Pytorch, which does it for you, which is why he’s doing it manually. I’m not using Pytorch, so the only way to do it is to do it manually, so I didn’t get to add too much to the code, I just verified that I had implemented it correctly and learned a bunch. It is still pretty confusing though, and I couldn’t solve any of the exercises in the lecture without watching his explanations. Anyway here’s a name it generated that I think is pretty cool.
I did a bunch of things to prep for implementing a wavenet architecture, which basically changes the model so instead of taking in all the characters of input at once and squishing them all into the first layer, it gradually puts them in at each separate layer. First, I put more stuff in classes! This didn’t really change the functionality, but instead of embedding the characters and flattening the model in separate chunks, I put them in their own classes so they can get put in the list of layers, and we can just run the input through each layer in the list, and compare it with the target at the end, instead of having half the layers in the list and half as separate chunks, which is a lot smoother. So the entire model is just: model = Sequential ([ Embedding ( vocab_size , n_embd ), FlattenConsecutive ( 2 ), Linear ( n_embd * 2 , n_hidden , bias = False ), BatchNorm1D ( n_hidden ), Tanh (), FlattenConsecutive ( 2 ), Linear ( n_hidden * 2 , n_hidden , bias = False ), BatchNorm1D ( n_hidden ), Tanh (), FlattenConsecutive ( 2 ), Linear ( n_hidden * 2 , n_hidden , bias = False ), BatchNorm1D ( n_hidden ), Tanh (), Linear ( n_hidden , vocab_size ), ]) Which I think is really cool. I also improved the loss graph, previously it looked like the screenshot on the right, because each iteration’s loss is graphed. Because our batch size is 32, which means in each iteration we look at just 32 inputs/output, a good deal of what the loss will be depends on how lucky we are with the input/output. Over a great number of iterations, it averages out into the correct value, though, so to fix the graph, we instead plot the average of every 1000 iterations, which lets us see a lot more detail that otherwise would be lost in the noise (the two loss graphs I added are not of the same model, but you get the idea). Anyway now I’m going to actually implement the wavenet architecture!
Implemented the wavenet architecture. Usually, during the flattening phase, the tensor goes from the shape (batch num, block size, embedding dimensions) to (batch num, block size * embedding dimensions). This squishes all of the embedded characters into one dimension. Wavenet does that more gradually, it slowly merges the different letters. So the first two letter embeddings get squished into one, then the next two, etc, and in the next layer then you have the first 4, then the next four, until by the final layer you have just one group of all the letters, which is the same as the original method, just a much more gradual approach. The first image is the training loss, the huge cliff is when the learning rate decreased. The second image is a visualization of the wavenet architecture from the paper. You can see that in each layer, nearby groups of input get merged together. In the original method, the graph would look like all of the inputs going to the 1st dot in the hidden layer, then continuing up. Next I will be actually building a GPT instead of this names project.
Trained the wavenet architecture on a file with just shakespear in it. It’s got the structure down well, and sometimes can do words and wordlike outputs, but generally spouts straight gibberish. I will try to follow a lecture to build a better Tokenizer and Transformer next time. Right now each character is treated as a token, and embedded into 10 dimensions, it would be better if pairs of characters were treated as tokens and embedded. Increasing the context size could also help, it’s currently an input of the previous 8 characters and outputting 1. This is it’s output:
I increased the block size from 8 characters to 64. This means that instead of the model taking in the previous 8 characters and outputting the next one, it takes in the previous 64 characters and outputs the next. This means that it should be able to keep track of longer words so it doesn’t get lost in them. However, it doesn’t seem to be improving the model too much, although that might be because I haven’t trained it as much as the others. I’ve done roughly 200,000 epochs, which took a long time, since this model is much larger (110,415 parameters vs 45,000), and has 6 hidden layers as apposed to 2, which means it is a lot slower. As you can see in the loss graph, it probably could make further gains, although it seems to be mostly good.
I implemented self attention! I will try to explain here, but will do a terrible job: basically, what that is, is it lets the model decide what tokens in the input are more important than the others. The first thing I did was scrap the wavenet model, and switched to a simple bigram model. The second thing I implemented was bag of words, which edits the input tokens so every element is the average of that element and all that came before it. This lets all of the tokens “talk” to eachother. This is all fine and dandy but since all the things are averaged then you don’t know where things came from, and positional data is lost, so we lose a lot of resolution and data, so that sucks. So we have to encode positional data. So instead of just averaging all the elements that came before, we expand each averaged element into a list, which has all the elements in a row instead of averaging them into one number. So the first row could be [1, 0, 0] and the second [1, 2, 0] and the third [1, 2, 3], etc. We do this by masking it with the tril function, from numpy (very cool). But this is problematic, because all of the elements are given the exact same weight. A letter 34 characters back gets the same weight as the last character in the input (which is the letter immediately preceding the predicted letter, the output). To fix this, we add self attention! This is modeled after the groundbreaking paper Attention is All You Need, which started the whole AI hype thing. How it works is each token has a linear layer (that multiplies it by learned weights) called the key, and another called the query. The query is kind of like what that token is looking for, and the key is kind of like what that token has. And these can be multiplied with the keys and queries of all the other tokens, and that lets you know which token has the stuff that the most other tokens are looking for, and is thus more important and can be given more weight. That is a single head of attention, there are multiple heads that can specialize in different things. This, in theory, should increase performance. But it also drastically increases the amount of time it takes to train. The model only has ~56k parameters, which is less than half of the wavenet model, but takes a lot more time to do it’s thing. This is the output from the results of more than 13 hours of training. As you can see from the loss function, the loss was decreasing at a steady rate, so more training could probably improve it. Plus, this was at a highish learning rate the whole time (.1) so decreasing it would probably further improve it. But I can’t do anything on my computer while this is training or it runs out of RAM, and I have to use my computer now, so I will be moving on for now.
I made a bunch of tiny improvements. I didn’t change the architecture at all, but I did change the optimizer to AdamW. The optimizer is what controls how much each parameter is changed each epoch. Before, I was using a set learning rate, of about .1 for the first 80% of training then decreasing to .01 for the last 20%. Decreasing it at the end is important because as the loss settles into a local minimum, it might not be able to go to the lowest point because it keeps overshooting it since the lr is too high. Conversely, we can’t keep the lr too small the whole time because it might settle into a very tiny local minima that it might have been able to go over with a higher learning rate. It would also take forever. AdamW helps improve the optimizing step by changing the learning rate per parameter, helping the model train as fast as possible without overfitting. Overfitting isn’t really an issue I’m worrying about since my model is pretty small (around 56k params), so it’s not really large enough to learn the ins and outs of my dataset. Anyway I also changed the logging step, so it now logs validation dataset loss in addition to the training dataset loss. I split the dataset into train and validation so I can make sure it’s not overfitting. Currently the val loss is at 1.76, which is a lot better than where we were at before, which makes me hopeful. Training has around another 7,000 epochs to go, but Stardance is yelling at me I should write another devlog now so here you go, Stardance. I’m looking forward to sampling the model and seeing how much it’s improved!
I finished training it! It finished with a val loss of around 1.76, it got down to 1.73 but ticked up at the end. The output is pretty good, but not substantially better than the wavenet model. However, it’s vaguely word-like, and took 20 hours to train so I’m not sure how much larger I can make the model before my laptop implodes. Next I will probably try to find a question-answer training dataset, so that I can start training it to answer questions. This step that I’ve been working on is the pre-training step, where I teach the model to basically spit out documents. Next, I have to have it spit out documents that happen to be question-answer documents.
Updated the demo website to include the wavenet model, and the new self-attention shakespear model. You can check it out here .
Started working on a more advanced tokenizer. The tokenizer is what splits the input text from words into numbers, and back again. Before, I was using a 10 dimensional embedding, where each letter is represented by a 10 long array (each value representing a dimension). But current models have much more advanced tokenizers, which often encompass entire words, or parts of words for longer words. This works using Byte Pair Encoding, which turns all of the letters pairs of letters into their utf encodings (usually 8), then iteratively merging the most common consecutive pairs into tokens to add to the vocabulary. You can see how tokenizers work at https://tiktokenizer.vercel.app/ , which is a cool website that lets you play around with stuff like that.
Switched to using the fineweb edu dataset, instead of shakespear. This is the dataset I will use to train my actual model on. It’s a highly currated database of the internet, and is similar to what GPT2 was trained on (although the actual db they trained it on is closed source). I also reformated the sampling system so you can put in a query and get a response, as long as the query takes up less tokens than the context. Other than swapping out the training file, it’s the exact same. Next, I will probably implement a special ending token to my tokenizer, and also increase the scale of my model a little bit. I can’t increase it all the way to what Karpathy does in his tutorial (he uses cloud computing, so he paid to rent out like 8 64GB GPUs, or something like that), since I don’t want to spend money training it. However I think I can squeeze a little more out of my laptop.
Added an EOS ID, which is a special token that the model can output to indicate that it’s done. I built a script to insert this in between passages in the training data, so it can learn when it should shut up (otherwise it will yap forever, until it hits the max number of output tokens). This meant I had to retrain the entire model, but got it down to a loss of around 3.46. Obviously, it’s not very good. But I’m pretty sure the only way to improve is to scale up the model size and training time, something I don’t really have the capacity to do (this model trained for 15 hours on my laptop). I will probably continue by adding this model to my demo website, and build a chatGPT like UI, just for fun. After that, I think it might be time to ship!
Trained the model a little more, exported it, wrote some UI to make it look more like a chatbot. It still sounds like gibberish. Sometimes I imagine that it’s output changes slightly depending on the context (for example, more numbers if I ask it a number related question, and a list if I ask it for a list, etc), but I’m probably just imagining it, it’s really just gibberish. Still kinda cool tho. You can check out the demo at https://luchik28.github.io/BadGPT/ .
Fixed up the readme a bit in preparation to ship. Specifically, I added info on what all the files do, but I named them poorly and then forgot what most of them do so it’s kind of confusing.
Ships:
badGPT is a conglomeration of sequential ML projects I did this summer, culminating in a chatbot like ChatGPT or Claude built from scratch using just python and numpy. I started off by building a name generation model, then a Shakespeare writing model, then finally a chatGPT-esque model. The model produces, for the most part, complete gibberish, so this was less a practical project and more an exercise in understanding how everything works. It performs so poorly because it’s so small. Models need a lot of parameters to be able to capture all the nuances required to produce coherent text, which makes the models much slower to train. The final model I made includes around 120,000 parameters, 4 transformer blocks of 4 attention heads each, and 64 tokens of context. It’s based largely on GPT-2, which for reference had about 1.5 billion parameters. Current frontier models, like Anthropic’s fable, have trillions of parameters and can have millions of input tokens, so it makes sense that my model is too small to make much sense at all. Even at its small size, it took my laptop more than 20 hours to train, so scaling up with my current hardware is not feasible. Many people like using libraries like pytorch and tensorflow, which include classes that handle backpropagation (the system that’s at the heart of letting the models learn), but I wanted to start from scratch so I wrote my own. If you wish to try any of my models out, you can visit the demo website (click try project), and click through the tabs to see each of the models. It all runs in your browser. You can also look through the Jupyter notebooks in the Github repository to get a sense of how everything works....
|
1792875233.3266373
|
1793739233.3266373
|
|
28749
|
WaldOS© 3.0 by @Waldewort | Stardance
|
Waldewort
|
3
|
121.0
|
900
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T11:57:36Z", "hours": 64.0, "multiplier": 13.36, "payout": 0, "blessing": "neutral", "text": "🎉Release of the WaldOS© 3.0🎉 Yipppppie, here are all new features: Animation when you start the WaldOS© 3.0 The completely new startmenu and minimization of the Apps The VoiceAI, starts by pressing on the starring under the title and can be monitored in the settings 🤖. The WaldAI, a groq based Ai witch can answer your question (not that good, but it´s okay) The Waldracer, a game in qhich you can drive infinte in a cool world. Thanks to slowroads to make this free 🏎️! The WaldClock, a timer and clock (wow!) The Wal(D)-OS, you can create your own TO-DO Pins with date and time. Waldtravel, a app you can calculate the CO2 and energy needed for different Vehicles and Routes Waldollution, you can see how long different things need to get composed in nature The Waldeye, with different livestreams of nature and animals The WaldWeather, a whater app! Waldience, you can create naturesounds to chill more 🌳. Thanks for testing the WaldOS© 3.0 and your likes ♥️, comments 💬 and the good rating 🥰😉 !", "repo": "https://github.com/Waldewort/WaldOS", "demo": "https://waldewort.github.io/WaldOS/"}, {"ship_num": 2, "ts": "2026-09-18T21:39:19Z", "hours": 17.0, "multiplier": 18.03, "payout": 302, "blessing": "neutral", "text": "🎉 The WaldOS© 2.0 has officelly launched 🎉 Welcome to the WaldOS© 2.0 🥳! The WaldOS© 2.0 is a update of the WaldOS© and brings with it two new Apps, a completely new Background ✨witch is fully customisable and new Icons 📱! The WaldOS© 2.0 is a very elaborate project in witch I tried to use as many AI as possible so please remember this in the rating! What’s Inside the WaldOS©? 📝 Notes & 🌙 Mooncalendar: Write down ideas and check your calendar persistent session saving. (Pro tip: Try clicking on the clock! ⏰) 🎺 Trumpet Learn: Learn brass fingerings step-by-step—huge credit to my coding colleague #Dasher2801 for building this! 📽️ Waldiverse & 🔍 WaldSearch: Stream longform YouTube content or search exclusively for pure Wikipedia articles. 🗺️ Waldlas: OpenStreetMap integration with route planning and session-saved emoji pins worldwide. 🧮 WaldCalc & 🌌 WaldSky: Solve equations or gaze at real-time constellations flying across your screen. ⚙️ Settings App: Fully customize your background universe! Adjust colors, star density, and speeds (watch out, potato PCs 🥔). ⚠️I only tested the WaldOS© 2.0 on a FHD (1080p) or higher monitor so lower resolution may cause window rendering issues⚠️ Thanks for reading and your interests in the WaldOS© 2.0 ♥️. Thanks for your feedback and like and I hope for a good rating 😉!", "repo": "https://github.com/Waldewort/WaldOS", "demo": "https://waldewort.github.io/WaldOS/"}, {"ship_num": 3, "ts": "2026-09-05T13:59:35Z", "hours": 40.0, "multiplier": 14.98, "payout": 598, "blessing": "neutral", "text": "Welcome to the WaldOS©! The WaldOS© is a Webbased operating system by #Waldewort. It already has the most important features like: A Notebook screen which saves your notes for the next session A Trumpetfingeringlearning screen made by my coding college #Dasher2801 For all the ones who only want to watch longform YouTube content the Waldiverse, a YouTube application The WaldSearch, a Wikipedia based Searchmachine which outputs you only Wikipedia articles The Waldlas, a openstreetmaps based map version with Searchmodus and the possibility to make emoji Pins all over the world witch also saves over sessions and a route planer to plan your next vacation (We as coder won´t need this XD ) It´s important during coding to not forget to eat so theres the Mooncalendar, opens by pressing on the date is presize and custumisable Notes are possible witch saves over your sessions !!!Try out what happens when you press on the clock!!! Please only try it on desktop and you need at least a FHD Monitor that the windows aren´t too big! One day there will be a mobile version! But the WaldOS© is still in process and a lot more Apps will come, with even more features and better Style. Please remember that I needed 40 hours to code this caused by coding it BY MYSELF and not AI, so also the design is not the best but at least not a AI Design like on 95% of the projects here! Thanks for reading and your interest in WaldSearch© and for the good rating :))", "repo": "https://github.com/Waldewort/WaldOS", "demo": "https://waldewort.github.io/WaldOS/"}]...
|
[{"post_id": 80338, "ts": "202 [{"post_id": 80338, "ts": "2026-10-17T10:05:31Z", "hours": 9.5719, "text": "🥳The last features before the WaldOS© 3.0🥳 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Devlog 17 The new apps: The WaldEye: A cool app you can watch cute animal livestreams in! Of course only animals in pure nature so it can be you can´t see an animal for hours, but that´s nature. Since now I included four live streams of different animals ( also cute ones, like squirrels) The Waldollution: Another app that shows you how long trash need to get composed if it´s thrown into nature! Finally introducing the WaldWeather app: Automatically shows you the Weather on your location, but you can also search for places and save them to the bar on top to have easy access to them. If you maximize the window you get extra detailed information and a 7 day forecast (that´s maybe right XD) Also I fixed some bugs in the WaldTravel app! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Here you can try the WaldOS 2.0 for your own: https://waldewort.github.io/WaldOS/ Today I will launch the WaldOS 3.0 so follow to don´t miss something! Thanks for reading and the like and comment :))"}, {"post_id": 79807, "ts": "2026-10-15T14:09:25Z", "hours": 9.6897, "text": "🌳More Waldclimate Apps for the WaldOS© 2.0🌳 “´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´´”´”´”´”´”´” Devlog 16 One new app and one in progress: The Waldollution, a app which shows you how long different objects need to get composed in nature if they get thrown away not regular. Work in progress for a really cool app with cats and polar bears ( and lot of cool other animals 😉), but more in the next Devlog 🤫 Bug fixing for the Control Center and some performance tests. Also I improved the Waldtravel animations a bit “´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´´”´”´”´”´”´” Test the WaldOS© 2.0 by your own: https://waldewort.github.io/WaldOS/ That´s it, the release of WaldOS© 3.0 will be soon, follow to don´t miss it! Thanks for reading and the like and follow 🙃"}, {"post_id": 79021, "ts": "2026-10-12T11:54:43Z", "hours": 9.4014, "text": "🎉We celebrate the pass of the 100 hours mark of the WaldOS© 2.0 🎉 (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: Devlog 16 One new feature and one revolutional app for the celebration 😲: The WaldOS has got it´s own control center . Now you open apps in this center and then they are shown in the taskbar like in all other real operating systems! Also you can now minimize apps or close them complete. The new App: Introducing the WaldTravel! The WaldTravel is a tool you can plan your next trip more climate nutral and you can explore how much CO2 is expelled with different Vehicles! Short realtalk: This app is very important to me to show all the world how to reduce greenhouse gases and help with climate protection ♥️🌳! This is the most important topic for our (the stardance) generation and the following ones and I think stardance is a good way to show this importance to more people. Thank you 🥰 The app is very interactive and shows the importance of this topic in an easy and good to understand way with visualization! Also I fixed again some bugs and smoothed the WaldOS© 2.0 expierience more 🥱! (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: Try the WaldOS© 2.0 for your own: https://waldewort.github.io/WaldOS/ Thank you so much for reading this more serios Devlog and sharing it and give it a like 🙃! Write down in the comments if you want more of such apps with a important topic."}, {"post_id": 78288, "ts": "2026-10-10T09:37:52Z", "hours": 9.0592, "text": "🤖Full Voice Assistant in the WaldOS© 2.0🤖 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Devlog 15 Trying is better than … this: https://waldewort.github.io/WaldOS/ The first accessibility feature is full working now 🤖🎉 The VoiceAI is now completely integrated in the WaldOS© 2.0 without a App needed. Just press the starring right under the title and talk to the VoiceAI! Also then there is a cool animation 🙃 The VoiceAI can now complete tasks in the apps like setting a timer or write down notes for you 😯 In the Settings App you can controll the VoiceAI and also read the user manuell to get to know how the VoiceAI works excactly. What changed else: Nothing 😢 But right now I´m working on a big new feature witch revoluts the opening process of the Apps in the WaldOS© 2.0, so stay tuned 😉 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - You wanna try the WaldOS© 2.0 ? Here you can 🥳: https://waldewort.github.io/WaldOS/ I´m glad you´ve readen this Devlog and thank you soo much for the like and comment and the good rating for the WaldOS© 3.0 (which is comming soon🤫)"}, {"post_id": 76453, "ts": "2026-10-03T16:04:27Z", "hours": 8.8867, "text": "🎉🗣️The Waldasist beta version is out now in the WaldOS© 2.0🗣️🎉 ^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^ Devlog 14 The biggest new feature in the history of the WaldOS© 2.0 has launched its beta version 🥳! The Waldasist is a integrated voice assistant in the WaldOS© 2.0. You can easyly activate it by pressing on the circle of stars right under the title. Now you can say the name of the App and it opens by magic. Also you can say maximize and then the name of the app and close apps by saying close and the app name. I´m right now working on a voice assist even in the apps themself but that´s not that easy! What changed too: Just a bit buggfixing in the Waldracer and WaldAi 😢 ^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^ Stay tuned to don´t miss the next ship and that you can try WaldOS© 3.0 (holy moly😯). Next week I´m in holiday so I won´t post anything! Thanks for the like, follow and the commi 🙃"}, {"post_id": 74464, "ts": "2026-09-27T13:08:04Z", "hours": 8.9736, "text": "💫Animations for the WaldOS© 2.0 💫 </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </> Devlog 13 You know the sentence 😂: https://waldewort.github.io/WaldOS/ A lot of cool new things for all with shortend attentionspan: A legendary starting animation in which … ahh no, just watch the video or visit: https://waldewort.github.io/WaldOS/ by your own! (but watch out it´s epic 😯) A new app with mathematical generated ambience sounds to learn or chill. Google Gemini helped me with this cause the generating of sounds is mindblowing complex. Thank you Gemini XD (But I made all around by my own and I think it´s a good app anyways! ) (I just recognized I still don´t have an app icon, but fixed till next time! ) A bit of bugfixing and testing with different thinks (stay tuned 😉) </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </> Try the WaldOS© 2.0 for your own: https://waldewort.github.io/WaldOS/ What comes next ? I don´t know, right now I´m producing content for the Virality Bonus for this follow https://www.instagram.com/waldewort/ on Instagram, thank you! Thanks for reading, your time, the like and the comment :)))"}, {"post_id": 72793, "ts": "2026-09-23T19:05:01Z", "hours": 8.5556, "text": "⏰🏎️🤖 The WaldOS© 2.0 got 3 new apps! :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.: Devlog 12 Trying is better than reading: https://github.com/Waldewort/WaldOS The 3 new apps: A clock, alarm and stopwatch app to not forget the time! Very simple done! (yippie 🥳) The thing most of the people wanted: An integrated WaldAI 🤖😲: Using an free croq API I created the WaldAI. It´s using the gpt oss 120b modell by openai and is a bit stupid but for normal questions it´s okay (just don´t ask things witch are newer than 2024 😉😂) A very simple integrated game: The Waldracer! It´s the game slowroads by topograph.io and now it´s in the WaldOS© 2.0 as a standalone game thanks to the open source of their game: https://slowroads.io 🎉 Things that are also new but no app: A little staranimation is now greeting you when entering the WaldOS© 2.0 :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.: That was it already, thanks for reading and the like and comment :) Try it for your own: https://github.com/Waldewort/WaldOS See you soon 🙃"}, {"post_id": 70280, "ts": "2026-09-18T21:18:32Z", "hours": 2.1525, "text": "2️⃣.0️⃣Release of the WaldOS© 2.0 is now🥳🥳🥳2️⃣.0️⃣ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Devlog 11 What has changed ? Bugfixes on the WaldSky and Waldlas and perfomance optimization (99% of work) Title has changed to WaldOS© 2.0 (1% of work 😂) A new ReadME (more exciting and readable) Uhm not more, but now version 2.0 is ready to launch 🥳🥳🥳 So celebrate with me the second launch in 3️⃣Three 2️⃣Two 1️⃣One Nowwww!!!! 🎉🎆✨ https://waldewort.github.io/WaldOS/ yippie! Try it your self 🙃 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Thanks for reading, the like and comment and the good rating 😉"}, {"post_id": 69775, "ts": "2026-09-17T19:23:30Z", "hours": 5.5242, "text": "2️⃣.0️⃣The Launch of the WaldOS© 2.0 is happening in the next days! 2️⃣.0️⃣ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Devlog 10 (I think) Trying is better than reading: https://waldewort.github.io/WaldOS/ All the new stuff: 1. First time ever I really did what I said in last Devlog: Introducing the own creatable and saveable Universum function in the settings app (yesss, fully customiseable - other than apple XD) Two new Apps (Wow I was productive 😁): The WaldCalc, a … Calculator (stunning 😲) And the… WaldSky, a App you can watch the real stars flying over sky. You can let you show real constellations and the names of them 💫. You can set in a time and place so you know where to have to look with your Crush during night to see the Ursa Minor ( Just joking, we are coder, not touching grass (or girls 😜(just joking again😂)) 😢). New Icon design: Gemini cooked with the new Icons, I just inserted them (took anyways like one hour) A little Copyright sentence under the title to prevent abuse 😲 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This was it actually, I´m going to ship tomorror or one day after this (sorry to all native speaker hehe) Try the WaldOS© for your own: https://waldewort.github.io/WaldOS/ Thanks for reading and all the support and the comment and like ♥️!"}, {"post_id": 67416, "ts": "2026-09-13T14:48:56Z", "hours": 5.2639, "text": "🥳The final design of the WaldOS© is finished!🥳 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Devlog 9 Try it out instead of reading (I know you 😜): https://waldewort.github.io/WaldOS/ What is new: The new glassy design with the new header is now applied on all Apps (sadly looks bit like apple :( ) A new App has launched: The settings (wow how exciting XD) -The background is now fully costummizable with the settings app. -You can choose of 6 different Presets for Colouring -You can create your own colouring -You can set the speed and digit of stars and how far constellations are forming (watch out for your potato PC - Graphical intensive 😉) -You can Rename the main title in the middle of the WebOS! Bugfixes 2.3 on Waldiverse and Waldlas First performance fix and improvement (no fun 😢) That will come next? A save for your own presets ( cool idea! ) Idk see what comes in my mind next! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- You wanna try the WaldOS©: https://waldewort.github.io/WaldOS/ I hope you have fun and thanks for the reading and the like and comment 🙃"}, {"post_id": 64382, "ts": "2026-09-08T18:24:53Z", "hours": 3.8128, "text": "💫Finale Design for the WaldOS©💫 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Devlog 8 What´s new: Interactive Background! The cursor forms star constellations and in the middle is a subtle WaldOS© title. Randomly some little shooting stars flying over the screen (some cute little ones💫) I´m worikng on a new App design for every app witch fits way better in the style (but need soo long time😢) — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Here you can try out the WaldOS©: https://waldewort.github.io/WaldOS/ Thanks for reading this and your like and comment :)"}, {"post_id": 62151, "ts": "2026-09-05T12:26:21Z", "hours": 8.9528, "text": "🥳The final Version 1.0 of The WaldOS©🥳 : ) : ) : ) : ) : ) : ) :) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) Devlog 7 Lunch of the WaldOS© Version 1.0 today❗ Thinks changed since last time: The best App has launched, The Waldlas: A Openstreetmaps based maps app with a lot of functions: Your current location and the WaldOS© Headquarter are fixed on the map as a pin. You can klick anywhere on the map and pin a emoji with text to the map to don´t ever forget where this good restaurant was ( because we all forget always 😢, but not anymore 🥳) A searchbar makes it possible to find any location within milliseconds (for all the bad geographie students 😉) And a FULLY USEABLE ROUTESEARCH SIDEBAR (wow!), just type in two locations and it will find the fastest route for cars! Again a new design! I removed the background and now theres something like a glassy optic ( I know a bit mainstream but I didn´t know what else 😢) Bugfixes 1.3 for the Waldiverse and the Waldsearch I don´t know it´s too much happend XD : ) : ) : ) : ) : ) : ) :) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) If you want to try it out before the launch in some hours: https://waldewort.github.io/WaldOS/ I hope you like the new features and give a good ranking 🙃 cause I made sooo much and nearly all by my self, different than others! Thanks for reading and leaving a like and a comment! See you soon 👋"}, {"post_id": 55209, "ts": "2026-08-26T19:18:22Z", "hours": 7.9508, "text": "❗Completely new Design for WaldOS© ❗ .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. Devlog 6! First, the Website to explore it to your own😉: https://waldewort.github.io/WaldOS/ If you more like to read about the new features, here it comes: Now the WaldOS has an fullscreenmode to make it feel like a real Operating System (That´s so cool!) Other things I added: Togglemode for the appicons to close them by pressing again on them A new App has launched (yippie): A calender to write in all your import dates to ship the next project for stardance XD The Taskbar border is gone now the Border is the sun 🤯 The Waldiverse and Waldsearch became their own Icons and a big remake: The Waldiverse (YouTube) experience is now way smoother and easier to handle The Waldsearch has now a own Wikipedia Screen in the WaldOS 😱 which opens by choosing an article and makes the expierience of WaldOS© sooo immersive (befor you was kicked out to your browser 🙄) The design is a bit updated and some datails like backgroundcolors changed (some uninteresting stuff XD ) .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. After adding the next app (hints in the Video 😶) I´m gonna ship Version 1.0 of The WaldOS© Stay excited there will come even more afterwards! Thanks for reading, now it´s on you to try the WaldOS for your own 🥳: https://waldewort.github.io/WaldOS/ Now as an real WebOS (yeah:))) ) Have fun and remember to like and leave a follow 🤗"}, {"post_id": 47552, "ts": "2026-08-15T15:04:42Z", "hours": 9.0628, "text": "❗Biggest Update ever for the WaldOS ❗ ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., Devlog 5 All the new features: Better WaldVideo App: Thanks to the google cloud YouTube DATA API v3 now you can search directly in the window and then watch your favorite Videos ( yesss, that´s soo cool :)) The WaldSearch: A Wikipedia Action API make it possible to search all you want to know and then get the matching Wikipedia Pages to read (Only the best information for you all XD ) New App in building: I´m building up an complete own app in the WaldOS without any iframes or APIs, the release of this will be next time (you have to have a bit patience, it will be soo cool. I promise :))) ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., Thanks for reading, now you can try all of this for your own: https://github.com/Waldewort/WaldOS (The YouTube will sadly not work cause you need a server to run on, I do it on a python server, so if you wanna try this you have to wait till the ship sadly :( Have fun and thanks for the like <3"}, {"post_id": 40709, "ts": "2026-08-04T12:27:28Z", "hours": 7.8767, "text": "❗NEW FEATURES FOR THE WALDOS© ❗ Devlog 4 ! New things I added: A new taskbar for a better overview Maximizable Windows ( Now you can see something 🤯💻) A notes Window with enough space to write down all notes about your own stardance project :) YouTube as a Window (Yippie, sadly you have to paste the Video-URL in, but changes will come :)) Onklick move to top on all Windows You can try it for your own and have a lot of fun: https://github.com/Waldewort/WaldOS Thanks for the like and follow ❤️, next time there will come new apps and better YouTube :)))"}, {"post_id": 35815, "ts": "2026-07-27T14:26:23Z", "hours": 4.1792, "text": "BIG UPDATE for the WaldOS©!!! (Devlog 3) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __ Things I updated since last time in Part-3: Movabale Windows (Yeah :))) Openable Windows Closable Windows New stile 💫 A own CSS - File for the stile (Now it´s ordered 👌) An inscreen of an other project as a window 🎺 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Next time I will add real content and a searching Machine 💻🌍"}, {"post_id": 20055, "ts": "2026-07-01T15:46:08Z", "hours": 1.6544, "text": "DEVLOG 2 .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. My WaldOS is doing a big progress! I´ve added a couple of new thiongs in part 2. - A aqua translucent Top Bar where all the underpages will get linked - A background of vacation in Michigan to make the OS more beautiful - Circeled all the edges and outlined all boxes - Centered the main Box .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. I´m still hyped to work on this project and will build up a cool OS - the WaldOS© (just jocking with the copyright XD) -´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´- I hope you have a good day :) You have to follow to don´t miss anything XD"}, {"post_id": 19174, "ts": "2026-06-30T13:13:14Z", "hours": 0.2708, "text": "Just finished the first part of the tutorial! I´ve once learned HTML in school like in sixth class or so and now all the memories come back and it´s a lot of fun to program in HTML (although the WaldOS© looks like garbage XD). But I´m hyped to build it better and spend way more time in this cool project which I can still use after the Stardance Challenge!"}]...
|
Title: WaldOS© 3.0 by @Waldewort | Stardance
Devl Title: WaldOS© 3.0 by @Waldewort | Stardance
Devlogs:
Just finished the first part of the tutorial! I´ve once learned HTML in school like in sixth class or so and now all the memories come back and it´s a lot of fun to program in HTML (although the WaldOS© looks like garbage XD). But I´m hyped to build it better and spend way more time in this cool project which I can still use after the Stardance Challenge!
DEVLOG 2 .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. My WaldOS is doing a big progress! I´ve added a couple of new thiongs in part 2. - A aqua translucent Top Bar where all the underpages will get linked - A background of vacation in Michigan to make the OS more beautiful - Circeled all the edges and outlined all boxes - Centered the main Box .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. I´m still hyped to work on this project and will build up a cool OS - the WaldOS© (just jocking with the copyright XD) -´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´-´- I hope you have a good day :) You have to follow to don´t miss anything XD
BIG UPDATE for the WaldOS©!!! (Devlog 3) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __ Things I updated since last time in Part-3: Movabale Windows (Yeah :))) Openable Windows Closable Windows New stile 💫 A own CSS - File for the stile (Now it´s ordered 👌) An inscreen of an other project as a window 🎺 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Next time I will add real content and a searching Machine 💻🌍
❗NEW FEATURES FOR THE WALDOS© ❗ Devlog 4 ! New things I added: A new taskbar for a better overview Maximizable Windows ( Now you can see something 🤯💻) A notes Window with enough space to write down all notes about your own stardance project :) YouTube as a Window (Yippie, sadly you have to paste the Video-URL in, but changes will come :)) Onklick move to top on all Windows You can try it for your own and have a lot of fun: https://github.com/Waldewort/WaldOS Thanks for the like and follow ❤️, next time there will come new apps and better YouTube :)))
❗Biggest Update ever for the WaldOS ❗ ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., Devlog 5 All the new features: Better WaldVideo App: Thanks to the google cloud YouTube DATA API v3 now you can search directly in the window and then watch your favorite Videos ( yesss, that´s soo cool :)) The WaldSearch: A Wikipedia Action API make it possible to search all you want to know and then get the matching Wikipedia Pages to read (Only the best information for you all XD ) New App in building: I´m building up an complete own app in the WaldOS without any iframes or APIs, the release of this will be next time (you have to have a bit patience, it will be soo cool. I promise :))) ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., Thanks for reading, now you can try all of this for your own: https://github.com/Waldewort/WaldOS (The YouTube will sadly not work cause you need a server to run on, I do it on a python server, so if you wanna try this you have to wait till the ship sadly :( Have fun and thanks for the like <3
❗Completely new Design for WaldOS© ❗ .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. Devlog 6! First, the Website to explore it to your own😉: https://waldewort.github.io/WaldOS/ If you more like to read about the new features, here it comes: Now the WaldOS has an fullscreenmode to make it feel like a real Operating System (That´s so cool!) Other things I added: Togglemode for the appicons to close them by pressing again on them A new App has launched (yippie): A calender to write in all your import dates to ship the next project for stardance XD The Taskbar border is gone now the Border is the sun 🤯 The Waldiverse and Waldsearch became their own Icons and a big remake: The Waldiverse (YouTube) experience is now way smoother and easier to handle The Waldsearch has now a own Wikipedia Screen in the WaldOS 😱 which opens by choosing an article and makes the expierience of WaldOS© sooo immersive (befor you was kicked out to your browser 🙄) The design is a bit updated and some datails like backgroundcolors changed (some uninteresting stuff XD ) .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. After adding the next app (hints in the Video 😶) I´m gonna ship Version 1.0 of The WaldOS© Stay excited there will come even more afterwards! Thanks for reading, now it´s on you to try the WaldOS for your own 🥳: https://waldewort.github.io/WaldOS/ Now as an real WebOS (yeah:))) ) Have fun and remember to like and leave a follow 🤗
🥳The final Version 1.0 of The WaldOS©🥳 : ) : ) : ) : ) : ) : ) :) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) Devlog 7 Lunch of the WaldOS© Version 1.0 today❗ Thinks changed since last time: The best App has launched, The Waldlas: A Openstreetmaps based maps app with a lot of functions: Your current location and the WaldOS© Headquarter are fixed on the map as a pin. You can klick anywhere on the map and pin a emoji with text to the map to don´t ever forget where this good restaurant was ( because we all forget always 😢, but not anymore 🥳) A searchbar makes it possible to find any location within milliseconds (for all the bad geographie students 😉) And a FULLY USEABLE ROUTESEARCH SIDEBAR (wow!), just type in two locations and it will find the fastest route for cars! Again a new design! I removed the background and now theres something like a glassy optic ( I know a bit mainstream but I didn´t know what else 😢) Bugfixes 1.3 for the Waldiverse and the Waldsearch I don´t know it´s too much happend XD : ) : ) : ) : ) : ) : ) :) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) : ) If you want to try it out before the launch in some hours: https://waldewort.github.io/WaldOS/ I hope you like the new features and give a good ranking 🙃 cause I made sooo much and nearly all by my self, different than others! Thanks for reading and leaving a like and a comment! See you soon 👋
💫Finale Design for the WaldOS©💫 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Devlog 8 What´s new: Interactive Background! The cursor forms star constellations and in the middle is a subtle WaldOS© title. Randomly some little shooting stars flying over the screen (some cute little ones💫) I´m worikng on a new App design for every app witch fits way better in the style (but need soo long time😢) — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Here you can try out the WaldOS©: https://waldewort.github.io/WaldOS/ Thanks for reading this and your like and comment :)
🥳The final design of the WaldOS© is finished!🥳 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Devlog 9 Try it out instead of reading (I know you 😜): https://waldewort.github.io/WaldOS/ What is new: The new glassy design with the new header is now applied on all Apps (sadly looks bit like apple :( ) A new App has launched: The settings (wow how exciting XD) -The background is now fully costummizable with the settings app. -You can choose of 6 different Presets for Colouring -You can create your own colouring -You can set the speed and digit of stars and how far constellations are forming (watch out for your potato PC - Graphical intensive 😉) -You can Rename the main title in the middle of the WebOS! Bugfixes 2.3 on Waldiverse and Waldlas First performance fix and improvement (no fun 😢) That will come next? A save for your own presets ( cool idea! ) Idk see what comes in my mind next! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- You wanna try the WaldOS©: https://waldewort.github.io/WaldOS/ I hope you have fun and thanks for the reading and the like and comment 🙃
2️⃣.0️⃣The Launch of the WaldOS© 2.0 is happening in the next days! 2️⃣.0️⃣ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Devlog 10 (I think) Trying is better than reading: https://waldewort.github.io/WaldOS/ All the new stuff: 1. First time ever I really did what I said in last Devlog: Introducing the own creatable and saveable Universum function in the settings app (yesss, fully customiseable - other than apple XD) Two new Apps (Wow I was productive 😁): The WaldCalc, a … Calculator (stunning 😲) And the… WaldSky, a App you can watch the real stars flying over sky. You can let you show real constellations and the names of them 💫. You can set in a time and place so you know where to have to look with your Crush during night to see the Ursa Minor ( Just joking, we are coder, not touching grass (or girls 😜(just joking again😂)) 😢). New Icon design: Gemini cooked with the new Icons, I just inserted them (took anyways like one hour) A little Copyright sentence under the title to prevent abuse 😲 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This was it actually, I´m going to ship tomorror or one day after this (sorry to all native speaker hehe) Try the WaldOS© for your own: https://waldewort.github.io/WaldOS/ Thanks for reading and all the support and the comment and like ♥️!
2️⃣.0️⃣Release of the WaldOS© 2.0 is now🥳🥳🥳2️⃣.0️⃣ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Devlog 11 What has changed ? Bugfixes on the WaldSky and Waldlas and perfomance optimization (99% of work) Title has changed to WaldOS© 2.0 (1% of work 😂) A new ReadME (more exciting and readable) Uhm not more, but now version 2.0 is ready to launch 🥳🥳🥳 So celebrate with me the second launch in 3️⃣Three 2️⃣Two 1️⃣One Nowwww!!!! 🎉🎆✨ https://waldewort.github.io/WaldOS/ yippie! Try it your self 🙃 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Thanks for reading, the like and comment and the good rating 😉
⏰🏎️🤖 The WaldOS© 2.0 got 3 new apps! :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.: Devlog 12 Trying is better than reading: https://github.com/Waldewort/WaldOS The 3 new apps: A clock, alarm and stopwatch app to not forget the time! Very simple done! (yippie 🥳) The thing most of the people wanted: An integrated WaldAI 🤖😲: Using an free croq API I created the WaldAI. It´s using the gpt oss 120b modell by openai and is a bit stupid but for normal questions it´s okay (just don´t ask things witch are newer than 2024 😉😂) A very simple integrated game: The Waldracer! It´s the game slowroads by topograph.io and now it´s in the WaldOS© 2.0 as a standalone game thanks to the open source of their game: https://slowroads.io 🎉 Things that are also new but no app: A little staranimation is now greeting you when entering the WaldOS© 2.0 :.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.: That was it already, thanks for reading and the like and comment :) Try it for your own: https://github.com/Waldewort/WaldOS See you soon 🙃
💫Animations for the WaldOS© 2.0 💫 </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </> Devlog 13 You know the sentence 😂: https://waldewort.github.io/WaldOS/ A lot of cool new things for all with shortend attentionspan: A legendary starting animation in which … ahh no, just watch the video or visit: https://waldewort.github.io/WaldOS/ by your own! (but watch out it´s epic 😯) A new app with mathematical generated ambience sounds to learn or chill. Google Gemini helped me with this cause the generating of sounds is mindblowing complex. Thank you Gemini XD (But I made all around by my own and I think it´s a good app anyways! ) (I just recognized I still don´t have an app icon, but fixed till next time! ) A bit of bugfixing and testing with different thinks (stay tuned 😉) </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </>< > </> Try the WaldOS© 2.0 for your own: https://waldewort.github.io/WaldOS/ What comes next ? I don´t know, right now I´m producing content for the Virality Bonus for this follow https://www.instagram.com/waldewort/ on Instagram, thank you! Thanks for reading, your time, the like and the comment :)))
🎉🗣️The Waldasist beta version is out now in the WaldOS© 2.0🗣️🎉 ^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^ Devlog 14 The biggest new feature in the history of the WaldOS© 2.0 has launched its beta version 🥳! The Waldasist is a integrated voice assistant in the WaldOS© 2.0. You can easyly activate it by pressing on the circle of stars right under the title. Now you can say the name of the App and it opens by magic. Also you can say maximize and then the name of the app and close apps by saying close and the app name. I´m right now working on a voice assist even in the apps themself but that´s not that easy! What changed too: Just a bit buggfixing in the Waldracer and WaldAi 😢 ^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^ Stay tuned to don´t miss the next ship and that you can try WaldOS© 3.0 (holy moly😯). Next week I´m in holiday so I won´t post anything! Thanks for the like, follow and the commi 🙃
🤖Full Voice Assistant in the WaldOS© 2.0🤖 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Devlog 15 Trying is better than … this: https://waldewort.github.io/WaldOS/ The first accessibility feature is full working now 🤖🎉 The VoiceAI is now completely integrated in the WaldOS© 2.0 without a App needed. Just press the starring right under the title and talk to the VoiceAI! Also then there is a cool animation 🙃 The VoiceAI can now complete tasks in the apps like setting a timer or write down notes for you 😯 In the Settings App you can controll the VoiceAI and also read the user manuell to get to know how the VoiceAI works excactly. What changed else: Nothing 😢 But right now I´m working on a big new feature witch revoluts the opening process of the Apps in the WaldOS© 2.0, so stay tuned 😉 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - You wanna try the WaldOS© 2.0 ? Here you can 🥳: https://waldewort.github.io/WaldOS/ I´m glad you´ve readen this Devlog and thank you soo much for the like and comment and the good rating for the WaldOS© 3.0 (which is comming soon🤫)
🎉We celebrate the pass of the 100 hours mark of the WaldOS© 2.0 🎉 (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: Devlog 16 One new feature and one revolutional app for the celebration 😲: The WaldOS has got it´s own control center . Now you open apps in this center and then they are shown in the taskbar like in all other real operating systems! Also you can now minimize apps or close them complete. The new App: Introducing the WaldTravel! The WaldTravel is a tool you can plan your next trip more climate nutral and you can explore how much CO2 is expelled with different Vehicles! Short realtalk: This app is very important to me to show all the world how to reduce greenhouse gases and help with climate protection ♥️🌳! This is the most important topic for our (the stardance) generation and the following ones and I think stardance is a good way to show this importance to more people. Thank you 🥰 The app is very interactive and shows the importance of this topic in an easy and good to understand way with visualization! Also I fixed again some bugs and smoothed the WaldOS© 2.0 expierience more 🥱! (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: (: Try the WaldOS© 2.0 for your own: https://waldewort.github.io/WaldOS/ Thank you so much for reading this more serios Devlog and sharing it and give it a like 🙃! Write down in the comments if you want more of such apps with a important topic.
🌳More Waldclimate Apps for the WaldOS© 2.0🌳 “´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´´”´”´”´”´”´” Devlog 16 One new app and one in progress: The Waldollution, a app which shows you how long different objects need to get composed in nature if they get thrown away not regular. Work in progress for a really cool app with cats and polar bears ( and lot of cool other animals 😉), but more in the next Devlog 🤫 Bug fixing for the Control Center and some performance tests. Also I improved the Waldtravel animations a bit “´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´”´´”´”´”´”´”´” Test the WaldOS© 2.0 by your own: https://waldewort.github.io/WaldOS/ That´s it, the release of WaldOS© 3.0 will be soon, follow to don´t miss it! Thanks for reading and the like and follow 🙃
🥳The last features before the WaldOS© 3.0🥳 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Devlog 17 The new apps: The WaldEye: A cool app you can watch cute animal livestreams in! Of course only animals in pure nature so it can be you can´t see an animal for hours, but that´s nature. Since now I included four live streams of different animals ( also cute ones, like squirrels) The Waldollution: Another app that shows you how long trash need to get composed if it´s thrown into nature! Finally introducing the WaldWeather app: Automatically shows you the Weather on your location, but you can also search for places and save them to the bar on top to have easy access to them. If you maximize the window you get extra detailed information and a 7 day forecast (that´s maybe right XD) Also I fixed some bugs in the WaldTravel app! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Here you can try the WaldOS 2.0 for your own: https://waldewort.github.io/WaldOS/ Today I will launch the WaldOS 3.0 so follow to don´t miss something! Thanks for reading and the like and comment :))
Ships:
Welcome to the WaldOS©! The WaldOS© is a Webbased operating system by #Waldewort. It already has the most important features like: A Notebook screen which saves your notes for the next session A Trumpetfingeringlearning screen made by my coding college #Dasher2801 For all the ones who only want to watch longform YouTube content the Waldiverse, a YouTube application The WaldSearch, a Wikipedia based Searchmachine which outputs you only Wikipedia articles The Waldlas, a openstreetmaps based map version with Searchmodus and the possibility to make emoji Pins all over the world witch also saves over sessions and a route planer to plan your next vacation (We as coder won´t need this XD ) It´s important during coding to not forget to eat so theres the Mooncalendar, opens by pressing on the date is presize and custumisable Notes are possible witch saves over your sessions !!!Try out what happens when you press on the clock!!! Please only try it on desktop and you need at least a FHD Monitor that the windows aren´t too big! One day there will be a mobile version! But the WaldOS© is still in process and a lot more Apps will come, with even more features and better Style. Please remember that I needed 40 hours to code this caused by coding it BY MYSELF and not AI, so also the design is not the best but at least not a AI Design like on 95% of the projects here! Thanks for reading and your interest in WaldSearch© and for the good rating :))
🎉 The WaldOS© 2.0 has officelly launched 🎉 Welcome to the WaldOS© 2.0 🥳! The WaldOS© 2.0 is a update of the WaldOS© and brings with it two new Apps, a completely new Background ✨witch is fully customisable and new Icons 📱! The WaldOS© 2.0 is a very elaborate project in witch I tried to use as many AI as possible so please remember this in the rating! What’s Inside the WaldOS©? 📝 Notes & 🌙 Mooncalendar: Write down ideas and check your calendar persistent session saving. (Pro tip: Try clicking on the clock! ⏰) 🎺 Trumpet Learn: Learn brass fingerings step-by-step—huge credit to my coding colleague #Dasher2801 for building this! 📽️ Waldiverse & 🔍 WaldSearch: Stream longform YouTube content or search exclusively for pure Wikipedia articles. 🗺️ Waldlas: OpenStreetMap integration with route planning and session-saved emoji pins worldwide. 🧮 WaldCalc & 🌌 WaldSky: Solve equations or gaze at real-time constellations flying across your screen. ⚙️ Settings App: Fully customize your background universe! Adjust colors, star density, and speeds (watch out, potato PCs 🥔). ⚠️I only tested the WaldOS© 2.0 on a FHD (1080p) or higher monitor so lower resolution may cause window rendering issues⚠️ Thanks for reading and your interests in the WaldOS© 2.0 ♥️. Thanks for your feedback and like and I hope for a good rating 😉!
🎉Release of the WaldOS© 3.0🎉 Yipppppie, here are all new features: Animation when you start the WaldOS© 3.0 The completely new startmenu and minimization of the Apps The VoiceAI, starts by pressing on the starring under the title and can be monitored in the settings 🤖. The WaldAI, a groq based Ai witch can answer your question (not that good, but it´s okay) The Waldracer, a game in qhich you can drive infinte in a cool world. Thanks to slowroads to make this free 🏎️! The WaldClock, a timer and clock (wow!) The Wal(D)-OS, you can create your own TO-DO Pins with date and time. Waldtravel, a app you can calculate the CO2 and energy needed for different Vehicles and Routes Waldollution, you can see how long different things need to get composed in nature The Waldeye, with different livestreams of nature and animals The WaldWeather, a whater app! Waldience, you can create naturesounds to chill more 🌳. Thanks for testing the WaldOS© 3.0 and your likes ♥️, comments 💬 and the good rating 🥰😉 !...
|
1792817554.6616461
|
1793681554.6616461
|
|
45298
|
City Defenders TD by @nautrw | Stardance
|
nautrw
|
0
|
120.8
|
0
|
[]
|
[{"post_id": 81498, "ts": "202 [{"post_id": 81498, "ts": "2026-10-21T14:31:28Z", "hours": 6.4322, "text": "There’s been a lot of progress, I think. The game is pretty much done at this point. What’s left is just to balance the game. Renamed Ground Zero to Magic Forest : Magic Forest sounds like a much cooler name that fits the theme of the game, so I just renamed it. Data Saving : I finally got around to saving the data when closing. I just made a function that closed the game and then saved the data, and then any pathway that exits the game just calls that function. Save and quit : I added a save and quit feature to the pause menu. I am now tracking a state inside the pause menu GUI manager. There is first a save and quit option, and then that leads to a second menu that warns the player and asks them to confirm their choice. There is also an X button in the main menu that straight up quotes the game, too. Archipelago : I made a new map, the Archipelago. This follows a thin strip of land on which the enemies walk. I actually had to rework how the map system worked, adding an option to draw the ground on top or below the blocked layer. I also had to add an extra check on the logic for determining if a player can place a tower. Flamethrower : I added a new flamethrower tower. As of right now, it has the same stats as the cannon. I am going to be balancing the whole thing soon. This is going to be the final tower I think."}, {"post_id": 80831, "ts": "2026-10-18T22:49:30Z", "hours": 6.415, "text": "I’ve been kind of behind again, but I think I’ve made some cool stuff. Tower shop is now an official mechanic. I just remembered I need to set the default shards back to 0, but it’s fully working now. Main menu : I ended up setting the background of it to a stone wall, which to be honest is just taken from the tower shop background. I was wasting too much time on drawing. Map selector music : I finally got some music for the map selector. It’s some public domain guitar music like the tower shop, but different. I think it sounds pretty nice. Victory & defeat scene revamp : I revamped the victory and defeat scenes. Now, they show a banner in the center of the screen and the amount of shards the player receives. A defeat will get 1/2 of the shards reward, to allow them to actually improve. 3x speed setting : While waiting for the enemies to get to the end so I could test the defeated scene, I got tired and decided to add a new 3x speed button. I ended up refactoring the whole thing but now the code is much cleaner."}, {"post_id": 78524, "ts": "2026-10-11T03:01:21Z", "hours": 7.6825, "text": "I’ve been working on 2 major things that look small but are actually pretty big: Currency buttons : I’ve had to do some major revamps to several parts of the GUI system, but now I have buttons that show the currency. I am now using these for the upgrades, buy towers, and the new tower shop with the shards. I am now allowing for icon elements to be passed into the Button class. This allows for custom positioning, and thus this new way of buttons. Then I had to change the way that elements refreshed in the GUI managers. It took a while to figure out, but now they will be red if there isn’t enough currency. Main menu background : Art is incredibly time-consuming for me, and I keep scrapping designs but I think this one is the one and the one I’ll stick with for the finished thing."}, {"post_id": 77585, "ts": "2026-10-07T15:31:34Z", "hours": 6.0606, "text": "I’ve started work on a tower shop. I spent several hours drawing the background, but I think it came out looking really good. It only took so much time, which is why I’m making the log now. I also used a template human model for the merchant. I am going to show the different upgrades on the menu. I haven’t added the buy functionality yet, but that will probably be pretty easy. I got some chill guitar music from opengameart."}, {"post_id": 77288, "ts": "2026-10-06T13:27:04Z", "hours": 6.6089, "text": "A little bit faster progress now. Tower Shop : I have started work on a tower shop. I want it to be from the POV of the player looking into a medieval stall. As of right now, I’m still working on drawing it, and also it’s still hidden and non-functional. I edited all the towers to have a requirement of another tower, so as to make it a progression later on, Data Saving : I am going to start implementing a save system. For this, I just put some values into a data class and then implemented a way to save it to and load it from JSON. Molten Lands : There is a new map now, the molten lands. I also made a lava slime which is a bit stronger than the other enemies except for the bosses. It took a while to draw the sandy tiles for it, but I feel as though I’ve gotten much better at drawing than before. Logging : I added logging. This probably should’ve been added earlier, but this will help tremendously to fix any bugs in the code. For now, I am logging pretty much everything that doesn’t happen every frame, like when an enemy dies or the user clicks on a button."}, {"post_id": 76508, "ts": "2026-10-03T19:37:01Z", "hours": 7.5089, "text": "Progress has been (very) slow but there’s some more new content: Crabs & Bat : I added crab enemies. There is a normal crab that is like a slime and then an armored crab (not shown in video) that is bigger and meant to be a boss. There is also a bat enemy. Pause Menu : Theere is a pause menu now. It allows the user to retry the map or go back to the main menu. I am finally making use of the other features of the scene manager. It’s a different scene but it’s rendered on top of the main game scene. I had to modify the scene manager to draw each scene on top of the last one in the stack. Otherwise, this is just the same usage of my GUI system. Rebalances : I did some rebalancing of the game. Towers generally cost different amounts of coins now and do different amounts of damage. I’ll probably have to do it again by the end of the project but this will do for now. Music : I am in the process of adding music. I am getting them from https://opengameart.org and crediting all publishers. I have a system where it will queue music files from a playlist and play those in sequence. They are pretty long files, but just in case. I’m probably forgetting some stuff (last time I touched this was like a week ago), but those are the major things."}, {"post_id": 72935, "ts": "2026-09-24T02:19:28Z", "hours": 5.8756, "text": "I am very glad stardance got extended! This definitely eases the pressure A LOT . Bit of a shorter devlog so as to not accidentally pass the 10h deadline. Here are the updates: Venom shooter : The venom shooter is a plant that shoots venom. It will poison the enemy. I did this through another effect. The recording doesn’t show it’s full potential, because I kind of force pushed to the repository and now I lost the change, but I have it on another computer. Essentuially, the damage over time is going to increase with the update instead of staying static and linked to the effect. More tiles! : I added the stone path tiles. They still need a little bit of work, as some areas don’t fully connect. The nice thing about working with stone sprites is that the textures connect pretty well regardless, but it’s still something I need to fix. New Map : I added a new map, Frontier. This one is just a somewhat harder version of Ground Zero, mostly to test out if the map selector and the new tiles actually worked. The map selector just had to be tweaked to refresh the UI when a new button is clicked, which is only one line, but otherwise everything went smoothly. Ghost : I added a new enemy, the Ghost. The ghost looks like a tortured soul, and at the moment he hasn’t received proper stats, so he’s just a clone of the slime. I want to make it somewhere in between the slime and fast slime. It uses a lot more frames than the other enemies to make it somewhat smooth. Ok chat I think we got this in the bag im tryna get that bambu a1 3d printer frfr i think i can get it now that the deadline has been increased tysm stardance devs!!!!"}, {"post_id": 71575, "ts": "2026-09-21T02:32:58Z", "hours": 7.1853, "text": "Ok, so a lot of progress, though it has been slow because the school year has genuinely driven a train through my productivity: Upgrades : This is the most recent thing, but basically I added upgrades. This is handled by using a list of values instead of single values when creating a new subclass of a Tower class. I track an upgrade index and increase it to change the index and some other stuff. I made some icons and added it to the tower selected menu. I will show the coins cost of the upgrade next, because I forgot to do that. I also made new sprites for the upgrades, and a complete resprite for the cannon, which badly needed it. I also remade the tower base, which looks much better now. Speed setting : I added a speed setting. This was a matter of tracking a delta time multiplier, and then multiplying it with everything that uses delta time. Remember that delta time is the amount of time between frames. It lets the developer do things like move an enemy at a movement speed independent of the frame rate, because the movement is split between the delta time. Frostspire : I added a new Frostspire tower. This is a tower that shoots icicles at enemies and makes them slower. To do the slower part, I made an effect system that gets appended to an array in the enemy. Effects have an overlay color, and will have several attributes that are applied to the enemy if it has them. As of right now, there is just a movement speed multiplier. I want to add a final venom tower that damages enemies over time, and that should be pretty easy. Tank slime : I added a tank slime, which is supposed to be the final boss of the Ground Zero map. I’m not sure if I have the inspiration to make more enemies other than slimes, or the drawing skills. Essentially it’s just a much bigger slime (takes up the whole width of the path) and green, and slower, and has a lot of health. I have to take the time to balance everything though, because 2 of the basic crossbows can kill it as of right now."}, {"post_id": 68312, "ts": "2026-09-14T22:14:49Z", "hours": 6.0117, "text": "I did this devlog mostly because I wanted to get a screenshot of (hopefully) six seven hours , but there has been some progress, even if it’s slow because now I have other things to do . Map Selector : I implemented a map selector, which will come in useful later on when I add more maps. I also want to do a little thing where every map is its own globe that kind of shows the outline of the map. I think it’ll look cool. Wave Control : I changed the wave logic to make it be controlled by the player. I was inspired by Bloons TD 6, and I think this makes it much better. Now, the player has as much time as they need to prepare for the next wave, or if they are feeling good they can just call in multiple waves and get it over with. Game Icon : I made a game icon, a shield with a golden cross and ruby in the center. I made it be the icon for the window, and it will be the icon for the .exe file when it’s time to ship. Canon : I added a cannon turret. It’s still kind of buggy, but the idea is that it will leave an explosion and that will also be the AoE so it can shoot multiple enemies, kind of like for crowd control. Generally, I really need to spend some time balancing the game, but I think that will come at a later time."}, {"post_id": 65687, "ts": "2026-09-11T00:36:05Z", "hours": 7.2467, "text": "I’ve kind of gotten into a slump, mostly because of school, but I think I’m back on track to finish this by the 30th of this month. Though I gotta say, it’s genuinely been slog to work on this now. I think I’m burning out Anyway, for the updates: Turret anti-aliasing : To fix the issue of turrets looking terribly when rotating, I used a new function that zooms and rotates the sprite, but also applies anti-aliasing. I can set the zoom scale to 1 and it will rotate the sprite but also anti-alias it. The jaggedness seen in other demos was because the actual map is rended in very low resolution (360x240) and then scaled up. GUI Makeover : I have given another makeover to the GUI. Now, most of it in the main game is a sleek semi-transparent black surface. I did this mostly because I couldn’t settle on a particular theme, and I didn’t know how to go about drawing such large sprites while still looking good. Waves : I finally got around to adding waves. They are a little buggy, but I ended up making a dictionary structure for the maps and put them in one big dictionary. This way, I can define which enemies spawn in which order, the interval between waves, etc. Enemies and turrets are also in their own dictionaries. Health : I added the health mechanic! It will now check if the health is equal or below 0 and send the user to a game over screen. Those screens will eventually get improved. Menus : I added a main menu, mostly because I had people trying the game, and it had to happen at some point. As of right now I am working on a map selector that harnesses that maps dictionary from earlier. (I did the devlog now because I was afraid of getting to 10h ) More menus and turrets : I added a ballista tower, which is slower but has higher range. I still have to balance it some more, and make a bolt projectile, and also probably make the tower control the damage instead of the arrow. That way I can subtract health from the enemy directly, which would fix an annoying bug where the turret shoots but the bullet doesn’t collide with the enemy, so it just stays there until it collides with another enemy. There is also another slime (the red slime) which is faster. This is to force the player to have at least 2 turrets."}, {"post_id": 63381, "ts": "2026-09-07T05:26:00Z", "hours": 6.885, "text": "Quite a bit of progress! Pixel art revamp : The pixel art has generally improved massively. I actually took the time to get some inspiration from Google and worked on the tileset. It now includes a lake and also generally just looks better, with borders around the paths. It did take a lot of time, though. I also implemented animations for this, for the slime, and perhaps for the crossbow too. I also made a little card container for the top 2 stats. Waves : I added waves! It’s now technically a fully playable tower defense game, I guess. As of right now it’s going to crash as soon as it gets farther than Wave 3 because I don’t have anything to do after it, but soon I will add another scene for that."}, {"post_id": 61219, "ts": "2026-09-04T01:33:38Z", "hours": 7.2719, "text": "Lots of progress again! This one was slightly more in the background, as I started a little bit of housekeeping: Transition from Rects to FRects : FRects are the same thing as normal Rects, except that they allow for floats. This didn’t really have an impact on the game other than making it easier to work with vectors for positioning, as they also use floats. UI Changes : I changed the positioning aspect of the UI. I recreated the Rect placement system of pygame, where you can select a point (eg. top left, center, midbottom, etc.) to use to position the rect. This is very flexible, and I copied it. Now, I can do things like place text with much more ease. I also changed the colors of the UI to make it darker and overall nicer. I made it so that the user had to select a turret and then go to a menu to see the cost and other attributes of it, which will be better for the future. Coins : I added coins, which will be the temporary currency when inside the game. This will be used to buy towers and such. Outside the main game, I am planning to create another one that is used to buy skills and stuff, just to make it more realistic."}, {"post_id": 57916, "ts": "2026-08-30T07:51:39Z", "hours": 7.0772, "text": "It took a while, but there have been some pretty big improvements. Transition to 1440x960px : I eventually found that being limited to 360x240 was going to be very limiting, specially with text because at low resolutions it looked like a jumbled mess. Thus I embarked on a pretty hard journey (not hard in retrospect) to figure out how to change the resolution but also keep the pixelated style without having to draw sprites at 4 times the resolution. The solution I ended up finding was to store a scale factor of 4 (360x4=1440, 240x4=960), and then scaling a separate surface to that resolution. Now, a surface is created with the same dimensions as the map, and everything is drawn to that surface instead of the map (I used to draw enemies, turrets, bullets, etc. onto the map because they moved together), and then that surface gets scaled. This allows me to keep the pixelated graphics on the actual game, and have crisp text on the GUI. For the offsets, I just moved the function that translated the screen coordinates to map ones from the map to the scene, and then adjusted it to take in the scale factor. Everything else works pretty much the same, as its only the image and mouse clicks getting scaled instead of rectangles. I scaled the button sprites to 32x32 to make them easier to draw, and then I have it in the config to scale them to 64x64. I decided to do that mostly for ease, because most of the other sprites are around that resolution anyway. Turret placement : I added more buttons to the GUI and added turret placement. The GUI itself is always going to be kind of janky. I moved it into its own class so as to sort of clean up the code in the main scene, but now the GUI manager does weird things like self.scene.game.screen.width which isn’t very pretty. It’ll do, though. I track a variable storing the turret to be placed (None if it’s not in that state) and a variable that stores whether it can be placed. I check for collisions between the path tiles (I knew it would be useful!) and the sprite to check if it can be placed. I also modified the draw function of the turret to make it red or green depending on it. GUI : Generally, for the GUI, I keep a state from an Enum (basically a fancy way of storing a string for a state), and then change the UI according to that state. I designed it in a way where it only rebuilds it on command, so it won’t rebuild the whole thing every frame, in hopes to save some sort of performance. Overall, some very good progress, even if it’s not 100% visible!"}, {"post_id": 56469, "ts": "2026-08-28T07:48:03Z", "hours": 6.7975, "text": "I decided to just write the GUI from scratch. This is kind of uncharted territory for me. I tried using pygame_gui but it felt really restrictive and the use of a json file for customization is absurd to me. I made a basic element abstract class so that all elements must have an update and draw method. I then made a button class and a container class. All elements have an ID, and when a button is clicked it sends out a pygame event, which is a feature I did like from pygame_gui. I think I will end up eventually making an UI manager class, as handling the state within the scene is getting clunky and weird."}, {"post_id": 54261, "ts": "2026-08-25T04:49:22Z", "hours": 6.2936, "text": "I’ve probably progressed more in these ~6.25 hours than the rest of the project combined. Fixed the map dragging boundary checks. This was just a matter of separating the if statement into one for each axis. Now, even if the map won’t move on the y-axis, it can move on the x-axis, for example. I added an enemy. This was also pretty simple. They take in a path instead of a position, and their initial position is just the first index of the path (the path is a list of coordinates that they walk to). Vector math made this much easier, as I could just subtract the current position of the enemy from the target, and multiply it with movement speed to move it. The enemy is actually a parent class, and the specific slime in the video is a very simple subclass of it that just has some stats. Default enemy behavior is handled in that parent class. I made a customizable health bar class. The cool part about it is that it uses linear interpolation to change its color as the health changes relative to the maximum. I made a ballistic projectile parent class and an arrow subclass. It takes a position and a target, as well as other stats, and uses vector math to move to the target. When it hits an enemy it takes health from the enemy and then ceases to exist. There is a turret class and a crossbow. The turret takes a projectile class (the crossbow takes the arrow, for example). It will make a new instance of the projectile when shooting. It has a circle for a range of effect, and it will point to and shoot at enemies within the circle. The r key will toggle between drawing the areas and not. Quite a lot of progress!"}, {"post_id": 53480, "ts": "2026-08-24T01:35:31Z", "hours": 7.2239, "text": "I decided to give up on the isometry because I wasn’t really getting anything done. I have gone back to using a 2d map instead.| The map is made with the Tiled Map Editor ( https://thorbjorn.itch.io/tiled ) and saved as a JSON file. Tiled is good for visually building maps but a pain to work with. I’d much rather write a map editor from scratch, genuinely. I might do it at some point, honestly. The map is actually split up into 3 layers: the ground, where turrets can be placed; the path tiles, where enemies will walk; and the path polygon, which is a line that the enemies will follow. This allows me to have separate path and ground groups which will simplify turret-path collisions later. In theory, I will be able to make the enemies follow the polygon, too. I had to write a whole function just to parse the map JSON files. It organizes the layers into a dictionary of keys and 2-dimensional Numpy arrays. For the path polygon, it converts it from a list of dicts to tuples. It also removes any other inconsistencies with the original file and only keeps the important stuff. I made the map bigger than the screen itself so that it is draggable. The checks for boundaries are kind of buggy but it’ll do for now. This was just a matter of keeping a variable to track if the map is being dragged, keeping an offset, checking for boundaries, and checking for mouse movements. I know this was kind of a setback, but real progress can be made now!"}, {"post_id": 44368, "ts": "2026-08-10T02:37:52Z", "hours": 5.3789, "text": "Turns out, rendering isometric grids is pretty hard! I followed a tutorial by DaFluffyPotato on isometric rendering which let me understand the drawing part, but there are going to be some issues with the grid system in the future. I had an issue in which the grid wouldn’t draw half of itself, and it was because it was drawing everything to the right of the top tile outside it. I got it to work by multiplying the grid width by 2 and then adding an offset, but it’s kind of a band-aid and I want to research more into how to actually solve it. I did actually draw the sprites myself, though, and I have a grass block that looks really nice but that’ll be for later."}, {"post_id": 43389, "ts": "2026-08-08T16:28:30Z", "hours": 6.8456, "text": "I’ve been working for a while, mostly on backwards-facing stuff about the general project structure: A basic game class is used for the actual game instance, letting me manage variables and such and then pass them around. A scene manager class manages different screens in the game. Abstract methods are used to make sure scenes will always handle events, update, and render by making sure the methods are always implemented. Each scene is a class object with several methods. A config manager takes in a bunch of dataclasses and allows accessing the config like globals. Tests check to make sure that an error is raised if a wrong key is accessed, and other stuff. Player ships all inherit from one overall base ship class, and so do turret from their base turret class. Turrets have an attachment point and player ships have points to attach to. Both sprites are joined at the points so as to create a mounting system in which the same ship can use different turret configurations. The next thing to work on is to allow the turret to rotate as if it was on top of the ship, and to handle ship movement, having it rotate to face where it is moving. The following image is actually 2 different sprites: the turret (green) and the ship (below). It draws them by blitting the turret on top of the ship sprite. I have decided to change the theme of the project. The vast majority of the time in this devlog was the background, and luckily I didn’t have much progress on the actual game part. It will now be a tower defense game."}]...
|
Title: City Defenders TD by @nautrw | Stardance
D Title: City Defenders TD by @nautrw | Stardance
Devlogs:
I’ve been working for a while, mostly on backwards-facing stuff about the general project structure: A basic game class is used for the actual game instance, letting me manage variables and such and then pass them around. A scene manager class manages different screens in the game. Abstract methods are used to make sure scenes will always handle events, update, and render by making sure the methods are always implemented. Each scene is a class object with several methods. A config manager takes in a bunch of dataclasses and allows accessing the config like globals. Tests check to make sure that an error is raised if a wrong key is accessed, and other stuff. Player ships all inherit from one overall base ship class, and so do turret from their base turret class. Turrets have an attachment point and player ships have points to attach to. Both sprites are joined at the points so as to create a mounting system in which the same ship can use different turret configurations. The next thing to work on is to allow the turret to rotate as if it was on top of the ship, and to handle ship movement, having it rotate to face where it is moving. The following image is actually 2 different sprites: the turret (green) and the ship (below). It draws them by blitting the turret on top of the ship sprite. I have decided to change the theme of the project. The vast majority of the time in this devlog was the background, and luckily I didn’t have much progress on the actual game part. It will now be a tower defense game.
Turns out, rendering isometric grids is pretty hard! I followed a tutorial by DaFluffyPotato on isometric rendering which let me understand the drawing part, but there are going to be some issues with the grid system in the future. I had an issue in which the grid wouldn’t draw half of itself, and it was because it was drawing everything to the right of the top tile outside it. I got it to work by multiplying the grid width by 2 and then adding an offset, but it’s kind of a band-aid and I want to research more into how to actually solve it. I did actually draw the sprites myself, though, and I have a grass block that looks really nice but that’ll be for later.
I decided to give up on the isometry because I wasn’t really getting anything done. I have gone back to using a 2d map instead.| The map is made with the Tiled Map Editor ( https://thorbjorn.itch.io/tiled ) and saved as a JSON file. Tiled is good for visually building maps but a pain to work with. I’d much rather write a map editor from scratch, genuinely. I might do it at some point, honestly. The map is actually split up into 3 layers: the ground, where turrets can be placed; the path tiles, where enemies will walk; and the path polygon, which is a line that the enemies will follow. This allows me to have separate path and ground groups which will simplify turret-path collisions later. In theory, I will be able to make the enemies follow the polygon, too. I had to write a whole function just to parse the map JSON files. It organizes the layers into a dictionary of keys and 2-dimensional Numpy arrays. For the path polygon, it converts it from a list of dicts to tuples. It also removes any other inconsistencies with the original file and only keeps the important stuff. I made the map bigger than the screen itself so that it is draggable. The checks for boundaries are kind of buggy but it’ll do for now. This was just a matter of keeping a variable to track if the map is being dragged, keeping an offset, checking for boundaries, and checking for mouse movements. I know this was kind of a setback, but real progress can be made now!
I’ve probably progressed more in these ~6.25 hours than the rest of the project combined. Fixed the map dragging boundary checks. This was just a matter of separating the if statement into one for each axis. Now, even if the map won’t move on the y-axis, it can move on the x-axis, for example. I added an enemy. This was also pretty simple. They take in a path instead of a position, and their initial position is just the first index of the path (the path is a list of coordinates that they walk to). Vector math made this much easier, as I could just subtract the current position of the enemy from the target, and multiply it with movement speed to move it. The enemy is actually a parent class, and the specific slime in the video is a very simple subclass of it that just has some stats. Default enemy behavior is handled in that parent class. I made a customizable health bar class. The cool part about it is that it uses linear interpolation to change its color as the health changes relative to the maximum. I made a ballistic projectile parent class and an arrow subclass. It takes a position and a target, as well as other stats, and uses vector math to move to the target. When it hits an enemy it takes health from the enemy and then ceases to exist. There is a turret class and a crossbow. The turret takes a projectile class (the crossbow takes the arrow, for example). It will make a new instance of the projectile when shooting. It has a circle for a range of effect, and it will point to and shoot at enemies within the circle. The r key will toggle between drawing the areas and not. Quite a lot of progress!
I decided to just write the GUI from scratch. This is kind of uncharted territory for me. I tried using pygame_gui but it felt really restrictive and the use of a json file for customization is absurd to me. I made a basic element abstract class so that all elements must have an update and draw method. I then made a button class and a container class. All elements have an ID, and when a button is clicked it sends out a pygame event, which is a feature I did like from pygame_gui. I think I will end up eventually making an UI manager class, as handling the state within the scene is getting clunky and weird.
It took a while, but there have been some pretty big improvements. Transition to 1440x960px : I eventually found that being limited to 360x240 was going to be very limiting, specially with text because at low resolutions it looked like a jumbled mess. Thus I embarked on a pretty hard journey (not hard in retrospect) to figure out how to change the resolution but also keep the pixelated style without having to draw sprites at 4 times the resolution. The solution I ended up finding was to store a scale factor of 4 (360x4=1440, 240x4=960), and then scaling a separate surface to that resolution. Now, a surface is created with the same dimensions as the map, and everything is drawn to that surface instead of the map (I used to draw enemies, turrets, bullets, etc. onto the map because they moved together), and then that surface gets scaled. This allows me to keep the pixelated graphics on the actual game, and have crisp text on the GUI. For the offsets, I just moved the function that translated the screen coordinates to map ones from the map to the scene, and then adjusted it to take in the scale factor. Everything else works pretty much the same, as its only the image and mouse clicks getting scaled instead of rectangles. I scaled the button sprites to 32x32 to make them easier to draw, and then I have it in the config to scale them to 64x64. I decided to do that mostly for ease, because most of the other sprites are around that resolution anyway. Turret placement : I added more buttons to the GUI and added turret placement. The GUI itself is always going to be kind of janky. I moved it into its own class so as to sort of clean up the code in the main scene, but now the GUI manager does weird things like self.scene.game.screen.width which isn’t very pretty. It’ll do, though. I track a variable storing the turret to be placed (None if it’s not in that state) and a variable that stores whether it can be placed. I check for collisions between the path tiles (I knew it would be useful!) and the sprite to check if it can be placed. I also modified the draw function of the turret to make it red or green depending on it. GUI : Generally, for the GUI, I keep a state from an Enum (basically a fancy way of storing a string for a state), and then change the UI according to that state. I designed it in a way where it only rebuilds it on command, so it won’t rebuild the whole thing every frame, in hopes to save some sort of performance. Overall, some very good progress, even if it’s not 100% visible!
Lots of progress again! This one was slightly more in the background, as I started a little bit of housekeeping: Transition from Rects to FRects : FRects are the same thing as normal Rects, except that they allow for floats. This didn’t really have an impact on the game other than making it easier to work with vectors for positioning, as they also use floats. UI Changes : I changed the positioning aspect of the UI. I recreated the Rect placement system of pygame, where you can select a point (eg. top left, center, midbottom, etc.) to use to position the rect. This is very flexible, and I copied it. Now, I can do things like place text with much more ease. I also changed the colors of the UI to make it darker and overall nicer. I made it so that the user had to select a turret and then go to a menu to see the cost and other attributes of it, which will be better for the future. Coins : I added coins, which will be the temporary currency when inside the game. This will be used to buy towers and such. Outside the main game, I am planning to create another one that is used to buy skills and stuff, just to make it more realistic.
Quite a bit of progress! Pixel art revamp : The pixel art has generally improved massively. I actually took the time to get some inspiration from Google and worked on the tileset. It now includes a lake and also generally just looks better, with borders around the paths. It did take a lot of time, though. I also implemented animations for this, for the slime, and perhaps for the crossbow too. I also made a little card container for the top 2 stats. Waves : I added waves! It’s now technically a fully playable tower defense game, I guess. As of right now it’s going to crash as soon as it gets farther than Wave 3 because I don’t have anything to do after it, but soon I will add another scene for that.
I’ve kind of gotten into a slump, mostly because of school, but I think I’m back on track to finish this by the 30th of this month. Though I gotta say, it’s genuinely been slog to work on this now. I think I’m burning out Anyway, for the updates: Turret anti-aliasing : To fix the issue of turrets looking terribly when rotating, I used a new function that zooms and rotates the sprite, but also applies anti-aliasing. I can set the zoom scale to 1 and it will rotate the sprite but also anti-alias it. The jaggedness seen in other demos was because the actual map is rended in very low resolution (360x240) and then scaled up. GUI Makeover : I have given another makeover to the GUI. Now, most of it in the main game is a sleek semi-transparent black surface. I did this mostly because I couldn’t settle on a particular theme, and I didn’t know how to go about drawing such large sprites while still looking good. Waves : I finally got around to adding waves. They are a little buggy, but I ended up making a dictionary structure for the maps and put them in one big dictionary. This way, I can define which enemies spawn in which order, the interval between waves, etc. Enemies and turrets are also in their own dictionaries. Health : I added the health mechanic! It will now check if the health is equal or below 0 and send the user to a game over screen. Those screens will eventually get improved. Menus : I added a main menu, mostly because I had people trying the game, and it had to happen at some point. As of right now I am working on a map selector that harnesses that maps dictionary from earlier. (I did the devlog now because I was afraid of getting to 10h ) More menus and turrets : I added a ballista tower, which is slower but has higher range. I still have to balance it some more, and make a bolt projectile, and also probably make the tower control the damage instead of the arrow. That way I can subtract health from the enemy directly, which would fix an annoying bug where the turret shoots but the bullet doesn’t collide with the enemy, so it just stays there until it collides with another enemy. There is also another slime (the red slime) which is faster. This is to force the player to have at least 2 turrets.
I did this devlog mostly because I wanted to get a screenshot of (hopefully) six seven hours , but there has been some progress, even if it’s slow because now I have other things to do . Map Selector : I implemented a map selector, which will come in useful later on when I add more maps. I also want to do a little thing where every map is its own globe that kind of shows the outline of the map. I think it’ll look cool. Wave Control : I changed the wave logic to make it be controlled by the player. I was inspired by Bloons TD 6, and I think this makes it much better. Now, the player has as much time as they need to prepare for the next wave, or if they are feeling good they can just call in multiple waves and get it over with. Game Icon : I made a game icon, a shield with a golden cross and ruby in the center. I made it be the icon for the window, and it will be the icon for the .exe file when it’s time to ship. Canon : I added a cannon turret. It’s still kind of buggy, but the idea is that it will leave an explosion and that will also be the AoE so it can shoot multiple enemies, kind of like for crowd control. Generally, I really need to spend some time balancing the game, but I think that will come at a later time.
Ok, so a lot of progress, though it has been slow because the school year has genuinely driven a train through my productivity: Upgrades : This is the most recent thing, but basically I added upgrades. This is handled by using a list of values instead of single values when creating a new subclass of a Tower class. I track an upgrade index and increase it to change the index and some other stuff. I made some icons and added it to the tower selected menu. I will show the coins cost of the upgrade next, because I forgot to do that. I also made new sprites for the upgrades, and a complete resprite for the cannon, which badly needed it. I also remade the tower base, which looks much better now. Speed setting : I added a speed setting. This was a matter of tracking a delta time multiplier, and then multiplying it with everything that uses delta time. Remember that delta time is the amount of time between frames. It lets the developer do things like move an enemy at a movement speed independent of the frame rate, because the movement is split between the delta time. Frostspire : I added a new Frostspire tower. This is a tower that shoots icicles at enemies and makes them slower. To do the slower part, I made an effect system that gets appended to an array in the enemy. Effects have an overlay color, and will have several attributes that are applied to the enemy if it has them. As of right now, there is just a movement speed multiplier. I want to add a final venom tower that damages enemies over time, and that should be pretty easy. Tank slime : I added a tank slime, which is supposed to be the final boss of the Ground Zero map. I’m not sure if I have the inspiration to make more enemies other than slimes, or the drawing skills. Essentially it’s just a much bigger slime (takes up the whole width of the path) and green, and slower, and has a lot of health. I have to take the time to balance everything though, because 2 of the basic crossbows can kill it as of right now.
I am very glad stardance got extended! This definitely eases the pressure A LOT . Bit of a shorter devlog so as to not accidentally pass the 10h deadline. Here are the updates: Venom shooter : The venom shooter is a plant that shoots venom. It will poison the enemy. I did this through another effect. The recording doesn’t show it’s full potential, because I kind of force pushed to the repository and now I lost the change, but I have it on another computer. Essentuially, the damage over time is going to increase with the update instead of staying static and linked to the effect. More tiles! : I added the stone path tiles. They still need a little bit of work, as some areas don’t fully connect. The nice thing about working with stone sprites is that the textures connect pretty well regardless, but it’s still something I need to fix. New Map : I added a new map, Frontier. This one is just a somewhat harder version of Ground Zero, mostly to test out if the map selector and the new tiles actually worked. The map selector just had to be tweaked to refresh the UI when a new button is clicked, which is only one line, but otherwise everything went smoothly. Ghost : I added a new enemy, the Ghost. The ghost looks like a tortured soul, and at the moment he hasn’t received proper stats, so he’s just a clone of the slime. I want to make it somewhere in between the slime and fast slime. It uses a lot more frames than the other enemies to make it somewhat smooth. Ok chat I think we got this in the bag im tryna get that bambu a1 3d printer frfr i think i can get it now that the deadline has been increased tysm stardance devs!!!!
Progress has been (very) slow but there’s some more new content: Crabs & Bat : I added crab enemies. There is a normal crab that is like a slime and then an armored crab (not shown in video) that is bigger and meant to be a boss. There is also a bat enemy. Pause Menu : Theere is a pause menu now. It allows the user to retry the map or go back to the main menu. I am finally making use of the other features of the scene manager. It’s a different scene but it’s rendered on top of the main game scene. I had to modify the scene manager to draw each scene on top of the last one in the stack. Otherwise, this is just the same usage of my GUI system. Rebalances : I did some rebalancing of the game. Towers generally cost different amounts of coins now and do different amounts of damage. I’ll probably have to do it again by the end of the project but this will do for now. Music : I am in the process of adding music. I am getting them from https://opengameart.org and crediting all publishers. I have a system where it will queue music files from a playlist and play those in sequence. They are pretty long files, but just in case. I’m probably forgetting some stuff (last time I touched this was like a week ago), but those are the major things.
A little bit faster progress now. Tower Shop : I have started work on a tower shop. I want it to be from the POV of the player looking into a medieval stall. As of right now, I’m still working on drawing it, and also it’s still hidden and non-functional. I edited all the towers to have a requirement of another tower, so as to make it a progression later on, Data Saving : I am going to start implementing a save system. For this, I just put some values into a data class and then implemented a way to save it to and load it from JSON. Molten Lands : There is a new map now, the molten lands. I also made a lava slime which is a bit stronger than the other enemies except for the bosses. It took a while to draw the sandy tiles for it, but I feel as though I’ve gotten much better at drawing than before. Logging : I added logging. This probably should’ve been added earlier, but this will help tremendously to fix any bugs in the code. For now, I am logging pretty much everything that doesn’t happen every frame, like when an enemy dies or the user clicks on a button.
I’ve started work on a tower shop. I spent several hours drawing the background, but I think it came out looking really good. It only took so much time, which is why I’m making the log now. I also used a template human model for the merchant. I am going to show the different upgrades on the menu. I haven’t added the buy functionality yet, but that will probably be pretty easy. I got some chill guitar music from opengameart.
I’ve been working on 2 major things that look small but are actually pretty big: Currency buttons : I’ve had to do some major revamps to several parts of the GUI system, but now I have buttons that show the currency. I am now using these for the upgrades, buy towers, and the new tower shop with the shards. I am now allowing for icon elements to be passed into the Button class. This allows for custom positioning, and thus this new way of buttons. Then I had to change the way that elements refreshed in the GUI managers. It took a while to figure out, but now they will be red if there isn’t enough currency. Main menu background : Art is incredibly time-consuming for me, and I keep scrapping designs but I think this one is the one and the one I’ll stick with for the finished thing.
I’ve been kind of behind again, but I think I’ve made some cool stuff. Tower shop is now an official mechanic. I just remembered I need to set the default shards back to 0, but it’s fully working now. Main menu : I ended up setting the background of it to a stone wall, which to be honest is just taken from the tower shop background. I was wasting too much time on drawing. Map selector music : I finally got some music for the map selector. It’s some public domain guitar music like the tower shop, but different. I think it sounds pretty nice. Victory & defeat scene revamp : I revamped the victory and defeat scenes. Now, they show a banner in the center of the screen and the amount of shards the player receives. A defeat will get 1/2 of the shards reward, to allow them to actually improve. 3x speed setting : While waiting for the enemies to get to the end so I could test the defeated scene, I got tired and decided to add a new 3x speed button. I ended up refactoring the whole thing but now the code is much cleaner.
There’s been a lot of progress, I think. The game is pretty much done at this point. What’s left is just to balance the game. Renamed Ground Zero to Magic Forest : Magic Forest sounds like a much cooler name that fits the theme of the game, so I just renamed it. Data Saving : I finally got around to saving the data when closing. I just made a function that closed the game and then saved the data, and then any pathway that exits the game just calls that function. Save and quit : I added a save and quit feature to the pause menu. I am now tracking a state inside the pause menu GUI manager. There is first a save and quit option, and then that leads to a second menu that warns the player and asks them to confirm their choice. There is also an X button in the main menu that straight up quotes the game, too. Archipelago : I made a new map, the Archipelago. This follows a thin strip of land on which the enemies walk. I actually had to rework how the map system worked, adding an option to draw the ground on top or below the blocked layer. I also had to add an extra check on the logic for determining if a player can place a tower. Flamethrower : I added a new flamethrower tower. As of right now, it has the same stats as the cannon. I am going to be balancing the whole thing soon. This is going to be the final tower I think....
|
1792619351.3911572
|
1793224151.3911572
|
|
26001
|
Project Muniris by @shbebeek | Stardance
|
shbebeek
|
1
|
120.2
|
1013
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T05:31:47Z", "hours": 119.0, "multiplier": 8.54, "payout": 1013, "blessing": "neutral", "text": "This is my first ever fully finished Unity game, named Muniris! It is a 2-player action adventure game that combines RPG and shooter-based mechanics to make for dynamic and differentiating playstyles for everyone. Each player has a left and right hand that control different purposes: the left hand performs magic attacks/items, and the right hand shoots whatever gun you have equipped. Each player can choose their own loadout and upgrade their items along the way. To check out the project take a look at the README of my GitHub repo, as it contains info on which version you can play depending on your operating system. Enjoy!", "repo": "https://github.com/shbebeek/Muniris", "demo": "https://gamejolt.com/games/muniris-online/1100476"}]...
|
[{"post_id": 72059, "ts": "202 [{"post_id": 72059, "ts": "2026-09-22T03:03:44Z", "hours": 1.2, "text": "Another quick update, I made another build of the game that is includes compatibility with Windows, where the player starts off with a couple of items and a bit farther ahead in the game. I thought that the browser version would work for non-Mac users but I realize now that the servers really can’t run Muniris very well. Thanks for your patience everyone!"}, {"post_id": 69953, "ts": "2026-09-18T03:55:04Z", "hours": 5.1333, "text": "Hi guys, one last quick log. I’ve been working to ship Munirism over the last couple of days and ran into a bunch of computer issues due to itch.io not being able to take files more than 1 gb in size (and my computer kept crashing every time I tried to build the game). Thankfully, I got a working link to play on a browser and a link to the Mac download of the project for people who would like better frame rate optimizations. Since I can’t submit 2 test links, I’ll give the Mac download here: https://gamejolt.com/games/muniris/1100442 . Thanks everyone!"}, {"post_id": 68963, "ts": "2026-09-16T03:50:51Z", "hours": 9.4, "text": "Good evening fellow coders, this is my final devlog for Project Muniris! I added in all of the mechanics that I wanted to into this final portion of the game and it is finally ready to be shipped. To summarize what I did, I made a bite-size castle area where there is a HUGE enemy gauntlet, which contains a final climb to the top of the hourglass that has been tantalizing the player ever since they entered the game. Since the castle is so high up that you can see past the boundary walls, I added a dense fog at the bottom of the castle that respawns you if you fall just in case the player fails any of the challenges. I created one final enemy type, that being an RPG turret, which essentially can shoot tons of missiles that seek out the players. Additionally, the last gun, the sniper rifle, was a fun time to speed develop since I realized that the mouse sensitivity was WAY too high for the player to reliably shoot when the rifle was zoomed in all the way. Due to this observation, I tweaked the mouse sensitivity via scripting so that when the camera is not zoomed in, it has a greater mouse sensitivity than when it is. Furthermore, I finally added a bunch of musical/sound assets into the game! All of the bullets from enemy and player fire have sound effects added to them. Each area also has a unique track to it, making them stand out from one another. While each track may not be musical, I made sure to find a bunch of immersive sound effects to increase the player’s auditory connection with the game. All in all, it feels very bittersweet writing this devlog, as it is the capstone to one of my longest and most passionate projects ever. I’m really thankful to the Stardance team for creating this program, as the community it developed really helped motivate me along the way. Most of all, thank you to you guys as well! Reading your comments and seeing what other people are doing has been really fun the past couple of months. Best of luck everyone!"}, {"post_id": 67858, "ts": "2026-09-14T04:19:41Z", "hours": 6.0667, "text": "Hey everyone, this is probably going to be one of my last devlogs for this project, as it is nearing completion. For starters, I finished the tundra area today, which combined my original idea of 2 separate mountain and “heavy weather” areas. It is a much more open area that the player is free to explore, but requires the double jump and dash to get into. At this point in time, all I really have left to do is create a quick ending area in the form of a castle, where the player will infiltrate the area and get to a giant hourglass at the end marking the finale of the game. I still have to create a new gun for the ending, and I’m leaning towards a sniper rifle. Since the player will have had tons of experience with the right-hand guns for a while, I’m thinking of making the sniper a bit harder to aim but having lots of damage as a tradeoff. Additionally, I added a bunch of snow particles falling from the sky to simulate a snowstorm, and it actually turned out pretty well! Due to occlusion culling, the framerate can actually survive all the snow being generated, and allowed me to create a lot it. Lastly, I added a tiny script that changed the skybox when you enter the area so that it seems cloudy instead of sunny, just so that the snow doesn’t seem like it’s appearing out of nowhere. As a personal anecdote, this project has been really fun to create the past couple of months, and has seriously boosted my design/programming skills (and time management). There will probably be one more devlog before I ship Project Muniris, but in any case I just wanted to share my thoughts on my journey through Stardance here."}, {"post_id": 67111, "ts": "2026-09-13T05:25:35Z", "hours": 8.3, "text": "Hi again fellow devs, over the course of the week I have been working on a bunch of stuff that I am excited to share. First off, I finished up the mine mini dungeon, where the player has to hit switches in order to unlock gates and progress throughout the area. It isn’t the most complex of puzzles but it gets the job done in a 3d platformer/shooter. Secondly, I added in 2 new abilities: the double jump and the dash. Essentially, via giving each player an extra jump whenever they’re in the air, I can enable them to double jump, and when they dash I simply set the non-vertical movement speed very high for a quick moment. I initially had some problems with the dash where it could send you flying upward if you collided with terrain/obstacles, but I mitigated how far up it can send you when you collide with other objects. Past these abilities, I am currently in the middle of a snowfield area, where the players will have to use both of their new movement abilities to traverse the area and make it to their final destination, the castle. I’ve decided to make it so that any currency you collected along the way in the game will be displayed at the end, and you will be able to see both your completion percentage and your total run time. I don’t think the game should take too long to beat, so I’m trying to make it have some replay value along the way. One last thing I forgot to mention was that I spent a bunch of time fixing the jump, since the coyote time would make your jump seem to blast off in the air super high. I know I said I fixed this problem in my past devlogs, but it seemed to keep coming back for whatever reason. Now though, I am happy to say that I fixed the error via taking a deeper look at when the coyote time should reset back to 0.2 seconds (any time above 0 means you can still jump after you fall off a ledge). In total, this game is almost finished, I just have to add 1 more area and give it a thorough run-through!"}, {"post_id": 65758, "ts": "2026-09-11T03:24:26Z", "hours": 5.7667, "text": "Hi developers, I just finished the base layout for the mine system that I am developing as one of the final areas of the game. At this point in time, I am trying to finish the mine area, create a quick mountain area, and make a short castle segment that acts as the final challenge of the game. Since the game is open world, little hints and clues as to where items might be located are scattered around the world now. Additionally, I worked on some post-processing effects for the mine area, which is why it is so dark on the right side of the screen compared to the left side; I will eventually add post-processing for all areas once I finish all the other parts of the game. In terms of item adjustments, I made it so that the chakram has a point light attached to it that can act as a miniature burst of light in dark areas. My last thing for now is a little issue that I ran into while adjusting the lighting for the game. Essentially, I switched from baking lighting back to generating realtime lighting because I realized that my computer can’t really handle baking lighting for so many objects in the scene, so I wanted to just generate it all in realtime to make things easier. After I tweaked these settings and generated the new lighting, I pressed play and the game totally nuked itself. Every game object had broken out of its hierarchy and 75% of them were straight up missing/deleted (all they left behind were empty transforms). I tried for a while to recover the scene but nothing was working, and eventually I had to force quit Unity due to it having stopped responding to my inputs. After I reopened Unity, the scene was back to normal! All in all, lesson learned to not panic when all seems lost and to not upset grumpy old Unity about lighting anymore."}, {"post_id": 64589, "ts": "2026-09-09T03:06:19Z", "hours": 3.2667, "text": "Hello everyone, today I worked on fixing the player UI and coded the chakram left-hand item I’ve been working on. After seeing that at different screen sizes/resolutions the UI would change shape and position, I adjusted the anchors of each UI element and made sure that they looked nice together no matter the screen size. The chakram ability turned out very nice, as with the additional fire/spark fx it feels pretty cool to throw around. I made it so that the chakram will interact with any physics object, meaning that it can bounce around a bunch before returning to the player. Looking ahead to the next area, I am thinking of a maze-like mine segment where the player will get either a new gun or the dash ability. See you all next time!"}, {"post_id": 63978, "ts": "2026-09-08T02:19:27Z", "hours": 8.8, "text": "Hello fellow devs, writing this now I realize that this game has gotten to a pretty large scale and I might not have time to finish everything I wanted to do with this game before I ship it. HOWEVER, I will be working my hardest to make sure that this game still contains the core aspects of what I wanted it to be. Speaking of, I made a whole new “forest hideout” area where there are a lot of enemies and slight platforming challenges. I coded in moving platforms that essentially just move around using an animation, and when the player jumps on one their parent transform is linked to the platform so that the camera doesn’t fall off. Furthermore, I finally added locked doors to the game, so the player has to first find some keys before they can open certain doors in this area. At the end of the hideout, I am working on a chakram left-hand ability that will be able to return to the player after being thrown, acting sort of like a boomerang. During the middle of the development of this area, the framerate dropped like CRAZY and I had to take a whole bunch of time to fix the parameters of the game so that it could run better. To sum up all the changes I made, I added occlusion culling, baked lighting for static objects, and tweaked the rendering distance for terrain like trees and grass. Lastly, I tuned up the player’s jump because it was getting really random jump heights and I wanted to make it more consistent. All in all, this project is going great and I can’t wait to ship it to all of you!"}, {"post_id": 62548, "ts": "2026-09-06T00:11:13Z", "hours": 8.6, "text": "Hey guys, I just finished up the left-hand healing item that I’ve been hinting at in my recent devlogs. It is a magic bottle that will heal you up at the cost of magic. I used a special visual fx in order to make the heal seem more “magical.” I also heavily tweaked the enemy vision system so that the enemies can see the secondary player and choose to aim at them instead of just the primary player. Currently I am trying to fix a problem where the UI will go crazy if you resize the screen, so I will be working on that from now on. Other than that, I also fixed an error where only the secondary player’s health ui would update, leading to both the primary player’s health and game over screen being stuck on the wrong camera. Best of luck everyone!"}, {"post_id": 58491, "ts": "2026-08-30T22:13:10Z", "hours": 6.2667, "text": "Hey everyone, long time since I posted here. Last week I realized that inside of my areas, there are not a lot of rewards given to the player in terms of their stats. So, instead of developing that new left-hand item I talked about in my last devlog, I decided to make an upgrade system where the player can receive health, magic, or stamina upgrades scattered around chests throughout the world. I also added a little series of clues to get the key and the eventual healing item hidden in the lake of this region through visual cues (ex. a heart-shaped rock formation) and text written on the walls of certain shelters. See you guys next time!"}, {"post_id": 53431, "ts": "2026-08-23T23:40:01Z", "hours": 3.7667, "text": "Hi guys! Today I finished up the code and tuning for both the rpg and mech enemy that I have been designing the past couple of days. I added a cool explosion to the gun whenever the bullet collides with an object, which creates some really cool visual effects. However, the bullet will still explode underwater; since I’m thinking of having a feature of being underwater that your guns misfire anyways, I’ll just keep this effect for now. With the new gun item and enemies all finished up, I am excited to say that I am almost done with this lake area. I am proud to say that it is of a much better quality than the tutorial area and is heavily focused on platforming, which will hopefully generate some fun chaos with 2 people playing at the same time. The last thing I have to do with this area is give it a proper “final upgrade.” I’m thinking of it being a healing item you can use with your left hand that takes a lot of magic but slowly heals you up. See you all later!"}, {"post_id": 51974, "ts": "2026-08-21T23:36:52Z", "hours": 3.3, "text": "Hey guys, quick update here. Lately I’ve been working on a heat-seeking missile, and although I encountered a lot of different bugs today I finished the weapon up (kind of). I’m using a software called Linq to filter out enemies and get the closest one to the missile, but a problem I encountered is that the algorithm doesn’t account for colliders between the missile and the enemy. I’ve tried a bunch of stuff such as raycasting and Physics.linecast, but nothing seems to be working. I’m gonna take a break for today and come back tomorrow with a fresh mindset. Other than that, I also am finishing up a “mech” enemy that has different pieces of it you have to destroy in order to kill it. I’ll give a bigger explanation of this enemy when I finish it. Thanks for reading!"}, {"post_id": 51426, "ts": "2026-08-21T03:53:02Z", "hours": 8.7333, "text": "Greetings fellow developers, as of right now I have been furthering development on the lake area of the game right outside the tutorial. Development is progressing well, and I am just about finished with the overall design of the area. On the programming side, I have been working on “heat-seeking” missiles that will be the reward for the player in the form of a new right-handed weapon at the end of the area. I’m thinking of having a key to a chest being hidden at the top of the area and the player has to dive down to the deepest part of the lake to open the chest in order to make the area loop in on itself. If anybody has any ideas for left-handed items let me know!"}, {"post_id": 47900, "ts": "2026-08-16T05:25:50Z", "hours": 4.7, "text": "What’s up everyone, over the last couple of days I’ve been working towards finishing up the lake area. This area is mainly focusing on platforming and refining the platforming that is seen inside of the tutorial area, as I feel as if that area has some janky features. I will eventually add enemies and some mini-bosses to fight while you are jumping from rock to rock, but as said before this is mainly for the spectacle and the platforming. I am thinking about adding some sort of a movement ability at the end of this area to reward the player, but I do not want to overpower the player too much at the beginning of the game. If you have any ideas please comment them down below, they would be well appreciated!"}, {"post_id": 46897, "ts": "2026-08-14T13:19:17Z", "hours": 5.1, "text": "Hey everyone, quick update here. I’m currently in the process of making a beach area to highlight the water effect that I developed over the past couple of days. I added a bunch of different terrain textures and tree assets, so the area itself should look a little different than the typical forest/grassy area of the tutorial. I hope to add some post-processing for outside of the water eventually as well."}, {"post_id": 45235, "ts": "2026-08-11T16:04:46Z", "hours": 8.5333, "text": "Today I finished up a new ladder system and the water post-processing effects, alongside a much-needed tuning of base speeds, maximum velocities, and the different forces added to the player (for example the jumping force). I noticed that in the vertical platforming sections I did not add shortcuts to get back up in case the player fell all the way back down, so I decided to add a ladder system that will extend down when the player reaches a certain spot. Furthermore, with the water system being finished up, I can now focus on making more unique areas of the map and creating engaging gameplay instead of just tutorial and test areas. See you guys soon!"}, {"post_id": 42060, "ts": "2026-08-06T16:50:40Z", "hours": 4.0333, "text": "Hey everyone, it’s been a while. Currently I am trying to implement a water mechanic inside of the game where players can enter the water and swim freely without the effects of gravity. Mechanics are working well to my surprise, and the only thing left to really work on is the post-processing for when you dive in. Unfortunately, I realized that the jump mechanic has to be kind of reworked due to the fact that the player does not have control over their momentum after they jump, making platforming way harder. All in all, development is trucking along."}, {"post_id": 37917, "ts": "2026-07-30T22:28:39Z", "hours": 3.8667, "text": "At this point in time, I finished fixing up the UI system so that the 2 different players are both able to control their separate canvases, while there remains a large canvas that encompasses the entirety of the screen. This can be utilized through the time slower item, for example, as the entire screen is scene through a blue lens when the item is used. Furthermore, I added a house next to a dry lake (at the moment), and will figure out how to add a water mechanic to the game that will require certain items for the players to swim across. Lastly, in order to enter the first eventual “dungeon” of the game, players will need to get the attention of the big dragon in the sky that was added recently. It currently just roams around from point to point but when the players get to a specific point they will need to utilize its positioning."}, {"post_id": 36110, "ts": "2026-07-28T00:09:04Z", "hours": 2.5, "text": "Currently I am working on making a UI system that can fit both players. I have 3 separate canvases all controlled by a main UI Manager script. Basically, there is 1 canvas for each player and then there is 1 canvas that covers both players’ screens."}, {"post_id": 33509, "ts": "2026-07-23T14:54:08Z", "hours": 1.5667, "text": "I just finished integrating the second player’s movement and UI into the game. I made it so that the 2 players share a common magic meter, which is a circular ring in the center of the screen. I try to make the gameplay require cooperation as much as possible via having both players share certain game mechanics such as their magic. With that, I have also finished the enemy tutorial area!"}, {"post_id": 32678, "ts": "2026-07-22T00:03:43Z", "hours": 2.8, "text": "I am currently working on the 2-player functionality of the code for this game. Since some of Unity’s canvas assets are not built for 2-player unless you update them in a certain way, I have to manually go in and update my scripts to make the world objects function as expected. All in all, development is rocky but progressing."}, {"post_id": 31768, "ts": "2026-07-20T12:38:29Z", "hours": 4.4667, "text": "I just finished the chest system as well as the coin system. Taps are the standard currency and joules are a rare currency that can net you cool items that wouldn’t be available normally."}, {"post_id": 23766, "ts": "2026-07-06T21:56:29Z", "hours": 3.5333, "text": "Just finished the enemy code to track down the player and try to shoot the player, it has been a little rough with the balancing but development is going well on the programming side."}]...
|
Title: Project Muniris by @shbebeek | Stardance
D Title: Project Muniris by @shbebeek | Stardance
Devlogs:
Just finished the enemy code to track down the player and try to shoot the player, it has been a little rough with the balancing but development is going well on the programming side.
I just finished the chest system as well as the coin system. Taps are the standard currency and joules are a rare currency that can net you cool items that wouldn’t be available normally.
I am currently working on the 2-player functionality of the code for this game. Since some of Unity’s canvas assets are not built for 2-player unless you update them in a certain way, I have to manually go in and update my scripts to make the world objects function as expected. All in all, development is rocky but progressing.
I just finished integrating the second player’s movement and UI into the game. I made it so that the 2 players share a common magic meter, which is a circular ring in the center of the screen. I try to make the gameplay require cooperation as much as possible via having both players share certain game mechanics such as their magic. With that, I have also finished the enemy tutorial area!
Currently I am working on making a UI system that can fit both players. I have 3 separate canvases all controlled by a main UI Manager script. Basically, there is 1 canvas for each player and then there is 1 canvas that covers both players’ screens.
At this point in time, I finished fixing up the UI system so that the 2 different players are both able to control their separate canvases, while there remains a large canvas that encompasses the entirety of the screen. This can be utilized through the time slower item, for example, as the entire screen is scene through a blue lens when the item is used. Furthermore, I added a house next to a dry lake (at the moment), and will figure out how to add a water mechanic to the game that will require certain items for the players to swim across. Lastly, in order to enter the first eventual “dungeon” of the game, players will need to get the attention of the big dragon in the sky that was added recently. It currently just roams around from point to point but when the players get to a specific point they will need to utilize its positioning.
Hey everyone, it’s been a while. Currently I am trying to implement a water mechanic inside of the game where players can enter the water and swim freely without the effects of gravity. Mechanics are working well to my surprise, and the only thing left to really work on is the post-processing for when you dive in. Unfortunately, I realized that the jump mechanic has to be kind of reworked due to the fact that the player does not have control over their momentum after they jump, making platforming way harder. All in all, development is trucking along.
Today I finished up a new ladder system and the water post-processing effects, alongside a much-needed tuning of base speeds, maximum velocities, and the different forces added to the player (for example the jumping force). I noticed that in the vertical platforming sections I did not add shortcuts to get back up in case the player fell all the way back down, so I decided to add a ladder system that will extend down when the player reaches a certain spot. Furthermore, with the water system being finished up, I can now focus on making more unique areas of the map and creating engaging gameplay instead of just tutorial and test areas. See you guys soon!
Hey everyone, quick update here. I’m currently in the process of making a beach area to highlight the water effect that I developed over the past couple of days. I added a bunch of different terrain textures and tree assets, so the area itself should look a little different than the typical forest/grassy area of the tutorial. I hope to add some post-processing for outside of the water eventually as well.
What’s up everyone, over the last couple of days I’ve been working towards finishing up the lake area. This area is mainly focusing on platforming and refining the platforming that is seen inside of the tutorial area, as I feel as if that area has some janky features. I will eventually add enemies and some mini-bosses to fight while you are jumping from rock to rock, but as said before this is mainly for the spectacle and the platforming. I am thinking about adding some sort of a movement ability at the end of this area to reward the player, but I do not want to overpower the player too much at the beginning of the game. If you have any ideas please comment them down below, they would be well appreciated!
Greetings fellow developers, as of right now I have been furthering development on the lake area of the game right outside the tutorial. Development is progressing well, and I am just about finished with the overall design of the area. On the programming side, I have been working on “heat-seeking” missiles that will be the reward for the player in the form of a new right-handed weapon at the end of the area. I’m thinking of having a key to a chest being hidden at the top of the area and the player has to dive down to the deepest part of the lake to open the chest in order to make the area loop in on itself. If anybody has any ideas for left-handed items let me know!
Hey guys, quick update here. Lately I’ve been working on a heat-seeking missile, and although I encountered a lot of different bugs today I finished the weapon up (kind of). I’m using a software called Linq to filter out enemies and get the closest one to the missile, but a problem I encountered is that the algorithm doesn’t account for colliders between the missile and the enemy. I’ve tried a bunch of stuff such as raycasting and Physics.linecast, but nothing seems to be working. I’m gonna take a break for today and come back tomorrow with a fresh mindset. Other than that, I also am finishing up a “mech” enemy that has different pieces of it you have to destroy in order to kill it. I’ll give a bigger explanation of this enemy when I finish it. Thanks for reading!
Hi guys! Today I finished up the code and tuning for both the rpg and mech enemy that I have been designing the past couple of days. I added a cool explosion to the gun whenever the bullet collides with an object, which creates some really cool visual effects. However, the bullet will still explode underwater; since I’m thinking of having a feature of being underwater that your guns misfire anyways, I’ll just keep this effect for now. With the new gun item and enemies all finished up, I am excited to say that I am almost done with this lake area. I am proud to say that it is of a much better quality than the tutorial area and is heavily focused on platforming, which will hopefully generate some fun chaos with 2 people playing at the same time. The last thing I have to do with this area is give it a proper “final upgrade.” I’m thinking of it being a healing item you can use with your left hand that takes a lot of magic but slowly heals you up. See you all later!
Hey everyone, long time since I posted here. Last week I realized that inside of my areas, there are not a lot of rewards given to the player in terms of their stats. So, instead of developing that new left-hand item I talked about in my last devlog, I decided to make an upgrade system where the player can receive health, magic, or stamina upgrades scattered around chests throughout the world. I also added a little series of clues to get the key and the eventual healing item hidden in the lake of this region through visual cues (ex. a heart-shaped rock formation) and text written on the walls of certain shelters. See you guys next time!
Hey guys, I just finished up the left-hand healing item that I’ve been hinting at in my recent devlogs. It is a magic bottle that will heal you up at the cost of magic. I used a special visual fx in order to make the heal seem more “magical.” I also heavily tweaked the enemy vision system so that the enemies can see the secondary player and choose to aim at them instead of just the primary player. Currently I am trying to fix a problem where the UI will go crazy if you resize the screen, so I will be working on that from now on. Other than that, I also fixed an error where only the secondary player’s health ui would update, leading to both the primary player’s health and game over screen being stuck on the wrong camera. Best of luck everyone!
Hello fellow devs, writing this now I realize that this game has gotten to a pretty large scale and I might not have time to finish everything I wanted to do with this game before I ship it. HOWEVER, I will be working my hardest to make sure that this game still contains the core aspects of what I wanted it to be. Speaking of, I made a whole new “forest hideout” area where there are a lot of enemies and slight platforming challenges. I coded in moving platforms that essentially just move around using an animation, and when the player jumps on one their parent transform is linked to the platform so that the camera doesn’t fall off. Furthermore, I finally added locked doors to the game, so the player has to first find some keys before they can open certain doors in this area. At the end of the hideout, I am working on a chakram left-hand ability that will be able to return to the player after being thrown, acting sort of like a boomerang. During the middle of the development of this area, the framerate dropped like CRAZY and I had to take a whole bunch of time to fix the parameters of the game so that it could run better. To sum up all the changes I made, I added occlusion culling, baked lighting for static objects, and tweaked the rendering distance for terrain like trees and grass. Lastly, I tuned up the player’s jump because it was getting really random jump heights and I wanted to make it more consistent. All in all, this project is going great and I can’t wait to ship it to all of you!
Hello everyone, today I worked on fixing the player UI and coded the chakram left-hand item I’ve been working on. After seeing that at different screen sizes/resolutions the UI would change shape and position, I adjusted the anchors of each UI element and made sure that they looked nice together no matter the screen size. The chakram ability turned out very nice, as with the additional fire/spark fx it feels pretty cool to throw around. I made it so that the chakram will interact with any physics object, meaning that it can bounce around a bunch before returning to the player. Looking ahead to the next area, I am thinking of a maze-like mine segment where the player will get either a new gun or the dash ability. See you all next time!
Hi developers, I just finished the base layout for the mine system that I am developing as one of the final areas of the game. At this point in time, I am trying to finish the mine area, create a quick mountain area, and make a short castle segment that acts as the final challenge of the game. Since the game is open world, little hints and clues as to where items might be located are scattered around the world now. Additionally, I worked on some post-processing effects for the mine area, which is why it is so dark on the right side of the screen compared to the left side; I will eventually add post-processing for all areas once I finish all the other parts of the game. In terms of item adjustments, I made it so that the chakram has a point light attached to it that can act as a miniature burst of light in dark areas. My last thing for now is a little issue that I ran into while adjusting the lighting for the game. Essentially, I switched from baking lighting back to generating realtime lighting because I realized that my computer can’t really handle baking lighting for so many objects in the scene, so I wanted to just generate it all in realtime to make things easier. After I tweaked these settings and generated the new lighting, I pressed play and the game totally nuked itself. Every game object had broken out of its hierarchy and 75% of them were straight up missing/deleted (all they left behind were empty transforms). I tried for a while to recover the scene but nothing was working, and eventually I had to force quit Unity due to it having stopped responding to my inputs. After I reopened Unity, the scene was back to normal! All in all, lesson learned to not panic when all seems lost and to not upset grumpy old Unity about lighting anymore.
Hi again fellow devs, over the course of the week I have been working on a bunch of stuff that I am excited to share. First off, I finished up the mine mini dungeon, where the player has to hit switches in order to unlock gates and progress throughout the area. It isn’t the most complex of puzzles but it gets the job done in a 3d platformer/shooter. Secondly, I added in 2 new abilities: the double jump and the dash. Essentially, via giving each player an extra jump whenever they’re in the air, I can enable them to double jump, and when they dash I simply set the non-vertical movement speed very high for a quick moment. I initially had some problems with the dash where it could send you flying upward if you collided with terrain/obstacles, but I mitigated how far up it can send you when you collide with other objects. Past these abilities, I am currently in the middle of a snowfield area, where the players will have to use both of their new movement abilities to traverse the area and make it to their final destination, the castle. I’ve decided to make it so that any currency you collected along the way in the game will be displayed at the end, and you will be able to see both your completion percentage and your total run time. I don’t think the game should take too long to beat, so I’m trying to make it have some replay value along the way. One last thing I forgot to mention was that I spent a bunch of time fixing the jump, since the coyote time would make your jump seem to blast off in the air super high. I know I said I fixed this problem in my past devlogs, but it seemed to keep coming back for whatever reason. Now though, I am happy to say that I fixed the error via taking a deeper look at when the coyote time should reset back to 0.2 seconds (any time above 0 means you can still jump after you fall off a ledge). In total, this game is almost finished, I just have to add 1 more area and give it a thorough run-through!
Hey everyone, this is probably going to be one of my last devlogs for this project, as it is nearing completion. For starters, I finished the tundra area today, which combined my original idea of 2 separate mountain and “heavy weather” areas. It is a much more open area that the player is free to explore, but requires the double jump and dash to get into. At this point in time, all I really have left to do is create a quick ending area in the form of a castle, where the player will infiltrate the area and get to a giant hourglass at the end marking the finale of the game. I still have to create a new gun for the ending, and I’m leaning towards a sniper rifle. Since the player will have had tons of experience with the right-hand guns for a while, I’m thinking of making the sniper a bit harder to aim but having lots of damage as a tradeoff. Additionally, I added a bunch of snow particles falling from the sky to simulate a snowstorm, and it actually turned out pretty well! Due to occlusion culling, the framerate can actually survive all the snow being generated, and allowed me to create a lot it. Lastly, I added a tiny script that changed the skybox when you enter the area so that it seems cloudy instead of sunny, just so that the snow doesn’t seem like it’s appearing out of nowhere. As a personal anecdote, this project has been really fun to create the past couple of months, and has seriously boosted my design/programming skills (and time management). There will probably be one more devlog before I ship Project Muniris, but in any case I just wanted to share my thoughts on my journey through Stardance here.
Good evening fellow coders, this is my final devlog for Project Muniris! I added in all of the mechanics that I wanted to into this final portion of the game and it is finally ready to be shipped. To summarize what I did, I made a bite-size castle area where there is a HUGE enemy gauntlet, which contains a final climb to the top of the hourglass that has been tantalizing the player ever since they entered the game. Since the castle is so high up that you can see past the boundary walls, I added a dense fog at the bottom of the castle that respawns you if you fall just in case the player fails any of the challenges. I created one final enemy type, that being an RPG turret, which essentially can shoot tons of missiles that seek out the players. Additionally, the last gun, the sniper rifle, was a fun time to speed develop since I realized that the mouse sensitivity was WAY too high for the player to reliably shoot when the rifle was zoomed in all the way. Due to this observation, I tweaked the mouse sensitivity via scripting so that when the camera is not zoomed in, it has a greater mouse sensitivity than when it is. Furthermore, I finally added a bunch of musical/sound assets into the game! All of the bullets from enemy and player fire have sound effects added to them. Each area also has a unique track to it, making them stand out from one another. While each track may not be musical, I made sure to find a bunch of immersive sound effects to increase the player’s auditory connection with the game. All in all, it feels very bittersweet writing this devlog, as it is the capstone to one of my longest and most passionate projects ever. I’m really thankful to the Stardance team for creating this program, as the community it developed really helped motivate me along the way. Most of all, thank you to you guys as well! Reading your comments and seeing what other people are doing has been really fun the past couple of months. Best of luck everyone!
Hi guys, one last quick log. I’ve been working to ship Munirism over the last couple of days and ran into a bunch of computer issues due to itch.io not being able to take files more than 1 gb in size (and my computer kept crashing every time I tried to build the game). Thankfully, I got a working link to play on a browser and a link to the Mac download of the project for people who would like better frame rate optimizations. Since I can’t submit 2 test links, I’ll give the Mac download here: https://gamejolt.com/games/muniris/1100442 . Thanks everyone!
Another quick update, I made another build of the game that is includes compatibility with Windows, where the player starts off with a couple of items and a bit farther ahead in the game. I thought that the browser version would work for non-Mac users but I realize now that the servers really can’t run Muniris very well. Thanks for your patience everyone!
Ships:
This is my first ever fully finished Unity game, named Muniris! It is a 2-player action adventure game that combines RPG and shooter-based mechanics to make for dynamic and differentiating playstyles for everyone. Each player has a left and right hand that control different purposes: the left hand performs magic attacks/items, and the right hand shoots whatever gun you have equipped. Each player can choose their own loadout and upgrade their items along the way. To check out the project take a look at the README of my GitHub repo, as it contains info on which version you can play depending on your operating system. Enjoy!...
|
1793008180.655093
|
1793094580.655093
|
|
30836
|
calc82: Web Scientific Calculator by @rigel | Star calc82: Web Scientific Calculator by @rigel | Stardance...
|
rigel
|
1
|
120.0
|
2248
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T04:20:09Z", "hours": 120.0, "multiplier": 19.41, "payout": 2248, "blessing": "neutral", "text": "What did you make? calc82: A calculator web-app inspired by the Casio fx-82 series of scientific calculators. These calculators are common in high schools in my country. My project simulates the behaviour of the Casio calculator, while maintaining a good user experience on both desktop and mobile. What was challenging? Creating reliable algebraic (non-linear) input parsing was the most difficult part of the project. This was because it required some difficult array traversal to avoid invalid states - even one mistake would break the whole input. It took a lot of iterations to get to a working input system that passed all my tests. Close contenders for most challenging were the sheer volume of functions I needed to implement, as well as all possible states the calculator can be in. However, the challenge for this was finding time to get around to everything, rather than technical challenge. What are you proud of? I’m most proud of my implementation of the input-to-result pipeline. I was able to incorporate new-to-me concepts such as tokenisers and abstract syntax trees, yet the resulting code is arguably the cleanest part of the program. I’m also proud of the responsive layout, which supports desktop and mobile well, and that the user experience is similar enough to the Casio that my muscle memory carries over. Finally, I’m proud that I managed to finish the project, as it’s the largest software project I’ve ever managed to complete. Demo: https://rigelseven.github.io/calc82/ Source: https://github.com/rigelseven/calc82/", "repo": "https://github.com/rigelseven/calc82", "demo": "https://rigelseven.github.io/calc82/"}]...
|
[{"post_id": 64600, "ts": "202 [{"post_id": 64600, "ts": "2026-09-09T03:36:33Z", "hours": 1.0264, "text": "calc82: Devlog #14 9/09/2026 calc82: because calculators are for everyone Final devlog. It’s done!! This last stretch was writing the readme and publishing everything to Github pages. You can now access it at https://rigelseven.github.io/calc82/ Now for a short reflection calc82 is the largest personal software project I have ever completed. This project taught me a lot about input parsing - specifically, tokenisers and syntax trees - and the importance of keeping a large codebase tidy . Overall, the structure of the project is well laid out. However, there are architectural decisions I made early on that I came to regret later (such as the fact that input is represented as a string, whereas it should probably be a tree). Developing calc82 also showed me that I am capable of putting together such an app from scratch. I’m pleased to have participated in Stardance and be given this opportunity."}, {"post_id": 64551, "ts": "2026-09-09T01:44:48Z", "hours": 8.6039, "text": "calc82: Devlog #13 9/09/2026 calc82: because calculators are for everyone This devlog follows the addition of help and about menus to my calculator, as well as bundling into one js file. 🌟 New functionality summary Help menu Lookup function by calculator button (reuses key bind selector logic) Q&A About page About the calculator Contribute Legal License All JS files are bundled into one file Service worker makes app available offline 📦 Bundling and service worker I chose to use esbuild for bundling. This allows the many JS files to be condensed down into one file, reducing the number of requests that need to be made. This build system is much simpler than other options such as node.js. I also added a simple service worker that caches all requests locally. This makes the calculator available offline. ⚖️ Licensing & Legal I chose GPLv3 for this project as it is an end-user product. Essentially, this means others are free to modify and distribute the project as long as they make the source available. I also added legal disclaimers to the about page of the calculator. 📈 Next steps Write the readme, publicise the repo, and host! Thanks for reading :)"}, {"post_id": 63421, "ts": "2026-09-07T07:56:19Z", "hours": 9.6403, "text": "calc82: Devlog #12 7/09/2026 calc82: because calculators are for everyone This devlog follows the addition of customisable and accessible keyboard bindings to my calculator. 🌟 New functionality summary Settings menu Switches between sidebar and popup dependent on screen width Key rebinding Flow of choosing button, then pressing key to rebind Stores in local storage Help hotkey Shows all currently bound keys. Key hint consideration The default keyboard map has been implemented as a const dictionary for a while now, allowing lookup of buttons from keyboard keys. This was extended with a user dictionary that can be dynamically updated. However, generating the help hotkey hints needed to go in the opposite direction of the dictionary. The naive approach of iterating through values to find a key for each would perform poorly with O(n^2). Instead, we precalculate a reversed dictionary to lookup keyboard keys from each button. This precalculation is O(n), and setting the keys is also O(n), resulting in O(n) time overall. 📈 Next steps Development Brief manual for each calculator function (considering reusing the on click functionality from key mapper) ) Info menubar button with author & project information, and disclaimers Fullscreen button for mobile devices Preparation for shipping Webpack, choose a license, write readme, publicise repo, host. Thanks for reading :)"}, {"post_id": 62611, "ts": "2026-09-06T02:35:54Z", "hours": 8.5919, "text": "calc82: Devlog #11 6/09/2026 calc82: because calculators are for everyone This devlog follows the addition of a few final features to my calculator, and then my worst nightmare, frontend UI 😧 🌟 New functionality summary Prime factorisation using Pollard’s rho algorithm Engineering notation button Degree/minute/second output button CSS styling!! + menu bar buttons Fixed some input quirks Dark and light mode (based on system default) with manual toggle 🐚 Pollards rho algorithm for prime factorisation Prime factorisation or integer factorisation is the decomposition of a positive integer into a product of integers. The simplest way to implement this is trial division , which is straightforward but has O(√n) time complexity. I thought this would be too slow, so I decided to implement Pollard’s rho algorithm. This has a nicer complexity of O(√p) where p is the smallest prime factor of the number. However, further observation showed that that the Casio calculator probably doesn’t do this - for numbers without easy factors, it just doesn’t bother. Despite this, I’ve already implemented the algorithm, so I’m not going to remove functionality for the sake of exactly replicating the calculator’s behaviour. 🎨 CSS and styling My goal with the styling was to make the calculator as similar across browsers as possible. I bundled the Inter font (best font) into the program and removed browser-specific button styling. Implementing the CSS styling was mostly painless. I opted for a simple design with a menubar that adapts to horizontal or vertical depending on the window’s aspect ratio for the web app functionality. Additionally the css uses the system theme to automatically choose light or dark mode. 📈 Next steps This project is nearly finished - should only be one or two devlogs left until I ship. Here’s what I have left to do: Development Keybind show and edit Brief manual for each calculator function Info menubar button with author & project information, and disclaimers: that I am not affiliated with casio that the calculator is in a beta state and not guaranteed to be correct for all inputs Fullscreen button for mobile devices Preparation for shipping Webpack or similar Choose a license and publicise repo Write a readme Host on github pages (?) Hope that I did enough to not receive legal action from casio 🙃 Thanks for reading :)"}, {"post_id": 60028, "ts": "2026-09-02T04:16:18Z", "hours": 9.8953, "text": "calc82: Devlog #10 2/09/2026 calc82: because calculators are for everyone This devlog follows the addition of a lot of small features to my calculator that were last on my to-do list, as well as a slight shift in scope. 🌟 New functionality summary Colon operator for multiple operations Saving variables and settings to LocalStorage Clearing this memory Polar and rectangular coordinates (finally!) Forward delete key (keyboard only) Scrolling screen with a nicer cursor! Colon operator This is an operator I’ve never used on my calculator, but its quite powerful. you can type Ans+1:Ans*2:Ans^2 and it will calculate the first expression, then the second, and so on until it loops back to the start. ➡️ Forward delete Although this functionality is not part of the original calculator, it makes it much more pleasant to use on a computer keyboard. This was implemented as a hidden button. Scrolling Scrolling was surprisingly easy to implement! The browser handles all of the hard work, and all I had to do was set the right CSS tags. Granted, with my CSS experience, this was still difficult, but I made it work in the end. 📈 Next steps I have decided to shift the current scope of the project (before shipping) to just be implementing the main compute mode . This means I will not need to do STAT, VERIFY or LINEIO mode. This is for three reasons: With my semester starting, I will not have as much time to work on this project before the deadline I have very little experience with using these other modes I want to focus my time on the user experience. With this shift in scope, the calculator part of the project is all but done - I only have three buttons remaining. (I had to push this devlog out before 10 hours, which is why they’re not done). Then, I can focus on adding the surrounding UI and UX, which should make it actually possible for other people to use my project. Thanks for reading :)"}, {"post_id": 58608, "ts": "2026-08-31T02:44:52Z", "hours": 8.6944, "text": "calc82: Devlog #9 31/08/2026 calc82: because calculators are for everyone This devlog follows the addition of menus and the status bar to my calculator. 🌟 New functionality summary Extensible menu system that allows for easy creation of paginated and nested menus Status bar with indicators that change based on the current calculator state M+ and M- special variables Mixed fraction display 📋 Menu system The menu system uses a dictionary to encode the menu pages and their entries, making it easy to add new menus. However, I couldn’t find a way to easily encode functions and arguments in this structure, so the actual actions are handled by a big switch statement. When the menu is active, most buttons have no action and the input/output display is hidden. 🧀 Status bar The status bar consists of a row of elements with adjustable opacity (to represent their active state). It is handled by a class which allows items to be toggled with a single method call, meaning it can retroactively be integrated into other components. The original calculator has some menu elements that can never be activated - for example, there is a complex mode indicator, but the calculator cannot show complex numbers. I omitted these on calc82, as they took up unnecessary space. 📈 Next steps The project is almost nearing completion :) I made complete list of every feature missing from the calculator (too long to post here). It should should get shorter every devlog from now! Hopefully I can finally ship this project in the next couple of weeks. Thanks for reading :)"}, {"post_id": 45453, "ts": "2026-08-11T22:22:45Z", "hours": 10.3792, "text": "calc82: Devlog #8 12/08/2026 calc82: because calculators are for everyone Sorry its been a while since the last devlog, I’ve had this one sitting for a while and not had the chance to finish and post it. This devlog follows the improvement of the user interface to my calculator, as well as the addition of variables . 🌟 New functionality summary Add keyboard mappings for buttons Variables - assign and recall Navigate through history Recall history and edit it. 🦋 Modifier keys It was difficult porting the modifier (shift/alpha) keys to keyboard because Shift is used to type symbols such as + and *, and there is also a Shift key on the calculator… My solution was making tapping shift without any other input to toggle the calculator shift modifier, and combining it with another key to not toggle it. 🗒️ Notes Use of the calculator I’ve actually started using the calculator in class, and it’s been faithful to the original so far (for implemented functionality). I still don’t really trust it though and want to run it through some formalised tests before shipping. Keyboard mappings So far, I have been hardcoding keyboard mappings based on what feels natural to me. However, it would probably be better to have user-editable mappings for other people to customise. 📈 Next steps Immediate: M+ and M- special variable Variable and history persistence in the browser Implement polar/rectangualr conversion Medium: Add menu system and settings Add other modes (STAT, VERIFY) Create a test suite to ensure there is no unwanted behaviour Long-term: Tidy up visuals Ship :)"}, {"post_id": 32188, "ts": "2026-07-21T05:53:53Z", "hours": 9.9386, "text": "calc82: Devlog #7 21/07/2026 calc82: because calculators are for everyone This devlog follows the introduction of an actual user interface to my calculator. 🌟 New functionality summary Grid of calculator buttons Different button output when modifiers pressed Navigation buttons work Calculator resembles a real calculator 👇 Button handling The calculator needed buttons resembling that of the Casio to fulfil my purpose. Buttons are dynamically built from an array, which defines their labels and actions. This allows easy changes. For most buttons, the area surrounding the button also acts as a clickable area for better touch input. However, I didn’t find an easy way to do this for the navigation buttons (which are positioned off the grid). 🎨 CSS CSS Grid allows a 2D layout system based on rows and columns. It has been supported by all major browsers since October 2017. CSS Grid was used, as it allows consistent positioning across browsers. In addition, relative units were used to prevent resizing the calculator from affecting it. This should make it easier to make dynamic sizing in the future. 🗒️ Notes Accessibility <button> s are preferred over clickable <div> s because they work with screen readers and legacy browsers . However, I also made the surrounding elements clickable for a better touch experience. Also, keyboard input will make use significantly easier for computer users. Aesthetics The CSS applied so far is purely functional. In the future, I will improve the aesthetics of the calculator through CSS - but for now, this barebones look makes development easier and more focused. 📈 Next steps The todo list was getting too empty, so it has been updated with new tasks Immediate: Add remaining functions Add keyboard shortcuts Medium: Add menu system and settings Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion Add other modes (STAT, VERIFY) Add Long-term: Create a test suite to ensure there is no unwanted behaviour Ship :)"}, {"post_id": 30511, "ts": "2026-07-18T04:36:43Z", "hours": 9.605, "text": "calc82: Devlog #6 18/07/2026 calc82: because calculators are for everyone This devlog follows the further development of algebraic I/O to my calculator, including turning this into an actual result. 🌟 New functionality summary Input and output formatting through KaTeX Square root, arbitrary root, mixed fraction, and absolute values Tokeniser now directly reads input tokens Errors now move the cursor to the position where it occurred 🌊 New program flow inputHandler -> [input tokens] -> tokeniser -> [calculator tokens] -> parser -> AST -> evaluator -> result This: improves speed (compared to parsing text) allows cursor to be moved to error location since we never flatten to text You might notice I have two sets of tokens. They are similar, but input tokens deal with digits and combined symbols ( sin( ), and calculator tokens are whole numbers and separated symbols. 🗒️ Notes Avoiding the lazy route My first approach was turning the input tokens into a string, which my tokeniser already knew how to deal with. However, this added much processing overhead and made it harder to find out the position at which errors occurred. Spending the time to implement the token conversion made this step much easier Misplaced math errors When implementing error handling, I passed down the original position of each token in the input token array down to each step of the calculation process. However, because my evaluator is recursive, it would constantly update the error position to the latest token, meaning the errors were always placed at the end. This was an easy fix in the end - but hard to spot! 📈 Next steps Immediate: Buttons input Add remaining functions (once buttons are added can be done) Medium: Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion (delayed until UI is more fleshed out) Build UI Long-term (but getting closer!): Create a usable UX Ship :)"}, {"post_id": 29405, "ts": "2026-07-16T10:32:06Z", "hours": 9.6708, "text": "calc82: Devlog #5 16/07/2026 calc82: because calculators are for everyone This devlog mainly follows the addition of algebraic I/O to my calculator. This is just a check-in since I was getting close to 10 hours since the last devlog - I still have some work to do on this aspect before I move on. 🌟 New functionality summary Input and output formatting through KaTeX Fractions and powers formatted correctly in the input Ability to intuitively traverse the input with arrow keys ⚖️ Algebraic IO with KaTeX I decided on KaTeX because it is both fast (no reflow!) and does not rely on dependencies . KaTeX is a math formatting library that uses LaTeX commands to create beautiful equations from code. For example, \\frac{2^{\\frac{3}{4}}}{4\\sin(30)}\\times 2\\pi turns into the attached image. Input is currently captured directly from the keyboard to build a 1D array of tokens. The tokens are then converted into KaTeX formatting for algebraic display. In the future, there will also be buttons onscreen as an alternative. Fractions and powers Fractions and powers cannot be represented as a single token. Rather, fractions have a beginning, middle and end, and powers have a beginning and end. The program traverses the array to decide where to put them (and take them out for deletion). 🗒️ Notes The cursor It is surprisingly difficult to make a vertical bar to act as a cursor in KaTeX, without affecting the spacing of the rest of the expression. For now, I am using a \\clap{\\rule{0.1em}{0.5em}} for the cursor, but I am looking to replace this with custom CSS in the future. Replicating exact behaviour? The fx-82 has some interesting behaviour wherein an empty power is not allowed to exist directly after another power. I am unsure whether I should replicate this - but for now, I am leaving it out. Dealing with broken LaTeX I have been able to get the display pretty bulletproof when it comes to not producing broken LaTeX. However, I’m sure there’s something I haven’t run into in debugging! I want to have this be dealt with gracefully rather than blowing up in the user’s face. 📈 Next steps Immediate: Implement mixed fractions, roots, and Abs to algebraic display Make the input token array able to be parsed into the AST to be calculated Medium: Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion (delayed until UI is more fleshed out) Build UI Long-term (but getting closer!): Create a usable UX Ship :)"}, {"post_id": 27701, "ts": "2026-07-13T14:20:52Z", "hours": 7.1211, "text": "calc82: Devlog #4 14/07/2026 calc82: because calculators are for everyone This devlog mainly follows the addition of fractional I/O to my calculator. 🌟 New functionality summary Fractional input, including fractions Computation of fractions - add/sub,div/mult,power,root other operations convert the fraction to a decimal Fractional output (temporary UI) LCM/GCD separate execute and fraction/decimal converting buttons 🔢 fractional io :) I defined a separate fraction data type: it’s like a decimal, but with a numerator and denominator, and optionally a whole component: for example, 1 and 1/3, or 4/3. Using fractions means that numbers can be represented more naturally and precisely. I.e. 1/7 instead of 0.142857143 🧮 Fractional calculation Additionally calculations can be made more precise. For example (1/7) * (2/3) can be directly computed by multiplying the numerators and denominators. My implementation attempts to convert user input and the products of divisions into fractions wherever possible in order to chase this precision. 🗒️ Notes Web design is not my thing I realised the importance of UI and UX (user experience) by looking at other projects on Stardance. As of the current iteration, this project lacks this a bit.. But I will give it a shot My next developments will begin to focus more on this - starting with the algebraic input, and eventually moving onto the CSS and design aspects. I am also considering whether I should use a Javascript framework. 📈 Next steps Immediate: Create algebraic display functionality Medium: Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion (delayed until UI is more fleshed out) Build UI Long-term (but getting closer!): Create a usable UX Ship :)"}, {"post_id": 25807, "ts": "2026-07-10T08:35:45Z", "hours": 6.5419, "text": "calc82: Devlog #3 10/07/2026 calc82: because calculators are for everyone Oh dear, looks like I lost 4 hours of counted time in the last devlog… let’s try to make this one a bit shorter! This devlog follows the implementation of the other inline functions of the calculator: 🌟 New functionality summary inverse and hyperbolic trig arbitrary roots absolute value percent random numbers: Ran and RanInt scientific notation: *10^x / E combinatorics: nPr and nCr variables (not yet adjustable) 📋 Implementation details Implementing most of this functionality followed the same general steps: identify implement test. As I undertook this process. other dependent requirements popped up - such as the implementation of multivariable functions , which in turn required the expansion of the tokeniser and parser. Also, I implemented degrees, radians, and gradians modes into the calculator, and the associated functions (as postfix expressions - e.g. sin(30d) for degrees) . 🗄️ decimal.js changes Finally, I applied some further changes to decimal.js.: Rounding now depends on the closeness of the output to a known value, rather than the input, reducing unnecessary rounding Near-decimal values close to 0, 0.25, 0.5, 0.75 and 1 are now caught. 🗒️ Notes: Remembering that Javascript is weird NaN === NaN is FALSE! Spent a good 10 minutes figuring this one out. The solution was to use isNaN() . Fixing negative-base powers: (-8)^(1/3) should equal 2 but returns NaN Fixed by taking the denominator from the output of a decimal.js toFraction() function, which attempts to create a rational fraction. This overcomes the tiny precision loss and evaluates the function correctly 📈 Next steps Immediate: Add fractional I/O Implement polar/rectangualr conversion Medium: Create algebraic display functionality Multi-line calculation (Ans) and setting variables Long-term: Build UI Ship :) This has been a bit of a shorter devlog. But I’m still proud of what I achieved! Thanks so much for reading. If you have any suggestions, please leave me a comment. Take care"}, {"post_id": 25217, "ts": "2026-07-09T10:31:56Z", "hours": 14.0967, "text": "calc82: Devlog #2 08/07/2026 calc82: because calculators are for everyone This devlog follows the handling of nasty floating point errors in my web calculator - inspired by and designed to work with Casio’s fx-82au. I realised that relying purely on the Javascript math system was unsuitable for a scientific calculator that works with decimal numbers. This is due to binary floating point not translating well to decimal. 0.1+0.2=0.30000000000000004 >:( I researched and considered a few approaches. 🥧 Symbolic simplifier? The idea behind this is to perform algebra and avoid evaluating constants and functions to values until strictly necessary. However, the scope of this seemed massive, and I did not observe this behaviour in the Casio. 🔟 Decimal arithmetic Instead, I stumbled upon the fact that decimal arithmetic can be implemented in a computer. While IEEE floats use binary representation, there is no reason we cannot use decimals internally, avoiding errors that arise from conversion. Decimal floats can be stored by: Sign: +/- Mantissa: the number itself, in my case an array of digits Exponent: what power of 10 the number should be multiplied by. I started implementation, made decent progress, but found out that I was re-doing work that was already done by other people. 🗄️ Decimal.js I found the decimal.js library after researching how to handle decimal addition. Implementing this quickly fixed my floating point errors, but did not fix trig approximation. 👀 Observing the calculator I observed some of the behaviour of the real calculator to work out how it functions. Handles small-angle approximation based on a threshold Drops precision as the trig function argument value increases Appears to use a 15-digit mantissa Refuses to evaluate trig functions with argument above a certain limit I tried my best to implement the behaviour I observed, some of which required editing the code of the decimal.js library. 📝 Editing decimal.js The decimal.js library uses more than the set precision for some internal calculations. However, arithmetic with pi is otherwise only the set precision, causing drift. My fix for this was to adjust the internal pi value to match the mantissa size of the real calculator. Troubles with the library When given a less accurate value for pi (in line with that of the real calculator) sine quadrant is incorrectly calculated. I found that the isOdd function is flawed! function isOdd(n) { return n.d[n.d.length - 1] & 1; } I replaced it with one that works for my use case (if less efficient): function isOdd(n) { return n.mod(2).eq(1); } I need to see if this is just due to my low precision pi, or an actual problem in the library, in the future. But for now my issue is fixed. I also found an error in the cosine function: if (x.isZero()) return x needed to be changed to if (x.isZero()) return new Ctor(1) . Again, I’m going to have to look into this more before submitting a pr or anything, since decimal.js is not made for such an imprecise pi. 🗒️ Notes Deviations There are still small deviations between my calculator and the real one at really, really large trig angles. One idea to reduce error could be optimising the order of operations in the AST to prevent dropping precision unnecessarily. I might explore this later However, I want to press on with other features, instead of tiny inaccuracies that would never show up in real-world use. I have slightly rearranged the to-do list below. 📈 Next steps Immediate: Implement the other calculator buttons and functions Add fractional I/O Medium: Create algebraic display functionality Multi-line calculation (Ans) and variables Long-term: Build UI Ship :) Thanks so much for reading! If you have any suggestions, please leave me a comment. Until next time"}, {"post_id": 23363, "ts": "2026-07-06T09:05:57Z", "hours": 6.4844, "text": "calc82: Project Introduction and Devlog #1 calc82: because calculators are for everyone The aim of this project is to create a free, software-based browser calculator which mimics the behaviour of the Casio fx-82au. This is the most common calculator in high schools in my country. 🔥 Motivation My motivation for this project is the following: calculators are cool i dont always have my calculator on me (most notably) not everyone has access to a scientific calculator 🎯 Approach I will take a black-box reverse engineering approach . This means analysing the inputs and outputs of the calculator and attempting to replicate the behaviour without looking at the underlying code. This along with avoiding patents and copyright should keep the project okay legally. 📈 Goals and scope The final goal for the project is to create a fully functional calculator (obviously) which works on most types of devices. This means both touch and keyboard input, resolution scaling, wide browser support… I have moderate experience with creating web apps. and a lot of experience using this calculator. so this project should be pretty fun :) Devlog #1 06/07/2026 This devlog covers the initial development of the parts of the calculator that do math. Essentially turning an input expression into an output. I chose a high-level structure similar to that used by programming language syntax analysers. That is: Input -> Tokeniser -> Parser -> Evaluator -> Output 🪙 Tokeniser yes, with an s >:( The tokeniser converts the input into a list of tokens (think individual pieces of the expression). It does this by scanning the input string and identifying what each character corresponds to. The tokeniser only knows what each symbol is , not what it does . Then it passes the token array to the… 🌲 Parser The parser converts the token array into an Abstract Syntax Tree (AST). Essentially this is a tree which shows how the expressions should be evaluated in order to produce the desired output. This properly lets me implement order of operations. The exact type of parser I am using is a recursive descent parser . It attempts to match the tokens with known symbols recursively, meaning i can rely on the call stack :) The order of operations can be defined by the order of function calls within the parser. 🧮 Evaluator The evaluator’s job is easy: it just traverses the tree made by the parser and runs the necessary operations. Because all of the hard work regarding order of operations has been done by the other components, implementing the evaluator was really easy. Its also recursive. your call stack is gonna love me for this 🗒️ Notes Why not eval? It’s true that JavaScript has a perfectly good expression parser, which I could have used. However, its behaviour is more suited to a programming language than a calculator. For example, 4(2+3) should implicitly multiply , but will instead complain TypeError: 4 is not a function . Writing my own system gives me more flexibility to make the calculator how I want. Floating point precision Because it uses Javascript’s internal math engine, i have floating-point problems. This results in expressions like sin(2pi) = -2.44929360e-16 I will likely fix this by using a math library, or a novel approach. Last-minute catch I was just writing an example for this devlog when I found that .3ln(4)*5^2 raised an error. In fact, ANYTHING * or / followed by x^n would error - but other operators wouldn’t. This was a quick fix, but I’m glad I caught it! 📈 Next steps Immediate: Fix math imprecision Add fractional I/O Medium: Create algebraic display functionality Multi-line calculation (Ans) and variables Long-term: Make the calculator functionally equivalent to the fx-82 Build UI Ship :) Thanks so much for reading! If you have any suggestions, please leave me a comment"}]...
|
Title: calc82: Web Scientific Calculator by @rigel Title: calc82: Web Scientific Calculator by @rigel | Stardance
Devlogs:
calc82: Project Introduction and Devlog #1 calc82: because calculators are for everyone The aim of this project is to create a free, software-based browser calculator which mimics the behaviour of the Casio fx-82au. This is the most common calculator in high schools in my country. 🔥 Motivation My motivation for this project is the following: calculators are cool i dont always have my calculator on me (most notably) not everyone has access to a scientific calculator 🎯 Approach I will take a black-box reverse engineering approach . This means analysing the inputs and outputs of the calculator and attempting to replicate the behaviour without looking at the underlying code. This along with avoiding patents and copyright should keep the project okay legally. 📈 Goals and scope The final goal for the project is to create a fully functional calculator (obviously) which works on most types of devices. This means both touch and keyboard input, resolution scaling, wide browser support… I have moderate experience with creating web apps. and a lot of experience using this calculator. so this project should be pretty fun :) Devlog #1 06/07/2026 This devlog covers the initial development of the parts of the calculator that do math. Essentially turning an input expression into an output. I chose a high-level structure similar to that used by programming language syntax analysers. That is: Input -> Tokeniser -> Parser -> Evaluator -> Output 🪙 Tokeniser yes, with an s >:( The tokeniser converts the input into a list of tokens (think individual pieces of the expression). It does this by scanning the input string and identifying what each character corresponds to. The tokeniser only knows what each symbol is , not what it does . Then it passes the token array to the… 🌲 Parser The parser converts the token array into an Abstract Syntax Tree (AST). Essentially this is a tree which shows how the expressions should be evaluated in order to produce the desired output. This properly lets me implement order of operations. The exact type of parser I am using is a recursive descent parser . It attempts to match the tokens with known symbols recursively, meaning i can rely on the call stack :) The order of operations can be defined by the order of function calls within the parser. 🧮 Evaluator The evaluator’s job is easy: it just traverses the tree made by the parser and runs the necessary operations. Because all of the hard work regarding order of operations has been done by the other components, implementing the evaluator was really easy. Its also recursive. your call stack is gonna love me for this 🗒️ Notes Why not eval? It’s true that JavaScript has a perfectly good expression parser, which I could have used. However, its behaviour is more suited to a programming language than a calculator. For example, 4(2+3) should implicitly multiply , but will instead complain TypeError: 4 is not a function . Writing my own system gives me more flexibility to make the calculator how I want. Floating point precision Because it uses Javascript’s internal math engine, i have floating-point problems. This results in expressions like sin(2pi) = -2.44929360e-16 I will likely fix this by using a math library, or a novel approach. Last-minute catch I was just writing an example for this devlog when I found that .3ln(4)*5^2 raised an error. In fact, ANYTHING * or / followed by x^n would error - but other operators wouldn’t. This was a quick fix, but I’m glad I caught it! 📈 Next steps Immediate: Fix math imprecision Add fractional I/O Medium: Create algebraic display functionality Multi-line calculation (Ans) and variables Long-term: Make the calculator functionally equivalent to the fx-82 Build UI Ship :) Thanks so much for reading! If you have any suggestions, please leave me a comment
calc82: Devlog #2 08/07/2026 calc82: because calculators are for everyone This devlog follows the handling of nasty floating point errors in my web calculator - inspired by and designed to work with Casio’s fx-82au. I realised that relying purely on the Javascript math system was unsuitable for a scientific calculator that works with decimal numbers. This is due to binary floating point not translating well to decimal. 0.1+0.2=0.30000000000000004 >:( I researched and considered a few approaches. 🥧 Symbolic simplifier? The idea behind this is to perform algebra and avoid evaluating constants and functions to values until strictly necessary. However, the scope of this seemed massive, and I did not observe this behaviour in the Casio. 🔟 Decimal arithmetic Instead, I stumbled upon the fact that decimal arithmetic can be implemented in a computer. While IEEE floats use binary representation, there is no reason we cannot use decimals internally, avoiding errors that arise from conversion. Decimal floats can be stored by: Sign: +/- Mantissa: the number itself, in my case an array of digits Exponent: what power of 10 the number should be multiplied by. I started implementation, made decent progress, but found out that I was re-doing work that was already done by other people. 🗄️ Decimal.js I found the decimal.js library after researching how to handle decimal addition. Implementing this quickly fixed my floating point errors, but did not fix trig approximation. 👀 Observing the calculator I observed some of the behaviour of the real calculator to work out how it functions. Handles small-angle approximation based on a threshold Drops precision as the trig function argument value increases Appears to use a 15-digit mantissa Refuses to evaluate trig functions with argument above a certain limit I tried my best to implement the behaviour I observed, some of which required editing the code of the decimal.js library. 📝 Editing decimal.js The decimal.js library uses more than the set precision for some internal calculations. However, arithmetic with pi is otherwise only the set precision, causing drift. My fix for this was to adjust the internal pi value to match the mantissa size of the real calculator. Troubles with the library When given a less accurate value for pi (in line with that of the real calculator) sine quadrant is incorrectly calculated. I found that the isOdd function is flawed! function isOdd(n) { return n.d[n.d.length - 1] & 1; } I replaced it with one that works for my use case (if less efficient): function isOdd(n) { return n.mod(2).eq(1); } I need to see if this is just due to my low precision pi, or an actual problem in the library, in the future. But for now my issue is fixed. I also found an error in the cosine function: if (x.isZero()) return x needed to be changed to if (x.isZero()) return new Ctor(1) . Again, I’m going to have to look into this more before submitting a pr or anything, since decimal.js is not made for such an imprecise pi. 🗒️ Notes Deviations There are still small deviations between my calculator and the real one at really, really large trig angles. One idea to reduce error could be optimising the order of operations in the AST to prevent dropping precision unnecessarily. I might explore this later However, I want to press on with other features, instead of tiny inaccuracies that would never show up in real-world use. I have slightly rearranged the to-do list below. 📈 Next steps Immediate: Implement the other calculator buttons and functions Add fractional I/O Medium: Create algebraic display functionality Multi-line calculation (Ans) and variables Long-term: Build UI Ship :) Thanks so much for reading! If you have any suggestions, please leave me a comment. Until next time
calc82: Devlog #3 10/07/2026 calc82: because calculators are for everyone Oh dear, looks like I lost 4 hours of counted time in the last devlog… let’s try to make this one a bit shorter! This devlog follows the implementation of the other inline functions of the calculator: 🌟 New functionality summary inverse and hyperbolic trig arbitrary roots absolute value percent random numbers: Ran and RanInt scientific notation: *10^x / E combinatorics: nPr and nCr variables (not yet adjustable) 📋 Implementation details Implementing most of this functionality followed the same general steps: identify implement test. As I undertook this process. other dependent requirements popped up - such as the implementation of multivariable functions , which in turn required the expansion of the tokeniser and parser. Also, I implemented degrees, radians, and gradians modes into the calculator, and the associated functions (as postfix expressions - e.g. sin(30d) for degrees) . 🗄️ decimal.js changes Finally, I applied some further changes to decimal.js.: Rounding now depends on the closeness of the output to a known value, rather than the input, reducing unnecessary rounding Near-decimal values close to 0, 0.25, 0.5, 0.75 and 1 are now caught. 🗒️ Notes: Remembering that Javascript is weird NaN === NaN is FALSE! Spent a good 10 minutes figuring this one out. The solution was to use isNaN() . Fixing negative-base powers: (-8)^(1/3) should equal 2 but returns NaN Fixed by taking the denominator from the output of a decimal.js toFraction() function, which attempts to create a rational fraction. This overcomes the tiny precision loss and evaluates the function correctly 📈 Next steps Immediate: Add fractional I/O Implement polar/rectangualr conversion Medium: Create algebraic display functionality Multi-line calculation (Ans) and setting variables Long-term: Build UI Ship :) This has been a bit of a shorter devlog. But I’m still proud of what I achieved! Thanks so much for reading. If you have any suggestions, please leave me a comment. Take care
calc82: Devlog #4 14/07/2026 calc82: because calculators are for everyone This devlog mainly follows the addition of fractional I/O to my calculator. 🌟 New functionality summary Fractional input, including fractions Computation of fractions - add/sub,div/mult,power,root other operations convert the fraction to a decimal Fractional output (temporary UI) LCM/GCD separate execute and fraction/decimal converting buttons 🔢 fractional io :) I defined a separate fraction data type: it’s like a decimal, but with a numerator and denominator, and optionally a whole component: for example, 1 and 1/3, or 4/3. Using fractions means that numbers can be represented more naturally and precisely. I.e. 1/7 instead of 0.142857143 🧮 Fractional calculation Additionally calculations can be made more precise. For example (1/7) * (2/3) can be directly computed by multiplying the numerators and denominators. My implementation attempts to convert user input and the products of divisions into fractions wherever possible in order to chase this precision. 🗒️ Notes Web design is not my thing I realised the importance of UI and UX (user experience) by looking at other projects on Stardance. As of the current iteration, this project lacks this a bit.. But I will give it a shot My next developments will begin to focus more on this - starting with the algebraic input, and eventually moving onto the CSS and design aspects. I am also considering whether I should use a Javascript framework. 📈 Next steps Immediate: Create algebraic display functionality Medium: Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion (delayed until UI is more fleshed out) Build UI Long-term (but getting closer!): Create a usable UX Ship :)
calc82: Devlog #5 16/07/2026 calc82: because calculators are for everyone This devlog mainly follows the addition of algebraic I/O to my calculator. This is just a check-in since I was getting close to 10 hours since the last devlog - I still have some work to do on this aspect before I move on. 🌟 New functionality summary Input and output formatting through KaTeX Fractions and powers formatted correctly in the input Ability to intuitively traverse the input with arrow keys ⚖️ Algebraic IO with KaTeX I decided on KaTeX because it is both fast (no reflow!) and does not rely on dependencies . KaTeX is a math formatting library that uses LaTeX commands to create beautiful equations from code. For example, \frac{2^{\frac{3}{4}}}{4\sin(30)}\times 2\pi turns into the attached image. Input is currently captured directly from the keyboard to build a 1D array of tokens. The tokens are then converted into KaTeX formatting for algebraic display. In the future, there will also be buttons onscreen as an alternative. Fractions and powers Fractions and powers cannot be represented as a single token. Rather, fractions have a beginning, middle and end, and powers have a beginning and end. The program traverses the array to decide where to put them (and take them out for deletion). 🗒️ Notes The cursor It is surprisingly difficult to make a vertical bar to act as a cursor in KaTeX, without affecting the spacing of the rest of the expression. For now, I am using a \clap{\rule{0.1em}{0.5em}} for the cursor, but I am looking to replace this with custom CSS in the future. Replicating exact behaviour? The fx-82 has some interesting behaviour wherein an empty power is not allowed to exist directly after another power. I am unsure whether I should replicate this - but for now, I am leaving it out. Dealing with broken LaTeX I have been able to get the display pretty bulletproof when it comes to not producing broken LaTeX. However, I’m sure there’s something I haven’t run into in debugging! I want to have this be dealt with gracefully rather than blowing up in the user’s face. 📈 Next steps Immediate: Implement mixed fractions, roots, and Abs to algebraic display Make the input token array able to be parsed into the AST to be calculated Medium: Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion (delayed until UI is more fleshed out) Build UI Long-term (but getting closer!): Create a usable UX Ship :)
calc82: Devlog #6 18/07/2026 calc82: because calculators are for everyone This devlog follows the further development of algebraic I/O to my calculator, including turning this into an actual result. 🌟 New functionality summary Input and output formatting through KaTeX Square root, arbitrary root, mixed fraction, and absolute values Tokeniser now directly reads input tokens Errors now move the cursor to the position where it occurred 🌊 New program flow inputHandler -> [input tokens] -> tokeniser -> [calculator tokens] -> parser -> AST -> evaluator -> result This: improves speed (compared to parsing text) allows cursor to be moved to error location since we never flatten to text You might notice I have two sets of tokens. They are similar, but input tokens deal with digits and combined symbols ( sin( ), and calculator tokens are whole numbers and separated symbols. 🗒️ Notes Avoiding the lazy route My first approach was turning the input tokens into a string, which my tokeniser already knew how to deal with. However, this added much processing overhead and made it harder to find out the position at which errors occurred. Spending the time to implement the token conversion made this step much easier Misplaced math errors When implementing error handling, I passed down the original position of each token in the input token array down to each step of the calculation process. However, because my evaluator is recursive, it would constantly update the error position to the latest token, meaning the errors were always placed at the end. This was an easy fix in the end - but hard to spot! 📈 Next steps Immediate: Buttons input Add remaining functions (once buttons are added can be done) Medium: Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion (delayed until UI is more fleshed out) Build UI Long-term (but getting closer!): Create a usable UX Ship :)
calc82: Devlog #7 21/07/2026 calc82: because calculators are for everyone This devlog follows the introduction of an actual user interface to my calculator. 🌟 New functionality summary Grid of calculator buttons Different button output when modifiers pressed Navigation buttons work Calculator resembles a real calculator 👇 Button handling The calculator needed buttons resembling that of the Casio to fulfil my purpose. Buttons are dynamically built from an array, which defines their labels and actions. This allows easy changes. For most buttons, the area surrounding the button also acts as a clickable area for better touch input. However, I didn’t find an easy way to do this for the navigation buttons (which are positioned off the grid). 🎨 CSS CSS Grid allows a 2D layout system based on rows and columns. It has been supported by all major browsers since October 2017. CSS Grid was used, as it allows consistent positioning across browsers. In addition, relative units were used to prevent resizing the calculator from affecting it. This should make it easier to make dynamic sizing in the future. 🗒️ Notes Accessibility <button> s are preferred over clickable <div> s because they work with screen readers and legacy browsers . However, I also made the surrounding elements clickable for a better touch experience. Also, keyboard input will make use significantly easier for computer users. Aesthetics The CSS applied so far is purely functional. In the future, I will improve the aesthetics of the calculator through CSS - but for now, this barebones look makes development easier and more focused. 📈 Next steps The todo list was getting too empty, so it has been updated with new tasks Immediate: Add remaining functions Add keyboard shortcuts Medium: Add menu system and settings Multi-line calculation (Ans) and setting variables Implement polar/rectangualr conversion Add other modes (STAT, VERIFY) Add Long-term: Create a test suite to ensure there is no unwanted behaviour Ship :)
calc82: Devlog #8 12/08/2026 calc82: because calculators are for everyone Sorry its been a while since the last devlog, I’ve had this one sitting for a while and not had the chance to finish and post it. This devlog follows the improvement of the user interface to my calculator, as well as the addition of variables . 🌟 New functionality summary Add keyboard mappings for buttons Variables - assign and recall Navigate through history Recall history and edit it. 🦋 Modifier keys It was difficult porting the modifier (shift/alpha) keys to keyboard because Shift is used to type symbols such as + and *, and there is also a Shift key on the calculator… My solution was making tapping shift without any other input to toggle the calculator shift modifier, and combining it with another key to not toggle it. 🗒️ Notes Use of the calculator I’ve actually started using the calculator in class, and it’s been faithful to the original so far (for implemented functionality). I still don’t really trust it though and want to run it through some formalised tests before shipping. Keyboard mappings So far, I have been hardcoding keyboard mappings based on what feels natural to me. However, it would probably be better to have user-editable mappings for other people to customise. 📈 Next steps Immediate: M+ and M- special variable Variable and history persistence in the browser Implement polar/rectangualr conversion Medium: Add menu system and settings Add other modes (STAT, VERIFY) Create a test suite to ensure there is no unwanted behaviour Long-term: Tidy up visuals Ship :)
calc82: Devlog #9 31/08/2026 calc82: because calculators are for everyone This devlog follows the addition of menus and the status bar to my calculator. 🌟 New functionality summary Extensible menu system that allows for easy creation of paginated and nested menus Status bar with indicators that change based on the current calculator state M+ and M- special variables Mixed fraction display 📋 Menu system The menu system uses a dictionary to encode the menu pages and their entries, making it easy to add new menus. However, I couldn’t find a way to easily encode functions and arguments in this structure, so the actual actions are handled by a big switch statement. When the menu is active, most buttons have no action and the input/output display is hidden. 🧀 Status bar The status bar consists of a row of elements with adjustable opacity (to represent their active state). It is handled by a class which allows items to be toggled with a single method call, meaning it can retroactively be integrated into other components. The original calculator has some menu elements that can never be activated - for example, there is a complex mode indicator, but the calculator cannot show complex numbers. I omitted these on calc82, as they took up unnecessary space. 📈 Next steps The project is almost nearing completion :) I made complete list of every feature missing from the calculator (too long to post here). It should should get shorter every devlog from now! Hopefully I can finally ship this project in the next couple of weeks. Thanks for reading :)
calc82: Devlog #10 2/09/2026 calc82: because calculators are for everyone This devlog follows the addition of a lot of small features to my calculator that were last on my to-do list, as well as a slight shift in scope. 🌟 New functionality summary Colon operator for multiple operations Saving variables and settings to LocalStorage Clearing this memory Polar and rectangular coordinates (finally!) Forward delete key (keyboard only) Scrolling screen with a nicer cursor! Colon operator This is an operator I’ve never used on my calculator, but its quite powerful. you can type Ans+1:Ans*2:Ans^2 and it will calculate the first expression, then the second, and so on until it loops back to the start. ➡️ Forward delete Although this functionality is not part of the original calculator, it makes it much more pleasant to use on a computer keyboard. This was implemented as a hidden button. Scrolling Scrolling was surprisingly easy to implement! The browser handles all of the hard work, and all I had to do was set the right CSS tags. Granted, with my CSS experience, this was still difficult, but I made it work in the end. 📈 Next steps I have decided to shift the current scope of the project (before shipping) to just be implementing the main compute mode . This means I will not need to do STAT, VERIFY or LINEIO mode. This is for three reasons: With my semester starting, I will not have as much time to work on this project before the deadline I have very little experience with using these other modes I want to focus my time on the user experience. With this shift in scope, the calculator part of the project is all but done - I only have three buttons remaining. (I had to push this devlog out before 10 hours, which is why they’re not done). Then, I can focus on adding the surrounding UI and UX, which should make it actually possible for other people to use my project. Thanks for reading :)
calc82: Devlog #11 6/09/2026 calc82: because calculators are for everyone This devlog follows the addition of a few final features to my calculator, and then my worst nightmare, frontend UI 😧 🌟 New functionality summary Prime factorisation using Pollard’s rho algorithm Engineering notation button Degree/minute/second output button CSS styling!! + menu bar buttons Fixed some input quirks Dark and light mode (based on system default) with manual toggle 🐚 Pollards rho algorithm for prime factorisation Prime factorisation or integer factorisation is the decomposition of a positive integer into a product of integers. The simplest way to implement this is trial division , which is straightforward but has O(√n) time complexity. I thought this would be too slow, so I decided to implement Pollard’s rho algorithm. This has a nicer complexity of O(√p) where p is the smallest prime factor of the number. However, further observation showed that that the Casio calculator probably doesn’t do this - for numbers without easy factors, it just doesn’t bother. Despite this, I’ve already implemented the algorithm, so I’m not going to remove functionality for the sake of exactly replicating the calculator’s behaviour. 🎨 CSS and styling My goal with the styling was to make the calculator as similar across browsers as possible. I bundled the Inter font (best font) into the program and removed browser-specific button styling. Implementing the CSS styling was mostly painless. I opted for a simple design with a menubar that adapts to horizontal or vertical depending on the window’s aspect ratio for the web app functionality. Additionally the css uses the system theme to automatically choose light or dark mode. 📈 Next steps This project is nearly finished - should only be one or two devlogs left until I ship. Here’s what I have left to do: Development Keybind show and edit Brief manual for each calculator function Info menubar button with author & project information, and disclaimers: that I am not affiliated with casio that the calculator is in a beta state and not guaranteed to be correct for all inputs Fullscreen button for mobile devices Preparation for shipping Webpack or similar Choose a license and publicise repo Write a readme Host on github pages (?) Hope that I did enough to not receive legal action from casio 🙃 Thanks for reading :)
calc82: Devlog #12 7/09/2026 calc82: because calculators are for everyone This devlog follows the addition of customisable and accessible keyboard bindings to my calculator. 🌟 New functionality summary Settings menu Switches between sidebar and popup dependent on screen width Key rebinding Flow of choosing button, then pressing key to rebind Stores in local storage Help hotkey Shows all currently bound keys. Key hint consideration The default keyboard map has been implemented as a const dictionary for a while now, allowing lookup of buttons from keyboard keys. This was extended with a user dictionary that can be dynamically updated. However, generating the help hotkey hints needed to go in the opposite direction of the dictionary. The naive approach of iterating through values to find a key for each would perform poorly with O(n^2). Instead, we precalculate a reversed dictionary to lookup keyboard keys from each button. This precalculation is O(n), and setting the keys is also O(n), resulting in O(n) time overall. 📈 Next steps Development Brief manual for each calculator function (considering reusing the on click functionality from key mapper) ) Info menubar button with author & project information, and disclaimers Fullscreen button for mobile devices Preparation for shipping Webpack, choose a license, write readme, publicise repo, host. Thanks for reading :)
calc82: Devlog #13 9/09/2026 calc82: because calculators are for everyone This devlog follows the addition of help and about menus to my calculator, as well as bundling into one js file. 🌟 New functionality summary Help menu Lookup function by calculator button (reuses key bind selector logic) Q&A About page About the calculator Contribute Legal License All JS files are bundled into one file Service worker makes app available offline 📦 Bundling and service worker I chose to use esbuild for bundling. This allows the many JS files to be condensed down into one file, reducing the number of requests that need to be made. This build system is much simpler than other options such as node.js. I also added a simple service worker that caches all requests locally. This makes the calculator available offline. ⚖️ Licensing & Legal I chose GPLv3 for this project as it is an end-user product. Essentially, this means others are free to modify and distribute the project as long as they make the source available. I also added legal disclaimers to the about page of the calculator. 📈 Next steps Write the readme, publicise the repo, and host! Thanks for reading :)
calc82: Devlog #14 9/09/2026 calc82: because calculators are for everyone Final devlog. It’s done!! This last stretch was writing the readme and publishing everything to Github pages. You can now access it at https://rigelseven.github.io/calc82/ Now for a short reflection calc82 is the largest personal software project I have ever completed. This project taught me a lot about input parsing - specifically, tokenisers and syntax trees - and the importance of keeping a large codebase tidy . Overall, the structure of the project is well laid out. However, there are architectural decisions I made early on that I came to regret later (such as the fact that input is represented as a string, whereas it should probably be a tree). Developing calc82 also showed me that I am capable of putting together such an app from scratch. I’m pleased to have participated in Stardance and be given this opportunity.
Ships:
What did you make? calc82: A calculator web-app inspired by the Casio fx-82 series of scientific calculators. These calculators are common in high schools in my country. My project simulates the behaviour of the Casio calculator, while maintaining a good user experience on both desktop and mobile. What was challenging? Creating reliable algebraic (non-linear) input parsing was the most difficult part of the project. This was because it required some difficult array traversal to avoid invalid states - even one mistake would break the whole input. It took a lot of iterations to get to a working input system that passed all my tests. Close contenders for most challenging were the sheer volume of functions I needed to implement, as well as all possible states the calculator can be in. However, the challenge for this was finding time to get around to everything, rather than technical challenge. What are you proud of? I’m most proud of my implementation of the input-to-result pipeline. I was able to incorporate new-to-me concepts such as tokenisers and abstract syntax trees, yet the resulting code is arguably the cleanest part of the program. I’m also proud of the responsive layout, which supports desktop and mobile well, and that the user experience is similar enough to the Casio that my muscle memory carries over. Finally, I’m proud that I managed to finish the project, as it’s the largest software project I’ve ever managed to complete. Demo: https://rigelseven.github.io/calc82/ Source: https://github.com/rigelseven/calc82/...
|
1793004753.863248
|
1793091153.863248
|
|
38971
|
Canvas Sweeper by @GeorgeZ | Stardance
|
GeorgeZ
|
1
|
120.0
|
1426
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T06:30:59Z", "hours": 120.0, "multiplier": 11.9, "payout": 1426, "blessing": "neutral", "text": "Canvas Sweeper is officially shipped. canvassweeper.com The problem I wanted to solve was pretty simple: Canvas tells you what assignments you have, but it does not tell you how to fit all of that work into your actual life. Canvas Sweeper connects to Canvas, pulls your courses and assignments, tracks due dates and missing work, prioritizes what matters most, and turns everything into an actual study schedule based on your routines, school schedule, preferred study times, workload limits, and other commitments. It also includes: Google login Canvas connection + assignment sync assignment workspace smart prioritization automatic study plan generation recurring routines for school, rowing, clubs, commute, meals, sleep, work, and custom blocks student profile + study preferences Google Calendar integration Canvai ( Canvas ai ) account/privacy controls account deletion AI history deletion settings security checks, testing, Docker, CI/CD, and a self-hosted Ubuntu deployment 3 major quality-of-life improvements 1. Turns Canvas into an actual plan Instead of seeing a giant list of assignments and figuring everything out yourself, Canvas Sweeper decides when there is actually time to work on each assignment. 2. Plans around your real life School, practices, clubs, commute, sleep, meals, work, and other routines can all be added so it does not schedule homework when you are busy. 3. Automatically prioritizes important work Deadlines, missing assignments, tests, workload, and your preferences are considered so the most important work gets attention first. Why this is a QoL improvement The goal is to remove a bunch of repetitive planning. Instead of checking Canvas, checking your calendar, thinking about everything due, finding free time, and manually deciding what to work on, Canvas Sweeper brings those steps together. Working project The app is live and usable. Google login works, Canvas connection works, assignments can sync, routines/preferences can be configured, and the planning system can turn active assignments into a schedule. The Canvas integration is complete. Google Calendar can be connected, but its public OAuth configuration is still going through Google’s verification process, which can take a few weeks. Google may currently show an unverified-app warning during that connection flow, and testers can continue through the advanced option if they choose to. One note about the demo video: I currently have no active Canvas assignments, so there is nothing for Canvas Sweeper to turn into a study schedule in the recording. Effort / execution This ended up becoming way bigger than I originally expected. I built the frontend and backend, Canvas and Google integrations, database, authentication, planning logic, security systems, testing, Docker setup, CI/CD, and deployment. I also decided to self-host the actual application on my own Ubuntu server instead of using a normal app hosting platform, so I ended up learning Linux, Docker, networking, HTTPS, OAuth, APIs, databases, security, and production deployment along the way. Definitely a lot of hours went into this. Canvas Sweeper is live!!! Thanks for watching the journey!!", "repo": "https://github.com/georgeSzielinski/canvas-sweeper-demo", "demo": "https://canvassweeper.com/"}]...
|
[{"post_id": 46175, "ts": "202 [{"post_id": 46175, "ts": "2026-08-13T06:23:36Z", "hours": 0.3, "text": "finally found the issue - i set up google auth wrong and accidentally made it so only one person could sign up fixing that tomorrow, hopefully nothing else breaks."}, {"post_id": 45623, "ts": "2026-08-12T07:20:07Z", "hours": 0.3667, "text": "trying to get google auth working for hours and it still refuses to cooperate canvas sweeper coming soon 👀"}, {"post_id": 44990, "ts": "2026-08-11T03:50:19Z", "hours": 1.9667, "text": "Canvas Sweeper - Authentication Testing( Devlog #16 ) Had to reconnect Supabase today, which took a bit longer than expected. I’m now testing the full authentication flow with Google OAuth and fixing the last few signup/login issues. If everything goes smoothly, Canvas Sweeper will probably launch over the weekend 👀"}, {"post_id": 44441, "ts": "2026-08-10T06:00:29Z", "hours": 4.8, "text": "Unfortunately I have somehow gone in a complete circle trying to launch this I have never deployed anything before, so I guess there’s a first time for everything. 97.3% chance Canvas Sweeper launches tomorrow. Sorry for the delay. Was definitely not part of the plan."}, {"post_id": 43753, "ts": "2026-08-09T05:24:18Z", "hours": 3.3, "text": "Canvas Sweeper Launch Prep ( Devlog #15 ) Today I finished the final prep for launching canvas sweeper online. I spent most of the time making sure everything was secure, stable, and ready instead of rushing. I completed the Docker setup, hardened the frontend and backend containers, added security checks, verified the deployment pipeline, and prepared the Ubuntu server deploymen. I also finished the final testing, image verification, and release preparation needed before putting the app online. What’s Next Finish the final server setup Connect the deployment Launch Canvas Sweeper online tomorrow THANKS FOR READING!!!!"}, {"post_id": 43155, "ts": "2026-08-08T08:27:30Z", "hours": 6.7667, "text": "Canvas Sweeper Deployment ( Devlog #14 ) I’m finally getting Canvas Sweeper ready to go online. I’m going to host it on my own Ubuntu server using Docker, then connect the frontend, backend, database, HTTPS, and the public URL. Since I already have the server, I won’t pay for hosting like Vercel or Render, which is pretty cool because I can run the whole thing myself and keep upgrading it later. Today I worked on getting the release ready and security. I added and tested rate limits, user isolation, secret scanning, CodeQL, Gitleaks, container scanning, safer Docker builds, and a full GitHub release pipeline. I also spent a lot of time fixing random CI issues that only showed up once everything started running in GitHub. What’s Next Finish the last security checks Set up the server Connect the domain Put Canvas Sweeper online"}, {"post_id": 42482, "ts": "2026-08-07T07:54:14Z", "hours": 9.0333, "text": "Canvas Sweeper - Beta Security & Release Preparation ( Devlog #13 ) Features / Improvements Added AI safety improvements: AI claim grounding so canvai cannot make stupid academic conclusions Structured ai responses tied to real evidence Prompt injection protection Ai context and replay safety improvements Added AI privacy controls: ai enable/disable preference ai history deletion Account deletion system Updated ai disclosures and privacy explanations Added security protections: User isolation testing to prevent students from accessing other users data Rate limiting for authentication, Canvas, Calendar, planning, and Canvai ai Request size limits to prevent abuse Operation locks to prevent duplicate expensive tasks Error and logging sanitization Security headers and authenticated response cache protection Secret scanning and CI security improvements Added deployment and release preparation: Beta deployment configuration Secure Docker boundaries CI/CD security improvements Dependency and supply chain checks Updated privacy policy and terms of service Data retention and deletion documentation Security Work Completed Authentication hardening Authorization and user isolation testing API abuse protection ai security review Provider security boundaries Data lifecycle controls Account deletion testing Privacy and legal preparation What’s Next!!!! Finish final deployment steps Connect the beta URL Prepare Canvai for its first public users The first public beta release should be ready tomorrow.!!!!! THANKS FOR READING!!!"}, {"post_id": 41820, "ts": "2026-08-06T08:37:50Z", "hours": 8.8656, "text": "Canvas Sweeper — Beta Preparation & AI Upgrade ( Devlog # 12 ) Recently, I finished a lot of the final polish before letting other people test it. All major pages and workflows have been added, and I have been focusing on making the experience feel like a real product. the most annoying bugs I fixed was the Canvas connection status. I probably spent 4 hours fixing a tiny red connection box that was not turning green. It ended up being sync states, cached data, and different parts of the app interpreting connection status differently. What’s Next Before releasing a beta, I’m focusing on making Canvas Sweeper safe and ready for real users: Improving security and protecting student data Creating privacy policies and terms of service Improving AI privacy, safety, and transparency Testing user data isolation Preparing the app for a private beta launch THANKS FOR READING!!!"}, {"post_id": 41188, "ts": "2026-08-05T07:36:41Z", "hours": 8.0667, "text": "Canvai AI - Making Canvas Smarter ( Devlog # 11 ) Canvai has grown a lot since the last update. I finished building the foundation for Canvai ai and started preparing the next phase of the project. Features Complete Canvas assignment integration Automatic study planning with Google Calendar Student modeling based on completed work and feedback Adaptive Planning with workload analysis, simulations, and recommendations Canvai ai foundation with NVIDIA ai integration Safe ai architecture with read-only tools and evidence-based responses Redesigned Adaptive Planning experience to match the final product design What I Learned Designing ai systems around existing data instead of replacing them Building safe ai features with strict boundaries ( so nobody drains my pockets ) Creating large full stack applications with many connected systems Improving user experience through design reviews and testing How much work goes into turning a prototype into a real product What’s Next I’m currently working on redesigning Canvai Assistant and making the ai features feel like a real assistant. The goal is to let students ask questions about their assignments, schedules, risks, and progress while keeping everything evidence based and safe. THANKS FOR READING!! Page of free Nvidia ai APIs"}, {"post_id": 40614, "ts": "2026-08-04T08:38:54Z", "hours": 5.5667, "text": "Canvas Sweeper - Building the Brain( Devlog #10 ) Canvas Sweeper has grown a lot since the last update. Over the past few missions, I built the core systems that power Canvai: Features Canvas assignment intelligence: analyzes deadlines, workload, risk, and priority Smart scheduling engine: creates realistic study plans around school, rowing, and personal commitments Google Calendar integration: lets approved study plans become real calendar events Learning system: tracks completed work and improves understanding of planning accuracy Student modeling: learns from completed sessions and creates evidence-based insights Canvai assistant foundation: explains plans, risks, and recommendations without using AI yet Advanced planning: workload forecasting, exam planning, dependencies, and what-if scenarios Built With Next.js FastAPI PostgreSQL / SQLite Docker Google Calendar API Canvas API TypeScript Python What I learned this session Building large full stack systems takes much more than just writing features Designing reliable data models before adding AI is important Creating explainable systems is much harder than creating simple automation Testing, migrations, and security What’s Next The foundation for Canvai (canvas ai) is finally coming together. The next step is improving the user experience and preparing the system for the future AI phase. I am also making the page for the ai assistant and brain. THANKS FOR READING!!!"}, {"post_id": 39930, "ts": "2026-08-03T07:42:03Z", "hours": 6.2856, "text": "Canvas Sweeper = Final Stages! hopefully ( Devlog #9 ) Canvas Sweeper is finally fully functional and looking much better than before. I’ve connected the new UI to the real app and finished most of the core planning system. Built with Next.js + React FastAPI SQLAlchemy + Alembic SQLite Canvas API Google Calendar API Docker What it can do Sync real Canvas assignments Build study plans around your schedule Review and edit sessions Publish approved plans to Google Calendar Track progress and reschedule work Next Supabase/PostgreSQL Vercel deployment ( Hopefully soon ) Custom domain ( Already setting up ) Security and privacy improvements Invite only beta Background syncing AI task breakdown and smarter estimates THANKS FOR READING!!!"}, {"post_id": 39325, "ts": "2026-08-02T07:23:28Z", "hours": 7.9786, "text": "I Severely Underestimated This UI Redesign ( Devlog #8 ) I thought implementing the new Canvas Sweeper UI would be a quick frontend update. It was not… I’ve added the new dashboard, assignments page, and plan page, but I still need to finish the rest, including settings and all the smaller screens. Then I have to connect everything properly and make sure every button, state, animation, and real data flow actually works .😬 So this has officially turned into a multi day project, but it’s finally starting to come together. After the UI is fully finished and working, I can finally move on to the AI phase. THANKS FOR READING!!"}, {"post_id": 38697, "ts": "2026-08-01T06:48:05Z", "hours": 9.1, "text": "Canvas Sweeper’s New UI Is Almost Done ( Devlog #7 ) I implemented the new dashboard, assignments pages, planner screens, settings, and the rest of the redesigned app. At the moment everything is using demo data while I connect the new frontend to the real Canvas and Google Calendar systems. This took way longer than I expected because I had to rebuild a lot of the frontend stack without breaking the existing backend, authentication, scheduling system, or calendar publishing. The hardest parts were recreating all the animations, keeping the design consistent across every page, and making sure the new UI could still work with the real data. What I worked on New dashboard Assignments and detail pages Planner and scheduling screens Settings and account pages New animations and design system The new pages should be fully functional tomorrow or the day after. After that, I’m finally moving on to the AI phase"}, {"post_id": 38032, "ts": "2026-07-31T05:52:47Z", "hours": 7.5, "text": "My Own Server ( Devlog #6 ) (Picture of the server 😬, hopefully getting a case soon) Every day this project just keeps getting bigger. What started as a software project is now growing into a hardware project too. I wanted to make my own server to run my projects locally and create a dedicated machine for development, as my computer could not handle it anymore. I built this server completely from parts I found through thrift stores, garage sales, and things I was able to get for free. It has been really cool taking old hardware and turning it into something useful. Features 🖥️ Dedicated local server for running projects ⚙️ Full-stack development environment 🌐 Local hosting for applications and services 🔒 Remote access through SSH Hardware Intel Xeon 22-core / 44-thread processor 64GB DDR3 ECC RAM 1GB DDR3 VRAM GPU 1000W Power Supply Built with Ubuntu Server OpenSSH Python development tools Full stack development tools What I Learned Setting up this server took much longer than expected. Installing Ubuntu Server, configuring everything, and fixing all the small issues was definitely a challenge, but I learned a lot about hardware, Linux, and server management. Next Steps I am currently continuing development on the full stack side of things and getting everything ready to run locally on this server. Once that is finished, I will start working on the AI phase and adding more advanced features. Also ignore whats on the homepage"}, {"post_id": 37456, "ts": "2026-07-30T06:45:05Z", "hours": 8.1889, "text": "Building the Rest of Canvas Sweeper! The animated landing page from my last devlog is officially finished! 🎉 Now we are working on designing the rest of the app to match, including the dashboard, assignments, planner, and settings pages so everything feels more polished. At the same time, I’m wrapping up Phase 4, which is all about making sure the scheduling system can create, review, and publish reliable study plans before moving on to Phase 5, where I’ll start adding AI to make planning even smarter. Working on now 🎨 Dashboard & app pages 📅 Final Phase 4 scheduling improvements 🤖 Getting ready for the AI phase"}, {"post_id": 36865, "ts": "2026-07-29T06:23:15Z", "hours": 8.1667, "text": "Redesigning Canvas Sweeper! Me and my friends took a short break from adding new features to completely redesign the Canvas Sweeper UI. I wanted the landing page to feel more like an Apple product page, with smooth scroll animations that show assignments turning into an organized study schedule. I just finished implementing the new landing page and UI style! Next, I’m redesigning the dashboard, assignments, planner, settings, and the rest of the app to match. What I worked on Animated landing page Visual Canvas-to-calendar story Cleaner typography and layout Hopefully stop looking vide coded"}, {"post_id": 36238, "ts": "2026-07-28T05:58:07Z", "hours": 8.3333, "text": "Canvas Sweeper is getting smarter (no ai yet) I have no active assignments at the moment since it is summer time but you can see all of your previous assignments and late assignments, thus canvas connection is working Since my last devlog, I finished connecting Canvas Sweeper to my real Canvas account and Google Calendar, and I started building the main scheduling system. The app can now use my assignments, deadlines, existing calendar events, sleep schedule, school, rowing, and other commitments to find free time and build a study plan around my actual schedule. The biggest challenge has been making Google Calendar publishing safe. I’ve been fixing bugs involving duplicate events, sleep hour scheduling, rescheduling, and failed calendar syncs. Next, I’m finishing testing and making sure everything is reliable before moving on to the next phase, which is to implement ai."}, {"post_id": 35635, "ts": "2026-07-27T06:03:24Z", "hours": 6.6808, "text": "After about 6 and a half hours of work, Canvas Sweeper is finally connecting to my real Canvas account and Google Calendar! 🎉 The app can now import my actual courses and assignments, and the foundation for the scheduling system is in place. Eventually, it will look at my calendar, see when I’m busy with things like school and rowing, and automatically build a study schedule around my free time. The hardest bug so far was getting rid of “Demo Mode.” Everything on the backend was working, but the frontend still thought my account was fake. After lots of debugging, I finally got it and got everything working with real data. Next up is building the intelligent scheduling engine and removing the last bits of demo and hardcoded data before the app eventually goes public"}, {"post_id": 33863, "ts": "2026-07-24T04:01:27Z", "hours": 8.5814, "text": "AI Canvas Planner Its highkey broken,I can’t fix it for now and the ui sucks but this is my newest project! AI Canvas Planner is a full stack web application that automatically turns my Canvas assignments into an intelligent study schedule. Instead of just copying due dates onto a calendar, it connects to my Google Calendar, sees my existing schedule (school, rowing, appointments, etc.), and builds personalized study sessions around my free time. Right now it’s designed for my own workflow, but once it’s polished I plan to make it public so other students can use it too. Features:: 📚 Connects to Canvas to import assignments and courses 📅 Connects to Google Calendar to see existing events and availability 🧠 Automatically makes study sessions around your schedule ⚡ Prioritizes missing assignments, upcoming deadlines, and important work 🎯 Designed to be fully configurable so everyone can customize how their schedule is built 🔄 One-click assignment synchronization 🔐 Secure Google OAuth authentication 📱 Modern responsive interface with real-time updates 🚀 Planned public release after the scheduling engine is fully completed Built With: Next.js React TypeScript FastAPI Python SQLite (development) Docker & Docker Compose Google Calendar API Google OAuth 2.0 Canvas LMS API Alembic SQLAlchemy Vitest Playwright Pytest APIs & Services: Google Calendar API Google OAuth Canvas LMS REST API Docker GitHub Biggest Challenges So Far One of the hardest parts has been getting multiple APIs to work together. Google OAuth, Google Calendar, and Canvas all have different authentication flows and edge cases. I also spent a long time fixing down timezone bugs where Canvas timestamps and SQLite stored dates differently, causing assignments to crash until I normalized everything to UTC. Another frustrating bug happened after I connected Canvas successfully. The backend was working perfectly, but the frontend kept thinking it was still in demo mode, so it showed that Canvas wasn’t connected even though all of the API requests were succeeding. Bugs like these have taught me a lot about debugging full-stack applications and how frontend and backend state can get out of sync. What I Learned Building a full-stack web application from scratch Implementing secure OAuth authentication Working with multiple REST APIs at the same time Designing database schemas and migrations Debugging frontend and backend communication Managing Docker containers and local development environments Writing automated tests for both frontend and backend Handling timezones and date serialization correctly Building software that solves a real problem I deal with every day"}]...
|
Title: Canvas Sweeper by @GeorgeZ | Stardance
Dev Title: Canvas Sweeper by @GeorgeZ | Stardance
Devlogs:
AI Canvas Planner Its highkey broken,I can’t fix it for now and the ui sucks but this is my newest project! AI Canvas Planner is a full stack web application that automatically turns my Canvas assignments into an intelligent study schedule. Instead of just copying due dates onto a calendar, it connects to my Google Calendar, sees my existing schedule (school, rowing, appointments, etc.), and builds personalized study sessions around my free time. Right now it’s designed for my own workflow, but once it’s polished I plan to make it public so other students can use it too. Features:: 📚 Connects to Canvas to import assignments and courses 📅 Connects to Google Calendar to see existing events and availability 🧠 Automatically makes study sessions around your schedule ⚡ Prioritizes missing assignments, upcoming deadlines, and important work 🎯 Designed to be fully configurable so everyone can customize how their schedule is built 🔄 One-click assignment synchronization 🔐 Secure Google OAuth authentication 📱 Modern responsive interface with real-time updates 🚀 Planned public release after the scheduling engine is fully completed Built With: Next.js React TypeScript FastAPI Python SQLite (development) Docker & Docker Compose Google Calendar API Google OAuth 2.0 Canvas LMS API Alembic SQLAlchemy Vitest Playwright Pytest APIs & Services: Google Calendar API Google OAuth Canvas LMS REST API Docker GitHub Biggest Challenges So Far One of the hardest parts has been getting multiple APIs to work together. Google OAuth, Google Calendar, and Canvas all have different authentication flows and edge cases. I also spent a long time fixing down timezone bugs where Canvas timestamps and SQLite stored dates differently, causing assignments to crash until I normalized everything to UTC. Another frustrating bug happened after I connected Canvas successfully. The backend was working perfectly, but the frontend kept thinking it was still in demo mode, so it showed that Canvas wasn’t connected even though all of the API requests were succeeding. Bugs like these have taught me a lot about debugging full-stack applications and how frontend and backend state can get out of sync. What I Learned Building a full-stack web application from scratch Implementing secure OAuth authentication Working with multiple REST APIs at the same time Designing database schemas and migrations Debugging frontend and backend communication Managing Docker containers and local development environments Writing automated tests for both frontend and backend Handling timezones and date serialization correctly Building software that solves a real problem I deal with every day
After about 6 and a half hours of work, Canvas Sweeper is finally connecting to my real Canvas account and Google Calendar! 🎉 The app can now import my actual courses and assignments, and the foundation for the scheduling system is in place. Eventually, it will look at my calendar, see when I’m busy with things like school and rowing, and automatically build a study schedule around my free time. The hardest bug so far was getting rid of “Demo Mode.” Everything on the backend was working, but the frontend still thought my account was fake. After lots of debugging, I finally got it and got everything working with real data. Next up is building the intelligent scheduling engine and removing the last bits of demo and hardcoded data before the app eventually goes public
Canvas Sweeper is getting smarter (no ai yet) I have no active assignments at the moment since it is summer time but you can see all of your previous assignments and late assignments, thus canvas connection is working Since my last devlog, I finished connecting Canvas Sweeper to my real Canvas account and Google Calendar, and I started building the main scheduling system. The app can now use my assignments, deadlines, existing calendar events, sleep schedule, school, rowing, and other commitments to find free time and build a study plan around my actual schedule. The biggest challenge has been making Google Calendar publishing safe. I’ve been fixing bugs involving duplicate events, sleep hour scheduling, rescheduling, and failed calendar syncs. Next, I’m finishing testing and making sure everything is reliable before moving on to the next phase, which is to implement ai.
Redesigning Canvas Sweeper! Me and my friends took a short break from adding new features to completely redesign the Canvas Sweeper UI. I wanted the landing page to feel more like an Apple product page, with smooth scroll animations that show assignments turning into an organized study schedule. I just finished implementing the new landing page and UI style! Next, I’m redesigning the dashboard, assignments, planner, settings, and the rest of the app to match. What I worked on Animated landing page Visual Canvas-to-calendar story Cleaner typography and layout Hopefully stop looking vide coded
Building the Rest of Canvas Sweeper! The animated landing page from my last devlog is officially finished! 🎉 Now we are working on designing the rest of the app to match, including the dashboard, assignments, planner, and settings pages so everything feels more polished. At the same time, I’m wrapping up Phase 4, which is all about making sure the scheduling system can create, review, and publish reliable study plans before moving on to Phase 5, where I’ll start adding AI to make planning even smarter. Working on now 🎨 Dashboard & app pages 📅 Final Phase 4 scheduling improvements 🤖 Getting ready for the AI phase
My Own Server ( Devlog #6 ) (Picture of the server 😬, hopefully getting a case soon) Every day this project just keeps getting bigger. What started as a software project is now growing into a hardware project too. I wanted to make my own server to run my projects locally and create a dedicated machine for development, as my computer could not handle it anymore. I built this server completely from parts I found through thrift stores, garage sales, and things I was able to get for free. It has been really cool taking old hardware and turning it into something useful. Features 🖥️ Dedicated local server for running projects ⚙️ Full-stack development environment 🌐 Local hosting for applications and services 🔒 Remote access through SSH Hardware Intel Xeon 22-core / 44-thread processor 64GB DDR3 ECC RAM 1GB DDR3 VRAM GPU 1000W Power Supply Built with Ubuntu Server OpenSSH Python development tools Full stack development tools What I Learned Setting up this server took much longer than expected. Installing Ubuntu Server, configuring everything, and fixing all the small issues was definitely a challenge, but I learned a lot about hardware, Linux, and server management. Next Steps I am currently continuing development on the full stack side of things and getting everything ready to run locally on this server. Once that is finished, I will start working on the AI phase and adding more advanced features. Also ignore whats on the homepage
Canvas Sweeper’s New UI Is Almost Done ( Devlog #7 ) I implemented the new dashboard, assignments pages, planner screens, settings, and the rest of the redesigned app. At the moment everything is using demo data while I connect the new frontend to the real Canvas and Google Calendar systems. This took way longer than I expected because I had to rebuild a lot of the frontend stack without breaking the existing backend, authentication, scheduling system, or calendar publishing. The hardest parts were recreating all the animations, keeping the design consistent across every page, and making sure the new UI could still work with the real data. What I worked on New dashboard Assignments and detail pages Planner and scheduling screens Settings and account pages New animations and design system The new pages should be fully functional tomorrow or the day after. After that, I’m finally moving on to the AI phase
I Severely Underestimated This UI Redesign ( Devlog #8 ) I thought implementing the new Canvas Sweeper UI would be a quick frontend update. It was not… I’ve added the new dashboard, assignments page, and plan page, but I still need to finish the rest, including settings and all the smaller screens. Then I have to connect everything properly and make sure every button, state, animation, and real data flow actually works .😬 So this has officially turned into a multi day project, but it’s finally starting to come together. After the UI is fully finished and working, I can finally move on to the AI phase. THANKS FOR READING!!
Canvas Sweeper = Final Stages! hopefully ( Devlog #9 ) Canvas Sweeper is finally fully functional and looking much better than before. I’ve connected the new UI to the real app and finished most of the core planning system. Built with Next.js + React FastAPI SQLAlchemy + Alembic SQLite Canvas API Google Calendar API Docker What it can do Sync real Canvas assignments Build study plans around your schedule Review and edit sessions Publish approved plans to Google Calendar Track progress and reschedule work Next Supabase/PostgreSQL Vercel deployment ( Hopefully soon ) Custom domain ( Already setting up ) Security and privacy improvements Invite only beta Background syncing AI task breakdown and smarter estimates THANKS FOR READING!!!
Canvas Sweeper - Building the Brain( Devlog #10 ) Canvas Sweeper has grown a lot since the last update. Over the past few missions, I built the core systems that power Canvai: Features Canvas assignment intelligence: analyzes deadlines, workload, risk, and priority Smart scheduling engine: creates realistic study plans around school, rowing, and personal commitments Google Calendar integration: lets approved study plans become real calendar events Learning system: tracks completed work and improves understanding of planning accuracy Student modeling: learns from completed sessions and creates evidence-based insights Canvai assistant foundation: explains plans, risks, and recommendations without using AI yet Advanced planning: workload forecasting, exam planning, dependencies, and what-if scenarios Built With Next.js FastAPI PostgreSQL / SQLite Docker Google Calendar API Canvas API TypeScript Python What I learned this session Building large full stack systems takes much more than just writing features Designing reliable data models before adding AI is important Creating explainable systems is much harder than creating simple automation Testing, migrations, and security What’s Next The foundation for Canvai (canvas ai) is finally coming together. The next step is improving the user experience and preparing the system for the future AI phase. I am also making the page for the ai assistant and brain. THANKS FOR READING!!!
Canvai AI - Making Canvas Smarter ( Devlog # 11 ) Canvai has grown a lot since the last update. I finished building the foundation for Canvai ai and started preparing the next phase of the project. Features Complete Canvas assignment integration Automatic study planning with Google Calendar Student modeling based on completed work and feedback Adaptive Planning with workload analysis, simulations, and recommendations Canvai ai foundation with NVIDIA ai integration Safe ai architecture with read-only tools and evidence-based responses Redesigned Adaptive Planning experience to match the final product design What I Learned Designing ai systems around existing data instead of replacing them Building safe ai features with strict boundaries ( so nobody drains my pockets ) Creating large full stack applications with many connected systems Improving user experience through design reviews and testing How much work goes into turning a prototype into a real product What’s Next I’m currently working on redesigning Canvai Assistant and making the ai features feel like a real assistant. The goal is to let students ask questions about their assignments, schedules, risks, and progress while keeping everything evidence based and safe. THANKS FOR READING!! Page of free Nvidia ai APIs
Canvas Sweeper — Beta Preparation & AI Upgrade ( Devlog # 12 ) Recently, I finished a lot of the final polish before letting other people test it. All major pages and workflows have been added, and I have been focusing on making the experience feel like a real product. the most annoying bugs I fixed was the Canvas connection status. I probably spent 4 hours fixing a tiny red connection box that was not turning green. It ended up being sync states, cached data, and different parts of the app interpreting connection status differently. What’s Next Before releasing a beta, I’m focusing on making Canvas Sweeper safe and ready for real users: Improving security and protecting student data Creating privacy policies and terms of service Improving AI privacy, safety, and transparency Testing user data isolation Preparing the app for a private beta launch THANKS FOR READING!!!
Canvas Sweeper - Beta Security & Release Preparation ( Devlog #13 ) Features / Improvements Added AI safety improvements: AI claim grounding so canvai cannot make stupid academic conclusions Structured ai responses tied to real evidence Prompt injection protection Ai context and replay safety improvements Added AI privacy controls: ai enable/disable preference ai history deletion Account deletion system Updated ai disclosures and privacy explanations Added security protections: User isolation testing to prevent students from accessing other users data Rate limiting for authentication, Canvas, Calendar, planning, and Canvai ai Request size limits to prevent abuse Operation locks to prevent duplicate expensive tasks Error and logging sanitization Security headers and authenticated response cache protection Secret scanning and CI security improvements Added deployment and release preparation: Beta deployment configuration Secure Docker boundaries CI/CD security improvements Dependency and supply chain checks Updated privacy policy and terms of service Data retention and deletion documentation Security Work Completed Authentication hardening Authorization and user isolation testing API abuse protection ai security review Provider security boundaries Data lifecycle controls Account deletion testing Privacy and legal preparation What’s Next!!!! Finish final deployment steps Connect the beta URL Prepare Canvai for its first public users The first public beta release should be ready tomorrow.!!!!! THANKS FOR READING!!!
Canvas Sweeper Deployment ( Devlog #14 ) I’m finally getting Canvas Sweeper ready to go online. I’m going to host it on my own Ubuntu server using Docker, then connect the frontend, backend, database, HTTPS, and the public URL. Since I already have the server, I won’t pay for hosting like Vercel or Render, which is pretty cool because I can run the whole thing myself and keep upgrading it later. Today I worked on getting the release ready and security. I added and tested rate limits, user isolation, secret scanning, CodeQL, Gitleaks, container scanning, safer Docker builds, and a full GitHub release pipeline. I also spent a lot of time fixing random CI issues that only showed up once everything started running in GitHub. What’s Next Finish the last security checks Set up the server Connect the domain Put Canvas Sweeper online
Canvas Sweeper Launch Prep ( Devlog #15 ) Today I finished the final prep for launching canvas sweeper online. I spent most of the time making sure everything was secure, stable, and ready instead of rushing. I completed the Docker setup, hardened the frontend and backend containers, added security checks, verified the deployment pipeline, and prepared the Ubuntu server deploymen. I also finished the final testing, image verification, and release preparation needed before putting the app online. What’s Next Finish the final server setup Connect the deployment Launch Canvas Sweeper online tomorrow THANKS FOR READING!!!!
Unfortunately I have somehow gone in a complete circle trying to launch this I have never deployed anything before, so I guess there’s a first time for everything. 97.3% chance Canvas Sweeper launches tomorrow. Sorry for the delay. Was definitely not part of the plan.
Canvas Sweeper - Authentication Testing( Devlog #16 ) Had to reconnect Supabase today, which took a bit longer than expected. I’m now testing the full authentication flow with Google OAuth and fixing the last few signup/login issues. If everything goes smoothly, Canvas Sweeper will probably launch over the weekend 👀
trying to get google auth working for hours and it still refuses to cooperate canvas sweeper coming soon 👀
finally found the issue - i set up google auth wrong and accidentally made it so only one person could sign up fixing that tomorrow, hopefully nothing else breaks.
Ships:
Canvas Sweeper is officially shipped. canvassweeper.com The problem I wanted to solve was pretty simple: Canvas tells you what assignments you have, but it does not tell you how to fit all of that work into your actual life. Canvas Sweeper connects to Canvas, pulls your courses and assignments, tracks due dates and missing work, prioritizes what matters most, and turns everything into an actual study schedule based on your routines, school schedule, preferred study times, workload limits, and other commitments. It also includes: Google login Canvas connection + assignment sync assignment workspace smart prioritization automatic study plan generation recurring routines for school, rowing, clubs, commute, meals, sleep, work, and custom blocks student profile + study preferences Google Calendar integration Canvai ( Canvas ai ) account/privacy controls account deletion AI history deletion settings security checks, testing, Docker, CI/CD, and a self-hosted Ubuntu deployment 3 major quality-of-life improvements 1. Turns Canvas into an actual plan Instead of seeing a giant list of assignments and figuring everything out yourself, Canvas Sweeper decides when there is actually time to work on each assignment. 2. Plans around your real life School, practices, clubs, commute, sleep, meals, work, and other routines can all be added so it does not schedule homework when you are busy. 3. Automatically prioritizes important work Deadlines, missing assignments, tests, workload, and your preferences are considered so the most important work gets attention first. Why this is a QoL improvement The goal is to remove a bunch of repetitive planning. Instead of checking Canvas, checking your calendar, thinking about everything due, finding free time, and manually deciding what to work on, Canvas Sweeper brings those steps together. Working project The app is live and usable. Google login works, Canvas connection works, assignments can sync, routines/preferences can be configured, and the planning system can turn active assignments into a schedule. The Canvas integration is complete. Google Calendar can be connected, but its public OAuth configuration is still going through Google’s verification process, which can take a few weeks. Google may currently show an unverified-app warning during that connection flow, and testers can continue through the advanced option if they choose to. One note about the demo video: I currently have no active Canvas assignments, so there is nothing for Canvas Sweeper to turn into a study schedule in the recording. Effort / execution This ended up becoming way bigger than I originally expected. I built the frontend and backend, Canvas and Google integrations, database, authentication, planning logic, security systems, testing, Docker setup, CI/CD, and deployment. I also decided to self-host the actual application on my own Ubuntu server instead of using a normal app hosting platform, so I ended up learning Linux, Docker, networking, HTTPS, OAuth, APIs, databases, security, and production deployment along the way. Definitely a lot of hours went into this. Canvas Sweeper is live!!! Thanks for watching the journey!!...
|
1792878727.513517
|
1793742727.513517
|
|
7806
|
Crooked Rails by @AllInTw0 | Stardance
|
AllInTw0
|
0
|
119.84
|
0
|
[]
|
[{"post_id": 80798, "ts": "202 [{"post_id": 80798, "ts": "2026-10-18T20:21:48Z", "hours": 9.9678, "text": "Thirteenth devlog of the game! I added/changed various stuff so here is a list of changes: -Added a new weapon - Flamethrower! -Added a debuff system! Currently only has the fire debuff from the flamethrower addition. -Added Xray vision to enemies that are dealing damage. (This mostly so that the player can quickly locate the cause of damage to the train) -Changed how code handles structure spawning. (doesn’t change anything gameplay wise) -Other small improvements/fixes I was also experimenting with better movement around the train, but dont have anything to show for it currently. Here are two videos showcasing the Flamethrower and the Xray!"}, {"post_id": 76847, "ts": "2026-10-04T20:10:21Z", "hours": 9.9686, "text": "Twelfth devlog of the game! As I am getting closer and closer to the first ship I decided to make a lobby system so that multiple sessions can be going at once rather than the forced one session for playtesting. Before that I also made a new crane railcar model that also visually lifts the payload to be loaded on to the train for the payload minigame. Here are two videos for each major change plus a image of how the crane car looks on the job preview."}, {"post_id": 72727, "ts": "2026-09-23T16:29:21Z", "hours": 9.4689, "text": "Eleventh devlog of the game! I continued work on the payload escort minigame. List of changes: -Added basic structures to the generation. (The goal is a western mining town) -Added the ability for props to spawn on terrain. -Added enemy wave spawning specific to the payload. (enemies use the structures as spawn points) -Added a crane rail car that picks up the payload to be delivered to the station. (Probably a new model for it next devlog) -Added a new station section where you will be able to pick special additional jobs with a starting fee but if successful a returning pay. -Improved how the uppercutter enemy calculates the trajectory. -Improved movement for both player and enemies -Other tiny changes Still have some issues with the terrain where the track sinks into the ground and the surrounding terrain around structures looking odd. Dont know if ill ever fully fix it. Here is a video showcasing the current state of the payload escort and the prototype special job monitor. I didnt fully play through the escort before recording the video and I was pretty surprised how fun it actually felt and its not even finished. Hope others will think its fun to."}, {"post_id": 70635, "ts": "2026-09-19T14:22:16Z", "hours": 9.2675, "text": "Tenth devlog of the game! I decided to start making an idea I had from the beginning of the project. The idea is that you have to escort a minecart payload through a randomly generated town in return for bonus money. Its basically the main game but around a smaller train which allows for a higher number enemies all going for one target and more interesting generation. So far I made the very basics. The track gen (took the most of time) where it can also go over the main train tracks and the payload prototype that moves if a player is nearby. If an enemy attacks it, it gets stunned not being able to move for a second or so. I also improved the new enemy AI around how it handles enemy-enemy targeting so two uppercutters dont go to the same enemy. I also fixed a spline mesh bug that was in the game since the beginning of the project. Here is a video showcasing the payload plus some pictures of interesting bugs."}, {"post_id": 69814, "ts": "2026-09-17T20:36:15Z", "hours": 11.4131, "text": "Ninth devlog of the game! This devlog is mostly three things. Firstly, I finally added new enemies! Their descriptions: Healer: heals nearby enemies by tethering itself to the target. I plan on adding a passive effect that reduces the targets incoming damage. The Uppercuter: punches melee enemies forward to their target. To accommodate this I lowered the melee enemy walk speed. Secondly, I improved the inventory UI to highlight the selected item more by adding a scaling animation and a cyan tint. Finally, I added a display boards on all railcars that show the health of the railcar and the cargo. Other changes: -Fixed some multiplayer bugs Here is a video showcasing the inventory and enemies as well as a picture of the display board."}, {"post_id": 50556, "ts": "2026-08-19T19:22:54Z", "hours": 9.5303, "text": "Eighth devlog of the game! I finally finished syncing all of the games features/mechanics! Of course with the help of my friend we held the first multiplayer playtest of the game! It went about as expected - quite a few bugs… But it was still playable and I had fun. List Of Changes: -Added a starting shop -Fixed the blur that sometimes appeared on papers + improved paper visuals -Implemented Spectating -Synced Game Over -Synced Bucket Item -Synced Teleporter Item -Synced Sentry -Synced Railcar Derailing -Improved enemy health sync. (Had an issue in the playtest where the client thought the enemy was dead, but it was still alive for the host) -Synced explosive tankcar -Other tiny stuff GIF of a funny moment from the playtest. Plus the new starting shop and some bugs from the playtest."}, {"post_id": 42041, "ts": "2026-08-06T16:31:33Z", "hours": 10.925, "text": "Seventh devlog of the game! Continuing heavy work on multiplayer - now touching up the few last things left to sync between host & client. I believe next devlog or two the game will be fully converted to work in multiplayer! List of changes: -Synced health script (Used in various areas beyond player & enemy health. For example: tender’s fuel and water level) -Synced water tower -Synced train upgrades -Synced foliage spawning -Synced items - health kit & backpack expander -Implemented a basic enemy sync Here is a video showcasing the water tower and the train upgrades. Left is client, right is host. Did not notice i went over the 10h mark… how fun."}, {"post_id": 40643, "ts": "2026-08-04T10:08:05Z", "hours": 9.8547, "text": "Sixth devlog of the game! Continued work on multiplayer - this time syncing everything in the station. Showcased changes: -Synced hauling job monitors (the 3 at the entrance) -Synced railcar spawning and despawning -Synced shops -Synced sell station -Synced unlock station Possibly unnoticeable changes: -Improved player movement sync -Improved locomotive control syncing Here is a video showcasing the changes. Right is client, left is host. Next up i plan on syncing enemies."}, {"post_id": 32858, "ts": "2026-07-22T09:06:29Z", "hours": 10.0806, "text": "Fifth devlog of the game! This time i went all over the place working on stuff that doesn’t contain a lot of multiplayer. Why? Because I was waiting for my order of 16GB of RAM to arrive so my laptop doesn’t crash with two games running at once. Now its running smoothly and I can continue working on multiplayer! Here are the showcased changes: -Started work on a new starting location -Added a train ride intro -Added train sounds Not showcased changes: -Started work on syncing the station, hauling jobs and rail-car spawning/despawning for multiplayer"}, {"post_id": 20816, "ts": "2026-07-02T14:59:07Z", "hours": 10.1861, "text": "Fourth devlog of the game! Continuing to work on multiplayer. This time focusing on the world and train by syncing train movement and controls and by syncing the world seed and generated structures. Here is a video showcasing being able to control the train from a client and some screenshots showcasing the host view (top) and the client view (bottom). There are still some things that are not synced fully. Maybe you can spot some differences"}, {"post_id": 7387, "ts": "2026-06-12T09:54:39Z", "hours": 8.6583, "text": "Third devlog of the game! I am finally adding MULTIPLAYER!!! :D I added the ability to host and join sessions across the world. Currently only movement, inventory, item physics and interactions with guns is synced. Still a lot of work needs to be done to convert he whole game. Here is a video showcasing it running locally from the client’s perspective in a testing scene."}, {"post_id": 5647, "ts": "2026-06-09T14:56:26Z", "hours": 10.2222, "text": "Second devlog of the game! Worked on quite different stuff. Showcased changes: -Added a camera shake -Modeled a swamp-like tree -Added tank car explosion + visually damaged model. -Improved scene lighting a bit. (Still need to mess around more) Not showcased: -Improved code behind shops and added support for rerolls."}, {"post_id": 2667, "ts": "2026-06-05T10:41:42Z", "hours": 0.3011, "text": "First (eighteenth) devlog of the game! Since this is a continuation of a project from Flavortown and before hand here are the things I changed since Flavortown: -Added a companion robot. Follows the player and attacks enemies -Added a teleporter. The player can carry it and use it for easier travel between important locations -Experimented with different types of foliage -The rails finally are crooked and not perfect curves! To fit the name -Added a groundwork texture around the rails Changes not showcased: -Improved player and enemy movement -Track that transitions from the station and playable space will avoid going into mountains -Improved navigation mesh generation If you wish to see the gameplay of the game: https://youtu.be/yDcuscI8zDo Flavortown project: https://flavortown.hackclub.com//projects/10071"}]...
|
Title: Crooked Rails by @AllInTw0 | Stardance
Dev Title: Crooked Rails by @AllInTw0 | Stardance
Devlogs:
First (eighteenth) devlog of the game! Since this is a continuation of a project from Flavortown and before hand here are the things I changed since Flavortown: -Added a companion robot. Follows the player and attacks enemies -Added a teleporter. The player can carry it and use it for easier travel between important locations -Experimented with different types of foliage -The rails finally are crooked and not perfect curves! To fit the name -Added a groundwork texture around the rails Changes not showcased: -Improved player and enemy movement -Track that transitions from the station and playable space will avoid going into mountains -Improved navigation mesh generation If you wish to see the gameplay of the game: https://youtu.be/yDcuscI8zDo Flavortown project: https://flavortown.hackclub.com//projects/10071
Second devlog of the game! Worked on quite different stuff. Showcased changes: -Added a camera shake -Modeled a swamp-like tree -Added tank car explosion + visually damaged model. -Improved scene lighting a bit. (Still need to mess around more) Not showcased: -Improved code behind shops and added support for rerolls.
Third devlog of the game! I am finally adding MULTIPLAYER!!! :D I added the ability to host and join sessions across the world. Currently only movement, inventory, item physics and interactions with guns is synced. Still a lot of work needs to be done to convert he whole game. Here is a video showcasing it running locally from the client’s perspective in a testing scene.
Fourth devlog of the game! Continuing to work on multiplayer. This time focusing on the world and train by syncing train movement and controls and by syncing the world seed and generated structures. Here is a video showcasing being able to control the train from a client and some screenshots showcasing the host view (top) and the client view (bottom). There are still some things that are not synced fully. Maybe you can spot some differences
Fifth devlog of the game! This time i went all over the place working on stuff that doesn’t contain a lot of multiplayer. Why? Because I was waiting for my order of 16GB of RAM to arrive so my laptop doesn’t crash with two games running at once. Now its running smoothly and I can continue working on multiplayer! Here are the showcased changes: -Started work on a new starting location -Added a train ride intro -Added train sounds Not showcased changes: -Started work on syncing the station, hauling jobs and rail-car spawning/despawning for multiplayer
Sixth devlog of the game! Continued work on multiplayer - this time syncing everything in the station. Showcased changes: -Synced hauling job monitors (the 3 at the entrance) -Synced railcar spawning and despawning -Synced shops -Synced sell station -Synced unlock station Possibly unnoticeable changes: -Improved player movement sync -Improved locomotive control syncing Here is a video showcasing the changes. Right is client, left is host. Next up i plan on syncing enemies.
Seventh devlog of the game! Continuing heavy work on multiplayer - now touching up the few last things left to sync between host & client. I believe next devlog or two the game will be fully converted to work in multiplayer! List of changes: -Synced health script (Used in various areas beyond player & enemy health. For example: tender’s fuel and water level) -Synced water tower -Synced train upgrades -Synced foliage spawning -Synced items - health kit & backpack expander -Implemented a basic enemy sync Here is a video showcasing the water tower and the train upgrades. Left is client, right is host. Did not notice i went over the 10h mark… how fun.
Eighth devlog of the game! I finally finished syncing all of the games features/mechanics! Of course with the help of my friend we held the first multiplayer playtest of the game! It went about as expected - quite a few bugs… But it was still playable and I had fun. List Of Changes: -Added a starting shop -Fixed the blur that sometimes appeared on papers + improved paper visuals -Implemented Spectating -Synced Game Over -Synced Bucket Item -Synced Teleporter Item -Synced Sentry -Synced Railcar Derailing -Improved enemy health sync. (Had an issue in the playtest where the client thought the enemy was dead, but it was still alive for the host) -Synced explosive tankcar -Other tiny stuff GIF of a funny moment from the playtest. Plus the new starting shop and some bugs from the playtest.
Ninth devlog of the game! This devlog is mostly three things. Firstly, I finally added new enemies! Their descriptions: Healer: heals nearby enemies by tethering itself to the target. I plan on adding a passive effect that reduces the targets incoming damage. The Uppercuter: punches melee enemies forward to their target. To accommodate this I lowered the melee enemy walk speed. Secondly, I improved the inventory UI to highlight the selected item more by adding a scaling animation and a cyan tint. Finally, I added a display boards on all railcars that show the health of the railcar and the cargo. Other changes: -Fixed some multiplayer bugs Here is a video showcasing the inventory and enemies as well as a picture of the display board.
Tenth devlog of the game! I decided to start making an idea I had from the beginning of the project. The idea is that you have to escort a minecart payload through a randomly generated town in return for bonus money. Its basically the main game but around a smaller train which allows for a higher number enemies all going for one target and more interesting generation. So far I made the very basics. The track gen (took the most of time) where it can also go over the main train tracks and the payload prototype that moves if a player is nearby. If an enemy attacks it, it gets stunned not being able to move for a second or so. I also improved the new enemy AI around how it handles enemy-enemy targeting so two uppercutters dont go to the same enemy. I also fixed a spline mesh bug that was in the game since the beginning of the project. Here is a video showcasing the payload plus some pictures of interesting bugs.
Eleventh devlog of the game! I continued work on the payload escort minigame. List of changes: -Added basic structures to the generation. (The goal is a western mining town) -Added the ability for props to spawn on terrain. -Added enemy wave spawning specific to the payload. (enemies use the structures as spawn points) -Added a crane rail car that picks up the payload to be delivered to the station. (Probably a new model for it next devlog) -Added a new station section where you will be able to pick special additional jobs with a starting fee but if successful a returning pay. -Improved how the uppercutter enemy calculates the trajectory. -Improved movement for both player and enemies -Other tiny changes Still have some issues with the terrain where the track sinks into the ground and the surrounding terrain around structures looking odd. Dont know if ill ever fully fix it. Here is a video showcasing the current state of the payload escort and the prototype special job monitor. I didnt fully play through the escort before recording the video and I was pretty surprised how fun it actually felt and its not even finished. Hope others will think its fun to.
Twelfth devlog of the game! As I am getting closer and closer to the first ship I decided to make a lobby system so that multiple sessions can be going at once rather than the forced one session for playtesting. Before that I also made a new crane railcar model that also visually lifts the payload to be loaded on to the train for the payload minigame. Here are two videos for each major change plus a image of how the crane car looks on the job preview.
Thirteenth devlog of the game! I added/changed various stuff so here is a list of changes: -Added a new weapon - Flamethrower! -Added a debuff system! Currently only has the fire debuff from the flamethrower addition. -Added Xray vision to enemies that are dealing damage. (This mostly so that the player can quickly locate the cause of damage to the train) -Changed how code handles structure spawning. (doesn’t change anything gameplay wise) -Other small improvements/fixes I was also experimenting with better movement around the train, but dont have anything to show for it currently. Here are two videos showcasing the Flamethrower and the Xray!...
|
1792504468.309998
|
1793109268.309998
|
|
70171
|
zero-hour by @jakub-ginal | Stardance
|
jakub-ginal
|
0
|
119.43
|
0
|
[]
|
[{"post_id": 82659, "ts": "202 [{"post_id": 82659, "ts": "2026-10-25T15:16:16Z", "hours": 9.9333, "text": "v1.13.0 - Saved Launches and Subscribable Calendars Saved Launches - Added browser-based bookmarks, a saved-only filter, live count, and empty state. Full Launch Manifest - Added up to 100 upcoming missions, displayed 24 at a time with a Load More button. Calendar Feed - Added /api/calendar for subscribing to confirmed launches, excluding tentative dates until schedules become more certain. Calendar Setup Page - Added a copyable feed URL, .ics downloads, and subscription instructions. Mission Calendar Files - Added individual calendar events with launch details and links back to mission briefings. API Performance - Added ETags, 304 responses, gzip compression, and stale-cache fallback. Calendar Download Fix - Redirected browser visits to the setup page and fixed download handling. Interface Polish - Improved accessibility, bookmark controls, responsive layouts, and saved-launch indicators. Published - v1.13.0 is now available on GitHub."}, {"post_id": 82472, "ts": "2026-10-24T22:17:34Z", "hours": 8.1708, "text": "v1.12.0 - Honest Launch Dates and Shareable Mission Briefings Date Precision - Unconfirmed launch dates now display as NET Q4 2026 or NET May 2026 and appear under “Date to be confirmed”. Mission Briefing Redesign - Added status and live pills, image credits, country codes, launch windows, weather, webcast links, maps, and copy-link actions. Shareable Launch Links - Added #launch/<id> links that open the correct briefing on page load or when pasted, including launches outside the initially loaded page. Enhanced Launch Cards - Added orbit badges, success and failure colors, and a visual highlight for imminent launches. Visual Polish - Added muted country codes and added a hero word-reveal animation, scroll-aware navigation, and a subtle card spotlight effect. Smarter Calendar Files - Added shareable launch links to calendar files and warnings when launch dates are not final. Published - v1.12.0 is now available on GitHub."}, {"post_id": 82226, "ts": "2026-10-24T10:18:21Z", "hours": 10.1667, "text": "v1.11.0 - Sticky Navigation and Launch Manifest Sticky Navigation - Added a fixed top bar with a new logo mark, ZERO HOUR wordmark, Manifest and About links, live clock, and Local / UTC switch. Launch Manifest Section - Added a dedicated section header with a live launch count and status note. Lost Signal Panel - Added a dedicated error panel with a Retry button when the launch feed is unreachable. Hero Scroll Cue - Added a scroll indicator and smooth anchor scrolling with an offset for the sticky header. Active Navigation - Highlighted the section currently being viewed and hid section links on mobile. Branding and Credits - Updated the footer branding and data credits, and added the logo to the boot screen. Reduced Motion Support - Extended reduced-motion support to the new animations. Published - v1.11.0 is now available on GitHub."}, {"post_id": 82070, "ts": "2026-10-23T18:20:04Z", "hours": 10.0611, "text": "v1.10.0 - Live Clock and Enhanced Launch Dashboard Live Clock - Added a header clock with a pulsing status indicator that follows the selected Local or UTC time zone. Hero Metadata - Added provider, launch pad, and launch window details to the hero section. Launch Actions - Added Mission Briefing and Add to Calendar actions for the next launch. Calendar Confirmation - Added toast notifications to confirm successful calendar downloads. Radar Statistics - Added launch counts for the next 24 hours, the current week, and Go-status launches. About Section - Added information explaining the data source and launch status meanings. Search Shortcut - Added the / keyboard shortcut to jump directly to search. Hero Button Polish - Kept the primary hero button subtle to maintain visual balance. Published - v1.10.0 is now available on GitHub."}, {"post_id": 81893, "ts": "2026-10-22T21:34:09Z", "hours": 12.0217, "text": "v1.9.0 - Testing, Security, and UI Polish Automated Tests - Added a pytest suite covering the API, provider filtering, cache reuse, stale data fallback, and 503 responses. Secure Rendering - Escaped launch data before rendering and restricted links to HTTP and HTTPS. Focus Management - Restored keyboard focus to the launch card after closing the detail dialog. Accessibility Improvements - Added a skip link, live status region, aria-busy state, and an accessible dialog label. Error Handling - Added a Retry button and an Offline footer state when loading fails. Reduced Motion Support - Disabled radar, blip, and skeleton animations when reduced motion is enabled. Typography - Added Space Grotesk, Inter, and JetBrains Mono with system font fallbacks. Visual Polish - Added a gradient hero title, card hover lift and zoom effects, and accent-colored text selection. Favicon - Added favicon.svg Published - v1.9.0 is now available on GitHub."}, {"post_id": 81709, "ts": "2026-10-22T05:31:23Z", "hours": 12.3517, "text": "v1.8.0 - FastAPI Backend and Data Caching FastAPI Backend - Added API endpoints for listing launches, retrieving the next launch, fetching launch details, and checking service health. Normalized Launch Data - Converted Launch Library 2 records into a consistent launch model. 10-Minute Cache - Cached upstream data for 10 minutes to reduce API requests and extend free-tier usage. Single-Flight Refresh - Added a lock to prevent concurrent requests from triggering duplicate data refreshes. Stale Data Fallback - Kept serving the last successful data with a stale flag when the upstream API fails. Refresh Backoff - Added a 60-second cooldown after a failed refresh to avoid repeated requests. Frontend API Integration - Switched the frontend to fetch launches from /api/launches and use normalized fields. Local Development Mode - Added local run instructions and a development mode that serves the frontend directly from the API. Published - v1.8.0 is now available on GitHub."}, {"post_id": 81523, "ts": "2026-10-21T15:54:03Z", "hours": 8.9514, "text": "v1.7.0 - Live Launch Radar and Boot Sequence Launch Radar - Added a hero radar panel with rings, a crosshair, and a rotating sweep. Launch Pad Tracking - Plotted launch pads as pulsing blips based on their latitude and longitude. Hero Stats - Added live stats for tracked launches, providers, and the next lift-off time. Boot Sequence - Added an animated startup overlay with staged telemetry lines and a progress bar. Session-Based Startup - Made the boot sequence appear once per browser session and skip automatically when reduced motion is enabled. Responsive Hero Layout - Hid the radar on small screens and stacked the hero layout for better mobile support. Published - v1.7.0 is now available on GitHub."}, {"post_id": 81353, "ts": "2026-10-20T22:47:48Z", "hours": 7.0, "text": "v1.6.0 - Animated Starfield and Rocket Launch Animated Starfield - Added a full-page starfield with twinkling stars, depth layers, and mouse parallax. Warp Effects - Made stars streak into warp lines based on scroll speed. Rocket Launch Animation - Added a rocket lifting off from a glowing planetary horizon in the hero section. Realistic Flight Effects - Added a curved gravity turn with a rocket plume, smoke, and contrail. Motion Accessibility - Made animations respect reduced-motion settings and pause when the hero is offscreen. Persistent Animations - Kept hero canvases mounted across data refreshes to prevent animations from restarting. Published - v1.6.0 is now available on GitHub."}, {"post_id": 81172, "ts": "2026-10-20T05:46:02Z", "hours": 6.3839, "text": "v1.5.0 - Daily Launch Groups and Time Zones Daily Launch Groups - Grouped launches by day with sticky labels for Today, Tomorrow, weekdays, and dates. Loading Skeletons - Added placeholder cards while launch data loads. Time Zone Toggle - Added a Local / UTC toggle that remembers your preference. Live Time Zone Updates - Made the toggle update the hero, launch list, and currently open detail view. Sync Status - Added a footer indicator showing when the data was last updated. Automatic Refresh - Added automatic data refresh every 5 minutes. Unified Date Formatting - Routed date and time formatting through a single time zone-aware helper. Published - v1.5.0 is now available on GitHub."}, {"post_id": 81048, "ts": "2026-10-19T17:35:33Z", "hours": 9.6347, "text": "v1.4.0 - Launch Detail View Clickable Launch Cards - Made each launch card clickable to open a detailed view. Live Countdown and Facts - Added a large live countdown and a facts grid with liftoff time, launch window, rocket, provider, mission type, orbit, launch pad, and location. Mission Description - Added mission descriptions when available. Launch Pad Map - Embedded a map showing the launch pad location. Launch Actions - Added links for webcasts and live streams, .ics calendar downloads, Open in Maps, and mission information. Improved Dialog Controls - Added a close button, backdrop click, and Esc key support. Published - v1.4.0 is now available on GitHub."}, {"post_id": 80886, "ts": "2026-10-19T05:01:16Z", "hours": 7.9964, "text": "v1.3.0 - Launch Search and Filters Added a search box matching missions, rockets, providers, orbits, and launch pads. Added multi-word search with a short debounce delay to avoid filtering on every keystroke. Added status filter chips for All, Go, TBC, and TBD. Added a provider dropdown generated automatically from launch data, including launch counts. Added an empty state for unmatched searches with a Clear Filters button. Refactored the filtering logic around a shared filter state for cleaner list rendering. Published v1.3.0 on GitHub."}, {"post_id": 80634, "ts": "2026-10-18T11:03:32Z", "hours": 9.5139, "text": "v1.2.0 - Live Launch Countdowns Added a “Next Launch” hero section highlighting the soonest upcoming launch. Added a live countdown displaying days, hours, minutes, and seconds, updated every second. Automatically switched to T+ elapsed time once a launch time had passed. Added a compact live countdown to every launch card. Styled the hero section and countdown displays to fit the dark theme. Published v1.2.0 on GitHub."}, {"post_id": 80516, "ts": "2026-10-17T23:39:13Z", "hours": 5.7417, "text": "v1.1.0 - Launch Board Redesign Added a dark theme and structured page layout with a header, status section, and footer. Redesigned each launch as a card displaying an image, provider, mission, rocket, launch time, and launch pad. Added colored status indicators for Go, TBC, TBD, and Hold. Added a responsive card grid that adapts to mobile screens. Separated the styling into styles.css and moved the JavaScript into app.js . Published v1.1.0 on GitHub."}, {"post_id": 80444, "ts": "2026-10-17T17:19:55Z", "hours": 1.5028, "text": "v1.0.0 - zero-hour - Initial Release Zero Hour shows every upcoming orbital rocket launch with a live countdown. Added index.html to fetch upcoming launches from Launch Library 2 and display their names and dates. Added README.md with basic instructions for running the project. Added an MIT LICENSE . Initialized the local repository, pushed it to GitHub, and tagged the release as v1.0.0 . Published v1.0.0 on the GitHub project page."}]...
|
Title: zero-hour by @jakub-ginal | Stardance
Devl Title: zero-hour by @jakub-ginal | Stardance
Devlogs:
v1.0.0 - zero-hour - Initial Release Zero Hour shows every upcoming orbital rocket launch with a live countdown. Added index.html to fetch upcoming launches from Launch Library 2 and display their names and dates. Added README.md with basic instructions for running the project. Added an MIT LICENSE . Initialized the local repository, pushed it to GitHub, and tagged the release as v1.0.0 . Published v1.0.0 on the GitHub project page.
v1.1.0 - Launch Board Redesign Added a dark theme and structured page layout with a header, status section, and footer. Redesigned each launch as a card displaying an image, provider, mission, rocket, launch time, and launch pad. Added colored status indicators for Go, TBC, TBD, and Hold. Added a responsive card grid that adapts to mobile screens. Separated the styling into styles.css and moved the JavaScript into app.js . Published v1.1.0 on GitHub.
v1.2.0 - Live Launch Countdowns Added a “Next Launch” hero section highlighting the soonest upcoming launch. Added a live countdown displaying days, hours, minutes, and seconds, updated every second. Automatically switched to T+ elapsed time once a launch time had passed. Added a compact live countdown to every launch card. Styled the hero section and countdown displays to fit the dark theme. Published v1.2.0 on GitHub.
v1.3.0 - Launch Search and Filters Added a search box matching missions, rockets, providers, orbits, and launch pads. Added multi-word search with a short debounce delay to avoid filtering on every keystroke. Added status filter chips for All, Go, TBC, and TBD. Added a provider dropdown generated automatically from launch data, including launch counts. Added an empty state for unmatched searches with a Clear Filters button. Refactored the filtering logic around a shared filter state for cleaner list rendering. Published v1.3.0 on GitHub.
v1.4.0 - Launch Detail View Clickable Launch Cards - Made each launch card clickable to open a detailed view. Live Countdown and Facts - Added a large live countdown and a facts grid with liftoff time, launch window, rocket, provider, mission type, orbit, launch pad, and location. Mission Description - Added mission descriptions when available. Launch Pad Map - Embedded a map showing the launch pad location. Launch Actions - Added links for webcasts and live streams, .ics calendar downloads, Open in Maps, and mission information. Improved Dialog Controls - Added a close button, backdrop click, and Esc key support. Published - v1.4.0 is now available on GitHub.
v1.5.0 - Daily Launch Groups and Time Zones Daily Launch Groups - Grouped launches by day with sticky labels for Today, Tomorrow, weekdays, and dates. Loading Skeletons - Added placeholder cards while launch data loads. Time Zone Toggle - Added a Local / UTC toggle that remembers your preference. Live Time Zone Updates - Made the toggle update the hero, launch list, and currently open detail view. Sync Status - Added a footer indicator showing when the data was last updated. Automatic Refresh - Added automatic data refresh every 5 minutes. Unified Date Formatting - Routed date and time formatting through a single time zone-aware helper. Published - v1.5.0 is now available on GitHub.
v1.6.0 - Animated Starfield and Rocket Launch Animated Starfield - Added a full-page starfield with twinkling stars, depth layers, and mouse parallax. Warp Effects - Made stars streak into warp lines based on scroll speed. Rocket Launch Animation - Added a rocket lifting off from a glowing planetary horizon in the hero section. Realistic Flight Effects - Added a curved gravity turn with a rocket plume, smoke, and contrail. Motion Accessibility - Made animations respect reduced-motion settings and pause when the hero is offscreen. Persistent Animations - Kept hero canvases mounted across data refreshes to prevent animations from restarting. Published - v1.6.0 is now available on GitHub.
v1.7.0 - Live Launch Radar and Boot Sequence Launch Radar - Added a hero radar panel with rings, a crosshair, and a rotating sweep. Launch Pad Tracking - Plotted launch pads as pulsing blips based on their latitude and longitude. Hero Stats - Added live stats for tracked launches, providers, and the next lift-off time. Boot Sequence - Added an animated startup overlay with staged telemetry lines and a progress bar. Session-Based Startup - Made the boot sequence appear once per browser session and skip automatically when reduced motion is enabled. Responsive Hero Layout - Hid the radar on small screens and stacked the hero layout for better mobile support. Published - v1.7.0 is now available on GitHub.
v1.8.0 - FastAPI Backend and Data Caching FastAPI Backend - Added API endpoints for listing launches, retrieving the next launch, fetching launch details, and checking service health. Normalized Launch Data - Converted Launch Library 2 records into a consistent launch model. 10-Minute Cache - Cached upstream data for 10 minutes to reduce API requests and extend free-tier usage. Single-Flight Refresh - Added a lock to prevent concurrent requests from triggering duplicate data refreshes. Stale Data Fallback - Kept serving the last successful data with a stale flag when the upstream API fails. Refresh Backoff - Added a 60-second cooldown after a failed refresh to avoid repeated requests. Frontend API Integration - Switched the frontend to fetch launches from /api/launches and use normalized fields. Local Development Mode - Added local run instructions and a development mode that serves the frontend directly from the API. Published - v1.8.0 is now available on GitHub.
v1.9.0 - Testing, Security, and UI Polish Automated Tests - Added a pytest suite covering the API, provider filtering, cache reuse, stale data fallback, and 503 responses. Secure Rendering - Escaped launch data before rendering and restricted links to HTTP and HTTPS. Focus Management - Restored keyboard focus to the launch card after closing the detail dialog. Accessibility Improvements - Added a skip link, live status region, aria-busy state, and an accessible dialog label. Error Handling - Added a Retry button and an Offline footer state when loading fails. Reduced Motion Support - Disabled radar, blip, and skeleton animations when reduced motion is enabled. Typography - Added Space Grotesk, Inter, and JetBrains Mono with system font fallbacks. Visual Polish - Added a gradient hero title, card hover lift and zoom effects, and accent-colored text selection. Favicon - Added favicon.svg Published - v1.9.0 is now available on GitHub.
v1.10.0 - Live Clock and Enhanced Launch Dashboard Live Clock - Added a header clock with a pulsing status indicator that follows the selected Local or UTC time zone. Hero Metadata - Added provider, launch pad, and launch window details to the hero section. Launch Actions - Added Mission Briefing and Add to Calendar actions for the next launch. Calendar Confirmation - Added toast notifications to confirm successful calendar downloads. Radar Statistics - Added launch counts for the next 24 hours, the current week, and Go-status launches. About Section - Added information explaining the data source and launch status meanings. Search Shortcut - Added the / keyboard shortcut to jump directly to search. Hero Button Polish - Kept the primary hero button subtle to maintain visual balance. Published - v1.10.0 is now available on GitHub.
v1.11.0 - Sticky Navigation and Launch Manifest Sticky Navigation - Added a fixed top bar with a new logo mark, ZERO HOUR wordmark, Manifest and About links, live clock, and Local / UTC switch. Launch Manifest Section - Added a dedicated section header with a live launch count and status note. Lost Signal Panel - Added a dedicated error panel with a Retry button when the launch feed is unreachable. Hero Scroll Cue - Added a scroll indicator and smooth anchor scrolling with an offset for the sticky header. Active Navigation - Highlighted the section currently being viewed and hid section links on mobile. Branding and Credits - Updated the footer branding and data credits, and added the logo to the boot screen. Reduced Motion Support - Extended reduced-motion support to the new animations. Published - v1.11.0 is now available on GitHub.
v1.12.0 - Honest Launch Dates and Shareable Mission Briefings Date Precision - Unconfirmed launch dates now display as NET Q4 2026 or NET May 2026 and appear under “Date to be confirmed”. Mission Briefing Redesign - Added status and live pills, image credits, country codes, launch windows, weather, webcast links, maps, and copy-link actions. Shareable Launch Links - Added #launch/<id> links that open the correct briefing on page load or when pasted, including launches outside the initially loaded page. Enhanced Launch Cards - Added orbit badges, success and failure colors, and a visual highlight for imminent launches. Visual Polish - Added muted country codes and added a hero word-reveal animation, scroll-aware navigation, and a subtle card spotlight effect. Smarter Calendar Files - Added shareable launch links to calendar files and warnings when launch dates are not final. Published - v1.12.0 is now available on GitHub.
v1.13.0 - Saved Launches and Subscribable Calendars Saved Launches - Added browser-based bookmarks, a saved-only filter, live count, and empty state. Full Launch Manifest - Added up to 100 upcoming missions, displayed 24 at a time with a Load More button. Calendar Feed - Added /api/calendar for subscribing to confirmed launches, excluding tentative dates until schedules become more certain. Calendar Setup Page - Added a copyable feed URL, .ics downloads, and subscription instructions. Mission Calendar Files - Added individual calendar events with launch details and links back to mission briefings. API Performance - Added ETags, 304 responses, gzip compression, and stale-cache fallback. Calendar Download Fix - Redirected browser visits to the setup page and fixed download handling. Interface Polish - Improved accessibility, bookmark controls, responsive layouts, and saved-launch indicators. Published - v1.13.0 is now available on GitHub....
|
1792958138.2726412
|
1793562938.2726412
|
|
4712
|
VaultForge Crypto Wallet by @professional_toad | S VaultForge Crypto Wallet by @professional_toad | Stardance...
|
professional_toad
|
1
|
119.12
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T16:59:27Z", "hours": 26.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Fully functional, multi-chain (Bitcoin, EVM, and Solana support with more on the way) wallet. To test this project, please go to the GitHub repository linked to the project.", "repo": "https://github.com/kunningKing11/vaultforge", "demo": "https://github.com/kunningKing11/vaultforge/releases"}]...
|
[{"post_id": 81422, "ts": "202 [{"post_id": 81422, "ts": "2026-10-21T07:03:36Z", "hours": 0.7881, "text": "Devlog 31 - swapping support for Solana! (partially) there’s now swapping support for solana, at least for DEX aggregators like LI.FI or Relay. i still need to figure out native solana DEX swapping on platforms like Jupiter…"}, {"post_id": 81198, "ts": "2026-10-20T08:10:50Z", "hours": 3.2675, "text": "Devlog 30 - support for swapping (finally!) this took so long!!! i thought i would be done last friday but ig that was overly optimistic… there are still some small things i will fix/improve to make the experience a bit smoother in the coming days. Implementation so i added uniswap support for all supported evm chains; however only for same-chain transactions and only through one pool. this is suboptimal so i want to add cross-chain support and through multiple pools maybe in the future. to make it possible to do cross-chain swaps, i added Relay support (it’s an aggregator) were solvers compete to give a quote. the issue with this is that they charge quite a fee and so i really want to just use uniswap where possible. what’s next better uniswap integration (as mentioned above), plus support for solana potentially jupiter support (it’s a solana DEX) as it has really good rates and high liquidity."}, {"post_id": 80081, "ts": "2026-10-16T05:40:57Z", "hours": 1.2094, "text": "Devlog 29 - more coin icons! specifically for AAVE, Chainlink (LINK), and Uniswap (UNI)."}, {"post_id": 79643, "ts": "2026-10-14T20:01:16Z", "hours": 1.4264, "text": "Devlog 28 - coin icons! it finally looks sooo professional now… just look at those icons! they will also appear in the send and transfer (soon to be swap!) tabs over the coming days. uniswap dex integration is still the top priority though. 🫡 before there weren’t any (they were just grey) and every wallet has them so i made it better ig"}, {"post_id": 79385, "ts": "2026-10-13T19:20:45Z", "hours": 3.1186, "text": "Devlog 27 - CCTP support is here… in like 30 minutes hang tight, it’s coming soon 🚀 i attached some proof , you guys can check out the transaction here more info on this tomorrow after v0.5.0 comes out with the CCTP support. you haven’t seen nothing yet, uniswap support coming next; stay tuned! probably coming in the next week or so…"}, {"post_id": 79016, "ts": "2026-10-12T11:14:38Z", "hours": 2.2986, "text": "Devlog 26 unfortunately, it’s taking longer than i would like to add the swapping and CCTP functionality. i would say i’m about 80% there, but there are quite a few things that i have to think about and as such, i think i will get it working by tomorrow (tuesday). stay tuned! 👀"}, {"post_id": 77760, "ts": "2026-10-08T05:56:13Z", "hours": 2.3114, "text": "Devlog 25 - some progress on the swapping i haven’t had much time in the last few days but i managed to do a big refactor to make the code more modular and cleaner. this is needed so that i can do more complex transactions instead of just basic transfers. i haven’t pushed it to main or committed it yet but it’s basically done. in terms of when CCTP support will ship, I think it will be by the end of sunday."}, {"post_id": 76737, "ts": "2026-10-04T13:27:58Z", "hours": 2.095, "text": "Devlog 24 - adding support for swapping after absolutely grinding on the support for swapping for the past week, here are some updates: 12 commits coming to main soon, about half bug fixes 4/10 things completed that i think are required for adding swapping support (more info below) i’ve also decided on a rough implementation order of swapping-related functionality: CCTP v2 transfers (basically moving USDC stablecoins across chains) Uniswap DEX (the biggest Decentrallized EXchange) Jupiter DEX ( the biggest dex on Solana) NEAR Intents (a cross-chain DEX) LI.FI aggregator (basically tells the walet the best market rates) i know this is kind of an ambitious timeline but i think i can pull it all off before the end of stardance on the 31st of october 🤞. i think i will manage to get CCTP transfers working by friday or sunday, depending on how much time i have."}, {"post_id": 74986, "ts": "2026-09-28T19:35:45Z", "hours": 1.4533, "text": "Devlog 23 15 new commits pushed to main ! still cooking on the integrated swapping support… sorry this is a short devlog; i’m more focused on the coding rn and will post when i’ve done something more substantial."}, {"post_id": 74352, "ts": "2026-09-27T06:58:05Z", "hours": 2.1792, "text": "Devlog 22 since the deadline for stardance has been extended by one month, i decided to keep going and make VaultForge as good as possible over the coming weeks. here’s a quick overview of what i will focus on next: actual swapping, and integration with multiple DEXes (think Jupiter, NEAR Intents, Uniswap, etc.) a better activity view token and chain icons! makes it much easier to differentiate between assets general performance and UI improvements with these new features, especially the integrated swapping, my wallet is finally going to be on par (mostly) with established wallets such as metamask. i’ve already got like 10+ commits since the last release that i will merge to main branch soon…"}, {"post_id": 73472, "ts": "2026-09-25T06:06:46Z", "hours": 1.0978, "text": "Devlog 21 as promised, VaultForge v0.4.0 is out! this brings huge changes to wallet unlock speed, adds ripple support, adds BIP-84 addresses, and loads more. here is the link to the release page if you want to check it out. some interesting stats: there was an increase of >6,000 lines of code which is a more than 50% increase since v0.3.0 . 132 commits since last release. this is probably going to be my second-to-last devlog as i really want to hit the 100-hour mark."}, {"post_id": 72818, "ts": "2026-09-23T20:02:48Z", "hours": 7.05, "text": "Devlog 20 so i finally added ripple support… and migrated everything to React for a much better, cleaner UI. and as always, i am late again. i actually could have finished on friday but i had other things to do (like homework) and i also wanted to migrate to react as well since I decided this will be my last release before the end of stardance, so i really want to add everything i can. this is because after stardance i will take a break of a few months on this project and then come back with a different hack club ysws challenge. the react migration was so big that i decided to use AI this time: the finished App.tsx file containing the react code is over 3090 lines of code (proof is the 2nd attached image)! that’s the largest code file i have ever worked on. since this is a huge change to the ui, i decided to create some before and after comparisons below. anyways, i decided to share some design decisions relating to the migration to react. i knew react was a big framework so it would add a few MB to the app’s file size (about 1-2 MB as of my recent testing) but the app itself is tiny anyway - not even 30 MB - so i thought it was really worth it. it gives you design consistency, more so than tailwindcss, which i needed since the more fun part for me was working on the backend and not the frontend (the user-facing part of the application). plus, the guys who work at coinbase (shoutout to them) made a goated plugin/theme/whatever you call it for react which makes my app have the default coinbase theme that i can tweak (i made the font monospace) which is alone like 70% of the stuff needed for the migration. i promise i will release v0.4.0 tomorrow…"}, {"post_id": 68207, "ts": "2026-09-14T18:12:58Z", "hours": 0.5819, "text": "Devlog 19 still cooking on the ripple support… i think i will be done by friday."}, {"post_id": 66040, "ts": "2026-09-11T16:23:03Z", "hours": 0.4975, "text": "Devlog 18 i finished all the perf improvements! there was one that i left out though bc it probably wouldn’t have helped much in terms of performance and would have been a pain to implement. i am FINALLY going to move on to ripple support for the next few days…"}, {"post_id": 65508, "ts": "2026-09-10T18:18:14Z", "hours": 0.7617, "text": "Devlog 17 perf improvement #3 done! 🎊 now refreshes are fully concurrent, w/ a limit of 4 requests at a time to avoid rate limiting. i haven’t fully tetsed it yet but it feels noticeably faster (like 25-35% faster) until the updated prices & balances are shown. plus, I kind of finished the settings stuff so i’ll be working on ripple support ig…"}, {"post_id": 64935, "ts": "2026-09-09T17:38:35Z", "hours": 2.8842, "text": "Devlog 16 sorry guys, i’m kind of late on this one tbh: I said that I would have the settings improvements, ripple support and all that ready by like monday but clearly nothing has happened since like the weekend. i have decided to delay the timleine by about a week as after some careful consideration I found it was wayyy too aggressive and my fingers can’t keep up with the typing speed i would need for that :) i seriously have no idae whatsoever why I thought it was possible to add that many features in such a short space of time. I know it kind of is but I have school now which means i have much less time for this with homework and studying and stuff. however, today I decided to lock in and actually do this and so I can assure you that i am hard at work doing the settings stuff rn and ripple support is absolutely coming right after that this next release really is going to be a big one… p.s. i attached a screenshot of some of the new commits i worked on (more are coming soon)"}, {"post_id": 62021, "ts": "2026-09-05T07:16:08Z", "hours": 1.6236, "text": "Devlog #15 Since the last devlog, I’ve worked on some more boring stuff: Tauri cleanup and desktop-specific improvements. I moved the application setup and command registration from src-tauri/src/main.rs into a new src-tauri/src/lib.rs . This keeps the entry point organized and follows Tauri’s recommended structure, while main.rs now only launches the library. I also replaced the browser clipboard API with Tauri’s native clipboard manager plugin. Copy buttons now use the desktop clipboard integration. Finally, VaultForge now enforces a single-instance window. If the app is launched while another instance is already open, the new launch focuses the existing main window instead of opening a second copy, which is far more desirable of a behaviour imo as it lets a user find a window without inadvertently opening even more. Plus some more random stuff: I now sign off all my commits As of today (4th of September), I also sign all my commits with a PGP key to verify all commits are made on my laptop and not by someone who hacked my GitHub account or smth - this is definitely overkill but why not Next, I’m continuing the settings improvements before moving on to Ripple support. P.S. I also randomly moved to Neovim as it looks much better than VS Code."}, {"post_id": 61004, "ts": "2026-09-03T18:18:49Z", "hours": 1.7533, "text": "Devlog #14 Not very much since last time; just some refactors and small improvements throughout. You can kind of tell by all the fix/chore/docs changes… btw improved settings is in the works - I think I’ll do some more progress over the next two days, then some actual chain support for Ripple. I’ve decided that I will release v0.4.0 before adding basic Zcash support as it’s been basically a month since last release and I don’t want to keep you guys waiting for those of you who want to download the binaries directly w/o building. Quick summary Now –> ~5 September: settings improvements 5 September –> 7 September: Ripple support 7/8 September: release of VaultForge v0.4.0"}, {"post_id": 59639, "ts": "2026-09-01T15:39:50Z", "hours": 3.5681, "text": "Devlog #13 I finally added different currencies ! Before, all prices were displayed in USD and now they can display in any of the below currencies: USD ($) EUR (€) GBP (£) JPY (¥) Shoutout to the fantastic API I used for this! Previously, I fetched CoinGecko pricing data which came in USD but I needed to convert this data into whatever currency the user chose so I had to find an API. However, there really weren’t any good forex APIs that were free with no rate limits when I searched for one so I turned to ChatGPT to find one and find one it did. This API gives daily central bank rates and even has data going back to 1948 on 201 currencies which is more than enough for this project. I also added the second performance improvement : caching the HTTP request client object to avoid having to recreate it on every API request. As of rn the project roadmap for the near future is this: Finish perf improvements Add basic Ripple (XRP) transaction support Maybe add transparent <=> transparent pool transaction support for Zcash (ZEC) Release VaultForge v0.5.0"}, {"post_id": 58117, "ts": "2026-08-30T13:52:54Z", "hours": 5.2722, "text": "Devlog #12 Quite a bit more to report this time! Since last devlog, I’ve mostly been working on improving actual wallet functionality, fixing some smaller UI issues, and looking into performance. Recent changes Below is a quick summary of what I’ve been working on since the last devlog: Full TRC-20 token support is here! 🎊 Tron is no longer limited to just native TRX transfers, and the token validation/network logic has been updated to support TRC-20 tokens as well. Significantly improved Bitcoin support by adding proper BIP84 account discovery . VaultForge now scans both receive and change addresses, tracks which UTXOs belong to which derived addresses, signs each input with the correct derived key, and refreshes discovery before sending. Anecdote: I use Brave Wallet which did the receive and change addresses thing so my funds didn’t show up in previous versions of VaultForge. However, as of this update, I now am. Wallet unlocking now feels much faster ! Cached balances/prices are shown immediately while fresh data refreshes in the background. Improved asset cards so they show which network an asset belongs to . Assets worth less than $1 are now hidden from the portfolio/assets view unless VaultForge does not have price data for them. Fixed a few UI issues, including dashboard scrolling, refresh errors, escaping asset data (aka preventing XSS) , and copying the currently selected wallet address. Converted the remaining .js config files to TypeScript because apparently I cannot resist refactoring things even when it makes no difference whatsoever. For the first time in this series of devlogs, I’m linking the changes to relevant commits on GitHub wherever possible so you can have a look. Performance improvements I also found a few ways to reduce VaultForge’s roughly 10s full refresh time: Cached unlock (mentioned above): perceived unlock time is now closer to ~1–3s, although balances/prices can still take around the same amount of time to fully refresh in the background. Reuse HTTP clients: should save roughly ~0.2-1.5s by reusing connections. Concurrent provider calls: likely the biggest improvement, potentially bringing a ~10s refresh down to ~3–5s. Refresh prices separately: could make fresh balances appear another ~0.5–2s sooner. Derive Argon2 once: should save roughly a few hundred ms to ~1s on cold unlocks. The above estimated perf improvements are obviously quite variable and depend on a multitude of factors (+ I got ChatGPT to analyze my current code to make an estimate because how else would I do it), but there is definitely still a lot of low-hanging fruit here. Upcoming features Actual settings are still the elephant in the room 😭, so I definitely need to get around to those but since I think this may need a big PR a bit like the previous style improvements, I think I will do this after v0.4.0 (so therefore for v0.5.0 ). Ripple (XRP) support (at least for native token transfers), planned for v0.4.0 . Zcash (ZEC) support: I’ve got a feeling this one will take quite some time so at most I will implement transparent <=> transparent transactions before next release but will have to see. The remaining performance improvements mentioned above."}, {"post_id": 55009, "ts": "2026-08-26T13:12:12Z", "hours": 8.6272, "text": "Devlog #11 What a MASSIVE PR and it’s finally merged ! Hooray! That was the biggest PR I’ve ever created by a big margin. Now I can finally start work on actual features like more support for different blockchains, address types, random extra features that certain chains have… the list goes on. I already have a personal list of 25 different blockchains that I want to add support for, most of which aren’t in the project roadmap simply for the reason that it would make the file overly long and hard to read. * sigh * that will take a long time Not to underestimate what I added with the PR, though - I didn’t spend like 15 hours and do 48 commits for nothing: inside the PR I added Onboarding! 🎊 Lots of (at least in the future) common settings will be selected here to set up your wallet. You can already import an existing wallet or generate a new one (both accept 12, 15, 18, 21, and 24-word recovery phrases) and set an auto-lock timeout and select networks you want or don’t want. Finally, there is also the option to select a theme if you want. New and more prominent splash screen when loading the application. The application itself is super fast so it takes barely any time but to make it look cooler I’ve set a minimum time to display it for to 650 ms. Icons throughout the application to make it look better. Let you copy addresses in the sidebar with one click and list all enabled addresses, not just Ethereum. Squashed some more small UI bugs, especially relating to scrolling in different parts of the application. Although slightly unrelated to the theme of the PR, MUCH better refresh logic and handling. It now respects network selection choices (like the ones you want or don’t want that you selected during onboarding) and tells you exactly which network’s RPC request encountered errors. Perhaps ironically, this was literally the reason I fixed an issue with the Solana RPC. Before this update, it never actually refreshed the balance correctly so it wasn’t working. However, after this change, I was able to identify that the issue was not on my end (yay!) but was actually PublicNode ’s (the RPC I’m using for the majority of chains in this project for consistency, apart from Monad and now Solana) as I assumed it could fetch the user’s token accounts but it couldn’t so I had to switch to using the official Solana RPC which fixed the issue. For anyone who got lost somewhere in the previous paragraph, an RPC is a service that allows you to query data about the state of the blockchain (where crypto transactions are stored) so you can use it to see how much crypto you are holding. Token accounts are basically a weird quirk of Solana where your main account is used to hold Solana which links to associated token accounts (ATAs) , which each hold one token other than Solana. This is by far not a complete list but rather a list of the highlights of this PR; if you want to look at all the changes, please feel free to visit the page linked at the top of this devlog. That said, after this big change, I did say last devlog that I would be getting ready to release version v0.4.0 of this application which is exactly what I will do after adding Tron token support! Quick reminder, after v0.4.0 I am planning to add Ripple (XRP) support, preliminary (meaning like non-shielded probably) support for Zcash and revamp the settings page like I did to the onboarding in this PR. Further out, I will probably focus some more on the in-application swaps to aggregate data from major DEXs (decentralized exchanges) to get the best rates, matching other major wallets w/ more chain support, which would make my wallet actually competitive. 🤞"}, {"post_id": 50515, "ts": "2026-08-19T18:16:53Z", "hours": 6.2019, "text": "Devlog #10 I’m close to finishing the theme improvements (I would say I’m about 90% there) and am doing some general bug fixes and QoL improvements. As such, there isn’t much to log rn except for a few small new features & improvements: Show/hide password button on recovery phrase and password Loads of bug fixes, e.g., inconsistent password strength progress bar on onboarding, preventing the user from typing the Enter key when entering a seed phrase to import, text overflow, etc. Some dependency version bumps If you want to see my progress on this PR (there are already like 30 commits in it - it’s a pretty big PR!), you can do so here . What’s coming next Some final finishing touches on the PR and then I will merge it to main so that it will be in the next release Support for Tron token transfers Support for Ripple The release of VaultForge v0.4.0 either before or after adding support for Ripple transactions A revamp of the settings tab (currently it doesn’t do anything) Support for Zcash"}, {"post_id": 45175, "ts": "2026-08-11T14:25:55Z", "hours": 6.7719, "text": "Devlog #9 Not much to report but I’m still working on improving the theme and the wider interface. You can see my progress here . Recent changes Below is a quick summary of what I’ve been working on since last devlog: Improved fonts ( Tektur for headings, Manrope for body text, and Ubuntu Mono for monospace text) Updated some text across different views for consistency Improved the look and feel of onboarding Added wallet setup flow to onboarding so you can now quickly import or generate a wallet with different seed length options (12, 15, 18, 21, and 24-word seed phrases are all supported now) Theme selection (in onboarding) between four different themes - I know these look a bit AI-generated rn (they are; it would have been frustrating to write out three new themes) but I will make them look a bit better in the future Auto-lock! 🎊 Now, you can easily set an auto-lock option in the onboarding or have none at all Upcoming features I think the elephant in the elephant in the room rn is actual settings which I will be working on over the next few days as currently there are no settings in the literal settings page!"}, {"post_id": 40732, "ts": "2026-08-04T13:27:44Z", "hours": 10.4086, "text": "Devlog #8 That took a lot of time! Over the past two weeks, I have done quite a bit of bug fixing and stopping undesired behaviour, including fixing weird sideways scrolling behaviour on the dashboard portfolio and creating custom scrollbars for less janky behaviour fixing the left sidebar’s contents overflowing vertically when the window height was decreased too much (it now lets you scroll if there is not enough space to fully display its contents) stopping zooming with Ctrl + ... or with trackpad gestures completely fix portfolio allocation percentage bars stuck at zero in the dashboard Along with this, I have done quite some improvement on the CI (especially the release.yaml workflow and pre-commit checks) and some refactoring, including using Lefthook npm install , bun install , Oxlint, Oxfmt validation, TypeScript typechecking, cargo check , and package.json package-lock.json bun.lock src-tauri/Cargo.lock are automatically staged on every commit. The npm install , bun install , and automatic lockfile staging is to ensure consistency between npm and Bun so that both can be used in development and testing. The other checks are for checking (or at least trying to; there could always be edge cases that aren’t covered) that no invalid code gets committed. There is also a maximum commit message subject length (72 characters) and the same for each line of the commit message body to ensure that commit messages stay readable. cargo test , and rust-analyzer analysis on every push to GitHub, since every commit runs the other checks anyway and uncommitted code can’t be pushed refactoring the previously monolithic TypeScript file that contained multiple pages so that each page now gets its own file inside of src/views/ significantly improving release.yaml (the app release workflow for GitHub) so that it now adds a commit count since the last release adds a line count statistic and the change in lines since the previous release allows for release comments and highlights written by me adds a link that links to a GitHub page of all the commits made between the release and the previous one (it already/before this change had all the new commits listed in the release notes with a link to each one) unifying networks.json (the file that contains all the relevant chain information for the TypeScript frontend) with all the scattered equivalent information in the Rust backend; now, the backend references the networks.json file instead Also, you are now able to test out all of these changes as I have just released v0.3.0 of VaultForge! Unfortunately, I haven’t yet worked on any of the theme changes but these are top priority for the next release… As a recap, here are the things that I will be working on for the next release, in order of priority: Updated theme Full Tron support (not just native token sends) Ripple (XRP) support Miscellaneous bug fixes and new features"}, {"post_id": 29564, "ts": "2026-07-16T16:15:34Z", "hours": 7.8725, "text": "Devlog #7 Unfortunately, since I am on holiday, I was not able to complete everything that I wanted to do by the end of last week. However, I was definitely able to make some progress: Progress Tron (TRX) support is here! 🎊 (albeit only native Tron sends are currently supported) some refactoring happened What’s next As I promised last week (but did not manage to complete), I was going to completely redesign the UI to make it more user-friendly and usable and have less of an AI-generated feel. This is because when I initially started this project, I used AI to create a demo app (without any of the signing logic), just to get a sort of structure to build on and add functionality to. However, I have changed pretty much every part of it so far apart from the theme which is why I am going to work on it now/this week. Icons for different currencies and across the application for easily recognisable features Support for Ripple (XRP)"}, {"post_id": 25341, "ts": "2026-07-09T16:00:38Z", "hours": 8.0019, "text": "Devlog #6 Progress Not much to announce rn but so far (since last week/log), I have refactored the code a bit bumped some dependencies made a cool new banner for the project (you can see it on this project’s banner) started work on improving the theme/look of the app fixed some minor issues and bugs, such as EVM nonce processing used the latest nonce from a confirmed block, ignoring the fact that the user may have been fast enough to send two transactions with the same nonce, which would guarantee that at least one transaction will fail BTC preview balance displayed to the user before approving a transaction did not take into account the unspent UTXOs in the calculation Not too exciting but this lays the groundwork for what is to come. 👇🏼 What’s next I will try to add this before the end of this week: a full redesign of the theme full Tron (TRX) support"}, {"post_id": 18461, "ts": "2026-06-29T16:57:39Z", "hours": 1.5761, "text": "Devlog #5 Solana support is here!"}, {"post_id": 17931, "ts": "2026-06-28T21:30:30Z", "hours": 9.9086, "text": "Devlog #4 Support for Solana coming soon, stay tuned! 👀 Since last devlog, I refactored the code a bit and split up all the TypeScript frontend and Rust backend logic into self-contained files, each for a clear purpose. Now, it’s much easier to read and understand the codebase."}, {"post_id": 13869, "ts": "2026-06-22T18:44:00Z", "hours": 1.0944, "text": "Devlog #3 The GitHub repository is public!"}, {"post_id": 13552, "ts": "2026-06-22T05:53:33Z", "hours": 9.5006, "text": "Devlog #2 I added loads of stuff! As promised: CoinGecko pricing data integrated Integrated RPC Progress on the actual transactions (implemented for EVM only so far and I am still working on it) Hardened security: Added a CSP (content security policy) to stop XSS (cross-site scripting) Hardened address validation, including EVM EIP-55 checksum validation Added a “remove wallet data” button Added zeroization for mnemonic/key/salt on lock and clear Coming soon/roadmap: Full support for BTC, EVM, SOL, and TRX chain transfers Actual cross-chain swaps via NEAR Intents Public GitHub repository (the repo hasn’t been made public yet as it’s still not fully working) Full support for more chains, including (but not limited to): Ripple (XRP) Hyperliquid (HYPE) - support for trading perps (perpetuals) Injective (INJ) Algorand (ALGO) Zcash (ZEC) - support transparent AND shielded addresses Monero (XMR) - alternative to Zcash Support for the Open Wallet Standard Native DeFi support: Native Aerodrome Finance LPing (liquidity providing) Native Aave lending (hopefully) Filecoin storage integration so you can easily store, download, and access files stored on Filecoin (hopefully) Integration with Tor for anonymity"}, {"post_id": 6061, "ts": "2026-06-10T05:49:45Z", "hours": 4.1822, "text": "Devlog #1 Just finished the basic UI; more coming soon… Current features already include: Argon2 password hashing to secure wallet Import a wallet seed phrase RPC connection to see how much crypto you’re holding QR code to get people to send stuff to you with a fault tolerance selector, e.g., smaller QR code for 7% data recovery, 25%, 30%, etc. Coming soon: GitHub repository for the project Coming soon: CoinGecko pricing data so you can see how much your crypto is worth Coming soon: actual transactions Coming soon: compatibility with Open Wallet Standard"}]...
|
Title: VaultForge Crypto Wallet by @professional_t Title: VaultForge Crypto Wallet by @professional_toad | Stardance
Devlogs:
Devlog #1 Just finished the basic UI; more coming soon… Current features already include: Argon2 password hashing to secure wallet Import a wallet seed phrase RPC connection to see how much crypto you’re holding QR code to get people to send stuff to you with a fault tolerance selector, e.g., smaller QR code for 7% data recovery, 25%, 30%, etc. Coming soon: GitHub repository for the project Coming soon: CoinGecko pricing data so you can see how much your crypto is worth Coming soon: actual transactions Coming soon: compatibility with Open Wallet Standard
Devlog #2 I added loads of stuff! As promised: CoinGecko pricing data integrated Integrated RPC Progress on the actual transactions (implemented for EVM only so far and I am still working on it) Hardened security: Added a CSP (content security policy) to stop XSS (cross-site scripting) Hardened address validation, including EVM EIP-55 checksum validation Added a “remove wallet data” button Added zeroization for mnemonic/key/salt on lock and clear Coming soon/roadmap: Full support for BTC, EVM, SOL, and TRX chain transfers Actual cross-chain swaps via NEAR Intents Public GitHub repository (the repo hasn’t been made public yet as it’s still not fully working) Full support for more chains, including (but not limited to): Ripple (XRP) Hyperliquid (HYPE) - support for trading perps (perpetuals) Injective (INJ) Algorand (ALGO) Zcash (ZEC) - support transparent AND shielded addresses Monero (XMR) - alternative to Zcash Support for the Open Wallet Standard Native DeFi support: Native Aerodrome Finance LPing (liquidity providing) Native Aave lending (hopefully) Filecoin storage integration so you can easily store, download, and access files stored on Filecoin (hopefully) Integration with Tor for anonymity
Devlog #3 The GitHub repository is public!
Devlog #4 Support for Solana coming soon, stay tuned! 👀 Since last devlog, I refactored the code a bit and split up all the TypeScript frontend and Rust backend logic into self-contained files, each for a clear purpose. Now, it’s much easier to read and understand the codebase.
Devlog #5 Solana support is here!
Devlog #6 Progress Not much to announce rn but so far (since last week/log), I have refactored the code a bit bumped some dependencies made a cool new banner for the project (you can see it on this project’s banner) started work on improving the theme/look of the app fixed some minor issues and bugs, such as EVM nonce processing used the latest nonce from a confirmed block, ignoring the fact that the user may have been fast enough to send two transactions with the same nonce, which would guarantee that at least one transaction will fail BTC preview balance displayed to the user before approving a transaction did not take into account the unspent UTXOs in the calculation Not too exciting but this lays the groundwork for what is to come. 👇🏼 What’s next I will try to add this before the end of this week: a full redesign of the theme full Tron (TRX) support
Devlog #7 Unfortunately, since I am on holiday, I was not able to complete everything that I wanted to do by the end of last week. However, I was definitely able to make some progress: Progress Tron (TRX) support is here! 🎊 (albeit only native Tron sends are currently supported) some refactoring happened What’s next As I promised last week (but did not manage to complete), I was going to completely redesign the UI to make it more user-friendly and usable and have less of an AI-generated feel. This is because when I initially started this project, I used AI to create a demo app (without any of the signing logic), just to get a sort of structure to build on and add functionality to. However, I have changed pretty much every part of it so far apart from the theme which is why I am going to work on it now/this week. Icons for different currencies and across the application for easily recognisable features Support for Ripple (XRP)
Devlog #8 That took a lot of time! Over the past two weeks, I have done quite a bit of bug fixing and stopping undesired behaviour, including fixing weird sideways scrolling behaviour on the dashboard portfolio and creating custom scrollbars for less janky behaviour fixing the left sidebar’s contents overflowing vertically when the window height was decreased too much (it now lets you scroll if there is not enough space to fully display its contents) stopping zooming with Ctrl + ... or with trackpad gestures completely fix portfolio allocation percentage bars stuck at zero in the dashboard Along with this, I have done quite some improvement on the CI (especially the release.yaml workflow and pre-commit checks) and some refactoring, including using Lefthook npm install , bun install , Oxlint, Oxfmt validation, TypeScript typechecking, cargo check , and package.json package-lock.json bun.lock src-tauri/Cargo.lock are automatically staged on every commit. The npm install , bun install , and automatic lockfile staging is to ensure consistency between npm and Bun so that both can be used in development and testing. The other checks are for checking (or at least trying to; there could always be edge cases that aren’t covered) that no invalid code gets committed. There is also a maximum commit message subject length (72 characters) and the same for each line of the commit message body to ensure that commit messages stay readable. cargo test , and rust-analyzer analysis on every push to GitHub, since every commit runs the other checks anyway and uncommitted code can’t be pushed refactoring the previously monolithic TypeScript file that contained multiple pages so that each page now gets its own file inside of src/views/ significantly improving release.yaml (the app release workflow for GitHub) so that it now adds a commit count since the last release adds a line count statistic and the change in lines since the previous release allows for release comments and highlights written by me adds a link that links to a GitHub page of all the commits made between the release and the previous one (it already/before this change had all the new commits listed in the release notes with a link to each one) unifying networks.json (the file that contains all the relevant chain information for the TypeScript frontend) with all the scattered equivalent information in the Rust backend; now, the backend references the networks.json file instead Also, you are now able to test out all of these changes as I have just released v0.3.0 of VaultForge! Unfortunately, I haven’t yet worked on any of the theme changes but these are top priority for the next release… As a recap, here are the things that I will be working on for the next release, in order of priority: Updated theme Full Tron support (not just native token sends) Ripple (XRP) support Miscellaneous bug fixes and new features
Devlog #9 Not much to report but I’m still working on improving the theme and the wider interface. You can see my progress here . Recent changes Below is a quick summary of what I’ve been working on since last devlog: Improved fonts ( Tektur for headings, Manrope for body text, and Ubuntu Mono for monospace text) Updated some text across different views for consistency Improved the look and feel of onboarding Added wallet setup flow to onboarding so you can now quickly import or generate a wallet with different seed length options (12, 15, 18, 21, and 24-word seed phrases are all supported now) Theme selection (in onboarding) between four different themes - I know these look a bit AI-generated rn (they are; it would have been frustrating to write out three new themes) but I will make them look a bit better in the future Auto-lock! 🎊 Now, you can easily set an auto-lock option in the onboarding or have none at all Upcoming features I think the elephant in the elephant in the room rn is actual settings which I will be working on over the next few days as currently there are no settings in the literal settings page!
Devlog #10 I’m close to finishing the theme improvements (I would say I’m about 90% there) and am doing some general bug fixes and QoL improvements. As such, there isn’t much to log rn except for a few small new features & improvements: Show/hide password button on recovery phrase and password Loads of bug fixes, e.g., inconsistent password strength progress bar on onboarding, preventing the user from typing the Enter key when entering a seed phrase to import, text overflow, etc. Some dependency version bumps If you want to see my progress on this PR (there are already like 30 commits in it - it’s a pretty big PR!), you can do so here . What’s coming next Some final finishing touches on the PR and then I will merge it to main so that it will be in the next release Support for Tron token transfers Support for Ripple The release of VaultForge v0.4.0 either before or after adding support for Ripple transactions A revamp of the settings tab (currently it doesn’t do anything) Support for Zcash
Devlog #11 What a MASSIVE PR and it’s finally merged ! Hooray! That was the biggest PR I’ve ever created by a big margin. Now I can finally start work on actual features like more support for different blockchains, address types, random extra features that certain chains have… the list goes on. I already have a personal list of 25 different blockchains that I want to add support for, most of which aren’t in the project roadmap simply for the reason that it would make the file overly long and hard to read. * sigh * that will take a long time Not to underestimate what I added with the PR, though - I didn’t spend like 15 hours and do 48 commits for nothing: inside the PR I added Onboarding! 🎊 Lots of (at least in the future) common settings will be selected here to set up your wallet. You can already import an existing wallet or generate a new one (both accept 12, 15, 18, 21, and 24-word recovery phrases) and set an auto-lock timeout and select networks you want or don’t want. Finally, there is also the option to select a theme if you want. New and more prominent splash screen when loading the application. The application itself is super fast so it takes barely any time but to make it look cooler I’ve set a minimum time to display it for to 650 ms. Icons throughout the application to make it look better. Let you copy addresses in the sidebar with one click and list all enabled addresses, not just Ethereum. Squashed some more small UI bugs, especially relating to scrolling in different parts of the application. Although slightly unrelated to the theme of the PR, MUCH better refresh logic and handling. It now respects network selection choices (like the ones you want or don’t want that you selected during onboarding) and tells you exactly which network’s RPC request encountered errors. Perhaps ironically, this was literally the reason I fixed an issue with the Solana RPC. Before this update, it never actually refreshed the balance correctly so it wasn’t working. However, after this change, I was able to identify that the issue was not on my end (yay!) but was actually PublicNode ’s (the RPC I’m using for the majority of chains in this project for consistency, apart from Monad and now Solana) as I assumed it could fetch the user’s token accounts but it couldn’t so I had to switch to using the official Solana RPC which fixed the issue. For anyone who got lost somewhere in the previous paragraph, an RPC is a service that allows you to query data about the state of the blockchain (where crypto transactions are stored) so you can use it to see how much crypto you are holding. Token accounts are basically a weird quirk of Solana where your main account is used to hold Solana which links to associated token accounts (ATAs) , which each hold one token other than Solana. This is by far not a complete list but rather a list of the highlights of this PR; if you want to look at all the changes, please feel free to visit the page linked at the top of this devlog. That said, after this big change, I did say last devlog that I would be getting ready to release version v0.4.0 of this application which is exactly what I will do after adding Tron token support! Quick reminder, after v0.4.0 I am planning to add Ripple (XRP) support, preliminary (meaning like non-shielded probably) support for Zcash and revamp the settings page like I did to the onboarding in this PR. Further out, I will probably focus some more on the in-application swaps to aggregate data from major DEXs (decentralized exchanges) to get the best rates, matching other major wallets w/ more chain support, which would make my wallet actually competitive. 🤞
Devlog #12 Quite a bit more to report this time! Since last devlog, I’ve mostly been working on improving actual wallet functionality, fixing some smaller UI issues, and looking into performance. Recent changes Below is a quick summary of what I’ve been working on since the last devlog: Full TRC-20 token support is here! 🎊 Tron is no longer limited to just native TRX transfers, and the token validation/network logic has been updated to support TRC-20 tokens as well. Significantly improved Bitcoin support by adding proper BIP84 account discovery . VaultForge now scans both receive and change addresses, tracks which UTXOs belong to which derived addresses, signs each input with the correct derived key, and refreshes discovery before sending. Anecdote: I use Brave Wallet which did the receive and change addresses thing so my funds didn’t show up in previous versions of VaultForge. However, as of this update, I now am. Wallet unlocking now feels much faster ! Cached balances/prices are shown immediately while fresh data refreshes in the background. Improved asset cards so they show which network an asset belongs to . Assets worth less than $1 are now hidden from the portfolio/assets view unless VaultForge does not have price data for them. Fixed a few UI issues, including dashboard scrolling, refresh errors, escaping asset data (aka preventing XSS) , and copying the currently selected wallet address. Converted the remaining .js config files to TypeScript because apparently I cannot resist refactoring things even when it makes no difference whatsoever. For the first time in this series of devlogs, I’m linking the changes to relevant commits on GitHub wherever possible so you can have a look. Performance improvements I also found a few ways to reduce VaultForge’s roughly 10s full refresh time: Cached unlock (mentioned above): perceived unlock time is now closer to ~1–3s, although balances/prices can still take around the same amount of time to fully refresh in the background. Reuse HTTP clients: should save roughly ~0.2-1.5s by reusing connections. Concurrent provider calls: likely the biggest improvement, potentially bringing a ~10s refresh down to ~3–5s. Refresh prices separately: could make fresh balances appear another ~0.5–2s sooner. Derive Argon2 once: should save roughly a few hundred ms to ~1s on cold unlocks. The above estimated perf improvements are obviously quite variable and depend on a multitude of factors (+ I got ChatGPT to analyze my current code to make an estimate because how else would I do it), but there is definitely still a lot of low-hanging fruit here. Upcoming features Actual settings are still the elephant in the room 😭, so I definitely need to get around to those but since I think this may need a big PR a bit like the previous style improvements, I think I will do this after v0.4.0 (so therefore for v0.5.0 ). Ripple (XRP) support (at least for native token transfers), planned for v0.4.0 . Zcash (ZEC) support: I’ve got a feeling this one will take quite some time so at most I will implement transparent <=> transparent transactions before next release but will have to see. The remaining performance improvements mentioned above.
Devlog #13 I finally added different currencies ! Before, all prices were displayed in USD and now they can display in any of the below currencies: USD ($) EUR (€) GBP (£) JPY (¥) Shoutout to the fantastic API I used for this! Previously, I fetched CoinGecko pricing data which came in USD but I needed to convert this data into whatever currency the user chose so I had to find an API. However, there really weren’t any good forex APIs that were free with no rate limits when I searched for one so I turned to ChatGPT to find one and find one it did. This API gives daily central bank rates and even has data going back to 1948 on 201 currencies which is more than enough for this project. I also added the second performance improvement : caching the HTTP request client object to avoid having to recreate it on every API request. As of rn the project roadmap for the near future is this: Finish perf improvements Add basic Ripple (XRP) transaction support Maybe add transparent <=> transparent pool transaction support for Zcash (ZEC) Release VaultForge v0.5.0
Devlog #14 Not very much since last time; just some refactors and small improvements throughout. You can kind of tell by all the fix/chore/docs changes… btw improved settings is in the works - I think I’ll do some more progress over the next two days, then some actual chain support for Ripple. I’ve decided that I will release v0.4.0 before adding basic Zcash support as it’s been basically a month since last release and I don’t want to keep you guys waiting for those of you who want to download the binaries directly w/o building. Quick summary Now –> ~5 September: settings improvements 5 September –> 7 September: Ripple support 7/8 September: release of VaultForge v0.4.0
Devlog #15 Since the last devlog, I’ve worked on some more boring stuff: Tauri cleanup and desktop-specific improvements. I moved the application setup and command registration from src-tauri/src/main.rs into a new src-tauri/src/lib.rs . This keeps the entry point organized and follows Tauri’s recommended structure, while main.rs now only launches the library. I also replaced the browser clipboard API with Tauri’s native clipboard manager plugin. Copy buttons now use the desktop clipboard integration. Finally, VaultForge now enforces a single-instance window. If the app is launched while another instance is already open, the new launch focuses the existing main window instead of opening a second copy, which is far more desirable of a behaviour imo as it lets a user find a window without inadvertently opening even more. Plus some more random stuff: I now sign off all my commits As of today (4th of September), I also sign all my commits with a PGP key to verify all commits are made on my laptop and not by someone who hacked my GitHub account or smth - this is definitely overkill but why not Next, I’m continuing the settings improvements before moving on to Ripple support. P.S. I also randomly moved to Neovim as it looks much better than VS Code.
Devlog 16 sorry guys, i’m kind of late on this one tbh: I said that I would have the settings improvements, ripple support and all that ready by like monday but clearly nothing has happened since like the weekend. i have decided to delay the timleine by about a week as after some careful consideration I found it was wayyy too aggressive and my fingers can’t keep up with the typing speed i would need for that :) i seriously have no idae whatsoever why I thought it was possible to add that many features in such a short space of time. I know it kind of is but I have school now which means i have much less time for this with homework and studying and stuff. however, today I decided to lock in and actually do this and so I can assure you that i am hard at work doing the settings stuff rn and ripple support is absolutely coming right after that this next release really is going to be a big one… p.s. i attached a screenshot of some of the new commits i worked on (more are coming soon)
Devlog 17 perf improvement #3 done! 🎊 now refreshes are fully concurrent, w/ a limit of 4 requests at a time to avoid rate limiting. i haven’t fully tetsed it yet but it feels noticeably faster (like 25-35% faster) until the updated prices & balances are shown. plus, I kind of finished the settings stuff so i’ll be working on ripple support ig…
Devlog 18 i finished all the perf improvements! there was one that i left out though bc it probably wouldn’t have helped much in terms of performance and would have been a pain to implement. i am FINALLY going to move on to ripple support for the next few days…
Devlog 19 still cooking on the ripple support… i think i will be done by friday.
Devlog 20 so i finally added ripple support… and migrated everything to React for a much better, cleaner UI. and as always, i am late again. i actually could have finished on friday but i had other things to do (like homework) and i also wanted to migrate to react as well since I decided this will be my last release before the end of stardance, so i really want to add everything i can. this is because after stardance i will take a break of a few months on this project and then come back with a different hack club ysws challenge. the react migration was so big that i decided to use AI this time: the finished App.tsx file containing the react code is over 3090 lines of code (proof is the 2nd attached image)! that’s the largest code file i have ever worked on. since this is a huge change to the ui, i decided to create some before and after comparisons below. anyways, i decided to share some design decisions relating to the migration to react. i knew react was a big framework so it would add a few MB to the app’s file size (about 1-2 MB as of my recent testing) but the app itself is tiny anyway - not even 30 MB - so i thought it was really worth it. it gives you design consistency, more so than tailwindcss, which i needed since the more fun part for me was working on the backend and not the frontend (the user-facing part of the application). plus, the guys who work at coinbase (shoutout to them) made a goated plugin/theme/whatever you call it for react which makes my app have the default coinbase theme that i can tweak (i made the font monospace) which is alone like 70% of the stuff needed for the migration. i promise i will release v0.4.0 tomorrow…
Devlog 21 as promised, VaultForge v0.4.0 is out! this brings huge changes to wallet unlock speed, adds ripple support, adds BIP-84 addresses, and loads more. here is the link to the release page if you want to check it out. some interesting stats: there was an increase of >6,000 lines of code which is a more than 50% increase since v0.3.0 . 132 commits since last release. this is probably going to be my second-to-last devlog as i really want to hit the 100-hour mark.
Devlog 22 since the deadline for stardance has been extended by one month, i decided to keep going and make VaultForge as good as possible over the coming weeks. here’s a quick overview of what i will focus on next: actual swapping, and integration with multiple DEXes (think Jupiter, NEAR Intents, Uniswap, etc.) a better activity view token and chain icons! makes it much easier to differentiate between assets general performance and UI improvements with these new features, especially the integrated swapping, my wallet is finally going to be on par (mostly) with established wallets such as metamask. i’ve already got like 10+ commits since the last release that i will merge to main branch soon…
Devlog 23 15 new commits pushed to main ! still cooking on the integrated swapping support… sorry this is a short devlog; i’m more focused on the coding rn and will post when i’ve done something more substantial.
Devlog 24 - adding support for swapping after absolutely grinding on the support for swapping for the past week, here are some updates: 12 commits coming to main soon, about half bug fixes 4/10 things completed that i think are required for adding swapping support (more info below) i’ve also decided on a rough implementation order of swapping-related functionality: CCTP v2 transfers (basically moving USDC stablecoins across chains) Uniswap DEX (the biggest Decentrallized EXchange) Jupiter DEX ( the biggest dex on Solana) NEAR Intents (a cross-chain DEX) LI.FI aggregator (basically tells the walet the best market rates) i know this is kind of an ambitious timeline but i think i can pull it all off before the end of stardance on the 31st of october 🤞. i think i will manage to get CCTP transfers working by friday or sunday, depending on how much time i have.
Devlog 25 - some progress on the swapping i haven’t had much time in the last few days but i managed to do a big refactor to make the code more modular and cleaner. this is needed so that i can do more complex transactions instead of just basic transfers. i haven’t pushed it to main or committed it yet but it’s basically done. in terms of when CCTP support will ship, I think it will be by the end of sunday.
Devlog 26 unfortunately, it’s taking longer than i would like to add the swapping and CCTP functionality. i would say i’m about 80% there, but there are quite a few things that i have to think about and as such, i think i will get it working by tomorrow (tuesday). stay tuned! 👀
Devlog 27 - CCTP support is here… in like 30 minutes hang tight, it’s coming soon 🚀 i attached some proof , you guys can check out the transaction here more info on this tomorrow after v0.5.0 comes out with the CCTP support. you haven’t seen nothing yet, uniswap support coming next; stay tuned! probably coming in the next week or so…
Devlog 28 - coin icons! it finally looks sooo professional now… just look at those icons! they will also appear in the send and transfer (soon to be swap!) tabs over the coming days. uniswap dex integration is still the top priority though. 🫡 before there weren’t any (they were just grey) and every wallet has them so i made it better ig
Devlog 29 - more coin icons! specifically for AAVE, Chainlink (LINK), and Uniswap (UNI).
Devlog 30 - support for swapping (finally!) this took so long!!! i thought i would be done last friday but ig that was overly optimistic… there are still some small things i will fix/improve to make the experience a bit smoother in the coming days. Implementation so i added uniswap support for all supported evm chains; however only for same-chain transactions and only through one pool. this is suboptimal so i want to add cross-chain support and through multiple pools maybe in the future. to make it possible to do cross-chain swaps, i added Relay support (it’s an aggregator) were solvers compete to give a quote. the issue with this is that they charge quite a fee and so i really want to just use uniswap where possible. what’s next better uniswap integration (as mentioned above), plus support for solana potentially jupiter support (it’s a solana DEX) as it has really good rates and high liquidity.
Devlog 31 - swapping support for Solana! (partially) there’s now swapping support for solana, at least for DEX aggregators like LI.FI or Relay. i still need to figure out native solana DEX swapping on platforms like Jupiter…
Ships:
Fully functional, multi-chain (Bitcoin, EVM, and Solana support with more on the way) wallet. To test this project, please go to the GitHub repository linked to the project....
|
1792997289.539561
|
1793083689.539561
|
|
16300
|
EpochOS by @Mokila | Stardance
|
Mokila
|
2
|
119.0
|
2078
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-22T09:43:03Z", "hours": 112.0, "multiplier": 19.26, "payout": 2078, "blessing": "neutral", "text": "EpochOS is a fully functional operating system built entirely with vanilla JavaScript, HTML, and CSS. It doesnt require any client side installations or anything and runs directly in your browser. Its features include a file explorer, a browser, a media player, many essential applications, lots of customisation, widgets, and an actual ecosystem that mimics a real operating system. It also has no backend so it’s all run locally on your browser using the browser’s localStorage. Some things you should know before you test this out: Firstly, please don’t finish rating this project until you experience all the features because there are many hidden features that might change your opinion. An example is easter eggs. I implemented many easter eggs which you must experience before voting because these easter eggs are very devloped. If you can’t find them or are stuck on one of the easter eggs, read ARCHITECTURE.md and at the very bottom, i listed all the easter eggs so you can check them out. In fact, read the ARCHITECTURE.md because it provides valuable info about many of the features in the OS and how they work so make sure to read that aswell Secondly, this OS is not compatible with mobile or tablet devices and is optimized for desktop only. So please keep that in mind when you are testing it. Thank you so much for testing this project and hope you enjoy it :)", "repo": "https://github.com/Moksha-0102/MyOwnWebOS", "demo": "https://my-web-os-inky.vercel.app/"}, {"ship_num": 2, "ts": "2026-06-13T15:31:39Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a simple operating system with HTML, CSS, and Javascript that runs on you web browser. It has a nostalgic look and feel with old-styled buttons and looks. To make it more like an OS, a calculator and a notepad have been created and implemented in the app. Moreover, to allow the user to personalise as much as they want, many settings have been included, from custom wallpapers to wallpapers that come from NASA itself and more. This was my first large scale project that I have coded so it’s an interesting experience for me. Before this, I only used to do challenges on platforms like Codewars and other than some small side projects, I don’t have a practical experience. Therefore, i think this project has taught me a lot on how to built stuff yourself. I hope you like my project :)", "repo": "https://github.com/Moksha-0102/MyOwnWebOS", "demo": "https://my-web-os-inky.vercel.app/"}]...
|
[{"post_id": 32866, "ts": "202 [{"post_id": 32866, "ts": "2026-07-22T09:36:10Z", "hours": 0.3622, "text": "WebOS 2 Devlog #21: Final Submission Just did some final changes to the welcome text and am about to ship it"}, {"post_id": 32842, "ts": "2026-07-22T07:57:53Z", "hours": 1.0103, "text": "WebOS 2 Devlog #20: Updated README.md and ARCHITECTURE.md + changed properties window I just realised I had a properties window in the OS and that was quite outdated so I changed to include some new info like the Last Modified date which updates everytime the user saves something because i added a localStorage.setItem that saves the timestamp. I also updated the README and ARCHITECTURE files to make them sound better and to add some additional info. Anyway, this devlog is probably the last on for this project! Hope you enjoy :)"}, {"post_id": 32822, "ts": "2026-07-22T06:51:37Z", "hours": 7.8417, "text": "WebOS 2 Devlog #19: README.md + ARCHITECTURE.md + additional customisation features I’m in the final stages of the project and in this long session, I did many things. Firstly, I wrote a README.md with all the necessary stuff and i also made an ARCHITECTURE.md file which explains the nitty gritty insides of the WebOS so anyone can understand how the website works. Other than that I added a couple of other stuff. Firstly, i realised that even though I have accents to customize the desktop, I don’t have a wallpaper gallery (except the nasa apod) which I found was quite necessary. At first, i coded my own wallpapers like a synthwave grid wallpaper, pinstripe wallpaper for the legace theme, a tranforming aurora wallpaper and like 3 more but after i coded them, they just looked so damn ugly. So i scratched the idea of me coding my own wallpapers and added three categories of wallpapers in the wallpaper dropdown with each category having three 4k wallpapers in them so every time you pick that category, you get a random wallpaper from the three. I also added an about section in the settings which has a buttton that leads to the github page."}, {"post_id": 32308, "ts": "2026-07-21T12:14:02Z", "hours": 5.4103, "text": "WebOS 2 Devlog #18: Debugging session I swear random bugs keep popping up no matter how much debugging I do. There’s always something that’s wrong or doesn’t work but that’s just how it is. In this session which was longer than expected, i fixed a lot of different bugs. Here is a summary of the changes i did: I spent lots of time rewriting the mathematics for the desktop icon layout, and also changed the strict grid-snapping to free-form placement cus it felt it was quite annoying not to be able to place stuff on the desktop wherever you want. Unfortunately, it took too long and i abandoned the idea and just moved on without making any changes. I also spent some time cleaning up the code and tried to optimizing the code. Some other bugs I fixed include: Desktop icons were randomly rearranging themselves every time a file was saved. I found out that the reason was that since the localStorage returns keys randomly, everytime i wrote sth to localStorage, the items were randomized so the ordier they appeared on the desktop changed. So i rewrote the logic to sort the stuff alphabetically before displaying. The Notepad app was also blindly overwriting existing files with the same name. I fixed it by adding a localStorage query to intercept matching keys and to display an osConfirm dialog, forcing the user to explicitly authorize the overwrite. The internal browser was throwing captchas all the time and failed to load error screens for blocked domains. Since Google aggressively blocks embeds and flags them as bot traffic, i changed the default browser to Bing, which was much better and i didn’t get captchas everytime i search somehting up I also modified the system daemon engine so that it introduces itself when a user first view the OS. The weather widget was pulling the location not from where the user was but rather where my ISP was routing my traffic through. So if i lived in a village and ISP routes my traffic through like New York, the weather that showed up was that of New York. To fix this, i swapped the logic to request exact hardware GPS coordinates via navigator.geolocation, while falling back to the IP routing API if the user denies the browser prompt. If the location is inaccurate the user can enable the location permission in the browser and the weather widget then shows the correct location. The visualizer widget was working perfectly but i had the idea to add a text container above the bars which shows what the user is playing. I made way way more changes but many of them conform to the easter eggs and mainly about the theme that gets unlocked (small spoiler there ;)) so i won’t really get too much into it."}, {"post_id": 31915, "ts": "2026-07-20T18:15:51Z", "hours": 10.1178, "text": "WebOS 2 Devlog #17: Media player + Audio spectrum widget implementation It has been a massive coding session. And I barely managed to keep the time below 10 hours and I still went over it. But, on the bright side, the OS now has a fully functional, media player and an audio spectrum widget! In the media player, anyone can listen to radios, and lots of music. But the reason it took 10 hours is because implementing these stuff required facing some serious bugs-some of them for genuinely stupid mistakes-and rebuilding the audio engine the right way (you’ll see what I mean). Here is a breakdown of how these new features work, what went wrong, and some other stuff: Overview of features The Media Player: The new Media Player is a audio application that routes requests to three distinct APIs to fetch music that the user can listen two: Audius: This is a “decentralized music streaming platform for artists, labels, and fans.” And it’s free! I fetches some of the music from this API. Radio-Browser: This is a platform that is, in a nutshell, Wikipedia for radios. I fetched thousands of live, global radio broadcasts using this API Apple iTunes (Preview): This was a golden find because I didn’t know this existed (not for free anyway). This API pulls top hits and previews of music. Granted, it’s not full music tracks but the songs are much more famous and popular. The Audio Spectrum Widget To complement the player, I also added an Audio Spectrum visualizer. It uses the Web Audio API, or more specifically, its AudioContext and an AnalyserNode to get the frequency data from the audio element. That data is then mapped to an HTML5 element. Using requestAnimationFrame, I made it such that the spectrum repaints 40 individual frequency bars roughly 60 times a second, which creates the audio visualiser waveform thing. Challenges The Geolocation failure: The OS was originally hardcoded to fetch radio stations from my address because I hardcoded that for testing purposes. But I stupidly forgot to remove that so when attempting to make this dynamic by using vpns I spent like 40 minutes trying to figure out why ut kept showing stations from my local area and not japan (where my VPN was connected to). And the reason for that is the hardcoded address I mentioned earlier. Moreover, some of the API queries were too specific, causing the media player to return empty for smaller regions like the Bahamas. To fix it i used the BigDataCloud API to quietly ping the user’s IP address, cache their true country code, and inject it into the API queries. the broken audio spectrum: Initially, the audio visualizer was completely blank. Even when fixed, the baseline would just disappear the second music started playing. The canvas drawing logic was also aggressively using clearRect to wipe the entire widget, which erased the idle state baseline. To fix it, I changed the baseline math so that the baseline sits firmly at the bottom of the widget. I also remade the drawing loop to explicitly redraw the baseline before checking the isPlaying state, so the frequency bars can work smoothly. retro theme problems: I completely forgot about the retro theme as i was just focused on building the player and the widget. So, in the end i had to make the stuff retro theme aswell. I encountered some problems there like some white on white text and some styles not applying which turned out to be because my dumbass brain mispelled the ids and classes Oh, and I found some other big bugs. The dragging engine was hella laggy. Like the response time was like 3 seconds before it registered. I would go deeped but im abt to cross the 4000 character devlog word limit but in a nutshell I realised it was because the mousemove event listener was directly updating the inline CSS (style.left and style.top) on every single microscopic mouse movement so it was really laggy."}, {"post_id": 30592, "ts": "2026-07-18T09:18:19Z", "hours": 8.5214, "text": "WebOS 2 Devlog #16: Widget implementation + debugging In this session, i made multiple changes to the OS to improve the overall UX. I had to pull another all nighter again 🥲. Here is what i changed: Change 1: Debugging Everytime i enabled the system daemon in the settngs, the entire os reloaded which was quite annoying so I ripped out the location.reload() in the Settings app. I also moved him to the body so he didn’t get trapped behind windows, because most of the time the daemon was floating behind windows and i couldnt really see him. I also gave the Welcome screen a massive 9999999 z-index so the daemon would float behind it because my previous step was too effective and he was infront of every single screen including like the bootloading screen. Challenges: I ran into z-index hell because I didn’t plan the stacking initially. He was either in the very front or at the very back and it was all a bit weird. Change 2: Widget implementation I initially wanted to implement sticky notes as a widget which was inspired my the mac sticky notes so i coded all of that in first but I realised i can take it a step further and code in multiple widgets. Challenge: But the thing was i hardcoded the sticky notes widget so i had to recode everything and integrate all of the widgets at once I added a simple analog clock widget I added a calendar widget I initially added a system monitor with like the ram and cpu data but the thing was due to the security restrictions, I can’t get the actualy live hardware data so it would have to be a simulation, which i didnt want so I replace the system monitor with a live weather widget which uses the BigDataCloud and Open-Meteo APIs to provide weather data. Change 3: Originally I had all hte widgets in the context menu on after the other but they looked like a list and a bit redundant. So i removed all then in the html file and added one ‘Add a widget…’ option which connects to a screen with all the widget options"}, {"post_id": 30122, "ts": "2026-07-17T13:15:43Z", "hours": 6.5461, "text": "WebOS 2 Devlog #15: System Daemon implementation To keep the users more engaged so even when they saw everythign, they would still spend more time doing stuff, I wanted to build something alive for the desktop environment that would interact with the user. So, instead of a standard app, I built a system daemon! If you dont know what that is, it is a digital pet that hangs out on your desktop and does random stuff. I dont hav ea name for him yet so ill just call him daemon for now. When he’s healthy, he flies around the screen and shouts random stuff at you. But I didn’t want him to just be a visual gimmick. He interacts with the actual operating system itself and has states: He is hungry: Because I previously built a drag-and-drop system for the File Explorer, I hooked him into it. You can drag actual text files or folders out of your explorer and drop them on his face. He will chew them up and literally delete them from the virtual hard drive (localStorage). He has a digestive tract: I built a array for his stomach that records what he has last eaten. If he ate a file you actually needed, you can rapid-click his face 5 times. He will regurgitate the raw file data perfectly back onto your desktop. He has boundaries: I ‘taught’ him to recognize core OS files. If you try to feed him Notepad.app or the System Settings, he will violently reject them and yell at you. He has one more state but that relates to the easter egg so i wont provide any additional details in order to not spoil it Oh, and i changed his appearance for the retro theme. anywhat that’s all for this change. I didn’t get into the nitty gritty of how I built him because I am so excited to finish this project. Just a few more features and then I’m done."}, {"post_id": 29444, "ts": "2026-07-16T12:05:56Z", "hours": 7.8072, "text": "WebOS 2 Devlog #14: Easter Eggs Pt. 2 I am now done with making the easter eggs and in total i made 5 of them, which may seem less but some of them are really really complex and developed. I stayed up till 2am making these 😭. Out of these 5, three of them are simple easter eggs, one is more complex but still quite simple and the final one is essentialyl the absolut highlight. It is the reason why the easter egg section took me so long. I am not going to go into detail to avoid spoilers. Anyway i hope you have fun with the easter eggs :) p.s the attached pic is a screen shot again cus i dont want to give spoilers"}, {"post_id": 29017, "ts": "2026-07-15T17:46:09Z", "hours": 8.8292, "text": "WebOS 2 Devlog #13: Easter Eggs Pt. 1 I was looking forward to this a looooot. I’m not giving any spoilers whatsoever but I was so locked in tday and yesterday coding easter eggs into the OS. I added like 2 easter eggs (might seem less but trust me they’re very developed), one’s a very simple one but the other one is my favourite and is the reason this devlog took so long. It’s still not finished and im only lik halfway done w/ it but I’m not going to go into any details because it will spoil the fun but im sure you’ll enjoy it. Also, im not done with making easter eggs and i just made this devlog cus the time is almost 10hrs. I still have to finish the second easter egg and do more on top of that. The next one will hopefully be the final easter egg session (unless i get another absolute brainwave). p.s to prevent spoilers, the attached pic is just a screenshot once again"}, {"post_id": 28283, "ts": "2026-07-14T13:15:34Z", "hours": 3.2847, "text": "WebOS 2 Devlog #12: Debugging Session + retro theme redesign In this session I started debugging the os and wow i found a lot of bugs. Im not going to get into them because it would take too long but some of them include how the bootloading sequence absolutely breaks if the user presses escape before the setup is finished because the cache isnt cleared properly so when the user gets the setup agian, he wont we able to configure some stuff like the password because the cache wasnt cleared properly. I also redesigned the retro theme because it looked ugly because the accents i implemented in the modern theme appeared in the retro theme which didnt fit together. Moreover, some of the aspects of the retro theme, such as the top part of the web browser or the settings screen were just uncomfortable to look at. Changing the retro theme was such a pain because everytime i thought i fixed it, a new discrepancy appears and at one point after i fixed it, my retro-theme.css was so messy i couldnt be bothered to fix it so i just inputted the messy working version into gemini and it cleaned it up. Anyway that was all i changed this time. And I did more and more changes but many of them are small and it would take too long to explain in a devlog. p.s. didnt know which pic to attach so its just a simple screenshot of the desktop."}, {"post_id": 28127, "ts": "2026-07-14T06:44:53Z", "hours": 9.4628, "text": "WebOS 2 Devlog #11: Reset btn + Notepad IDE + other changes This was a long long coding session. Had to stay awake till like 2am. Here are the changes i made. Ill try to keep everythign concise because theres a 4000 char limit and i have lot more to say than that. Change 1: I added a factory reset button in settings that directs the user to the webos setup screen like the one they get when they first enter the website. When testing this feature, i realised that random variables from completely different web projects started appearing in the File Manager. Because browsers share localStorage databases across the same local port (e.g., 127.0.0.1:5500), the OS was inheriting the ghosts of old projects. The solution: I had to upgrade the Initial Setup Utility. When formatting the Virtual Hard Drive, the system now temporarily caches the user’s OS credentials in memory that they entered, executes a total localStorage.clear() wipe to delete all the localStorage varialbles, and then safely restores the username and stuff before continuing normally. Change 2: Notepad IDE This was the part that took the longest (and its still not done). I wanted to create something absolutely unique that i havent seen in any other webos projects that i saw. And i realised, why dont i make an IDE in me webos? Not an actual IDE ofc but the goal was to allow users to write raw HTML/JS in the Notepad, save it as a .app file, and double-click it on the desktop to launch it as a fully functioning, program. Attempt 1 (Failure): I initially tried parsing the saved text and running it directly in the OS context using eval(). It was an absolute security and stability nightmare. The custom app had root access to the OS memory and instantly overwrote the osState object, completely crashing the Window Manager within seconds. Attempt 2 (Failure): I tried fixing attempt 1 but messed up the entire code in the process so i had to revert to that commit and this time, i tried putting the apps in Web Components and the Shadow DOM. While this successfully isolated the CSS so custom apps didn’t break the OS styling, the JavaScript still executed in the global window scope. Running two different custom apps simultaneously caused variable collisions that bricked the taskbar. It was too complex and fundamentally flawed. I wiped the slate clean again. Attempt 3 (Success): I realised that the answer was looking straignt at me. I was so stupid. I can just take the code and slap it on to an iframe, and it runs it, just like how i made the web browser. The solution was that When a user double-clicks a custom .app, the OS takes the raw code and converts it into a text/html Blob. It then passes that Blob through URL.createObjectURL(), creating a localized URL. By feeding that URL into an , the custom app boots perfectly. I am really proud of this feature. It’s still not fully done but i had to make a devlog since the tracked time almost reached 10hrs."}, {"post_id": 27267, "ts": "2026-07-12T18:02:31Z", "hours": 4.4556, "text": "WebOS 2 Devlog #10: icon implementation + taskbar remodeling When i looked at the webos, i realised it missed something to look like an actual os. It wasnt realistic enough. So, i decided to do two changes to make it more realistic. Here is what it did: Change 1: I added some real user data in the taskbar. More specifically, the host device’s actual network and battery status and date. I used the the browser’s native navigator.onLine and the navigator.getBattery() APIs. I also made it such that the os actively listens for network connection drops such as when wifi is disconnected and battery charging/level events, and updates the data accordingly. Change 2: I also noticed that my entire os is filled with emojis for stuff like calculator, file manages (all the apps essentially), the taskbar, the browser, the sites in the browser, etc. THis made it look really unprofessional so i fixed it. I replace all system emojis with Google Material Symbols to make it look a lot better. I did face one challenge however, the emojis in my website in my web browser weren’t being replaced by icons for some reason and I then realised that the iframe sites acts as a sandbox and they dont inherit the imported apis from the main html file. So I just injected a tag and imported the Google Material Symbols API directly in the isolated HTML code in my js file. Change 3: The goal of this change was ot allow the user to snap the taskbar to the top of the screen (Linux style). This was the part that took longer than expected. I originally just added an optoin in the settings to move my taskbar to the top of the screen but the pill-like, floating taskbar i had was really ugly when it was at the top. So, i spent like more than an hour and half trying out new designs and redesigning the taskbar so it looks good both when its at the top and the bottom and finalised a design that actually looks much better than what i had before. It now takes up like the entire bottom/top of the screen instead of floating in the middle liek before. That was all the changes made since the last devlog."}, {"post_id": 26774, "ts": "2026-07-11T19:22:51Z", "hours": 3.2697, "text": "WebOS 2 Devlog #9: Implemented color accents and some browser improvements I was originally going to do some debugging and finish of this project but i was looking through other peoples’ webos projects and realised there was much i could improve. I then got like a huge brainwave about new stuff to implement so ig it’ll be a bit longer before I ship this project. One of these ideas was adding color accents because right now my modern theme is limited only to a light pinkish color. Here are the changes i made: Change 1: Accents In the settings screen, i added an option to choose the system accents. I also gave some basic presets and added an option to pick a color by adding a color picker option. Implementing this was quite simple, just replace all hardcoded pink colors with –os-accent (which i added in css). I linked htis –os-accents attribute/class to the color that the user chooses in js and made ti that all the places where the accent pops up, the color variable there is replaced with –os-accents. So if the user changes the accent in settings, the places where –os-accent is set changes color automatically. Challenge 1: Contrasting invisible text The problem: Swapping a single hex code for an accent color that the user chooses breaks all translucent UI elements (like shadows). Furthermore, if a user picks a bright color (like Mint Green or Yellow), the hardcoded white text on the title bars becomes completely invisible. The Solution: I implemented a Hex-to-RGB engine that injects raw RGB values directly into the CSS :root. This solves the first part of the problem. To solve the text contrast issue, I implemented the WCAG Relative Luminance algorithm ( used a bit of outside help here iykwim ;)). The OS now mathematically calculates the perceived brightness of the user’s chosen color. If the relative luminance passes a threshold of 0.179, the OS flips the title bar text to pitch black so its legible comfortable. Change 2: i was just playing around in the webbrowser and exploring, and i found some stuff that needed to be fixed: when building a simulated web browser using tags, embedding sites like google resulted in a “Refused to Connect” error. These servers send an X-Frame-Options: DENY header. Because client-side JavaScript is legally blind to server headers, the OS couldn’t detect the block to show the custom error screen I made. I knew this error existed and knew this was a thing but only after experiencing it like a real user did i realise how annoyinf this was and it made my os seem broken. Solution 1 (attempt): I initially tried routing requests through a third-party API to read the headers, but ad-blockers and privacy shields just made the API requests not work, crashing the entire browser app (at least thats what i think is the cause). The Solution: I used a massive Regex blocklist, such that the browser now instantly intercepts requests to 99% of top-tier websites that block iframes (like youtube or google), and routs the user to a custom error page. (did these stuff with the help of some ai only) Next Problem: When a user searches Google inside the iframe and clicks a link in the embedded page, the OS address bar wouldn’t update. This is a browser restriction. Browsers mathematically lock JavaScript out of reading cross-origin URLs for security reasons. At this point i just stopped instead of trying to waste my time trying to break through some military grade (i think?) restrictions. Change 3: Before, only iframe compatible websites worked but i had an idea to route all queries (except the ones in websites format) through a google search. Apparently, google.com doesn work in iframe but the google search works. So now if i type hello world, it just redirects me to a google search page with hello world searched. P.S. I made some other tiny changes aswell but i cant rlly remember them now sry"}, {"post_id": 20257, "ts": "2026-07-01T20:07:19Z", "hours": 2.9408, "text": "WebOS 2 Devlog #8: Migrated to ES6 arch. and split css into any files I just realised that essentially all my code is squished into three files-index.html, index.css, and index.js. And all of them were quite big. Like the js file had more than 2,000 lines, and css had more than a 1,000 lines. I dont know why i havent noticed it before but im glad that i did now because i was plannign to do a deep debugging session next and it wouldve been hella hard to do in a 2000+ line file. Plus, a single bug in e.g. the calculator could crash the file manager, and debugging required scrolling through thousands of lines of code. So, i decided to migrate the index.js into an ES6 architecture and split the index.css into multiple manageable files. That’s all i can say for this devlog ig. There was nothing new except some lines of code i had to add after the migration to make sure everything is working. There were no really new features added. But there were many things that delayed me: i accidentally deleted a block of code in the index.css without moving it and didnt notice it so some styles were broken and i had to like retrace my steps and stuff to fix all the problems it caused. That’s all ig. The project is almost coming to an end! Can’t wait to ship it :)"}, {"post_id": 19868, "ts": "2026-07-01T08:56:38Z", "hours": 3.9269, "text": "WebOS 2 Devlog #7: Web Browser Implementation I reached the final couple of phases of my project and this is one is one of the crucial ones: building a web browser. My plan was to use iframe. But the thing about building a webbrowser inside a webbrowser or inside a sandboxed environment like a website is most websites (about 99%) like google, youtube, or github use X-Frame-Options and Content-Security-Policy: frame-ancestors ‘none’ which means they specifically block their websites from being displayed in cases like this ot prevent clickjacking. So every time i tried loading a webpage, it just says this webpage refused to connect or sth. I used ai to try bypassing it but it didnt work, so with the help of the same aforementioned ai, i implemented a solution. The solution: Since I cannot disable host browser security policies, and i dont have a backend proxy server, I had an idea to just build my own native ‘browser’: EpochOS IntraNet (just decided on the name EpochOS btw). This didnt take too long cus i had someone (ai) helping me cus it was almost midnight and i was tired as hell. Here are the features: I wrote a parser that intercepts navigation requests. If the user navigates to webos://home or webos://directory, the engine injects a large data:text/html;charset=utf-8 string directly into the iframe’s src attribute. This opens a local, HTML dashboard without triggering cross-origin blocks. Essentially, i wrote html in js and injected that html into the iframe src, so i essentially made my own ‘web-page’. Standard links inside a data URI iframe will try to navigate the iframe itself, which doesn’t update the OS address bar. To fix this, I set up a window.addEventListener(‘message’) listener on the parent OS. The buttons inside the iframe use parent.postMessage() to pass the target URL up to the OS, allowing the JavaScript engine to handle the routing and update the UI properly. A real browser alse doesn’t lose a page’s state (like scroll position) when you switch tabs. And im trying to make a real browser. So, to achieve this, the browser engine now doesn’t share a single iframe but rather new ones get created: Every time the user clicks the “New Tab” button, a new node is generated and appended to the container. Switching tabs simply toggles the CSS display property between none and block. This keeps inactive pages fully loaded in memory. Because cross-origin security rules (the ones i mentioned before) lock us out of accessing the iframe’s native window.history object, I had to build a custom history router. Every tab object in the JS array maintains its own history array and a historyIndex pointer. The back/forward buttons just decrement or increment this pointer and re-apply the URL to the iframe. Kinda genius ngl (this was an idea from ai btw) But for a browser to be useful, it needs to have some proper webpages. After some scouring, i found some webpages that do work in iframe and dont have the restrictions that websites like google do. I’m not gonna tell you what websites those are, you just have to see yourself. I found like 10 or sth so there’ll be plenty of stuff to do. Other features of the browser include: bookmarking, reloading (i also added a reloading spinner btw) and some more stuff."}, {"post_id": 19207, "ts": "2026-06-30T14:00:14Z", "hours": 1.9208, "text": "WebOS 2 Devlog #6: UI, UX and functionality improvements This update focuses heavily on stabilizing what i already have and also refining the less finer aspects of the UI. Here is what i did: Theme improvenets: I overhauled the .theme-retro class. stuff were contradicting each other with one thing saying this and the other saying that (too many to even give an example). I also changed some other minor stuff too like increased the grid size in the desktop to prevent icons from overlapping. But this was the main change: System Security & Identity Manager: Implemented a global sanitizeIdentity utility (Regex: /[^a-zA-Z0-9_-]/g) to remove spaces and illegal characters from usernames and hostnames when the user sets it before writing to localStorage because if i have sth like ‘John Doe’ as the username and ‘my school computer’ as the host name, the terminal command would look sth like John Doe@my school computer. And this just looks hella ugly. Dedicated Identity UI: removed the raw identity inputs out of the Settings menu like i had before and moved them into a dedicated Identity Manager window because its more secure that way. I also added an authenticaiton wall before this window pops up. To do this, i wrote an async while loop for identity verification. All the users now have successfully pass the password prompt (or use the recover override to bypass the password) before it allows them to modify any identity settings. Bootloader improvements: btn-shutdown now properly halts system processes (clearing systemClockInterval and locking pointer events) instead of just hiding the UI like it did before where it just had like a black screen with text on it saying shutting down and stuff. It now has like a loading screen and all that stuff. Context Booting: i also implemented sessionStorage.setItem(‘boot_context’, ‘warm’) to track system restarts so different boots have like different bootloading sequences (the point below this). This didn’t take too long as i could just copy and past what i had in other sequenes and just take the text. Differnet Boot Sequences: The bootloader now reads the sessionStorage context. A Cold Boot triggers the full POST memory checks and hardware scans (dont know what this is. had to use ai for the sequences cus i didnt know what the data was). A Warm Boot (restart) bypasses POST and executes a different initialization sequence. THis makes the user more immersed in the environment."}, {"post_id": 18635, "ts": "2026-06-29T20:34:42Z", "hours": 3.7578, "text": "WebOS 2 Devlog #5: File manager overhaul + custom dialog box I realised that always having the custom browser alerts was kinda boring and interrupting so i made my own dialogue box. I also changed the file manager to include some essential functions that it was missing to make it more like an OS (see below). Here are the changes i made: I abandoned the old array-based folders. I made it so that it now reads and writes directly to localStorage using stricter pathing (e.g., webos-file-Root/Documents/file.txt). I also built a native getUniqueName() function. If you create a duplicate file or folder, there’s no like a (1), (2), etc. at the end of it, which prevents data overwrites. This makes it more like a real OS Drag-and-Drop: I alos removed the old custom JavaScript coordinate trackers for file movement. It now uses the native HTML5 Drag-and-Drop API. You can physically pick up a file from the Explorer window, drag it out, and drop it directly onto the visual Desktop wallpaper. Custom Dialog Box: Native browser popups (alert(), confirm()) look hella ugly and break the flow so i built a custom dialog engine using JavaScript Promises. Now, when the system needs confirmation a custom window that fits with the theme appears. Because it uses async/await, the JavaScript pauses and waits for user acceoting or declining without freezing the browser. List View & Item Properties: I introduced a hybrid Grid/List view (just like a real os like mac). Because tracking file metadata (like Date Modified) from the start would have been way to complicated, I just built this engine where when the File Explorer encounters a file without a timestamp, it instantly generates metadata key (os-meta-path) using Date.now() and saves it permanently, which means that it allows for Date sorting without breaking anything."}, {"post_id": 17638, "ts": "2026-06-28T14:55:23Z", "hours": 4.0281, "text": "WebOS 2 Devlog #4: Initial bootloading sequence + login (optional) When i looked at other projects i realised that they all have some kind of flashy bootloading sequences but mine didnt have any so i built one. I didn’t want it to be too flashy so i made a simple, straightforward sequence. I also knew what exactly I wanted so I managed to finish this in 4hrs on the dot or it would’ve taken a lot longer. This is what it consists of: Bootloader that takes into account the selected theme: Since I had two themes in my OS (Modern and Legacy), it didnt make sense for both to have the same loading screen. So the system now actually boots up differnetly before loading the UI. Depending on your settings, you’ll either get a quick Modern UEFI startup, or a 1995 Legacy BIOS sequence complete with memory checks, IDE drive detection, and ASCII loading bars (had to use some outside help [ai] for this one as I’m not that old to know all that stuff). Hardware Interrupts: Just like a real PC, if you hit esc while the system is booting, it triggers a hardware interrupt and drops you into a configuration screen. Interactive OS Installation: If it’s your first time booting up (or you reset your system), you now have to actually “install” the OS. You can type in your preferred Username, network Hostname, and set an Administrator Password right inside the terminal. You even get the option to format your virtual hard drive. Login: If you set a password (which is optoinal) during setup, the boot sequence will actually halt and lock the system until you type it in. (Don’t worry, I added a recover command bypass in case anyone forgets it). Terminal Integration: The CLI terminal now dynamically reads your setup data. Instead of a normal prompt that you used to get with the default user@stardance or sth, you’ll see your actual custom username@hostname:~/$. Loading text: as the os loads and goes through the bootloading sequence some highly advanced random computer text ‘loads’ to add a little bit to the realism. Some of them are actual data from the host computer such as ram, gpu, and stuff like that. I had lots of other text and loading content that came from the the user’s actual real life hardware and software data, which added to the realism I had to research and use ai to make this because I had no knowledge of how computers were back then. There’s more but it wont fit here so you’ll just have to see it when i host it after my next ship."}, {"post_id": 17451, "ts": "2026-06-28T07:29:09Z", "hours": 2.8478, "text": "WebOS 2 Devlog #3: Building a UNIX Terminal + some other improvements This was a major update today for WebOS 2.0 as i built a genuinely realistic CLI. It’s looks and acts like a Mac Terminal (cus i use mac). Here is what i implemented: In the terminal, i implemented the following commands: help, clear, pwd, ls, cd, cat, touch, mkdir, rm, echo, whoami, date, history, and nano. This part itseld wasnt so difficult cus I had previously done something similar before but it was still challenging nonetheless. I wanted the CLI to be as realistic as possible so I implemented (with a little bit of help from gemini) a custom AST-style parser. It fully supports logical command chaining (&&, ||, ;), quotation marks usage (both single and double), and file redirection (>, ») straight into the virtual hard drive. Autocomplete: This was probably the hardest thing i tried to build and i am happy with how it turned out. I implemented a zsh-style Tab completion system. Pressing Tab auto-fills the longest common prefix and then shows all the possible options directly beneath your active prompt. This is one of the things I a most proud of because after using it, it was essentially very similar to the mac Terminal. This autocomplete works both for commands and files/folders. Errors and stuff: The terminal behaves exactly like real bash. If you type ls -la (-la is not implemented [yet?]) or cd too many args, it won’t just blindly execute or fail silently (it originally did so i had to change it), but it will spit back the same error message you’d expect to see on a real machine. GUI/CLI Integration: When i was implementing nano, i tried to think of how to implement a CLI editor. But i then realised, i can just connect the nano command to the notepad that I alreadu made. So typing nano test.txt in the terminal now just launches the Notepad app and opens the file for editing. And I made some other changes to stuff like the file manager but the terminal implementation above is the biggest change."}, {"post_id": 16900, "ts": "2026-06-27T13:19:35Z", "hours": 1.9075, "text": "WebOS 2 Devlog #2: UI & UX Debugging + UI Improvements This was quite a short session mainly focused on debugging. Here are the changes for this session. New Setup Wizard: The Welcome Screen has been completely redesigned into a classic two-pane setup wizard. (In Retro mode, it even has the iconic sideways teal text on the sidebar). State Persistence: The OS now remembers your settings. Your preferences for military time, desktop icon labels, and whether you want to see the welcome screen on boot are all permanently saved to localStorage. Calculator & Layout Fixes: The calculator now properly displays full math expressions (e.g., 3 + 5) instead of instantly wiping the screen. Before it still worked but it just showed the numbers and the answer-it didnt show what the user was doing. I also fixed a ton of bugs. Apps that are maximized now perfectly snap to the taskbar without overlapping, and the File Explorer drag-to-select doesn’t glitch when you move the window because before the drag-to-select used to activate when i was dragging the window."}, {"post_id": 16391, "ts": "2026-06-26T17:48:49Z", "hours": 13.705, "text": "WebOS 2 Devlog #1: Transitioning into an actual OS. The WebOS 2 mission just unlocked so all the time before i spent working on this overhaul, hence the 13 hour devlog. In the last devlog, i had a very basic beginning: a basic onboarding screen with some text and a “Continue” button. There was no actualy proper desktop, not that many apps, and definitely no File Explorer. Over the last 13 hours, I managed to change the project into a fully functioning, browser-based operating system with its own virtual file system, and app ecosystem. Here is a breakdown of everything that was built in this time. Since i made a lot of changes, i’ll keep it brief and won’t go into it too much: The Window & Desktop Engine: the core physics of the OS were built completely from scratch. Drag and Drop: Windows can be dragged freely but are strictly clamped to the viewport so they can never be lost off-screen. Window Controls: remade the full Minimize, Maximize, and Close logic. Animations: Implemented a requestAnimationFrame state machine so windows don’t just appear—they like animate and scale and fade out into the taskbar. Desktop Grid: Desktop icons are draggable and auto-snap to an invisible grid when released. File System (File Manager): Going from zero file management to a complete virtual system was perhaps the biggest change. It is powered by localStorage, and the OS now remembers everything: Dynamic File Explorer: Built a grid/list view system complete with a sidebar, path breadcrumbs, and directory navigation. Context Menus: Right-clicking files now opens custom context menus to rename, delete, or restore items. Recycle Bin: Files are moved to a functional Trash directory where they can be permanently emptied or restored to the Root folder. Drag-and-Select: made a custom mouse-drag selection box (the translucent pink lasso) to highlight multiple files at once. App Ecosystem: Themes: I built a dynamic theme engine with two main themes. Modern Dark: The default OS features premium glassmorphism, background blurs, and other stuff, and has like a pink accent color. Retro: It changes the OS back to what it looked like in like 1995 by replacing animations and toggles with grey borders, checkboxes, and the blue desktop background. The New Welcome Screen: That old, basic onboarding screen looked ass so it was completely scrapped. I replaced it with a better and cleaner on that also remembers their preference if they check “Don’t show this on startup.”"}, {"post_id": 8031, "ts": "2026-06-13T12:06:02Z", "hours": 0.6592, "text": "Devlog #3: Onboarding and Eliminating FOUC Before shipping the WebOS 1 project and moving on to WebOS 2 project, I needed to implement an Onboarding/Welcome Screen to introduce users to the OS environment. This required a full-screen dark overlay. this is what i did: Z-index mismatch Because my custom Drag Engine automatically increments the zIndex of any .window it touches, the moment I clicked the Welcome Screen, the engine overwrote its god-tier Z-Index (99999). This caused an immediate Z-Index collapse, burying the modal underneath the desktop icons and the dark overlay. The Fix: I had to implement a strict exception in the JavaScript mousedown event listener to protect the Welcome Screen’s ID from being overwritten. DOM Reordering: To guarantee that the Welcome Screen will be at the very top,, I moved the Welcome Screen to the absolute bottom of the document. This means it will naturally sit on top of the other elements. Eliminating the FOUC I used the localStorage API so users could check a “Don’t show this again” box, saving their preference to the hard drive. However, this caused a massive FOUC bug. The Problem: HTML renders faster than JavaScript executes. On boot, the browser would instantly paint the Welcome Screen to the monitor. A few milliseconds later, JavaScript would read the hard drive, realize the user disabled the screen, and violently delete it—causing an ugly flicker. Fix: I basically just inverted the rendering logic. I hardcoded ‘display: none;’ directly into the HTML so the modal is completely invisible by default. Now, the browser paints nothing. JavaScript checks the hard drive, and only turns the welcome screen on if it confirms the user actually wants to see it. Now it’s much better. Ig this is the end of my WebOS 1 project. I will be shipping this project and then moving on to WebOS 2 where I’ll be implementing File Management, In-browser-browser?, and maybe some other built in tools. That’s the plan for now."}, {"post_id": 8007, "ts": "2026-06-13T11:10:55Z", "hours": 0.6994, "text": "Devlog #2: Debugging + Icon dragging features + localStorage implementation The core window manager is working properly so this second session was all about polishing the UI and UX aspects. But there were some challenges: The faulty dragging I transitioned the desktop icons from a static flexbox grid to absolute positioning so they could be freely dragged around the screen (like an actual operating system). However, this immediately triggered native browser collisions. The Problem: When clicking and dragging an icon, the browser saw the action as trying to highlight text or drag an image to a new tab. This triggered a native HTML “ghost drag,” completely overriding my custom JavaScript drag engine and leaving the icon permanently stuck to the cursor. The Solution: I just basically implemented multiple stuff to solve this: Applied ‘-webkit-user-select: none’ and ‘user-select: none’ to prevent highlighting. Injected ‘draggable=“false”’ natively into the HTML. Applied ‘pointer-events: none’ on the inner emoji and label text. This forces the mouse click to pass through the text and hit the icon container directly, ensuring my custom e.preventDefault() mousedown event works properly every time. State Persistence (The Local Storage API) An OS is useless if it resets every time you turn it on. I wired up the browser’s native localStorage API so it saves some of the stuff that the user did. So far it’s only the position of the icons, but I’m planning to add more stuff to the localStorage. Here are the changes: Upgraded the mouseup event listener to capture the exact X and Y coordinates of an icon the moment it is let go after dragging. Built a boot sequence that loops through .desktop-icon elements on page load, fetches their saved coordinates , and implementes them. Wallpaper changing bug The NASA API integration was fetching data successfully, but massive high-res images were causing visual lag, leading to a blank blue screen while the image downloaded in the background. Made a new thing where the newImage() is inserted into the virtual memory of the js. The UI now triggers a document.body.style.cursor = ‘wait’ loading wheel and displays a “Downloading…” status. JavaScript intentionally halts the DOM update until the virtual image’s ‘.onload’ event fires, ensuring the wallpaper only gets applied to the screen exactly when it is 100% ready. Lastly, I also added a setting in the settings tab where the user can choose if the icon labels are hidded or shown. What’s Next? The desktop environment is now completely stable, personalized, and persistent. Next up: More UI and UX refinements before shipping for WebOS 1. Gonna implement File Management for WebOS 2 :)"}, {"post_id": 7644, "ts": "2026-06-12T19:27:06Z", "hours": 5.5711, "text": "Devlog #1: Booting Up - Building a Custom Window Manager & Desktop Environment from Scratch Today marks the official first boot of my WebOS project. I’m trying to build a full OS that runs in the Web Browser directly using HTML, CSS, and Vanilla JavaScript. It acts like an actual operating system, like windows for example, but the only difference is the way it looks, it’s identity and that it runs in your web browser. Over the past few hours, I changed the project from a static layout into a fully interactive environment. Here is a breakdown of the core engine and features that I currently built. The Custom Window Manager The hardest part of making an OS is handling window states. I built a universal Drag-and-Drop engine with dynamic Z-Index management. The Problem: Windows would get stuck behind each other, or the browser would lose track of the mouse if the user dragged too fast or threw the window off-screen, so i wouldn’t be able to drag it back. The Solution: I implemented an event elegation system attached to the document root, calculating mouse offsets relative to the title bars. This means wherever the mouse moves, the title bars move to keep that offset difference the same, which is essentially what the drag and drop function is. I also engineered physical constraints so windows can never be dragged out of the viewport. The Desktop Environment To not make seem like this is just a website, I completely changed the browser’s default behavior. I Implemented double-click event listeners for desktop icons and then overrode the native browser right-click menu ( e.preventDefault() ) and built a custom OS context menu this makes it feel more unique. Core Applications Notepad: A fully resizable text editor using CSS flexbox so the typing area automatically expands with the window. Calculator: Quite self-explanatory. Engineered the math logic from scratch. Settings (NASA API): Built a customization menu that toggles a global 12hr/24hr clock state, and fetches real-time data from NASA’s APOD API to dynamically change the desktop wallpaper based on the NASA Picture of the Day. What’s Next? The UI feels like an OS, but it lacks permanence. Next on the roadmap: File Management. I’ll be engineering a system to actually save the data typed into the Notepad so it survives page refreshes. Also, I want to create a web browser with actual internet access to really bring that OS feeling. That’s all I have planned out. p.s. I’ve attached some pictures of my website below - hope you like it :) Stay tuned."}]...
|
Title: EpochOS by @Mokila | Stardance
Devlogs:
De Title: EpochOS by @Mokila | Stardance
Devlogs:
Devlog #1: Booting Up - Building a Custom Window Manager & Desktop Environment from Scratch Today marks the official first boot of my WebOS project. I’m trying to build a full OS that runs in the Web Browser directly using HTML, CSS, and Vanilla JavaScript. It acts like an actual operating system, like windows for example, but the only difference is the way it looks, it’s identity and that it runs in your web browser. Over the past few hours, I changed the project from a static layout into a fully interactive environment. Here is a breakdown of the core engine and features that I currently built. The Custom Window Manager The hardest part of making an OS is handling window states. I built a universal Drag-and-Drop engine with dynamic Z-Index management. The Problem: Windows would get stuck behind each other, or the browser would lose track of the mouse if the user dragged too fast or threw the window off-screen, so i wouldn’t be able to drag it back. The Solution: I implemented an event elegation system attached to the document root, calculating mouse offsets relative to the title bars. This means wherever the mouse moves, the title bars move to keep that offset difference the same, which is essentially what the drag and drop function is. I also engineered physical constraints so windows can never be dragged out of the viewport. The Desktop Environment To not make seem like this is just a website, I completely changed the browser’s default behavior. I Implemented double-click event listeners for desktop icons and then overrode the native browser right-click menu ( e.preventDefault() ) and built a custom OS context menu this makes it feel more unique. Core Applications Notepad: A fully resizable text editor using CSS flexbox so the typing area automatically expands with the window. Calculator: Quite self-explanatory. Engineered the math logic from scratch. Settings (NASA API): Built a customization menu that toggles a global 12hr/24hr clock state, and fetches real-time data from NASA’s APOD API to dynamically change the desktop wallpaper based on the NASA Picture of the Day. What’s Next? The UI feels like an OS, but it lacks permanence. Next on the roadmap: File Management. I’ll be engineering a system to actually save the data typed into the Notepad so it survives page refreshes. Also, I want to create a web browser with actual internet access to really bring that OS feeling. That’s all I have planned out. p.s. I’ve attached some pictures of my website below - hope you like it :) Stay tuned.
Devlog #2: Debugging + Icon dragging features + localStorage implementation The core window manager is working properly so this second session was all about polishing the UI and UX aspects. But there were some challenges: The faulty dragging I transitioned the desktop icons from a static flexbox grid to absolute positioning so they could be freely dragged around the screen (like an actual operating system). However, this immediately triggered native browser collisions. The Problem: When clicking and dragging an icon, the browser saw the action as trying to highlight text or drag an image to a new tab. This triggered a native HTML “ghost drag,” completely overriding my custom JavaScript drag engine and leaving the icon permanently stuck to the cursor. The Solution: I just basically implemented multiple stuff to solve this: Applied ‘-webkit-user-select: none’ and ‘user-select: none’ to prevent highlighting. Injected ‘draggable=“false”’ natively into the HTML. Applied ‘pointer-events: none’ on the inner emoji and label text. This forces the mouse click to pass through the text and hit the icon container directly, ensuring my custom e.preventDefault() mousedown event works properly every time. State Persistence (The Local Storage API) An OS is useless if it resets every time you turn it on. I wired up the browser’s native localStorage API so it saves some of the stuff that the user did. So far it’s only the position of the icons, but I’m planning to add more stuff to the localStorage. Here are the changes: Upgraded the mouseup event listener to capture the exact X and Y coordinates of an icon the moment it is let go after dragging. Built a boot sequence that loops through .desktop-icon elements on page load, fetches their saved coordinates , and implementes them. Wallpaper changing bug The NASA API integration was fetching data successfully, but massive high-res images were causing visual lag, leading to a blank blue screen while the image downloaded in the background. Made a new thing where the newImage() is inserted into the virtual memory of the js. The UI now triggers a document.body.style.cursor = ‘wait’ loading wheel and displays a “Downloading…” status. JavaScript intentionally halts the DOM update until the virtual image’s ‘.onload’ event fires, ensuring the wallpaper only gets applied to the screen exactly when it is 100% ready. Lastly, I also added a setting in the settings tab where the user can choose if the icon labels are hidded or shown. What’s Next? The desktop environment is now completely stable, personalized, and persistent. Next up: More UI and UX refinements before shipping for WebOS 1. Gonna implement File Management for WebOS 2 :)
Devlog #3: Onboarding and Eliminating FOUC Before shipping the WebOS 1 project and moving on to WebOS 2 project, I needed to implement an Onboarding/Welcome Screen to introduce users to the OS environment. This required a full-screen dark overlay. this is what i did: Z-index mismatch Because my custom Drag Engine automatically increments the zIndex of any .window it touches, the moment I clicked the Welcome Screen, the engine overwrote its god-tier Z-Index (99999). This caused an immediate Z-Index collapse, burying the modal underneath the desktop icons and the dark overlay. The Fix: I had to implement a strict exception in the JavaScript mousedown event listener to protect the Welcome Screen’s ID from being overwritten. DOM Reordering: To guarantee that the Welcome Screen will be at the very top,, I moved the Welcome Screen to the absolute bottom of the document. This means it will naturally sit on top of the other elements. Eliminating the FOUC I used the localStorage API so users could check a “Don’t show this again” box, saving their preference to the hard drive. However, this caused a massive FOUC bug. The Problem: HTML renders faster than JavaScript executes. On boot, the browser would instantly paint the Welcome Screen to the monitor. A few milliseconds later, JavaScript would read the hard drive, realize the user disabled the screen, and violently delete it—causing an ugly flicker. Fix: I basically just inverted the rendering logic. I hardcoded ‘display: none;’ directly into the HTML so the modal is completely invisible by default. Now, the browser paints nothing. JavaScript checks the hard drive, and only turns the welcome screen on if it confirms the user actually wants to see it. Now it’s much better. Ig this is the end of my WebOS 1 project. I will be shipping this project and then moving on to WebOS 2 where I’ll be implementing File Management, In-browser-browser?, and maybe some other built in tools. That’s the plan for now.
WebOS 2 Devlog #1: Transitioning into an actual OS. The WebOS 2 mission just unlocked so all the time before i spent working on this overhaul, hence the 13 hour devlog. In the last devlog, i had a very basic beginning: a basic onboarding screen with some text and a “Continue” button. There was no actualy proper desktop, not that many apps, and definitely no File Explorer. Over the last 13 hours, I managed to change the project into a fully functioning, browser-based operating system with its own virtual file system, and app ecosystem. Here is a breakdown of everything that was built in this time. Since i made a lot of changes, i’ll keep it brief and won’t go into it too much: The Window & Desktop Engine: the core physics of the OS were built completely from scratch. Drag and Drop: Windows can be dragged freely but are strictly clamped to the viewport so they can never be lost off-screen. Window Controls: remade the full Minimize, Maximize, and Close logic. Animations: Implemented a requestAnimationFrame state machine so windows don’t just appear—they like animate and scale and fade out into the taskbar. Desktop Grid: Desktop icons are draggable and auto-snap to an invisible grid when released. File System (File Manager): Going from zero file management to a complete virtual system was perhaps the biggest change. It is powered by localStorage, and the OS now remembers everything: Dynamic File Explorer: Built a grid/list view system complete with a sidebar, path breadcrumbs, and directory navigation. Context Menus: Right-clicking files now opens custom context menus to rename, delete, or restore items. Recycle Bin: Files are moved to a functional Trash directory where they can be permanently emptied or restored to the Root folder. Drag-and-Select: made a custom mouse-drag selection box (the translucent pink lasso) to highlight multiple files at once. App Ecosystem: Themes: I built a dynamic theme engine with two main themes. Modern Dark: The default OS features premium glassmorphism, background blurs, and other stuff, and has like a pink accent color. Retro: It changes the OS back to what it looked like in like 1995 by replacing animations and toggles with grey borders, checkboxes, and the blue desktop background. The New Welcome Screen: That old, basic onboarding screen looked ass so it was completely scrapped. I replaced it with a better and cleaner on that also remembers their preference if they check “Don’t show this on startup.”
WebOS 2 Devlog #2: UI & UX Debugging + UI Improvements This was quite a short session mainly focused on debugging. Here are the changes for this session. New Setup Wizard: The Welcome Screen has been completely redesigned into a classic two-pane setup wizard. (In Retro mode, it even has the iconic sideways teal text on the sidebar). State Persistence: The OS now remembers your settings. Your preferences for military time, desktop icon labels, and whether you want to see the welcome screen on boot are all permanently saved to localStorage. Calculator & Layout Fixes: The calculator now properly displays full math expressions (e.g., 3 + 5) instead of instantly wiping the screen. Before it still worked but it just showed the numbers and the answer-it didnt show what the user was doing. I also fixed a ton of bugs. Apps that are maximized now perfectly snap to the taskbar without overlapping, and the File Explorer drag-to-select doesn’t glitch when you move the window because before the drag-to-select used to activate when i was dragging the window.
WebOS 2 Devlog #3: Building a UNIX Terminal + some other improvements This was a major update today for WebOS 2.0 as i built a genuinely realistic CLI. It’s looks and acts like a Mac Terminal (cus i use mac). Here is what i implemented: In the terminal, i implemented the following commands: help, clear, pwd, ls, cd, cat, touch, mkdir, rm, echo, whoami, date, history, and nano. This part itseld wasnt so difficult cus I had previously done something similar before but it was still challenging nonetheless. I wanted the CLI to be as realistic as possible so I implemented (with a little bit of help from gemini) a custom AST-style parser. It fully supports logical command chaining (&&, ||, ;), quotation marks usage (both single and double), and file redirection (>, ») straight into the virtual hard drive. Autocomplete: This was probably the hardest thing i tried to build and i am happy with how it turned out. I implemented a zsh-style Tab completion system. Pressing Tab auto-fills the longest common prefix and then shows all the possible options directly beneath your active prompt. This is one of the things I a most proud of because after using it, it was essentially very similar to the mac Terminal. This autocomplete works both for commands and files/folders. Errors and stuff: The terminal behaves exactly like real bash. If you type ls -la (-la is not implemented [yet?]) or cd too many args, it won’t just blindly execute or fail silently (it originally did so i had to change it), but it will spit back the same error message you’d expect to see on a real machine. GUI/CLI Integration: When i was implementing nano, i tried to think of how to implement a CLI editor. But i then realised, i can just connect the nano command to the notepad that I alreadu made. So typing nano test.txt in the terminal now just launches the Notepad app and opens the file for editing. And I made some other changes to stuff like the file manager but the terminal implementation above is the biggest change.
WebOS 2 Devlog #4: Initial bootloading sequence + login (optional) When i looked at other projects i realised that they all have some kind of flashy bootloading sequences but mine didnt have any so i built one. I didn’t want it to be too flashy so i made a simple, straightforward sequence. I also knew what exactly I wanted so I managed to finish this in 4hrs on the dot or it would’ve taken a lot longer. This is what it consists of: Bootloader that takes into account the selected theme: Since I had two themes in my OS (Modern and Legacy), it didnt make sense for both to have the same loading screen. So the system now actually boots up differnetly before loading the UI. Depending on your settings, you’ll either get a quick Modern UEFI startup, or a 1995 Legacy BIOS sequence complete with memory checks, IDE drive detection, and ASCII loading bars (had to use some outside help [ai] for this one as I’m not that old to know all that stuff). Hardware Interrupts: Just like a real PC, if you hit esc while the system is booting, it triggers a hardware interrupt and drops you into a configuration screen. Interactive OS Installation: If it’s your first time booting up (or you reset your system), you now have to actually “install” the OS. You can type in your preferred Username, network Hostname, and set an Administrator Password right inside the terminal. You even get the option to format your virtual hard drive. Login: If you set a password (which is optoinal) during setup, the boot sequence will actually halt and lock the system until you type it in. (Don’t worry, I added a recover command bypass in case anyone forgets it). Terminal Integration: The CLI terminal now dynamically reads your setup data. Instead of a normal prompt that you used to get with the default user@stardance or sth, you’ll see your actual custom username@hostname:~/$. Loading text: as the os loads and goes through the bootloading sequence some highly advanced random computer text ‘loads’ to add a little bit to the realism. Some of them are actual data from the host computer such as ram, gpu, and stuff like that. I had lots of other text and loading content that came from the the user’s actual real life hardware and software data, which added to the realism I had to research and use ai to make this because I had no knowledge of how computers were back then. There’s more but it wont fit here so you’ll just have to see it when i host it after my next ship.
WebOS 2 Devlog #5: File manager overhaul + custom dialog box I realised that always having the custom browser alerts was kinda boring and interrupting so i made my own dialogue box. I also changed the file manager to include some essential functions that it was missing to make it more like an OS (see below). Here are the changes i made: I abandoned the old array-based folders. I made it so that it now reads and writes directly to localStorage using stricter pathing (e.g., webos-file-Root/Documents/file.txt). I also built a native getUniqueName() function. If you create a duplicate file or folder, there’s no like a (1), (2), etc. at the end of it, which prevents data overwrites. This makes it more like a real OS Drag-and-Drop: I alos removed the old custom JavaScript coordinate trackers for file movement. It now uses the native HTML5 Drag-and-Drop API. You can physically pick up a file from the Explorer window, drag it out, and drop it directly onto the visual Desktop wallpaper. Custom Dialog Box: Native browser popups (alert(), confirm()) look hella ugly and break the flow so i built a custom dialog engine using JavaScript Promises. Now, when the system needs confirmation a custom window that fits with the theme appears. Because it uses async/await, the JavaScript pauses and waits for user acceoting or declining without freezing the browser. List View & Item Properties: I introduced a hybrid Grid/List view (just like a real os like mac). Because tracking file metadata (like Date Modified) from the start would have been way to complicated, I just built this engine where when the File Explorer encounters a file without a timestamp, it instantly generates metadata key (os-meta-path) using Date.now() and saves it permanently, which means that it allows for Date sorting without breaking anything.
WebOS 2 Devlog #6: UI, UX and functionality improvements This update focuses heavily on stabilizing what i already have and also refining the less finer aspects of the UI. Here is what i did: Theme improvenets: I overhauled the .theme-retro class. stuff were contradicting each other with one thing saying this and the other saying that (too many to even give an example). I also changed some other minor stuff too like increased the grid size in the desktop to prevent icons from overlapping. But this was the main change: System Security & Identity Manager: Implemented a global sanitizeIdentity utility (Regex: /[^a-zA-Z0-9_-]/g) to remove spaces and illegal characters from usernames and hostnames when the user sets it before writing to localStorage because if i have sth like ‘John Doe’ as the username and ‘my school computer’ as the host name, the terminal command would look sth like John Doe@my school computer. And this just looks hella ugly. Dedicated Identity UI: removed the raw identity inputs out of the Settings menu like i had before and moved them into a dedicated Identity Manager window because its more secure that way. I also added an authenticaiton wall before this window pops up. To do this, i wrote an async while loop for identity verification. All the users now have successfully pass the password prompt (or use the recover override to bypass the password) before it allows them to modify any identity settings. Bootloader improvements: btn-shutdown now properly halts system processes (clearing systemClockInterval and locking pointer events) instead of just hiding the UI like it did before where it just had like a black screen with text on it saying shutting down and stuff. It now has like a loading screen and all that stuff. Context Booting: i also implemented sessionStorage.setItem(‘boot_context’, ‘warm’) to track system restarts so different boots have like different bootloading sequences (the point below this). This didn’t take too long as i could just copy and past what i had in other sequenes and just take the text. Differnet Boot Sequences: The bootloader now reads the sessionStorage context. A Cold Boot triggers the full POST memory checks and hardware scans (dont know what this is. had to use ai for the sequences cus i didnt know what the data was). A Warm Boot (restart) bypasses POST and executes a different initialization sequence. THis makes the user more immersed in the environment.
WebOS 2 Devlog #7: Web Browser Implementation I reached the final couple of phases of my project and this is one is one of the crucial ones: building a web browser. My plan was to use iframe. But the thing about building a webbrowser inside a webbrowser or inside a sandboxed environment like a website is most websites (about 99%) like google, youtube, or github use X-Frame-Options and Content-Security-Policy: frame-ancestors ‘none’ which means they specifically block their websites from being displayed in cases like this ot prevent clickjacking. So every time i tried loading a webpage, it just says this webpage refused to connect or sth. I used ai to try bypassing it but it didnt work, so with the help of the same aforementioned ai, i implemented a solution. The solution: Since I cannot disable host browser security policies, and i dont have a backend proxy server, I had an idea to just build my own native ‘browser’: EpochOS IntraNet (just decided on the name EpochOS btw). This didnt take too long cus i had someone (ai) helping me cus it was almost midnight and i was tired as hell. Here are the features: I wrote a parser that intercepts navigation requests. If the user navigates to webos://home or webos://directory, the engine injects a large data:text/html;charset=utf-8 string directly into the iframe’s src attribute. This opens a local, HTML dashboard without triggering cross-origin blocks. Essentially, i wrote html in js and injected that html into the iframe src, so i essentially made my own ‘web-page’. Standard links inside a data URI iframe will try to navigate the iframe itself, which doesn’t update the OS address bar. To fix this, I set up a window.addEventListener(‘message’) listener on the parent OS. The buttons inside the iframe use parent.postMessage() to pass the target URL up to the OS, allowing the JavaScript engine to handle the routing and update the UI properly. A real browser alse doesn’t lose a page’s state (like scroll position) when you switch tabs. And im trying to make a real browser. So, to achieve this, the browser engine now doesn’t share a single iframe but rather new ones get created: Every time the user clicks the “New Tab” button, a new node is generated and appended to the container. Switching tabs simply toggles the CSS display property between none and block. This keeps inactive pages fully loaded in memory. Because cross-origin security rules (the ones i mentioned before) lock us out of accessing the iframe’s native window.history object, I had to build a custom history router. Every tab object in the JS array maintains its own history array and a historyIndex pointer. The back/forward buttons just decrement or increment this pointer and re-apply the URL to the iframe. Kinda genius ngl (this was an idea from ai btw) But for a browser to be useful, it needs to have some proper webpages. After some scouring, i found some webpages that do work in iframe and dont have the restrictions that websites like google do. I’m not gonna tell you what websites those are, you just have to see yourself. I found like 10 or sth so there’ll be plenty of stuff to do. Other features of the browser include: bookmarking, reloading (i also added a reloading spinner btw) and some more stuff.
WebOS 2 Devlog #8: Migrated to ES6 arch. and split css into any files I just realised that essentially all my code is squished into three files-index.html, index.css, and index.js. And all of them were quite big. Like the js file had more than 2,000 lines, and css had more than a 1,000 lines. I dont know why i havent noticed it before but im glad that i did now because i was plannign to do a deep debugging session next and it wouldve been hella hard to do in a 2000+ line file. Plus, a single bug in e.g. the calculator could crash the file manager, and debugging required scrolling through thousands of lines of code. So, i decided to migrate the index.js into an ES6 architecture and split the index.css into multiple manageable files. That’s all i can say for this devlog ig. There was nothing new except some lines of code i had to add after the migration to make sure everything is working. There were no really new features added. But there were many things that delayed me: i accidentally deleted a block of code in the index.css without moving it and didnt notice it so some styles were broken and i had to like retrace my steps and stuff to fix all the problems it caused. That’s all ig. The project is almost coming to an end! Can’t wait to ship it :)
WebOS 2 Devlog #9: Implemented color accents and some browser improvements I was originally going to do some debugging and finish of this project but i was looking through other peoples’ webos projects and realised there was much i could improve. I then got like a huge brainwave about new stuff to implement so ig it’ll be a bit longer before I ship this project. One of these ideas was adding color accents because right now my modern theme is limited only to a light pinkish color. Here are the changes i made: Change 1: Accents In the settings screen, i added an option to choose the system accents. I also gave some basic presets and added an option to pick a color by adding a color picker option. Implementing this was quite simple, just replace all hardcoded pink colors with –os-accent (which i added in css). I linked htis –os-accents attribute/class to the color that the user chooses in js and made ti that all the places where the accent pops up, the color variable there is replaced with –os-accents. So if the user changes the accent in settings, the places where –os-accent is set changes color automatically. Challenge 1: Contrasting invisible text The problem: Swapping a single hex code for an accent color that the user chooses breaks all translucent UI elements (like shadows). Furthermore, if a user picks a bright color (like Mint Green or Yellow), the hardcoded white text on the title bars becomes completely invisible. The Solution: I implemented a Hex-to-RGB engine that injects raw RGB values directly into the CSS :root. This solves the first part of the problem. To solve the text contrast issue, I implemented the WCAG Relative Luminance algorithm ( used a bit of outside help here iykwim ;)). The OS now mathematically calculates the perceived brightness of the user’s chosen color. If the relative luminance passes a threshold of 0.179, the OS flips the title bar text to pitch black so its legible comfortable. Change 2: i was just playing around in the webbrowser and exploring, and i found some stuff that needed to be fixed: when building a simulated web browser using tags, embedding sites like google resulted in a “Refused to Connect” error. These servers send an X-Frame-Options: DENY header. Because client-side JavaScript is legally blind to server headers, the OS couldn’t detect the block to show the custom error screen I made. I knew this error existed and knew this was a thing but only after experiencing it like a real user did i realise how annoyinf this was and it made my os seem broken. Solution 1 (attempt): I initially tried routing requests through a third-party API to read the headers, but ad-blockers and privacy shields just made the API requests not work, crashing the entire browser app (at least thats what i think is the cause). The Solution: I used a massive Regex blocklist, such that the browser now instantly intercepts requests to 99% of top-tier websites that block iframes (like youtube or google), and routs the user to a custom error page. (did these stuff with the help of some ai only) Next Problem: When a user searches Google inside the iframe and clicks a link in the embedded page, the OS address bar wouldn’t update. This is a browser restriction. Browsers mathematically lock JavaScript out of reading cross-origin URLs for security reasons. At this point i just stopped instead of trying to waste my time trying to break through some military grade (i think?) restrictions. Change 3: Before, only iframe compatible websites worked but i had an idea to route all queries (except the ones in websites format) through a google search. Apparently, google.com doesn work in iframe but the google search works. So now if i type hello world, it just redirects me to a google search page with hello world searched. P.S. I made some other tiny changes aswell but i cant rlly remember them now sry
WebOS 2 Devlog #10: icon implementation + taskbar remodeling When i looked at the webos, i realised it missed something to look like an actual os. It wasnt realistic enough. So, i decided to do two changes to make it more realistic. Here is what it did: Change 1: I added some real user data in the taskbar. More specifically, the host device’s actual network and battery status and date. I used the the browser’s native navigator.onLine and the navigator.getBattery() APIs. I also made it such that the os actively listens for network connection drops such as when wifi is disconnected and battery charging/level events, and updates the data accordingly. Change 2: I also noticed that my entire os is filled with emojis for stuff like calculator, file manages (all the apps essentially), the taskbar, the browser, the sites in the browser, etc. THis made it look really unprofessional so i fixed it. I replace all system emojis with Google Material Symbols to make it look a lot better. I did face one challenge however, the emojis in my website in my web browser weren’t being replaced by icons for some reason and I then realised that the iframe sites acts as a sandbox and they dont inherit the imported apis from the main html file. So I just injected a tag and imported the Google Material Symbols API directly in the isolated HTML code in my js file. Change 3: The goal of this change was ot allow the user to snap the taskbar to the top of the screen (Linux style). This was the part that took longer than expected. I originally just added an optoin in the settings to move my taskbar to the top of the screen but the pill-like, floating taskbar i had was really ugly when it was at the top. So, i spent like more than an hour and half trying out new designs and redesigning the taskbar so it looks good both when its at the top and the bottom and finalised a design that actually looks much better than what i had before. It now takes up like the entire bottom/top of the screen instead of floating in the middle liek before. That was all the changes made since the last devlog.
WebOS 2 Devlog #11: Reset btn + Notepad IDE + other changes This was a long long coding session. Had to stay awake till like 2am. Here are the changes i made. Ill try to keep everythign concise because theres a 4000 char limit and i have lot more to say than that. Change 1: I added a factory reset button in settings that directs the user to the webos setup screen like the one they get when they first enter the website. When testing this feature, i realised that random variables from completely different web projects started appearing in the File Manager. Because browsers share localStorage databases across the same local port (e.g., 127.0.0.1:5500), the OS was inheriting the ghosts of old projects. The solution: I had to upgrade the Initial Setup Utility. When formatting the Virtual Hard Drive, the system now temporarily caches the user’s OS credentials in memory that they entered, executes a total localStorage.clear() wipe to delete all the localStorage varialbles, and then safely restores the username and stuff before continuing normally. Change 2: Notepad IDE This was the part that took the longest (and its still not done). I wanted to create something absolutely unique that i havent seen in any other webos projects that i saw. And i realised, why dont i make an IDE in me webos? Not an actual IDE ofc but the goal was to allow users to write raw HTML/JS in the Notepad, save it as a .app file, and double-click it on the desktop to launch it as a fully functioning, program. Attempt 1 (Failure): I initially tried parsing the saved text and running it directly in the OS context using eval(). It was an absolute security and stability nightmare. The custom app had root access to the OS memory and instantly overwrote the osState object, completely crashing the Window Manager within seconds. Attempt 2 (Failure): I tried fixing attempt 1 but messed up the entire code in the process so i had to revert to that commit and this time, i tried putting the apps in Web Components and the Shadow DOM. While this successfully isolated the CSS so custom apps didn’t break the OS styling, the JavaScript still executed in the global window scope. Running two different custom apps simultaneously caused variable collisions that bricked the taskbar. It was too complex and fundamentally flawed. I wiped the slate clean again. Attempt 3 (Success): I realised that the answer was looking straignt at me. I was so stupid. I can just take the code and slap it on to an iframe, and it runs it, just like how i made the web browser. The solution was that When a user double-clicks a custom .app, the OS takes the raw code and converts it into a text/html Blob. It then passes that Blob through URL.createObjectURL(), creating a localized URL. By feeding that URL into an , the custom app boots perfectly. I am really proud of this feature. It’s still not fully done but i had to make a devlog since the tracked time almost reached 10hrs.
WebOS 2 Devlog #12: Debugging Session + retro theme redesign In this session I started debugging the os and wow i found a lot of bugs. Im not going to get into them because it would take too long but some of them include how the bootloading sequence absolutely breaks if the user presses escape before the setup is finished because the cache isnt cleared properly so when the user gets the setup agian, he wont we able to configure some stuff like the password because the cache wasnt cleared properly. I also redesigned the retro theme because it looked ugly because the accents i implemented in the modern theme appeared in the retro theme which didnt fit together. Moreover, some of the aspects of the retro theme, such as the top part of the web browser or the settings screen were just uncomfortable to look at. Changing the retro theme was such a pain because everytime i thought i fixed it, a new discrepancy appears and at one point after i fixed it, my retro-theme.css was so messy i couldnt be bothered to fix it so i just inputted the messy working version into gemini and it cleaned it up. Anyway that was all i changed this time. And I did more and more changes but many of them are small and it would take too long to explain in a devlog. p.s. didnt know which pic to attach so its just a simple screenshot of the desktop.
WebOS 2 Devlog #13: Easter Eggs Pt. 1 I was looking forward to this a looooot. I’m not giving any spoilers whatsoever but I was so locked in tday and yesterday coding easter eggs into the OS. I added like 2 easter eggs (might seem less but trust me they’re very developed), one’s a very simple one but the other one is my favourite and is the reason this devlog took so long. It’s still not finished and im only lik halfway done w/ it but I’m not going to go into any details because it will spoil the fun but im sure you’ll enjoy it. Also, im not done with making easter eggs and i just made this devlog cus the time is almost 10hrs. I still have to finish the second easter egg and do more on top of that. The next one will hopefully be the final easter egg session (unless i get another absolute brainwave). p.s to prevent spoilers, the attached pic is just a screenshot once again
WebOS 2 Devlog #14: Easter Eggs Pt. 2 I am now done with making the easter eggs and in total i made 5 of them, which may seem less but some of them are really really complex and developed. I stayed up till 2am making these 😭. Out of these 5, three of them are simple easter eggs, one is more complex but still quite simple and the final one is essentialyl the absolut highlight. It is the reason why the easter egg section took me so long. I am not going to go into detail to avoid spoilers. Anyway i hope you have fun with the easter eggs :) p.s the attached pic is a screen shot again cus i dont want to give spoilers
WebOS 2 Devlog #15: System Daemon implementation To keep the users more engaged so even when they saw everythign, they would still spend more time doing stuff, I wanted to build something alive for the desktop environment that would interact with the user. So, instead of a standard app, I built a system daemon! If you dont know what that is, it is a digital pet that hangs out on your desktop and does random stuff. I dont hav ea name for him yet so ill just call him daemon for now. When he’s healthy, he flies around the screen and shouts random stuff at you. But I didn’t want him to just be a visual gimmick. He interacts with the actual operating system itself and has states: He is hungry: Because I previously built a drag-and-drop system for the File Explorer, I hooked him into it. You can drag actual text files or folders out of your explorer and drop them on his face. He will chew them up and literally delete them from the virtual hard drive (localStorage). He has a digestive tract: I built a array for his stomach that records what he has last eaten. If he ate a file you actually needed, you can rapid-click his face 5 times. He will regurgitate the raw file data perfectly back onto your desktop. He has boundaries: I ‘taught’ him to recognize core OS files. If you try to feed him Notepad.app or the System Settings, he will violently reject them and yell at you. He has one more state but that relates to the easter egg so i wont provide any additional details in order to not spoil it Oh, and i changed his appearance for the retro theme. anywhat that’s all for this change. I didn’t get into the nitty gritty of how I built him because I am so excited to finish this project. Just a few more features and then I’m done.
WebOS 2 Devlog #16: Widget implementation + debugging In this session, i made multiple changes to the OS to improve the overall UX. I had to pull another all nighter again 🥲. Here is what i changed: Change 1: Debugging Everytime i enabled the system daemon in the settngs, the entire os reloaded which was quite annoying so I ripped out the location.reload() in the Settings app. I also moved him to the body so he didn’t get trapped behind windows, because most of the time the daemon was floating behind windows and i couldnt really see him. I also gave the Welcome screen a massive 9999999 z-index so the daemon would float behind it because my previous step was too effective and he was infront of every single screen including like the bootloading screen. Challenges: I ran into z-index hell because I didn’t plan the stacking initially. He was either in the very front or at the very back and it was all a bit weird. Change 2: Widget implementation I initially wanted to implement sticky notes as a widget which was inspired my the mac sticky notes so i coded all of that in first but I realised i can take it a step further and code in multiple widgets. Challenge: But the thing was i hardcoded the sticky notes widget so i had to recode everything and integrate all of the widgets at once I added a simple analog clock widget I added a calendar widget I initially added a system monitor with like the ram and cpu data but the thing was due to the security restrictions, I can’t get the actualy live hardware data so it would have to be a simulation, which i didnt want so I replace the system monitor with a live weather widget which uses the BigDataCloud and Open-Meteo APIs to provide weather data. Change 3: Originally I had all hte widgets in the context menu on after the other but they looked like a list and a bit redundant. So i removed all then in the html file and added one ‘Add a widget…’ option which connects to a screen with all the widget options
WebOS 2 Devlog #17: Media player + Audio spectrum widget implementation It has been a massive coding session. And I barely managed to keep the time below 10 hours and I still went over it. But, on the bright side, the OS now has a fully functional, media player and an audio spectrum widget! In the media player, anyone can listen to radios, and lots of music. But the reason it took 10 hours is because implementing these stuff required facing some serious bugs-some of them for genuinely stupid mistakes-and rebuilding the audio engine the right way (you’ll see what I mean). Here is a breakdown of how these new features work, what went wrong, and some other stuff: Overview of features The Media Player: The new Media Player is a audio application that routes requests to three distinct APIs to fetch music that the user can listen two: Audius: This is a “decentralized music streaming platform for artists, labels, and fans.” And it’s free! I fetches some of the music from this API. Radio-Browser: This is a platform that is, in a nutshell, Wikipedia for radios. I fetched thousands of live, global radio broadcasts using this API Apple iTunes (Preview): This was a golden find because I didn’t know this existed (not for free anyway). This API pulls top hits and previews of music. Granted, it’s not full music tracks but the songs are much more famous and popular. The Audio Spectrum Widget To complement the player, I also added an Audio Spectrum visualizer. It uses the Web Audio API, or more specifically, its AudioContext and an AnalyserNode to get the frequency data from the audio element. That data is then mapped to an HTML5 element. Using requestAnimationFrame, I made it such that the spectrum repaints 40 individual frequency bars roughly 60 times a second, which creates the audio visualiser waveform thing. Challenges The Geolocation failure: The OS was originally hardcoded to fetch radio stations from my address because I hardcoded that for testing purposes. But I stupidly forgot to remove that so when attempting to make this dynamic by using vpns I spent like 40 minutes trying to figure out why ut kept showing stations from my local area and not japan (where my VPN was connected to). And the reason for that is the hardcoded address I mentioned earlier. Moreover, some of the API queries were too specific, causing the media player to return empty for smaller regions like the Bahamas. To fix it i used the BigDataCloud API to quietly ping the user’s IP address, cache their true country code, and inject it into the API queries. the broken audio spectrum: Initially, the audio visualizer was completely blank. Even when fixed, the baseline would just disappear the second music started playing. The canvas drawing logic was also aggressively using clearRect to wipe the entire widget, which erased the idle state baseline. To fix it, I changed the baseline math so that the baseline sits firmly at the bottom of the widget. I also remade the drawing loop to explicitly redraw the baseline before checking the isPlaying state, so the frequency bars can work smoothly. retro theme problems: I completely forgot about the retro theme as i was just focused on building the player and the widget. So, in the end i had to make the stuff retro theme aswell. I encountered some problems there like some white on white text and some styles not applying which turned out to be because my dumbass brain mispelled the ids and classes Oh, and I found some other big bugs. The dragging engine was hella laggy. Like the response time was like 3 seconds before it registered. I would go deeped but im abt to cross the 4000 character devlog word limit but in a nutshell I realised it was because the mousemove event listener was directly updating the inline CSS (style.left and style.top) on every single microscopic mouse movement so it was really laggy.
WebOS 2 Devlog #18: Debugging session I swear random bugs keep popping up no matter how much debugging I do. There’s always something that’s wrong or doesn’t work but that’s just how it is. In this session which was longer than expected, i fixed a lot of different bugs. Here is a summary of the changes i did: I spent lots of time rewriting the mathematics for the desktop icon layout, and also changed the strict grid-snapping to free-form placement cus it felt it was quite annoying not to be able to place stuff on the desktop wherever you want. Unfortunately, it took too long and i abandoned the idea and just moved on without making any changes. I also spent some time cleaning up the code and tried to optimizing the code. Some other bugs I fixed include: Desktop icons were randomly rearranging themselves every time a file was saved. I found out that the reason was that since the localStorage returns keys randomly, everytime i wrote sth to localStorage, the items were randomized so the ordier they appeared on the desktop changed. So i rewrote the logic to sort the stuff alphabetically before displaying. The Notepad app was also blindly overwriting existing files with the same name. I fixed it by adding a localStorage query to intercept matching keys and to display an osConfirm dialog, forcing the user to explicitly authorize the overwrite. The internal browser was throwing captchas all the time and failed to load error screens for blocked domains. Since Google aggressively blocks embeds and flags them as bot traffic, i changed the default browser to Bing, which was much better and i didn’t get captchas everytime i search somehting up I also modified the system daemon engine so that it introduces itself when a user first view the OS. The weather widget was pulling the location not from where the user was but rather where my ISP was routing my traffic through. So if i lived in a village and ISP routes my traffic through like New York, the weather that showed up was that of New York. To fix this, i swapped the logic to request exact hardware GPS coordinates via navigator.geolocation, while falling back to the IP routing API if the user denies the browser prompt. If the location is inaccurate the user can enable the location permission in the browser and the weather widget then shows the correct location. The visualizer widget was working perfectly but i had the idea to add a text container above the bars which shows what the user is playing. I made way way more changes but many of them conform to the easter eggs and mainly about the theme that gets unlocked (small spoiler there ;)) so i won’t really get too much into it.
WebOS 2 Devlog #19: README.md + ARCHITECTURE.md + additional customisation features I’m in the final stages of the project and in this long session, I did many things. Firstly, I wrote a README.md with all the necessary stuff and i also made an ARCHITECTURE.md file which explains the nitty gritty insides of the WebOS so anyone can understand how the website works. Other than that I added a couple of other stuff. Firstly, i realised that even though I have accents to customize the desktop, I don’t have a wallpaper gallery (except the nasa apod) which I found was quite necessary. At first, i coded my own wallpapers like a synthwave grid wallpaper, pinstripe wallpaper for the legace theme, a tranforming aurora wallpaper and like 3 more but after i coded them, they just looked so damn ugly. So i scratched the idea of me coding my own wallpapers and added three categories of wallpapers in the wallpaper dropdown with each category having three 4k wallpapers in them so every time you pick that category, you get a random wallpaper from the three. I also added an about section in the settings which has a buttton that leads to the github page.
WebOS 2 Devlog #20: Updated README.md and ARCHITECTURE.md + changed properties window I just realised I had a properties window in the OS and that was quite outdated so I changed to include some new info like the Last Modified date which updates everytime the user saves something because i added a localStorage.setItem that saves the timestamp. I also updated the README and ARCHITECTURE files to make them sound better and to add some additional info. Anyway, this devlog is probably the last on for this project! Hope you enjoy :)
WebOS 2 Devlog #21: Final Submission Just did some final changes to the welcome text and am about to ship it
Ships:
I created a simple operating system with HTML, CSS, and Javascript that runs on you web browser. It has a nostalgic look and feel with old-styled buttons and looks. To make it more like an OS, a calculator and a notepad have been created and implemented in the app. Moreover, to allow the user to personalise as much as they want, many settings have been included, from custom wallpapers to wallpapers that come from NASA itself and more. This was my first large scale project that I have coded so it’s an interesting experience for me. Before this, I only used to do challenges on platforms like Codewars and other than some small side projects, I don’t have a practical experience. Therefore, i think this project has taught me a lot on how to built stuff yourself. I hope you like my project :)
EpochOS is a fully functional operating system built entirely with vanilla JavaScript, HTML, and CSS. It doesnt require any client side installations or anything and runs directly in your browser. Its features include a file explorer, a browser, a media player, many essential applications, lots of customisation, widgets, and an actual ecosystem that mimics a real operating system. It also has no backend so it’s all run locally on your browser using the browser’s localStorage. Some things you should know before you test this out: Firstly, please don’t finish rating this project until you experience all the features because there are many hidden features that might change your opinion. An example is easter eggs. I implemented many easter eggs which you must experience before voting because these easter eggs are very devloped. If you can’t find them or are stuck on one of the easter eggs, read ARCHITECTURE.md and at the very bottom, i listed all the easter eggs so you can check them out. In fact, read the ARCHITECTURE.md because it provides valuable info about many of the features in the OS and how they work so make sure to read that aswell Secondly, this OS is not compatible with mobile or tablet devices and is optimized for desktop only. So please keep that in mind when you are testing it. Thank you so much for testing this project and hope you enjoy it :)...
|
1792997400.770447
|
1793083800.770447
|
|
23875
|
Open Wall by @Liam303 | Stardance
|
Liam303
|
1
|
119.0
|
1204
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T11:26:33Z", "hours": 119.0, "multiplier": 11.57, "payout": 1204, "blessing": "neutral", "text": "This is Open Wall, my first every complete Python project, this app takes data from open f1 and displays it visual in a clean way so that any user can use it. The biggest struggle throughout this project what converting the data supplied by open f1 into functional number, this involves time conversion, coordinate setting and proper caching.", "repo": "https://github.com/Minos303/OpenWall", "demo": "https://github.com/Minos303/OpenWall/releases"}]...
|
[{"post_id": 26517, "ts": "202 [{"post_id": 26517, "ts": "2026-07-11T11:21:18Z", "hours": 2.0, "text": "Its officially done, Open Wall is finished. 120 hours have gone into the project and I’ve gone from a complete beginner in python to somewhat competent. I’ve lost a huge amount of sleep trying to get this working but now that’s it’s finished I feel so proud of the final design. A massive thanks to Star Dance for hosting this and giving me a reason to finally learn python, I’ve never given myself a good enough reason until now. My dream is to become a aero engineering and this project is a stepping stone in that journey, my next project will be alot more relaxed. Thanks to everyone that supported me along the way, and with that I need sleep so in case I don’t see ya, good afternoon, good evening, and good night!"}, {"post_id": 26461, "ts": "2026-07-11T08:37:04Z", "hours": 9.0, "text": "Sorry if it sounds like I’m in a rush but I was in the process of testing my code for bugs and I discovered a gasp bug. Basically for driver swaps in the middle of the year like Lawson and Red bull the code would download separate data for the team for two different instances, and since previously I would have it assume they were the same it would crash. This fix shouldn’t take long, just like 30 minutes of testing values, but I’ve confirmed everything else works, fixed some bugs surrounding the time library I use, and so I’m confident my next post will be one announcing the conclusion of this project. For dramatic effect my project will officially be released in Bum bum baa 2 Hours. (Sorry for the lack of a project image, you’ll just have to check it out for yourself ;)"}, {"post_id": 26234, "ts": "2026-07-10T22:00:31Z", "hours": 9.0, "text": "I’ve officially passed 100 hours on my project. Today is the final stretch, the final sprint to the finish line, I was able to get it all running normally on windows, my plan is to lock in the for the remaining time, hopefully my next post will be to tell you all of the projects completion, I found the problem from yesterday and was able to get the data to cache properly and now I’m literally just running the app over and over to find as many bugs and errors as possible, I’d rather get the errors myself then make the final user have them. Sorry if none of this makes sense or if it lacks any of my previous humor, I’m pretty tired and I know the second this project is over I will be sleeping as long as possible, but for now I’m just desperately trying to get the final project finished."}, {"post_id": 25835, "ts": "2026-07-10T09:48:26Z", "hours": 9.0, "text": "I jinxed myself. So earlier I might have got a bit cocky about my own error fixing ability, it all worked perfectly well on my Cachy os laptop, but on my windows pc it all breaks for absolutely no reason. What I’ve spent the past 9 hours doing is converting it to use a different library, while this is easier than it sounds it’s by no means a walk in the park, so far I’ve got the functions to run, but efficiency, ironically the thing I was bragging about before, it still a problem so it crashes after like 5 minutes due to the previously displayed data not being properly cached. My plan is to finish the entire project by the end of tomorrow, I’m so close and super exited to show the final product."}, {"post_id": 25581, "ts": "2026-07-09T22:28:38Z", "hours": 9.0, "text": "Mānawatia a Matariki! 🌟, I am in a very good mood. For the past 9 hours I’ve worked on this project everything has just worked, within an hour the error that plagued me yesterday just dissapeared, do I know why? No. Do I care? Not at all. If it works it works. Today was more of a continuation of yesterday, making everything feel faster, better, fixing everything that didn’t work yesterday, I made the graphs scroll properly, I made the ui look even better, my plan is to lock in today and tomorrow and finish it by the end of tomorrow, might pull an all nighter"}, {"post_id": 25225, "ts": "2026-07-09T10:53:21Z", "hours": 9.0, "text": "Error time: For the past 9 Hours I’ve spent trying to make everything more efficient and I’ve been plagued with error after error, and as of this moment the errors are still erroring. The first error I got was the “texture not found”, which is unusual when I directly gave it the image texture, now obviously the fix to this error was that a completely unrelated button was labeled wrong so… Also some random thing about the way it downloaded the values from online meant specific races would spit out values that led to random websites, so basically it would try to download the f1 values from a bands website that had f1 in its name. Also the error below which I’m in the process of fixing."}, {"post_id": 25031, "ts": "2026-07-08T23:32:20Z", "hours": 11.0, "text": "Day number, you know what I’ve lost track of the time. Hours go by so quickly yet it refuses to work, I refuse to give in the ai and let it fix it for me, what could I have done, did I displease the coding gods, how can I undo my, oh wait it works now. Seems I mistook a full stop for a comma. That definitely didn’t take me over 5 hours to fix, and of course the error messages point to a random line that has nothing to do with the problem. Today was mainly just cleaning up the ui, just unifying everything into a good looking color scheme, next I think will be a few new features."}, {"post_id": 24445, "ts": "2026-07-08T00:26:07Z", "hours": 14.0, "text": "The beta build is now live. Please feel free to try out the program, test it, give feedback, the more I know the better this becomes. Close to 60 hours have been spent so far and so I hope this project brings as much joy to you all as it did to me, more updates coming soon and the final build should be released by the end of the week, have fun. installation: To install this program go to the releases page, and download the version for your operating system (as of now there is no Mac OS installer and no plans to implement one), extract the .zip file, open the read me and follow the instruction inside, if there are any issues at all please record them and respond. Have Fun"}, {"post_id": 23899, "ts": "2026-07-07T03:16:17Z", "hours": 12.0, "text": "UI Update: Added a new ui for the user to make it easier to select everything. Remove practice qauli and sprint sessions, they may return but they kept bringing up errors, added a loading screen, it doesn’t look great but… Tomorrow the app will be officially downloadable and hopefully after some small ui and error fixes in two days it should be fully finished"}, {"post_id": 23391, "ts": "2026-07-06T10:03:40Z", "hours": 15.0, "text": "Map Update: -Fast forward, pause rewind ect all works now -Tidied everything up making it look nice + colors -Now shows driver information -Shows current race information Planned Features: -Complete ui access -Making it downloadable Sorry for the long wait, I’ve had school internals ect and most of my time coding has been minor error fixing and starting to implement a few of the features above, on holiday for the next week so the project should speed up."}, {"post_id": 18163, "ts": "2026-06-29T05:50:18Z", "hours": 4.0, "text": "So I know it’s been a couple of days since my last update but for the past 2 days everything refused to work, most of my fixing wasn’t even me writing code just adjusting browser and html settings. I finally caved in and switched to an app ui for stability because the website keeped crashing. and after about 2 hours of work everything just started working, I can start graphing the speed gear that sort of stuff and even draw the track map so in the future I can animate it, this project is coming along really well, I look forward to sharing my first usable build in the near future, if you have any ideas for this project please feel free to tell me"}, {"post_id": 15501, "ts": "2026-06-25T06:13:21Z", "hours": 3.0, "text": "It does stuff now, yay, you can actually get back the driver speed and their gear and stuff, tried to make website gui but the diffrent code laungages have decided to gang up on me to make this task as hard as possible so I’ll hopefully finish that tomorrow. So far the website looks very unintresting but so be it, thats later me’s problem."}, {"post_id": 14897, "ts": "2026-06-24T05:57:34Z", "hours": 3.0, "text": "FINALY got it running on linux, added terminal interface so it doesnt take 5 minutes each time to select a track, and you can immediately get into the f1 action. It can now go and actually get the data so its not just a blank page, kinda a necessary part. Then spent close to an hour trying to sort the data, apparently “Sakhir” has an h in it which messed up all my code, its inefficient, terribly written, but it works so… And then finally I added a user interface because not everyone’s a nerd like me who likes staring at console screens. MORE F1 GREATNESS COMING SOON"}, {"post_id": 14196, "ts": "2026-06-23T06:00:23Z", "hours": 1.0, "text": "Day 2, spent most of my time today going back and forth with the server trying to get it to respond with the session info, in the end it seems the problem was the wrongly named race course, e.g. Monte Carlo vs Monaco, so got that fixed and I can now get the proper token for the session so progress should speed up from here, the other two things I got done was setting up the error codes so I could quickly identify the issue and began setting up a better user input system for simplicity, but all good things come in time"}, {"post_id": 13966, "ts": "2026-06-22T22:31:50Z", "hours": 0.0, "text": "Setting up the very basic function"}]...
|
Title: Open Wall by @Liam303 | Stardance
Devlogs: Title: Open Wall by @Liam303 | Stardance
Devlogs:
Setting up the very basic function
Day 2, spent most of my time today going back and forth with the server trying to get it to respond with the session info, in the end it seems the problem was the wrongly named race course, e.g. Monte Carlo vs Monaco, so got that fixed and I can now get the proper token for the session so progress should speed up from here, the other two things I got done was setting up the error codes so I could quickly identify the issue and began setting up a better user input system for simplicity, but all good things come in time
FINALY got it running on linux, added terminal interface so it doesnt take 5 minutes each time to select a track, and you can immediately get into the f1 action. It can now go and actually get the data so its not just a blank page, kinda a necessary part. Then spent close to an hour trying to sort the data, apparently “Sakhir” has an h in it which messed up all my code, its inefficient, terribly written, but it works so… And then finally I added a user interface because not everyone’s a nerd like me who likes staring at console screens. MORE F1 GREATNESS COMING SOON
It does stuff now, yay, you can actually get back the driver speed and their gear and stuff, tried to make website gui but the diffrent code laungages have decided to gang up on me to make this task as hard as possible so I’ll hopefully finish that tomorrow. So far the website looks very unintresting but so be it, thats later me’s problem.
So I know it’s been a couple of days since my last update but for the past 2 days everything refused to work, most of my fixing wasn’t even me writing code just adjusting browser and html settings. I finally caved in and switched to an app ui for stability because the website keeped crashing. and after about 2 hours of work everything just started working, I can start graphing the speed gear that sort of stuff and even draw the track map so in the future I can animate it, this project is coming along really well, I look forward to sharing my first usable build in the near future, if you have any ideas for this project please feel free to tell me
Map Update: -Fast forward, pause rewind ect all works now -Tidied everything up making it look nice + colors -Now shows driver information -Shows current race information Planned Features: -Complete ui access -Making it downloadable Sorry for the long wait, I’ve had school internals ect and most of my time coding has been minor error fixing and starting to implement a few of the features above, on holiday for the next week so the project should speed up.
UI Update: Added a new ui for the user to make it easier to select everything. Remove practice qauli and sprint sessions, they may return but they kept bringing up errors, added a loading screen, it doesn’t look great but… Tomorrow the app will be officially downloadable and hopefully after some small ui and error fixes in two days it should be fully finished
The beta build is now live. Please feel free to try out the program, test it, give feedback, the more I know the better this becomes. Close to 60 hours have been spent so far and so I hope this project brings as much joy to you all as it did to me, more updates coming soon and the final build should be released by the end of the week, have fun. installation: To install this program go to the releases page, and download the version for your operating system (as of now there is no Mac OS installer and no plans to implement one), extract the .zip file, open the read me and follow the instruction inside, if there are any issues at all please record them and respond. Have Fun
Day number, you know what I’ve lost track of the time. Hours go by so quickly yet it refuses to work, I refuse to give in the ai and let it fix it for me, what could I have done, did I displease the coding gods, how can I undo my, oh wait it works now. Seems I mistook a full stop for a comma. That definitely didn’t take me over 5 hours to fix, and of course the error messages point to a random line that has nothing to do with the problem. Today was mainly just cleaning up the ui, just unifying everything into a good looking color scheme, next I think will be a few new features.
Error time: For the past 9 Hours I’ve spent trying to make everything more efficient and I’ve been plagued with error after error, and as of this moment the errors are still erroring. The first error I got was the “texture not found”, which is unusual when I directly gave it the image texture, now obviously the fix to this error was that a completely unrelated button was labeled wrong so… Also some random thing about the way it downloaded the values from online meant specific races would spit out values that led to random websites, so basically it would try to download the f1 values from a bands website that had f1 in its name. Also the error below which I’m in the process of fixing.
Mānawatia a Matariki! 🌟, I am in a very good mood. For the past 9 hours I’ve worked on this project everything has just worked, within an hour the error that plagued me yesterday just dissapeared, do I know why? No. Do I care? Not at all. If it works it works. Today was more of a continuation of yesterday, making everything feel faster, better, fixing everything that didn’t work yesterday, I made the graphs scroll properly, I made the ui look even better, my plan is to lock in today and tomorrow and finish it by the end of tomorrow, might pull an all nighter
I jinxed myself. So earlier I might have got a bit cocky about my own error fixing ability, it all worked perfectly well on my Cachy os laptop, but on my windows pc it all breaks for absolutely no reason. What I’ve spent the past 9 hours doing is converting it to use a different library, while this is easier than it sounds it’s by no means a walk in the park, so far I’ve got the functions to run, but efficiency, ironically the thing I was bragging about before, it still a problem so it crashes after like 5 minutes due to the previously displayed data not being properly cached. My plan is to finish the entire project by the end of tomorrow, I’m so close and super exited to show the final product.
I’ve officially passed 100 hours on my project. Today is the final stretch, the final sprint to the finish line, I was able to get it all running normally on windows, my plan is to lock in the for the remaining time, hopefully my next post will be to tell you all of the projects completion, I found the problem from yesterday and was able to get the data to cache properly and now I’m literally just running the app over and over to find as many bugs and errors as possible, I’d rather get the errors myself then make the final user have them. Sorry if none of this makes sense or if it lacks any of my previous humor, I’m pretty tired and I know the second this project is over I will be sleeping as long as possible, but for now I’m just desperately trying to get the final project finished.
Sorry if it sounds like I’m in a rush but I was in the process of testing my code for bugs and I discovered a gasp bug. Basically for driver swaps in the middle of the year like Lawson and Red bull the code would download separate data for the team for two different instances, and since previously I would have it assume they were the same it would crash. This fix shouldn’t take long, just like 30 minutes of testing values, but I’ve confirmed everything else works, fixed some bugs surrounding the time library I use, and so I’m confident my next post will be one announcing the conclusion of this project. For dramatic effect my project will officially be released in Bum bum baa 2 Hours. (Sorry for the lack of a project image, you’ll just have to check it out for yourself ;)
Its officially done, Open Wall is finished. 120 hours have gone into the project and I’ve gone from a complete beginner in python to somewhat competent. I’ve lost a huge amount of sleep trying to get this working but now that’s it’s finished I feel so proud of the final design. A massive thanks to Star Dance for hosting this and giving me a reason to finally learn python, I’ve never given myself a good enough reason until now. My dream is to become a aero engineering and this project is a stepping stone in that journey, my next project will be alot more relaxed. Thanks to everyone that supported me along the way, and with that I need sleep so in case I don’t see ya, good afternoon, good evening, and good night!
Ships:
This is Open Wall, my first every complete Python project, this app takes data from open f1 and displays it visual in a clean way so that any user can use it. The biggest struggle throughout this project what converting the data supplied by open f1 into functional number, this involves time conversion, coordinate setting and proper caching....
|
1792882040.134691
|
1793746040.134691
|
|
60704
|
Socle by @torren | Stardance
|
torren
|
1
|
119.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-26T17:34:11Z", "hours": 119.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "socle is built around a simple idea: finding somewhere good should feel personal. it brings together places, curated lists, recommendations from people you trust, and a taste profile that develops through your activity. i wanted a better way to discover places that fit you and keep the good ones somewhere worth coming back to. the hardest part has been making those systems work together reliably. repeated activity shouldn’t let one place overwhelm your taste profile, and opening a place page shouldn’t count as physically visiting it. i worked on those distinctions alongside search, missing photos, chat navigation, loading states, and account isolation. testing kept revealing small problems that made a bigger difference to the experience than i expected. i’m proud of how the two sides of socle are coming together. discovery helps people explore and share places, while the business side connects guest feedback with insights about their experience. the design took plenty of iteration too, from discovery’s warmer colors to the interactive hardware animation on the business homepage. the native iphone and mac versions are also progressing, though location tracking, notifications, and widgets still need further real-device testing. how to test: click testers at the bottom-left of the sign-in page, or open socle.pages.dev/testers. enter stardance when asked where you’re from; capitalization doesn’t matter. a wrong answer gets one final question asking who you’re testing on behalf of. you’ll receive a 24-hour testing account. explore discovery, then open the profile menu and look under your workplaces for stardance testers. there are owner and employee entries, and each tester gets a separate workspace with sample reviews so you can experiment without changing a real business’s data. the linked public repository contains a limited discovery homepage demo; the full application and backend remain private. the devlogs cover the wider project, and ai’s substantial contribution to implementation and documentation is explained in the ai usage declaration.", "repo": "https://github.com/karamvschool-ai/socle-discovery-demo", "demo": "https://socle.pages.dev"}]...
|
[{"post_id": 83043, "ts": "202 [{"post_id": 83043, "ts": "2026-10-26T17:29:58Z", "hours": 0.4514, "text": "socle’s pretty much ready to be shipped in a few minutes, just made a last minute testing flow for you stardance testers:)"}, {"post_id": 82862, "ts": "2026-10-26T02:53:03Z", "hours": 12.3964, "text": "socle was looking ready for testing, but using it exposed things i couldn’t leave broken. i fixed search, added sliding transitions between chats, and built the native foundations for notifications, four widgets, and location tracking. the biggest change was separating browsing from actual visits: opening a place page shouldn’t count as going there, and a visit now needs five minutes of reliable location evidence. i also rebuilt the business homepage with a more interactive design. the simulator and mac builds passed alongside 23 automated checks, though location accuracy and the apple integrations still need real-device testing."}, {"post_id": 81522, "ts": "2026-10-21T15:49:23Z", "hours": 16.6728, "text": "i spent this session testing whether socle intelligence could give a business something useful beyond a summary of its reviews. i worked on how it uses customer feedback and business context, and added support for graphs and tables so answers are easier to understand. some responses still missed the point, so comparing answers and finding those gaps became a big part of the work. i also fixed cover-image bugs across the site. there’s progress, but i still want more evidence before trusting the answers."}, {"post_id": 78912, "ts": "2026-10-12T00:46:52Z", "hours": 21.3431, "text": "one review can contain a complaint about slow food and a compliment about the server. getting socle intelligence to recognize both became a useful test of whether it actually understood the feedback. i experimented with models, settings, and context, while building the connection between the model and a business’s data. running it locally also introduced speed and reliability problems to work through. the hardest part is still knowing when several reviews reveal a pattern and when there just isn’t enough evidence to say."}, {"post_id": 76476, "ts": "2026-10-03T17:15:48Z", "hours": 13.3208, "text": "this was where socle’s discovery and business sides started connecting. i worked on turning feedback, saves, visits, and employee recognition into insights a business could use. the difficult part was deciding when those interactions supported a conclusion, so i built around showing the evidence and admitting when there wasn’t enough. i also separated the broader patterns managers need from the feedback an individual employee should see. the first engine uses rules i can inspect and test, giving me a clearer foundation to build on."}, {"post_id": 74662, "ts": "2026-09-27T21:53:50Z", "hours": 11.8033, "text": "i kept fixing one small issue and finding three more. this session turned into a sweep through socle’s navigation, spacing, loading states, and awkward interactions, trying to use it like someone who didn’t already know where everything was. there wasn’t one big feature, but the fixes removed a lot of little interruptions. we were hoping to ship afterward, then ran into repo issues. that pushed the release back while we worked out a cleaner source setup."}, {"post_id": 73283, "ts": "2026-09-24T19:07:21Z", "hours": 9.3703, "text": "i’d gotten used to some of socle’s rough edges, which made them harder to notice. i went back through the main screens with a first-time user in mind and cleaned up confusing buttons, inconsistent layouts, navigation, and loading states. most fixes were small, but together they made the app easier to move through. i’m getting closer to the experience i want: people exploring places without having to figure out the interface first."}, {"post_id": 72270, "ts": "2026-09-22T15:40:08Z", "hours": 8.9336, "text": "taste needed a practical way to test visits before full location tracking was ready. i replaced the old flow with a temporary visit button, which let me check how visiting a place changes someone’s profile. i also adjusted how actions are weighted and repeated activity is counted, so one place doesn’t overwhelm everything else someone likes. the screenshot keeps the exact scoring weights private, but the goal is straightforward: taste should develop from someone’s activity without becoming too easy to distort."}, {"post_id": 71502, "ts": "2026-09-20T22:56:28Z", "hours": 9.3, "text": "socle needed more places to explore as well as a cleaner interface. i added locations and filled out existing pages, then worked through inconsistent layouts, spacing, small bugs, and interactions that felt awkward. having more content also made the gaps in the experience easier to spot. this update brings the app closer to a wider test, where people can spend time discovering things instead of reaching the end of the available content."}, {"post_id": 70153, "ts": "2026-09-18T16:01:12Z", "hours": 6.3247, "text": "before bringing in more testers, i wanted to clear out the obvious things that would get in their way. i went through the main screens fixing layout issues, inconsistent components, and navigation that took too much effort to understand. these were mostly small changes rather than new features, but they made the experience more consistent. the next round of feedback should help me find the problems i haven’t already learned to work around."}, {"post_id": 66671, "ts": "2026-09-12T15:11:08Z", "hours": 8.9261, "text": "i used codex to help with implementation while i worked through socle’s screens and tested the main flows. that testing uncovered bugs in a feature i thought was already finished, so i went back, fixed them, and checked it again. i also cleaned up the surrounding ui and interactions. it was a reminder that finishing the code isn’t the same as finishing the experience, and there’s still more to catch before opening it to more testers."}]...
|
Title: Socle by @torren | Stardance
Devlogs:
i us Title: Socle by @torren | Stardance
Devlogs:
i used codex to help with implementation while i worked through socle’s screens and tested the main flows. that testing uncovered bugs in a feature i thought was already finished, so i went back, fixed them, and checked it again. i also cleaned up the surrounding ui and interactions. it was a reminder that finishing the code isn’t the same as finishing the experience, and there’s still more to catch before opening it to more testers.
before bringing in more testers, i wanted to clear out the obvious things that would get in their way. i went through the main screens fixing layout issues, inconsistent components, and navigation that took too much effort to understand. these were mostly small changes rather than new features, but they made the experience more consistent. the next round of feedback should help me find the problems i haven’t already learned to work around.
socle needed more places to explore as well as a cleaner interface. i added locations and filled out existing pages, then worked through inconsistent layouts, spacing, small bugs, and interactions that felt awkward. having more content also made the gaps in the experience easier to spot. this update brings the app closer to a wider test, where people can spend time discovering things instead of reaching the end of the available content.
taste needed a practical way to test visits before full location tracking was ready. i replaced the old flow with a temporary visit button, which let me check how visiting a place changes someone’s profile. i also adjusted how actions are weighted and repeated activity is counted, so one place doesn’t overwhelm everything else someone likes. the screenshot keeps the exact scoring weights private, but the goal is straightforward: taste should develop from someone’s activity without becoming too easy to distort.
i’d gotten used to some of socle’s rough edges, which made them harder to notice. i went back through the main screens with a first-time user in mind and cleaned up confusing buttons, inconsistent layouts, navigation, and loading states. most fixes were small, but together they made the app easier to move through. i’m getting closer to the experience i want: people exploring places without having to figure out the interface first.
i kept fixing one small issue and finding three more. this session turned into a sweep through socle’s navigation, spacing, loading states, and awkward interactions, trying to use it like someone who didn’t already know where everything was. there wasn’t one big feature, but the fixes removed a lot of little interruptions. we were hoping to ship afterward, then ran into repo issues. that pushed the release back while we worked out a cleaner source setup.
this was where socle’s discovery and business sides started connecting. i worked on turning feedback, saves, visits, and employee recognition into insights a business could use. the difficult part was deciding when those interactions supported a conclusion, so i built around showing the evidence and admitting when there wasn’t enough. i also separated the broader patterns managers need from the feedback an individual employee should see. the first engine uses rules i can inspect and test, giving me a clearer foundation to build on.
one review can contain a complaint about slow food and a compliment about the server. getting socle intelligence to recognize both became a useful test of whether it actually understood the feedback. i experimented with models, settings, and context, while building the connection between the model and a business’s data. running it locally also introduced speed and reliability problems to work through. the hardest part is still knowing when several reviews reveal a pattern and when there just isn’t enough evidence to say.
i spent this session testing whether socle intelligence could give a business something useful beyond a summary of its reviews. i worked on how it uses customer feedback and business context, and added support for graphs and tables so answers are easier to understand. some responses still missed the point, so comparing answers and finding those gaps became a big part of the work. i also fixed cover-image bugs across the site. there’s progress, but i still want more evidence before trusting the answers.
socle was looking ready for testing, but using it exposed things i couldn’t leave broken. i fixed search, added sliding transitions between chats, and built the native foundations for notifications, four widgets, and location tracking. the biggest change was separating browsing from actual visits: opening a place page shouldn’t count as going there, and a visit now needs five minutes of reliable location evidence. i also rebuilt the business homepage with a more interactive design. the simulator and mac builds passed alongside 23 automated checks, though location accuracy and the apple integrations still need real-device testing.
socle’s pretty much ready to be shipped in a few minutes, just made a last minute testing flow for you stardance testers:)
Ships:
socle is built around a simple idea: finding somewhere good should feel personal. it brings together places, curated lists, recommendations from people you trust, and a taste profile that develops through your activity. i wanted a better way to discover places that fit you and keep the good ones somewhere worth coming back to. the hardest part has been making those systems work together reliably. repeated activity shouldn’t let one place overwhelm your taste profile, and opening a place page shouldn’t count as physically visiting it. i worked on those distinctions alongside search, missing photos, chat navigation, loading states, and account isolation. testing kept revealing small problems that made a bigger difference to the experience than i expected. i’m proud of how the two sides of socle are coming together. discovery helps people explore and share places, while the business side connects guest feedback with insights about their experience. the design took plenty of iteration too, from discovery’s warmer colors to the interactive hardware animation on the business homepage. the native iphone and mac versions are also progressing, though location tracking, notifications, and widgets still need further real-device testing. how to test: click testers at the bottom-left of the sign-in page, or open socle.pages.dev/testers. enter stardance when asked where you’re from; capitalization doesn’t matter. a wrong answer gets one final question asking who you’re testing on behalf of. you’ll receive a 24-hour testing account. explore discovery, then open the profile menu and look under your workplaces for stardance testers. there are owner and employee entries, and each tester gets a separate workspace with sample reviews so you can experiment without changing a real business’s data. the linked public repository contains a limited discovery homepage demo; the full application and backend remain private. the devlogs cover the wider project, and ai’s substantial contribution to implementation and documentation is explained in the ai usage declaration....
|
1793036962.8082829
|
1793123362.8082829
|
|
19271
|
Helios One by @Luka | Stardance
|
Luka
|
0
|
118.35
|
0
|
[]
|
[{"post_id": 80424, "ts": "202 [{"post_id": 80424, "ts": "2026-10-17T16:26:20Z", "hours": 0.35, "text": "I totally forgot to add Testpoints haha , now there are some on the PWR rails !"}, {"post_id": 79701, "ts": "2026-10-15T03:38:25Z", "hours": 5.2808, "text": "My Last designing Devlog , its been a reallyyyyy long part of the project RadiaX but the FPGA SOM , aswell as the rockchip sbc are finished ! (wich is more of an placeholder rg , because the funding does not make it possible… ) I am happy to ship it NOW !"}, {"post_id": 79604, "ts": "2026-10-14T17:53:16Z", "hours": 7.1186, "text": "Long time no devlog but its just power routing and some tricky layout changes . The only sad part to switch from the kintex7 325T to a smaller variant , same for the ram …. funding 600$ cap :,)"}, {"post_id": 77567, "ts": "2026-10-07T14:35:06Z", "hours": 1.6172, "text": "The SOM was wayyy to expensive for the 600 dollar funding limit … so i had to choose an smaller LUTS fpga model and for it change the recommendet decoupling caps amount . Afterwards I changed some parts for cost saving and played around with coupons till it fit the 600 dollar funding limit … .. ."}, {"post_id": 74653, "ts": "2026-09-27T21:22:01Z", "hours": 9.6522, "text": "SO the devlog may seem long… but i lost 2 hours of footage while routing so yeah .. i routed the ddr3 , that includes the diff pairs , length matching and impedance constrains , etc … bla bla bla tech stuff , this took longer and was harder than the double stack (2 ics in one) lpddr4 on the rockchip board , idk why , propably placement and fpgas being tricky in general !"}, {"post_id": 72412, "ts": "2026-09-22T21:19:04Z", "hours": 1.2108, "text": "So marco made the Kintex Fpga a 3d model , there werent any good ones out there … Its the big metal thingy you can see in the middle of the Pcb . He send me the wrong footprint to installed freecad and resized it (I like fusion360 but i dont have it installed on my new laptop..) , Also I rendered the Pcb in blender ! I know the routing isnt finished but i really dont have the energie and time for it today !"}, {"post_id": 71836, "ts": "2026-09-21T16:57:50Z", "hours": 1.65, "text": "I finished the Layout of the FPGA SOM , the filter caps have a really high footprint so that was tricky and the vtt resistors for the ddr3 , its a asingle ddr3 ic so that was weird …"}, {"post_id": 71376, "ts": "2026-09-20T18:29:22Z", "hours": 3.4336, "text": "The fpga SOM is now almost done , this was a faster pcb than i expected , i know it may look messy and crowdet but the pwr stuff is actually layouted in the best possible way(atleast i hope so) and some other things , now only some schematic finishing and checking is needet , then I can route and finish it !"}, {"post_id": 70898, "ts": "2026-09-19T23:55:28Z", "hours": 1.2167, "text": "THXXXX for the SUPER STAR !!!!! I finished the PWR filtering , i had to add some filter caps on the DDR3 . Then i used the LiteX Repo to see if i should add an EMMC , i decidet against it because of cost (already a problem…) and space constrains . But still i had to redo the Prog. section (mostly bank0 on the Kintex7) again because i accedently deleted it many journals ago when i sepperated the rockchip and kintex ! I went with a SPI flash (quad spi) … then I connected some mandatory config and other circuitry , this was mostly straightforward with the ref. designs and the ABSOLUTELY many documents on the AMD Technical Information Portal"}, {"post_id": 70768, "ts": "2026-09-19T18:40:42Z", "hours": 2.7503, "text": "The fpga SOM , PWR system is now finished . I already had the old power system but now its an smaller fpga package and power requirements , so i cleaned up suitable parts , let ai compare some dc/dc board mounts to safe space , designed some power sections and conmbined them all , etc…"}, {"post_id": 70622, "ts": "2026-09-19T14:02:18Z", "hours": 1.5503, "text": "I used the Mig Interface pin xdc file i created to connect the ddr3 to the fpga banks and then made the power interface for it !"}, {"post_id": 70219, "ts": "2026-09-18T18:50:14Z", "hours": 0.8, "text": "I updates some parts , mostly cap placement because it was to crowdet and i made an export of the layers … https://github.com/Luka-io/RadiaX/blob/main/electronics/layers.pdf"}, {"post_id": 70195, "ts": "2026-09-18T17:55:16Z", "hours": 4.6994, "text": "After doing the rockchip sbc , i started with the fpga som , i will redo the power parts as i switched to a fpga (same model) with less pins , and a small package … i laso installed vivado wich totally hanged up my pc so i had to pause work , i needet to do it to get the pinout for the ddr3 to fpga (MIG = memory interface generator wizard) . The layout on the pic isnt the actual one , its just for testing , but the connector will stay like this ! Also i will now go back to the rockchip sbc for a short fixing !"}, {"post_id": 65576, "ts": "2026-09-10T20:14:37Z", "hours": 5.3633, "text": "I finally finished routing the board , some error hunting and silkscreen layout and its done !!! the 2 pwr layers are the turquoise and green"}, {"post_id": 63808, "ts": "2026-09-07T19:30:26Z", "hours": 2.8314, "text": "i did some further routing , i am now at the power routing and constrain regions etc…"}, {"post_id": 61825, "ts": "2026-09-04T22:32:22Z", "hours": 2.9669, "text": "Most of the signals (only 2-4 traces missing i think) are done and the ethernet is fixed… now only power and other stuff and its done !!! :)"}, {"post_id": 61716, "ts": "2026-09-04T19:11:48Z", "hours": 4.9678, "text": "I did a bunch of routing , everything from usb (includes redoing the usb3.0 stuff) , hdmi and mipi dsi and some other small stuff and fixes , and i found out that i am missing some parts like resistors at the ethernet schematic …"}, {"post_id": 60440, "ts": "2026-09-02T19:30:26Z", "hours": 2.7736, "text": "So today i decidet because stardance ends this month i dont have time for all the planned ideas , the mainboard is now some small features poorer like mipi csi cam port and sd but maybe i will add it back… but i changed some power parts and other things on the board . This will be the rough layout , its matched to sepperate power sections from high speed signals like form the ram , while having priority on fast signals and pheripherntials further away … Now that i think of it i will propably add an small glue spacer under the oled so it doesnt mess up any signals … The Fpga will now be a SOM module so i can make a devboard in the future while still use it in the detector panel wich i will make after the mainboard and som … Also i know the layout and parts placement etc is messy but this is just the rough layout as I said….."}, {"post_id": 59873, "ts": "2026-09-01T21:13:37Z", "hours": 0.25, "text": "A final change to the emmc , may logs i know but i didnt want the emmc to break the rest of the system so this is the final rev i hope !"}, {"post_id": 59866, "ts": "2026-09-01T20:54:41Z", "hours": 0.9836, "text": "I totally forgot about a signal layer so i redone the full design !"}, {"post_id": 59817, "ts": "2026-09-01T19:41:16Z", "hours": 2.5169, "text": "I addet the emmc routing , this was weirdly harder than the ram , to match the impedance i couldnt go between the bga pins and also they were pretty mixed up so i redid it some times and now its good ! All the importand to match in length signals are matched by impedance and trace length / distance to other tracks and via count …"}, {"post_id": 59107, "ts": "2026-08-31T18:53:32Z", "hours": 2.5003, "text": "i finally routed the lpddr4 with its different impedances , differential pairs , via and lentgh matching . The power traces will come later …"}, {"post_id": 58851, "ts": "2026-08-31T13:04:03Z", "hours": 1.0503, "text": "After much time i finally figured out how the reference desing uses such tiny trace width for the ddr routing . They had to use such small trace width to route it between the bga pins but that would not be the needet 80-100ohm impedance on the noncopular differential pair . The trick was they used a different trace spacing to archive around 120ohm +- toleranze ! I also have redone some of the bottom caps for easy routing and no interferance problems !"}, {"post_id": 58239, "ts": "2026-08-30T16:30:50Z", "hours": 2.0169, "text": "Today i routed many of the caps wich need to be under the rockchip for power filtering , if to far away it would cause an to high path inductance … it was a little tricky to get them all in place and not to near to each other … some caps will be around it on the pmic and other power sources as the bulk caps do not need to be near the pins always !"}, {"post_id": 57476, "ts": "2026-08-29T17:06:33Z", "hours": 6.6789, "text": "This was a really long routing session , on the way i changed some part sizes , and had some fun time (absolute hell) playing tetris with the ram ic , where what cap goes under or on the side of the ram . same for all of the different routing parts , also I saw that this will need an 8 layer board …"}, {"post_id": 56635, "ts": "2026-08-28T13:58:57Z", "hours": 1.5594, "text": "I started to do the layout of the Rockchip board , on the picture you can see the rockchip pmic , the bottom and top layer design is carefully considered for thermal and noise reduction . Also i swapped some components like cap footprint sizes where possible !"}, {"post_id": 54380, "ts": "2026-08-25T11:03:11Z", "hours": 2.0169, "text": "I found out that i had many caps way to big to fit under the rockchip (bottom pcb side), its essential for some caps to be near the pins in power domains like low voltage or any sensitive soc stuff … then i changed the caps manually 🫠 . I made a green box around bottom caps and then made the CSI adapter (eg. for a cam) , I cleaned up some schematics in sepperate pages . I connected some headders for gipos and uart/i2c and made the final schematic fixes and changes …. now the routing wich as you can see will be hell ! I almost forgot to mention i addet an small 0.9” spi tft . As you can see the schematic looks more like a neural network or spiderweb than routing , but atleast its not as bad as the fpga will be in routing !"}, {"post_id": 54313, "ts": "2026-08-25T08:14:30Z", "hours": 0.7333, "text": "Sadly i found out the rockchip only supports pcie in host mode , to i cant really make a pcie card from it but its not the end of the world , i removed the 12v power mux system and then addet an oculink adapter , the oculink will also be on the fpga devboard but with more than the rockchip x1 pcie … then i connected some pins , while also having the problem of finding 2 suitable pins on a 3.3v bank near the pcie !"}, {"post_id": 53192, "ts": "2026-08-23T17:05:51Z", "hours": 0.8, "text": "I connected many of the systems to the rockchip and did some datasheet reading to know how eg. the Pcie Interface is intendet to be made ont the Rockchip.."}, {"post_id": 53066, "ts": "2026-08-23T13:58:44Z", "hours": 0.45, "text": "I finished the USB-C new Connector and then made the 2Port Usb 2.0 , after that i addet an Usb 3.0 Port and used the design rules/constrains by the hardware design guide from Rockchip"}, {"post_id": 53052, "ts": "2026-08-23T13:24:51Z", "hours": 0.5167, "text": "You know the best about lookout , its bugs … i mean it nicely captured the hdmi schematic , i used the reference design form a rk3566 board and swapped the connector and some power things . But when i got to USB , wich includet swapping the USB-c to a right angle one for the Pcie card to save space , and adding a usb 2.0 (2 port) . I saw it didnt capture because some screen minimizing error … but its not the end of the world , it was just choosing an suitable usb c and swapping it with the old one , using the datasheet to find out the function of some pin circuitry in the reference design , and doing some brainstorming , i will add a female usb 3.0 port because i dont need the sata interface on the phy ! Also i addet a uart debug port.. and the usb c otg and pwr screenshot is unfinished as i will procced with a fresh lookout recording"}, {"post_id": 50363, "ts": "2026-08-19T15:17:01Z", "hours": 1.3836, "text": "I finished the PWR MUX , when pcie is used then it gets the 12v and 3.3v , that means the usb 5 to 3.3v and the 5v from usb cant be on at the same time , this power mux design wich was a headache because of many states and sometimes wierd graphs passes the 5v from usb to system and the 3.3v buck (from usb 5v) output to the system normally . When 12v is detected it disconnects these power lanes and activates an 12v to 5v buck aswell as the 3.3v from pcie is used then !"}, {"post_id": 47759, "ts": "2026-08-15T22:00:13Z", "hours": 0.3631, "text": "This was funny and dumb enough to be a reason for a journal . I compared some parts for the load switch (mux type) and when i picked one and looked at the datasheet i was confused for a good amount of time , turns out i was looking at a datasheet for a similar part and that explained why some things totally didnt match !"}, {"post_id": 46496, "ts": "2026-08-13T19:01:45Z", "hours": 1.3672, "text": "I started by connecting the ethernet IC to the rockchip , after that i started brainstorming and testing around wich pcie or oculink or similar i would use for the interconnect of the devboards . I decidet to make the rockchip devboard onto an pcie card , it can work as pcie or standalone wich in the end started a hunt for an good 2 channel P mosfet , because if pcie is used it gives me 12v(step down to 5v) and 3.3v so the 5v from usb isnt needet aswell as the 5 to 3.3v so i have to switch it off when the 12v is applied but thats smth for tomorrow"}, {"post_id": 46400, "ts": "2026-08-13T16:07:52Z", "hours": 0.8833, "text": "I made many modular sections of the devboard but still the actual connections to the rockchip were missing , i also had to rearange some pins , add buttons and testpoints and fix some wiring mistakes that came along the way!"}, {"post_id": 45840, "ts": "2026-08-12T15:49:50Z", "hours": 1.6822, "text": "It turned out for the Ethernet port i wont use the SDIO interface but MIIG , i used the RTL8211F-CG and a ethernet port with includet magnetics . This time there were no reference designs , and as i didnt want to go back and forth searching for the pins of this interface on the rockchip , I used AI to search for them and made a quick check if the Ai is telling false statements by manual checking !"}, {"post_id": 44653, "ts": "2026-08-10T15:46:41Z", "hours": 0.5503, "text": "I had to wait for this devlog , since lapse has a bug not seeing your hackatime projects , if you have the same problem just go to hackatime and paste your exact project name into the field and it will synch to it ! So i addet an micro sd slot and also started thinking about wifi , but as this rockchip mainboard will mostly be used in the ct scanner i will skip wifi and use ethernet instead , if you ask why not both ? Its because the sd card uses an SDIO bus and I only have 1 left avaible so its either ethernet or wifi or some unecessary option of both , in the ct scanner wifi would anyways be kinda unecessary !"}, {"post_id": 44065, "ts": "2026-08-09T16:10:39Z", "hours": 1.8361, "text": "After carefull consideration (rembering the zynq fpga series exist ..) I decidet to split the system onto 2 boards , a rockchp sbc and a kintex7 devboard like genysis2 from digilent but they can still work along over pcie thorugh octolink ! This time i removed the current sense ic , moved and changed hte rochip to a standalone board , while also changing its power input to usb-c . I addet the intendet to use 10.1 tft from lcsc with a connector for mipi-dsi and touch connector , luckily lcsc already has an reference schmetic for it so i dont have to map a connector and pins myself !"}, {"post_id": 15965, "ts": "2026-06-25T22:38:43Z", "hours": 1.2003, "text": "PWR Monitoring , today i thought its gonna be a fast finish but it totally wasnt .. i started chossing a current meter ic and there were many options eg. : hall effect but this isnt suitable for such a pcb , the routing and interference relally is not needet here , i originally planned to pick an current ic (1 channel with shunt circuit and i2c) but then i thought i have for the fpga part 4 rails i want to watch withouth interfereing with them , but the problem is that shunts at eg 1v20a full load would take to much W for my application from the bus … so i need small shunt values but some are too small for the ic to read and depending on ic have bad resolution .. So i picked for the 1v20a (most crutial rail) a 2.5mohm and for the rest a 5 ohm resistor .. Back to my solution , I went with a MICROCHIP PAC1934T-I/JQ (cheap , high stock and good specs , also has 4 channels wich is perfect !) , i hooked the circuit up after some datasheet and ref design reading and i am planning to maybe add another one to the board later for eg the usb of pcie pwr draw watching ! And also for the rockchip maybe but i will first have to check if the rockchips pmic already does it standalone .."}, {"post_id": 15353, "ts": "2026-06-24T23:26:02Z", "hours": 0.4644, "text": "Today i didnt really have time for any big changes so i just started to add some Shunt resistor (and finding suitable values) matching for the INA219 . I did this so that i can monitor the pwr rails of the fpga while running for any problems … and i dont really have a screenshot to show , this is a special tiny journal on a busy day !"}, {"post_id": 14597, "ts": "2026-06-23T19:21:28Z", "hours": 3.7414, "text": "SODIMM DDR3 is now finished ! , so this was reallyyyyyy easy , there was a reference and good section about it in the Kintex7 Fpga design NOTE , i picked a SODIMM 204Pin ddr3 slot and connected it to the fpga banks , some resistors and caps were necessary for the jedec standart but why did i even bother to use sodimm ddr3 ? , so i could go with ddr4 but the kintex7 tool for memory implementation isnt really and neither the speed made for it , also i took sodimm as i am able to easily swap the ram to other sizes or vendors , the pcb routing is way easier and ram modules can also be cheaper often then the bare ic for ddr3 … and the most importand part there is a eeprom on the modules containing the timing constrains !!!"}, {"post_id": 11405, "ts": "2026-06-18T17:46:00Z", "hours": 1.3, "text": "FPGA pwr Filter Caps selection… after the last journal i wanted to finally finish it so i went into the 7 Series FPGAs PCB Design Guide (UG483) , where cap values and count for the different FPGAs are listed , it went well other than searching for not in stock part alternatives (esr values are importand here and depending on cap listing there is no lcsc filter for it so i am going with good brands like murata and most popular filter and reading the datasheets till i find a fitting one ! ) … it defently wasnt so easy for the MGT pwr lines .. they are wayyyy more complicated and usecase depending ( https://docs.amd.com/v/u/en-US/ug476_7Series_Transceivers , or : https://docs.amd.com/v/u/en-US/ug471_7Series_SelectIO ) , but eventually i found a good middle between my needs and proven values from a ref. design . Lastly i addet the needet filter caps per FPGA bank and connected them up and thats it for this easy but redudant task !"}, {"post_id": 11361, "ts": "2026-06-18T16:04:46Z", "hours": 3.2839, "text": "Prog Page , so the schematic still needs sorting and all (not all off todays design is on the schem. page attached) … I finished the FT4232H circuit , then i started searching for a compatible flash from the PROG memory of the fpga , after pickcing one i made the circuit and proccedet to add a dip switch to select the fpga boot mode and connect the jtag from the FTDI ic … then i went over to make the USB-C circuit for the Rockchip and some of its filtering , afterwards i hocked up the FTDI to the debug port of the Rockchip . Lastly i addet the USB-C connector for the FTDI…"}, {"post_id": 10823, "ts": "2026-06-17T19:23:42Z", "hours": 2.1914, "text": "Usb Host , the Fpga needs an Jtag for programming and config + an uart for communication so i wanted to pick the mostly used FT2232H wich features 2 buses (for my case 1 jtag and 1 uart) . But then i thought while researching reference schematics , kintex7 and vivado compability and reading the datasheet , if i shouldnt just use an FT4232HL , but why that ? the rockchip also needs an uart for debug and i thought about adding a jtag but it turned out its internally , now the FT4232HL has 4 buses ’ 2 of them can do jtag and 2 uart (or other protocols btw) so i went with that and started designing it , took longer than expected as the eeprom selection and crystal isnt really troughout in the datasheet … so now i have an jtag and uart for the fpga , one for the rockchip debug and 1 additional port i will find a use for eventually … but the rockchip still needs an usb direct connection so it will get 2 usb c ports , a multiplexer isnt good here as it would prevent from using any fpga (or uart debug on rockchip) while doing otg (eg. flashing or other stuff ) .. Btw the screenshot is only a fraction of the schematic of it as stardance shows the boring part of the full screenshot so i cropped it"}, {"post_id": 10657, "ts": "2026-06-17T14:51:10Z", "hours": 1.9667, "text": "Finished Emmc Flash for Rockchip Soc , As the ddr4 is now finished i wanted to move on to the emmc flash , so i locked up the list of supported emmc parts but the list was from 2024 and had 2 model options for the RK3566 B/C but i had E??? So i was a little confused and began research but there was nothing so i scrapped the internet to find some newer list , eventually i found a updated one and there was a huge and i mean really huge list of tested emmc… I looked up wich ones are avaible on lcsc in my prefered GB size and picked one but after hooking up some connections i saw a problem , to use the H200 or H400 protocol speed like the rockchip wants VCCQ would need to be 1.8v but the datasheed meintion many times the chip can only work for 1 hour at a time then (also even finding the datasheet was hard) .. so i had to research and eventually found a better pick wich i hooked up and i changed the voltage config pins for the flash voltage on the rockchip addet some filters on the pwr lines and also hooked it up to the rockchip (not on the screenshot , other schem. page) .. there i addet the by the datasheet required parts and by the emmc datasheet …. also i addet a button to DAT0 , if this pin is connected to GND wich the button does when pressed the rockchip enters a failsafe mode .. this is a non brickable in soc safed mode that enables reflash/unbricking the soc over usb in case it happens (called Maskroom) …"}, {"post_id": 10210, "ts": "2026-06-16T20:37:35Z", "hours": 2.1667, "text": "Today i finished hooking up the lpddr4(later x) to the rockchip soc , but while doing so and following the offical ref. design and datasheet i saw a problem they were talking about CS0A/B and CS1A/B ??? So i was totally confused as that are not valid lpddr4 pins as far as i know it , so i proccedet to look at other projects schematics and i saw some using it too , but when i looked up the offical ref design and thier Ram’s Datasheets i saw that these pins arent real there too (so if i am not wrong they all used the ref design wich was for a specific ram or smth because on all designs the pins are NC or DNU pins so defently not connect !) .. But before i didnt know that i thought my ram that i planned to use (lpddr4) only had this problem as the datasheet says 1CS pin but after switching to s stlightly bigger (lpddr4x) type Ram i saw its the same 1cs per bank so anyways now i have an new ram and buck converter on the board 🫠… I will defently include a deeper note on this in the Github Repo ! The Buck is on another schematic page (not on the screenshot) , but it is just a standart SY8089AAAC making the 0.6V , note that its importand to pick an stable and fast switching buck for precision parts (fast or precise) like ram"}, {"post_id": 9965, "ts": "2026-06-16T14:28:44Z", "hours": 0.3758, "text": "Small Journal , i did the hardware block diagramm of the Helios One board , it simplifies how the ARM-Soc and the FPGA are connected , thier power systems and pheripherentials…"}, {"post_id": 9343, "ts": "2026-06-15T17:58:13Z", "hours": 11.2894, "text": "Old journals from Macondo , i noticed that this is a standalone projekt and i started this Pcb (new revision / total change of schematic) after 1 July so it fits .. (summarized old journals with Ai !): Summary of older Macondo journals because this project got moved over. The current revision of the board was started after 1 July and is a complete redesign around a Kintex7 FPGA and Rockchip SoC. I started by researching how to program the FPGA and looked at supported JTAG solutions. After comparing datasheets, reference designs and available parts on LCSC I decided to use an FT2232H based solution because it supports both JTAG and UART and has good performance, although I might still switch to an external low cost programmer later. One of the biggest architecture changes was switching from the original Rockchip choice to the RK3566. The larger Rockchip would have made routing on a 6 layer board extremely difficult and much more expensive. The RK3566 allows a cleaner and cheaper design while still supporting PCIe connectivity to the Kintex7 FPGA and MIPI DSI display output. A large amount of time was spent designing the FPGA power system. I studied datasheets, reference designs and power sequencing requirements to determine which rails could share supplies and where tighter ripple and tolerance requirements were needed. Special attention was required for the FPGA MGT transceiver power rails used for high speed interfaces such as PCIe. Many reference designs relied on unavailable or very expensive parts so I selected alternatives and redesigned the sequencing around the LM3881 supervisor. During this process I also designed the DDR and DDRVTT supplies and completed the entire FPGA power architecture. After finishing the FPGA side I moved on to the Rockchip power system. Using the datasheet and reference designs I adapted the design to remove unused functions while reusing parts already selected for the FPGA section to reduce BOM complexity and cost. I also had to replace an obsolete component with a software and hardware compatible alternative. Another sidequest was selecting suitable LPDDR4 memory. After checking the Rockchip memory requirements and available parts I found a low cost memory IC with two x16 dies, allowing it to satisfy the required x32 memory interface while remaining compatible with the platform. The memory power requirements were already provided by the Rockchip PMIC so no additional regulators were needed. Today I started placing the final filtering capacitors and connecting up the Rockchip section so that part is nearly finished. I also did some sidequests like determining pin requirements for the MIPI DSI display and Ethernet controller in preparation for the upcoming schematic work."}]...
|
Title: Helios One by @Luka | Stardance
Devlogs:
O Title: Helios One by @Luka | Stardance
Devlogs:
Old journals from Macondo , i noticed that this is a standalone projekt and i started this Pcb (new revision / total change of schematic) after 1 July so it fits .. (summarized old journals with Ai !): Summary of older Macondo journals because this project got moved over. The current revision of the board was started after 1 July and is a complete redesign around a Kintex7 FPGA and Rockchip SoC. I started by researching how to program the FPGA and looked at supported JTAG solutions. After comparing datasheets, reference designs and available parts on LCSC I decided to use an FT2232H based solution because it supports both JTAG and UART and has good performance, although I might still switch to an external low cost programmer later. One of the biggest architecture changes was switching from the original Rockchip choice to the RK3566. The larger Rockchip would have made routing on a 6 layer board extremely difficult and much more expensive. The RK3566 allows a cleaner and cheaper design while still supporting PCIe connectivity to the Kintex7 FPGA and MIPI DSI display output. A large amount of time was spent designing the FPGA power system. I studied datasheets, reference designs and power sequencing requirements to determine which rails could share supplies and where tighter ripple and tolerance requirements were needed. Special attention was required for the FPGA MGT transceiver power rails used for high speed interfaces such as PCIe. Many reference designs relied on unavailable or very expensive parts so I selected alternatives and redesigned the sequencing around the LM3881 supervisor. During this process I also designed the DDR and DDRVTT supplies and completed the entire FPGA power architecture. After finishing the FPGA side I moved on to the Rockchip power system. Using the datasheet and reference designs I adapted the design to remove unused functions while reusing parts already selected for the FPGA section to reduce BOM complexity and cost. I also had to replace an obsolete component with a software and hardware compatible alternative. Another sidequest was selecting suitable LPDDR4 memory. After checking the Rockchip memory requirements and available parts I found a low cost memory IC with two x16 dies, allowing it to satisfy the required x32 memory interface while remaining compatible with the platform. The memory power requirements were already provided by the Rockchip PMIC so no additional regulators were needed. Today I started placing the final filtering capacitors and connecting up the Rockchip section so that part is nearly finished. I also did some sidequests like determining pin requirements for the MIPI DSI display and Ethernet controller in preparation for the upcoming schematic work.
Small Journal , i did the hardware block diagramm of the Helios One board , it simplifies how the ARM-Soc and the FPGA are connected , thier power systems and pheripherentials…
Today i finished hooking up the lpddr4(later x) to the rockchip soc , but while doing so and following the offical ref. design and datasheet i saw a problem they were talking about CS0A/B and CS1A/B ??? So i was totally confused as that are not valid lpddr4 pins as far as i know it , so i proccedet to look at other projects schematics and i saw some using it too , but when i looked up the offical ref design and thier Ram’s Datasheets i saw that these pins arent real there too (so if i am not wrong they all used the ref design wich was for a specific ram or smth because on all designs the pins are NC or DNU pins so defently not connect !) .. But before i didnt know that i thought my ram that i planned to use (lpddr4) only had this problem as the datasheet says 1CS pin but after switching to s stlightly bigger (lpddr4x) type Ram i saw its the same 1cs per bank so anyways now i have an new ram and buck converter on the board 🫠… I will defently include a deeper note on this in the Github Repo ! The Buck is on another schematic page (not on the screenshot) , but it is just a standart SY8089AAAC making the 0.6V , note that its importand to pick an stable and fast switching buck for precision parts (fast or precise) like ram
Finished Emmc Flash for Rockchip Soc , As the ddr4 is now finished i wanted to move on to the emmc flash , so i locked up the list of supported emmc parts but the list was from 2024 and had 2 model options for the RK3566 B/C but i had E??? So i was a little confused and began research but there was nothing so i scrapped the internet to find some newer list , eventually i found a updated one and there was a huge and i mean really huge list of tested emmc… I looked up wich ones are avaible on lcsc in my prefered GB size and picked one but after hooking up some connections i saw a problem , to use the H200 or H400 protocol speed like the rockchip wants VCCQ would need to be 1.8v but the datasheed meintion many times the chip can only work for 1 hour at a time then (also even finding the datasheet was hard) .. so i had to research and eventually found a better pick wich i hooked up and i changed the voltage config pins for the flash voltage on the rockchip addet some filters on the pwr lines and also hooked it up to the rockchip (not on the screenshot , other schem. page) .. there i addet the by the datasheet required parts and by the emmc datasheet …. also i addet a button to DAT0 , if this pin is connected to GND wich the button does when pressed the rockchip enters a failsafe mode .. this is a non brickable in soc safed mode that enables reflash/unbricking the soc over usb in case it happens (called Maskroom) …
Usb Host , the Fpga needs an Jtag for programming and config + an uart for communication so i wanted to pick the mostly used FT2232H wich features 2 buses (for my case 1 jtag and 1 uart) . But then i thought while researching reference schematics , kintex7 and vivado compability and reading the datasheet , if i shouldnt just use an FT4232HL , but why that ? the rockchip also needs an uart for debug and i thought about adding a jtag but it turned out its internally , now the FT4232HL has 4 buses ’ 2 of them can do jtag and 2 uart (or other protocols btw) so i went with that and started designing it , took longer than expected as the eeprom selection and crystal isnt really troughout in the datasheet … so now i have an jtag and uart for the fpga , one for the rockchip debug and 1 additional port i will find a use for eventually … but the rockchip still needs an usb direct connection so it will get 2 usb c ports , a multiplexer isnt good here as it would prevent from using any fpga (or uart debug on rockchip) while doing otg (eg. flashing or other stuff ) .. Btw the screenshot is only a fraction of the schematic of it as stardance shows the boring part of the full screenshot so i cropped it
Prog Page , so the schematic still needs sorting and all (not all off todays design is on the schem. page attached) … I finished the FT4232H circuit , then i started searching for a compatible flash from the PROG memory of the fpga , after pickcing one i made the circuit and proccedet to add a dip switch to select the fpga boot mode and connect the jtag from the FTDI ic … then i went over to make the USB-C circuit for the Rockchip and some of its filtering , afterwards i hocked up the FTDI to the debug port of the Rockchip . Lastly i addet the USB-C connector for the FTDI…
FPGA pwr Filter Caps selection… after the last journal i wanted to finally finish it so i went into the 7 Series FPGAs PCB Design Guide (UG483) , where cap values and count for the different FPGAs are listed , it went well other than searching for not in stock part alternatives (esr values are importand here and depending on cap listing there is no lcsc filter for it so i am going with good brands like murata and most popular filter and reading the datasheets till i find a fitting one ! ) … it defently wasnt so easy for the MGT pwr lines .. they are wayyyy more complicated and usecase depending ( https://docs.amd.com/v/u/en-US/ug476_7Series_Transceivers , or : https://docs.amd.com/v/u/en-US/ug471_7Series_SelectIO ) , but eventually i found a good middle between my needs and proven values from a ref. design . Lastly i addet the needet filter caps per FPGA bank and connected them up and thats it for this easy but redudant task !
SODIMM DDR3 is now finished ! , so this was reallyyyyyy easy , there was a reference and good section about it in the Kintex7 Fpga design NOTE , i picked a SODIMM 204Pin ddr3 slot and connected it to the fpga banks , some resistors and caps were necessary for the jedec standart but why did i even bother to use sodimm ddr3 ? , so i could go with ddr4 but the kintex7 tool for memory implementation isnt really and neither the speed made for it , also i took sodimm as i am able to easily swap the ram to other sizes or vendors , the pcb routing is way easier and ram modules can also be cheaper often then the bare ic for ddr3 … and the most importand part there is a eeprom on the modules containing the timing constrains !!!
Today i didnt really have time for any big changes so i just started to add some Shunt resistor (and finding suitable values) matching for the INA219 . I did this so that i can monitor the pwr rails of the fpga while running for any problems … and i dont really have a screenshot to show , this is a special tiny journal on a busy day !
PWR Monitoring , today i thought its gonna be a fast finish but it totally wasnt .. i started chossing a current meter ic and there were many options eg. : hall effect but this isnt suitable for such a pcb , the routing and interference relally is not needet here , i originally planned to pick an current ic (1 channel with shunt circuit and i2c) but then i thought i have for the fpga part 4 rails i want to watch withouth interfereing with them , but the problem is that shunts at eg 1v20a full load would take to much W for my application from the bus … so i need small shunt values but some are too small for the ic to read and depending on ic have bad resolution .. So i picked for the 1v20a (most crutial rail) a 2.5mohm and for the rest a 5 ohm resistor .. Back to my solution , I went with a MICROCHIP PAC1934T-I/JQ (cheap , high stock and good specs , also has 4 channels wich is perfect !) , i hooked the circuit up after some datasheet and ref design reading and i am planning to maybe add another one to the board later for eg the usb of pcie pwr draw watching ! And also for the rockchip maybe but i will first have to check if the rockchips pmic already does it standalone ..
After carefull consideration (rembering the zynq fpga series exist ..) I decidet to split the system onto 2 boards , a rockchp sbc and a kintex7 devboard like genysis2 from digilent but they can still work along over pcie thorugh octolink ! This time i removed the current sense ic , moved and changed hte rochip to a standalone board , while also changing its power input to usb-c . I addet the intendet to use 10.1 tft from lcsc with a connector for mipi-dsi and touch connector , luckily lcsc already has an reference schmetic for it so i dont have to map a connector and pins myself !
I had to wait for this devlog , since lapse has a bug not seeing your hackatime projects , if you have the same problem just go to hackatime and paste your exact project name into the field and it will synch to it ! So i addet an micro sd slot and also started thinking about wifi , but as this rockchip mainboard will mostly be used in the ct scanner i will skip wifi and use ethernet instead , if you ask why not both ? Its because the sd card uses an SDIO bus and I only have 1 left avaible so its either ethernet or wifi or some unecessary option of both , in the ct scanner wifi would anyways be kinda unecessary !
It turned out for the Ethernet port i wont use the SDIO interface but MIIG , i used the RTL8211F-CG and a ethernet port with includet magnetics . This time there were no reference designs , and as i didnt want to go back and forth searching for the pins of this interface on the rockchip , I used AI to search for them and made a quick check if the Ai is telling false statements by manual checking !
I made many modular sections of the devboard but still the actual connections to the rockchip were missing , i also had to rearange some pins , add buttons and testpoints and fix some wiring mistakes that came along the way!
I started by connecting the ethernet IC to the rockchip , after that i started brainstorming and testing around wich pcie or oculink or similar i would use for the interconnect of the devboards . I decidet to make the rockchip devboard onto an pcie card , it can work as pcie or standalone wich in the end started a hunt for an good 2 channel P mosfet , because if pcie is used it gives me 12v(step down to 5v) and 3.3v so the 5v from usb isnt needet aswell as the 5 to 3.3v so i have to switch it off when the 12v is applied but thats smth for tomorrow
This was funny and dumb enough to be a reason for a journal . I compared some parts for the load switch (mux type) and when i picked one and looked at the datasheet i was confused for a good amount of time , turns out i was looking at a datasheet for a similar part and that explained why some things totally didnt match !
I finished the PWR MUX , when pcie is used then it gets the 12v and 3.3v , that means the usb 5 to 3.3v and the 5v from usb cant be on at the same time , this power mux design wich was a headache because of many states and sometimes wierd graphs passes the 5v from usb to system and the 3.3v buck (from usb 5v) output to the system normally . When 12v is detected it disconnects these power lanes and activates an 12v to 5v buck aswell as the 3.3v from pcie is used then !
You know the best about lookout , its bugs … i mean it nicely captured the hdmi schematic , i used the reference design form a rk3566 board and swapped the connector and some power things . But when i got to USB , wich includet swapping the USB-c to a right angle one for the Pcie card to save space , and adding a usb 2.0 (2 port) . I saw it didnt capture because some screen minimizing error … but its not the end of the world , it was just choosing an suitable usb c and swapping it with the old one , using the datasheet to find out the function of some pin circuitry in the reference design , and doing some brainstorming , i will add a female usb 3.0 port because i dont need the sata interface on the phy ! Also i addet a uart debug port.. and the usb c otg and pwr screenshot is unfinished as i will procced with a fresh lookout recording
I finished the USB-C new Connector and then made the 2Port Usb 2.0 , after that i addet an Usb 3.0 Port and used the design rules/constrains by the hardware design guide from Rockchip
I connected many of the systems to the rockchip and did some datasheet reading to know how eg. the Pcie Interface is intendet to be made ont the Rockchip..
Sadly i found out the rockchip only supports pcie in host mode , to i cant really make a pcie card from it but its not the end of the world , i removed the 12v power mux system and then addet an oculink adapter , the oculink will also be on the fpga devboard but with more than the rockchip x1 pcie … then i connected some pins , while also having the problem of finding 2 suitable pins on a 3.3v bank near the pcie !
I found out that i had many caps way to big to fit under the rockchip (bottom pcb side), its essential for some caps to be near the pins in power domains like low voltage or any sensitive soc stuff … then i changed the caps manually 🫠 . I made a green box around bottom caps and then made the CSI adapter (eg. for a cam) , I cleaned up some schematics in sepperate pages . I connected some headders for gipos and uart/i2c and made the final schematic fixes and changes …. now the routing wich as you can see will be hell ! I almost forgot to mention i addet an small 0.9” spi tft . As you can see the schematic looks more like a neural network or spiderweb than routing , but atleast its not as bad as the fpga will be in routing !
I started to do the layout of the Rockchip board , on the picture you can see the rockchip pmic , the bottom and top layer design is carefully considered for thermal and noise reduction . Also i swapped some components like cap footprint sizes where possible !
This was a really long routing session , on the way i changed some part sizes , and had some fun time (absolute hell) playing tetris with the ram ic , where what cap goes under or on the side of the ram . same for all of the different routing parts , also I saw that this will need an 8 layer board …
Today i routed many of the caps wich need to be under the rockchip for power filtering , if to far away it would cause an to high path inductance … it was a little tricky to get them all in place and not to near to each other … some caps will be around it on the pmic and other power sources as the bulk caps do not need to be near the pins always !
After much time i finally figured out how the reference desing uses such tiny trace width for the ddr routing . They had to use such small trace width to route it between the bga pins but that would not be the needet 80-100ohm impedance on the noncopular differential pair . The trick was they used a different trace spacing to archive around 120ohm +- toleranze ! I also have redone some of the bottom caps for easy routing and no interferance problems !
i finally routed the lpddr4 with its different impedances , differential pairs , via and lentgh matching . The power traces will come later …
I addet the emmc routing , this was weirdly harder than the ram , to match the impedance i couldnt go between the bga pins and also they were pretty mixed up so i redid it some times and now its good ! All the importand to match in length signals are matched by impedance and trace length / distance to other tracks and via count …
I totally forgot about a signal layer so i redone the full design !
A final change to the emmc , may logs i know but i didnt want the emmc to break the rest of the system so this is the final rev i hope !
So today i decidet because stardance ends this month i dont have time for all the planned ideas , the mainboard is now some small features poorer like mipi csi cam port and sd but maybe i will add it back… but i changed some power parts and other things on the board . This will be the rough layout , its matched to sepperate power sections from high speed signals like form the ram , while having priority on fast signals and pheripherntials further away … Now that i think of it i will propably add an small glue spacer under the oled so it doesnt mess up any signals … The Fpga will now be a SOM module so i can make a devboard in the future while still use it in the detector panel wich i will make after the mainboard and som … Also i know the layout and parts placement etc is messy but this is just the rough layout as I said…..
I did a bunch of routing , everything from usb (includes redoing the usb3.0 stuff) , hdmi and mipi dsi and some other small stuff and fixes , and i found out that i am missing some parts like resistors at the ethernet schematic …
Most of the signals (only 2-4 traces missing i think) are done and the ethernet is fixed… now only power and other stuff and its done !!! :)
i did some further routing , i am now at the power routing and constrain regions etc…
I finally finished routing the board , some error hunting and silkscreen layout and its done !!! the 2 pwr layers are the turquoise and green
After doing the rockchip sbc , i started with the fpga som , i will redo the power parts as i switched to a fpga (same model) with less pins , and a small package … i laso installed vivado wich totally hanged up my pc so i had to pause work , i needet to do it to get the pinout for the ddr3 to fpga (MIG = memory interface generator wizard) . The layout on the pic isnt the actual one , its just for testing , but the connector will stay like this ! Also i will now go back to the rockchip sbc for a short fixing !
I updates some parts , mostly cap placement because it was to crowdet and i made an export of the layers … https://github.com/Luka-io/RadiaX/blob/main/electronics/layers.pdf
I used the Mig Interface pin xdc file i created to connect the ddr3 to the fpga banks and then made the power interface for it !
The fpga SOM , PWR system is now finished . I already had the old power system but now its an smaller fpga package and power requirements , so i cleaned up suitable parts , let ai compare some dc/dc board mounts to safe space , designed some power sections and conmbined them all , etc…
THXXXX for the SUPER STAR !!!!! I finished the PWR filtering , i had to add some filter caps on the DDR3 . Then i used the LiteX Repo to see if i should add an EMMC , i decidet against it because of cost (already a problem…) and space constrains . But still i had to redo the Prog. section (mostly bank0 on the Kintex7) again because i accedently deleted it many journals ago when i sepperated the rockchip and kintex ! I went with a SPI flash (quad spi) … then I connected some mandatory config and other circuitry , this was mostly straightforward with the ref. designs and the ABSOLUTELY many documents on the AMD Technical Information Portal
The fpga SOM is now almost done , this was a faster pcb than i expected , i know it may look messy and crowdet but the pwr stuff is actually layouted in the best possible way(atleast i hope so) and some other things , now only some schematic finishing and checking is needet , then I can route and finish it !
I finished the Layout of the FPGA SOM , the filter caps have a really high footprint so that was tricky and the vtt resistors for the ddr3 , its a asingle ddr3 ic so that was weird …
So marco made the Kintex Fpga a 3d model , there werent any good ones out there … Its the big metal thingy you can see in the middle of the Pcb . He send me the wrong footprint to installed freecad and resized it (I like fusion360 but i dont have it installed on my new laptop..) , Also I rendered the Pcb in blender ! I know the routing isnt finished but i really dont have the energie and time for it today !
SO the devlog may seem long… but i lost 2 hours of footage while routing so yeah .. i routed the ddr3 , that includes the diff pairs , length matching and impedance constrains , etc … bla bla bla tech stuff , this took longer and was harder than the double stack (2 ics in one) lpddr4 on the rockchip board , idk why , propably placement and fpgas being tricky in general !
The SOM was wayyy to expensive for the 600 dollar funding limit … so i had to choose an smaller LUTS fpga model and for it change the recommendet decoupling caps amount . Afterwards I changed some parts for cost saving and played around with coupons till it fit the 600 dollar funding limit … .. .
Long time no devlog but its just power routing and some tricky layout changes . The only sad part to switch from the kintex7 325T to a smaller variant , same for the ram …. funding 600$ cap :,)
My Last designing Devlog , its been a reallyyyyy long part of the project RadiaX but the FPGA SOM , aswell as the rockchip sbc are finished ! (wich is more of an placeholder rg , because the funding does not make it possible… ) I am happy to ship it NOW !
I totally forgot to add Testpoints haha , now there are some on the PWR rails !...
|
1792583337.602041
|
1793188137.602041
|
|
557
|
MatchRatingCalculator by @Allen | Stardance
|
Allen
|
4
|
118.0
|
488
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T23:22:10Z", "hours": 57.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Veyro, a React-based sports rating website that lets players enter match stats, calculate a live performance score, save matches to a vault, compare progress, and use role-based features like Coach, Premium, and Video AI. The hardest part was converting the old HTML version into a full React app while keeping the same original graphics, layout, and feel, because the design and logic had to stay consistent across every page. I am proud that the project now has stronger account persistence, saving, navigation, monetization gates, Firebase/Firestore security, CI/CD, and automated tests with all tests passing. To test it, people should sign in or use guest mode, try the soccer calculator, save a match, open the vault, check graph/compare pages, and test locked features like team tools or Video AI depending on the user plan.", "repo": "https://github.com/awang03-crypto/Veyrov2.6", "demo": "https://darksalmon-lark-983637.hostingersite.com"}, {"ship_num": 2, "ts": "2026-07-10T17:15:40Z", "hours": 28.0, "multiplier": 7.97, "payout": 225, "blessing": "neutral", "text": "I made Veyro, a React-based sports rating website that lets players enter match stats, calculate a live performance score, save matches to a vault, compare progress, and use role-based features like Coach, Premium, and Video AI. The hardest part was converting the old HTML version into a full React app while keeping the same original graphics, layout, and feel, because the design and logic had to stay consistent across every page. I am proud that the project now has stronger account persistence, saving, navigation, monetization gates, Firebase/Firestore security, CI/CD, and automated tests with all tests passing. To test it, people should sign in or use guest mode, try the soccer calculator, save a match, open the vault, check graph/compare pages, and test locked features like team tools or Video AI depending on the user plan.", "repo": "https://github.com/awang03-crypto/Veyrov2.6", "demo": "https://darksalmon-lark-983637.hostingersite.com"}, {"ship_num": 3, "ts": "2026-07-01T19:24:22Z", "hours": 30.0, "multiplier": 7.92, "payout": 236, "blessing": "neutral", "text": "This looks like a Ship post on Replit or a similar platform. Here's something you can paste in: I built Veyro, a multi-sport player performance rating app for soccer, basketball, and football. Players enter their match stats and get a rating out of 100 using a position-specific formula — so a goalkeeper is judged on saves and clean sheets, not goals, and a quarterback is judged on touchdowns and interceptions, not tackles. Matches save to a personal vault so players can track their development over time. The most challenging part was building a clean React codebase that could handle three completely different sports with separate calculators, vaults, graphs, and coach pages for each — while keeping the architecture maintainable and the bundle size small. I also built a full coach onboarding flow with shareable team invite links, a three-tier monetization system with Stripe integration, and a CI/CD pipeline with 87 passing tests. I'm most proud of the billing and entitlements system — it handles free tier limits, Coach plan features, and Premium Video AI access cleanly across both the server and the React UI. The app scores 94 for performance, 100 for accessibility, and 96 for best practices on PageSpeed Insights. To test it: go to the calculator, pick your sport and position, enter some match stats, and hit calculate. Free accounts can save up to 5 matches to the vault. If you're a coach, hit Setup in the sidebar to create a team and get a shareable invite link for your players.", "repo": "https://github.com/awang03-crypto/Veyrov2.6", "demo": "https://darksalmon-lark-983637.hostingersite.com"}, {"ship_num": 4, "ts": "2026-06-06T19:21:42Z", "hours": 3.0, "multiplier": 8.58, "payout": 27, "blessing": "neutral", "text": "I made Match Rating, a soccer performance app that helps players turn their match stats into a clear rating out of 100. I can calculate a live score, save games, track my progress in a vault, view graphs, analyze strengths and weaknesses, compare games, join coach teams, and test an experimental AI video-analysis tool. The most challenging part was making everything work together: the calculator, Firebase sign-in, saved stats, graphs, analysis, coach/player roles, team codes, privacy settings, mobile design, and the AI backend. It was also hard to make the app remember each player’s name, age, position, team, saved games, and detailed stats without breaking the user experience. I am proud that this became more than just a simple calculator. I built a full player-development platform with accounts, saved match history, team features, analytics, exports, scorecards, and a mobile-friendly design. I’m also proud that I improved it through feedback and kept making it cleaner, faster, and easier to use. People testing my product should know that they should sign up as a player or coach, enter their profile information, use the calculator first, and then save the match in the Vault. After saving games, they can check the Graph, Analysis, Compare Games, Profile, and Team pages. Coaches can create a team code and invite players. The Video AI feature is still experimental, so users should double-check the stats it gives.", "repo": "https://github.com/awang03-crypto/Veyrov2.6", "demo": "https://darksalmon-lark-983637.hostingersite.com"}]...
|
[{"post_id": 34256, "ts": "202 [{"post_id": 34256, "ts": "2026-07-24T19:58:49Z", "hours": 9.0, "text": "I improved the security and I improved and rewrote the firebase rules to make it easier to login and stuff."}, {"post_id": 33518, "ts": "2026-07-23T15:13:44Z", "hours": 9.0, "text": "I debugged the whole site"}, {"post_id": 32555, "ts": "2026-07-21T20:15:21Z", "hours": 9.0, "text": "I worked on the pricing of everything. I also made the video ai better and also worked on the pricing of the ai."}, {"post_id": 29287, "ts": "2026-07-16T03:09:38Z", "hours": 8.0, "text": "Making Veyro blogs on the site to improve backlinks along with SEO along with improving how to explain how this works."}, {"post_id": 28462, "ts": "2026-07-14T18:31:32Z", "hours": 9.0, "text": "I just focused on making it more suitable for coaches and trying to add more sports"}, {"post_id": 27717, "ts": "2026-07-13T14:51:07Z", "hours": 9.0, "text": "I worked on running tests on my website and making sure that there were no significant bugs."}, {"post_id": 26008, "ts": "2026-07-10T15:58:23Z", "hours": 8.0, "text": "I worked on the privacy and security."}, {"post_id": 24927, "ts": "2026-07-08T20:04:41Z", "hours": 8.0, "text": "I worked on just improving minor bugs and minor fixes. I also tried to make a lot of guides in the site to help coaches and parents."}, {"post_id": 24196, "ts": "2026-07-07T16:43:22Z", "hours": 8.0, "text": "I improved the calculator logic and scoring system along with the SEO"}, {"post_id": 23461, "ts": "2026-07-06T13:30:42Z", "hours": 2.0, "text": "I just improved the security"}, {"post_id": 20205, "ts": "2026-07-01T19:09:11Z", "hours": 2.0, "text": "I built out the coach onboarding flow, which walks coaches through creating an account, setting their role, generating a team, and sharing a unique invite link so players can request to join at veyro.com/join/TEAMCODE. I also wrote five long-form SEO blog posts targeting high-intent keywords — how to rate soccer players, a youth coach playbook, player performance analytics, a basketball rating system guide, and a football rating system guide — each with JSON-LD schema markup for Google rich results. Alongside the content work, I updated the sitemap to include all sixteen pages, fixed a missing meta description that PageSpeed Insights had flagged, and added SoftwareApplication and FAQPage structured data to the calculator homepage to improve search visibility."}, {"post_id": 19501, "ts": "2026-06-30T20:34:01Z", "hours": 5.0, "text": "I just improved the SEO"}, {"post_id": 18021, "ts": "2026-06-29T00:09:19Z", "hours": 2.0, "text": "I migrated the website into a unified React application while preserving its original graphics and layout, restored the calculator’s complete rating logic, improved account persistence, fixed saving and navigation, added Free, Coach, and Premium feature gates, strengthened Firebase and Firestore security, configured Stripe billing support, expanded automated backend and React tests, and updated CI/CD until all 87 tests passed."}, {"post_id": 13978, "ts": "2026-06-22T22:57:55Z", "hours": 2.0, "text": "I fixed the calculator format by implementing the iframe-based architecture from the zip, added the missing /calculator route to resolve the blank page issue, updated the navigation to use React Router’s navigate instead of window.location.href, implemented authentication bridging between React and legacy HTML pages, configured legacy page loaders for all routes, set up basketball and football subdirectories with their own calculators, added proper CSS module imports for all pages, integrated the sidebar, mobile nav, and toast components, and established the services for ratings and monetization."}, {"post_id": 11625, "ts": "2026-06-18T22:50:05Z", "hours": 1.0, "text": "I worked on turning the website from a mixed old HTML project into a React-based Veyro app while trying to keep the original graphics and page style the same. I added infrastructure like tests, build checks, linting, coverage, CI-style safety work, monetization plan logic, Video AI entitlement checks, and Hostinger deployment support. I also rebuilt the deployment output, fixed the Save & Benchmark flow, fixed the Vault save error caused by about:srcdoc, rewired old .html routes into React routes, added Hostinger .htaccess fallback support, and added basketball/football redirect files so those sections could still open after the old HTML files were removed."}, {"post_id": 10822, "ts": "2026-06-17T19:23:33Z", "hours": 2.0, "text": "I added coverage reporting and enforced a minimum threshold in CI, expanded unit and integration tests (including Firestore rules and critical server endpoints), implemented a billing integration with secure webhook handling to update plan fields, incrementally migrated legacy HTML pages into React components—prioritizing high‑traffic and complex pages and retiring the static files after verifying parity and tests—added linting, dependency and secret scanning to CI, and hardened operations with health/metrics checks and deployment documentation."}, {"post_id": 9941, "ts": "2026-06-16T13:51:54Z", "hours": 1.0, "text": "I polished Veyro from a rougher soccer rating site into a more professional product: I improved the homepage branding, spacing, mobile layout, CTA clarity, guest flow, rating preview, and overall visual quality; fixed the bad unfinished React placeholder that was accidentally showing instead of the real site; moved the React build safely under /app; rebuilt and tested the project; removed the mini pitch that I didn’t like."}, {"post_id": 9247, "ts": "2026-06-15T15:07:49Z", "hours": 4.0, "text": "I changed the website to feel much more like a polished Veyro landing/app entry page: the homepage now has a branded hero, clearer soccer performance messaging, feature pills for the live calculator, saved vault, and coach insights, a rating preview card showing an example match score, improved signup/sign-in/profile entry states, and expanded SEO sections explaining how Veyro works for players, parents, and coaches. I also added basic ESLint config for cleaner JavaScript going forward. Finally, I also changed the whole website to be running with React instead of HTML only so that the whole app should be faster."}, {"post_id": 6335, "ts": "2026-06-10T17:45:54Z", "hours": 2.0, "text": "In the last couple hours, we tightened up Veyro across auth, SEO, sharing, and polish: we fixed Firebase/Google auth issues by changing the server popup header, switching Google auth to popup-first, improving stale service-worker caching, and adding clearer email/password errors plus email verification reminders; upgraded the public recruiting profile with copy-link, save-PDF, and coach-style sections; improved SEO with a new soccer performance guide, better metadata, sitemap/robots cleanup, breadcrumb/FAQ schema validation, noindexing the experimental Video AI page, and backlink outreach copy; rewrote the README into a cleaner project overview; scanned the whole site for bugs without changing anything; and discussed advertising strategy plus the best next product improvements like demo data, coach setup, invite links, and better empty states."}, {"post_id": 5879, "ts": "2026-06-09T20:46:35Z", "hours": 1.0, "text": "I changed the website name to Veyro and I also made the firebase security more secure and way faster. I made the sidebar again look better and improved the UI of all the pages."}, {"post_id": 5149, "ts": "2026-06-08T20:44:04Z", "hours": 1.0, "text": "I worked on making the sidebar for the whole website look better. I also added a privacy page where users can request their data and object to any preferences they don’t want. I also made it so that the styles of different pages are more or less the same so that users feel like there aren’t big changes when going to the next page."}, {"post_id": 4941, "ts": "2026-06-08T15:47:49Z", "hours": 1.0, "text": "I added a cleaner coach page and made reports easier to share and cleaner to share. I also made the vault cleaner and less clogged. I also tightened the whole security of the whole website."}, {"post_id": 4455, "ts": "2026-06-07T19:36:33Z", "hours": 1.0, "text": "Improving the SEO and getting it ready for Google Search Console."}, {"post_id": 3704, "ts": "2026-06-06T19:12:57Z", "hours": 3.0, "text": "I made the whole website faster and cleaner. I also made it so that you can download this website as a app now."}]...
|
Title: MatchRatingCalculator by @Allen | Stardance Title: MatchRatingCalculator by @Allen | Stardance
Devlogs:
I made the whole website faster and cleaner. I also made it so that you can download this website as a app now.
Improving the SEO and getting it ready for Google Search Console.
I added a cleaner coach page and made reports easier to share and cleaner to share. I also made the vault cleaner and less clogged. I also tightened the whole security of the whole website.
I worked on making the sidebar for the whole website look better. I also added a privacy page where users can request their data and object to any preferences they don’t want. I also made it so that the styles of different pages are more or less the same so that users feel like there aren’t big changes when going to the next page.
I changed the website name to Veyro and I also made the firebase security more secure and way faster. I made the sidebar again look better and improved the UI of all the pages.
In the last couple hours, we tightened up Veyro across auth, SEO, sharing, and polish: we fixed Firebase/Google auth issues by changing the server popup header, switching Google auth to popup-first, improving stale service-worker caching, and adding clearer email/password errors plus email verification reminders; upgraded the public recruiting profile with copy-link, save-PDF, and coach-style sections; improved SEO with a new soccer performance guide, better metadata, sitemap/robots cleanup, breadcrumb/FAQ schema validation, noindexing the experimental Video AI page, and backlink outreach copy; rewrote the README into a cleaner project overview; scanned the whole site for bugs without changing anything; and discussed advertising strategy plus the best next product improvements like demo data, coach setup, invite links, and better empty states.
I changed the website to feel much more like a polished Veyro landing/app entry page: the homepage now has a branded hero, clearer soccer performance messaging, feature pills for the live calculator, saved vault, and coach insights, a rating preview card showing an example match score, improved signup/sign-in/profile entry states, and expanded SEO sections explaining how Veyro works for players, parents, and coaches. I also added basic ESLint config for cleaner JavaScript going forward. Finally, I also changed the whole website to be running with React instead of HTML only so that the whole app should be faster.
I polished Veyro from a rougher soccer rating site into a more professional product: I improved the homepage branding, spacing, mobile layout, CTA clarity, guest flow, rating preview, and overall visual quality; fixed the bad unfinished React placeholder that was accidentally showing instead of the real site; moved the React build safely under /app; rebuilt and tested the project; removed the mini pitch that I didn’t like.
I added coverage reporting and enforced a minimum threshold in CI, expanded unit and integration tests (including Firestore rules and critical server endpoints), implemented a billing integration with secure webhook handling to update plan fields, incrementally migrated legacy HTML pages into React components—prioritizing high‑traffic and complex pages and retiring the static files after verifying parity and tests—added linting, dependency and secret scanning to CI, and hardened operations with health/metrics checks and deployment documentation.
I worked on turning the website from a mixed old HTML project into a React-based Veyro app while trying to keep the original graphics and page style the same. I added infrastructure like tests, build checks, linting, coverage, CI-style safety work, monetization plan logic, Video AI entitlement checks, and Hostinger deployment support. I also rebuilt the deployment output, fixed the Save & Benchmark flow, fixed the Vault save error caused by about:srcdoc, rewired old .html routes into React routes, added Hostinger .htaccess fallback support, and added basketball/football redirect files so those sections could still open after the old HTML files were removed.
I fixed the calculator format by implementing the iframe-based architecture from the zip, added the missing /calculator route to resolve the blank page issue, updated the navigation to use React Router’s navigate instead of window.location.href, implemented authentication bridging between React and legacy HTML pages, configured legacy page loaders for all routes, set up basketball and football subdirectories with their own calculators, added proper CSS module imports for all pages, integrated the sidebar, mobile nav, and toast components, and established the services for ratings and monetization.
I migrated the website into a unified React application while preserving its original graphics and layout, restored the calculator’s complete rating logic, improved account persistence, fixed saving and navigation, added Free, Coach, and Premium feature gates, strengthened Firebase and Firestore security, configured Stripe billing support, expanded automated backend and React tests, and updated CI/CD until all 87 tests passed.
I just improved the SEO
I built out the coach onboarding flow, which walks coaches through creating an account, setting their role, generating a team, and sharing a unique invite link so players can request to join at veyro.com/join/TEAMCODE. I also wrote five long-form SEO blog posts targeting high-intent keywords — how to rate soccer players, a youth coach playbook, player performance analytics, a basketball rating system guide, and a football rating system guide — each with JSON-LD schema markup for Google rich results. Alongside the content work, I updated the sitemap to include all sixteen pages, fixed a missing meta description that PageSpeed Insights had flagged, and added SoftwareApplication and FAQPage structured data to the calculator homepage to improve search visibility.
I just improved the security
I improved the calculator logic and scoring system along with the SEO
I worked on just improving minor bugs and minor fixes. I also tried to make a lot of guides in the site to help coaches and parents.
I worked on the privacy and security.
I worked on running tests on my website and making sure that there were no significant bugs.
I just focused on making it more suitable for coaches and trying to add more sports
Making Veyro blogs on the site to improve backlinks along with SEO along with improving how to explain how this works.
I worked on the pricing of everything. I also made the video ai better and also worked on the pricing of the ai.
I debugged the whole site
I improved the security and I improved and rewrote the firebase rules to make it easier to login and stuff.
Ships:
I made Match Rating, a soccer performance app that helps players turn their match stats into a clear rating out of 100. I can calculate a live score, save games, track my progress in a vault, view graphs, analyze strengths and weaknesses, compare games, join coach teams, and test an experimental AI video-analysis tool. The most challenging part was making everything work together: the calculator, Firebase sign-in, saved stats, graphs, analysis, coach/player roles, team codes, privacy settings, mobile design, and the AI backend. It was also hard to make the app remember each player’s name, age, position, team, saved games, and detailed stats without breaking the user experience. I am proud that this became more than just a simple calculator. I built a full player-development platform with accounts, saved match history, team features, analytics, exports, scorecards, and a mobile-friendly design. I’m also proud that I improved it through feedback and kept making it cleaner, faster, and easier to use. People testing my product should know that they should sign up as a player or coach, enter their profile information, use the calculator first, and then save the match in the Vault. After saving games, they can check the Graph, Analysis, Compare Games, Profile, and Team pages. Coaches can create a team code and invite players. The Video AI feature is still experimental, so users should double-check the stats it gives.
This looks like a Ship post on Replit or a similar platform. Here's something you can paste in: I built Veyro, a multi-sport player performance rating app for soccer, basketball, and football. Players enter their match stats and get a rating out of 100 using a position-specific formula — so a goalkeeper is judged on saves and clean sheets, not goals, and a quarterback is judged on touchdowns and interceptions, not tackles. Matches save to a personal vault so players can track their development over time. The most challenging part was building a clean React codebase that could handle three completely different sports with separate calculators, vaults, graphs, and coach pages for each — while keeping the architecture maintainable and the bundle size small. I also built a full coach onboarding flow with shareable team invite links, a three-tier monetization system with Stripe integration, and a CI/CD pipeline with 87 passing tests. I'm most proud of the billing and entitlements system — it handles free tier limits, Coach plan features, and Premium Video AI access cleanly across both the server and the React UI. The app scores 94 for performance, 100 for accessibility, and 96 for best practices on PageSpeed Insights. To test it: go to the calculator, pick your sport and position, enter some match stats, and hit calculate. Free accounts can save up to 5 matches to the vault. If you're a coach, hit Setup in the sidebar to create a team and get a shareable invite link for your players.
I made Veyro, a React-based sports rating website that lets players enter match stats, calculate a live performance score, save matches to a vault, compare progress, and use role-based features like Coach, Premium, and Video AI. The hardest part was converting the old HTML version into a full React app while keeping the same original graphics, layout, and feel, because the design and logic had to stay consistent across every page. I am proud that the project now has stronger account persistence, saving, navigation, monetization gates, Firebase/Firestore security, CI/CD, and automated tests with all tests passing. To test it, people should sign in or use guest mode, try the soccer calculator, save a match, open the vault, check graph/compare pages, and test locked features like team tools or Video AI depending on the user plan.
I made Veyro, a React-based sports rating website that lets players enter match stats, calculate a live performance score, save matches to a vault, compare progress, and use role-based features like Coach, Premium, and Video AI. The hardest part was converting the old HTML version into a full React app while keeping the same original graphics, layout, and feel, because the design and logic had to stay consistent across every page. I am proud that the project now has stronger account persistence, saving, navigation, monetization gates, Firebase/Firestore security, CI/CD, and automated tests with all tests passing. To test it, people should sign in or use guest mode, try the soccer calculator, save a match, open the vault, check graph/compare pages, and test locked features like team tools or Video AI depending on the user plan....
|
1792882070.3901622
|
1793746070.3901622
|
|
21382
|
Hadronize by @ethmarks | Stardance
|
ethmarks
|
1
|
118.0
|
2150
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-26T05:16:19Z", "hours": 118.0, "multiplier": 19.09, "payout": 2150, "blessing": "neutral", "text": "Hadronize: a quark-themed set collection game. It has a web UI with a custom SvelteKit virtual layout engine, a polyglot CLI that runs across Node, Deno, Bun, and the browser console, a QuickJS bot sandbox, a comprehensive test suite, and more. I’m really proud of Hadronize and hope that you enjoy it.", "repo": "https://github.com/ethmarks/hadronize", "demo": "https://ethmarks.github.io/hadronize/"}]...
|
[{"post_id": 35009, "ts": "202 [{"post_id": 35009, "ts": "2026-07-26T05:04:06Z", "hours": 0.4372, "text": "Shipping I did a few miscellaneous things like make the remote script endpoint production-ready, fix some typos across the project, and create a favicon in Inkscape. After I write this devlog, I’m going to press the big “Ship your project!” button. If you’re a reviewer reading this: I hope you enjoy Hadronize. It’s one of my biggest projects ever, and I’m really proud of how it’s turned out."}, {"post_id": 32762, "ts": "2026-07-22T03:54:56Z", "hours": 5.1389, "text": "Revised Readme (again) Still working on the README. I think that Hadronize is more or less ready to ship now, but there’s probably still a bit more polishing I can do. In my other Stardance projects, I’ve gotten really positive feedback on my READMEs, so apparently my writing style and README format of choice is a winning combination. I’ve been referencing my past READMEs and the Stardance README guide a lot while writing this one. The bulk of what I added was the How it Works section, which explains some of the technical details and design choices that I made. It’s a dense topic so it’s obviously a long section. At first it was just a wall of text, even when I tried to break it up with lists and subheadings. So I spent about half an hour taking screenshots and editing them in GIMP until I had decorative images that I was satisfied with for each subsection. I think that drop shadows on transparent backgrounds look really cool in README images, so I used GIMP’s drop shadow filter to add them to my screenshots (in addition to cropping, rounding corners, et cetera). I kept fiddling with the drop shadow settings and I didn’t want to go back and redo the images that I’d already done, so the shadows are kind of inconsistent, which really irks me but I don’t think is very noticeable. I also added a Running Locally section and fixed a few typos throughout the README. Lastly, I did a bit of work on the home page. I added a big screenshot below the intro paragraph, thanks to feedback from the awesome @Luksus , whose project you should totally check out ."}, {"post_id": 31601, "ts": "2026-07-20T04:06:53Z", "hours": 2.7375, "text": "Revised README I worked on updating and basically completely rewriting the README to something more polished. I still need to add more sections and revise what I have, but I think that it’s alright. I’m trying to strike a balance between not having enough content and being a wall of text. It’s also surprisingly difficult to come up with bullet points for the features list. After I finish up the README, I’m going to redesign the home page a bit. After that, I think I might be ready to ship."}, {"post_id": 31058, "ts": "2026-07-19T04:31:59Z", "hours": 6.4664, "text": "How to play page I wrote a page that explains how to play, assuming zero knowledge. I think that this’ll be helpful for onboarding, because this way they learn the rules at the same time as they learn how to use the UI, rather than reading the abstract and theoretical rules and then trial-and-erroring their way through the UI. The actual writing part took a few hours, and most of it was revision and trying to find better ways to phrase things. It’s nearly 1000 words, meaning I could turn it in for an essay assignment and not fail the word count, which is funny. But what also took a lot of time was making the visual aid. I had to record myself performing the same action in the UI many times to get a perfect take, and then I had to craft an ffmpeg command to crop and trim it because I refuse to use graphical video editors. Also my recording software kept stuffing H.264 video data in a webm container, which made ffmpeg freak out because that file is technically corrupted. I also had to figure out how to screen record on my phone to get a tap indicator, which I’d never done before. You can read the page here: https://ethmarks.github.io/hadronize/how"}, {"post_id": 30534, "ts": "2026-07-18T05:53:11Z", "hours": 3.6139, "text": "Discontinuing the ranking arena I’ve decided to stop working on the driver ranking arena. I already have an MVP that works well enough to kinda sorta determine which drivers are good and which are bad, but it’s not robust and it just sums up rankings rather than implementing an actual Elo algorithm . The reason I’m not going to continue working on it is that it seems like a lot of work, and I don’t think that it’ll provide any value. Like, at all. The root of the problem is that Hadronize just isn’t a strategic-enough game. There’s certainly some strategy, of course, and probabilistic modeling, but luck plays just as much of a factor. The cleverest Hadronize driver can still routinely lose to the dumbest one just due to slightly bad luck. So it doesn’t really make sense to build tooling for strategic bots if the strategy is not a very big aspect of the game. Thinking back, I’m not really sure why I decided to start working on the driver arena in the first place. It just seemed like the right thing to do at the time even though I now realize that it would be kind of useless. Anyways, I also created two new drivers. The first is called Kingslayer, and it just tries to steal from the player who’s currently winning. It’s not very good at actually winning, but it does make things more challenging for the other players. The second is called Gentleman (aka charm ). It’s obsessed with trying to collect charm quarks, because its a charming gentleman. I made it as a joke because I thought it was funny, but to my complete surprise it turns out to be a pretty good strategy? Not charm quarks in particular, but trying to collect a specific flavor of quark at all costs turns out to be surprisingly effective. It consistently wins more often than EVan, the driver that I specifically built to be a good strategy and that actually does probabilistic expected value calculations. I think that next I’ll start working on the README and documentation, because I haven’t updated the README in like 3 weeks and it’s extremely outdated."}, {"post_id": 29906, "ts": "2026-07-17T02:31:07Z", "hours": 1.8094, "text": "Benchmark Before I started working on the bot ranking arena, I did a quick sidequest to figure out how many games per second I could simulate. So I wrote this script to execute a bunch of games sequentially, then print the elapsed time and calculate the games per second rate. I ran the benchmark in Node 24.15.0 on my 4.40 GHz Intel i5-12450H using Bogo drivers: Simulated 82157 turns across 1000 games Took 109048ms (109.048s). Speed is 9.170273640965446 games per second So that was surprising. I was expecting a speed in the low thousands, but instead it was less than 10. I had a suspicion what was causing the slowdowns. To make sure, I swapped out the Bogo driver (which uses QuickJS) with a non-QuickJS driver that I made for testing, and reran the same benchmark: Simulated 53854 turns across 1000 games. Took 130ms (0.13s). Speed is 7692.307692307692 games per second (the turn count is smaller because the drivers used a different strategy which made games end faster) So, obviously, the slowdown is caused entirely by QuickJS. Which makes sense. Every time a QuickJS driver is invoked, it spins up a brand new QuickJS VM, configures it, executes the actual code, extracts the return value from the VM, disposes of the VM to avoid memory leaks, and then finally returns the value. Non-QuickJS drivers can just execute the code directly, and the code can be optimized very well by the JIT compiler that Node uses. So the solution seems simple, right? Just don’t use QuickJS for the drivers. Whatever the advantages of using QuickJS are, surely they aren’t worth an 839x decrease in performance. Well, unfortunately that’s not an option. More specifically, dynamically running strings of JS (like the driver code that users write at runtime) as native code is not possible, so I have to use a JS VM. And QuickJS is by far the best embeddable JS VM that I know of. So I just have to accept the slowness. This means that I’ll have to be clever about the bot arena, though. I can’t just brute-force a ranking with thousands of games if I can only run 10 games per second. btw, if you’d like to see how your PC does on my benchmark, just run these commands: git clone https://github.com/ethmarks/hadronize.git cd hadronize pnpm install pnpm bench --count 1000 --driver prng If your time is faster than mine, leave a comment to gloat."}, {"post_id": 29828, "ts": "2026-07-16T23:29:46Z", "hours": 6.7503, "text": "Bot editor I integrated the QuickJS driver code that I made last devlog into the rest of the site. Things I did: I made the QuickJS VM override the default Math.random function and replace it with a mulberry32 prng seeded by stringifying the game state and hashing it through djbs2 . So now drivers can still use Math.random without making the rng predictable or sacrificing perfect determinism. I gave the drivers names and descriptions. The prng driver is named “Bogo” (after Bogosort ) and the expected value driver is named “EVan” (because it’s a normal name that starts with the abbreviation of “ E xpected V alue”). I moved the code for the existing drivers into a centralized array, rather than in multiple different files that had to be imported individually. I’m calling this array the “stock drivers”. I added a bot editor page. You can check it out at https://ethmarks.github.io/hadronize/bots . I used contenteditable and Svelte’s bind:textContent to let users edit the title, ID, and description. I used Prism code editor as the embedded IDE for editing the actual driver code. I made the play page fetch the list of drivers from localstorage on page load, defaulting to the stock drivers. I also made the bot editor automatically sync the drivers to localstorage . I added a new driver strategy: tit for tat . As expected, it plays pretty terribly because that strategy just isn’t very good in Hadronize. I mostly made it so that users looking at the stock drivers can learn how to reference the timeline from the state. I think that next I’ll work on a driver ranking system so that when I make more drivers, I’ll know whether they’re better or worse than the others. I might research how chess ranking systems work and copy concepts from those."}, {"post_id": 29163, "ts": "2026-07-15T21:36:28Z", "hours": 1.3381, "text": "QuickJS drivers I can now store driver strategy code as strings, execute the strings as JS code using QuickJS , read the quickjs output, and use it as driver output. This might not sound like much of a difference, but it completely changes how I can run drivers. Before, all driver strategies had to be present in the actual source code. Now, they just have to be strings. Because we can manipulate strings at runtime, this means that we can create new drivers while the site is running without modifying the source code. In other words: this lays the groundwork for letting you create and play against your own drivers without making a PR to the repo. To make sure that my implementation works, I converted the expected value driver to use quickjs. I enclosed all of the actual logic in backticks, making it a giant string, and then passed the string through my quickjs driver factory function. I ran the expected value driver test suite, and it failed immediately because I forgot to remove the type annotations (quickjs can only execute plain JS, not TS). But once I fixed that, all 19 tests passed, and it seems to work perfectly from my playtests. I eventually plan on adding a page that uses Prism code editor to let users edit driver strategies and save them to localStorage. But first I’m going to add more features to the quickjs runtime. For example, I want to have it swap all Math.random() calls with a deterministic psuedorandom generator, so that way developers can use randomness without making it non-deterministic."}, {"post_id": 28712, "ts": "2026-07-15T04:13:36Z", "hours": 1.0886, "text": "New quark style I made new quark graphics, like I promised last devlog. I’m not really sure if it fits the aesthetic I’m going for, but it’s something , and I tried to make it extensible so that I can experiment with more styles later. I also added a dropdown menu in the setup flow so that you can select which style you want to use, though I might remove that in the future if I decide on one style to be the definitive one. The new style is just patterns masked onto the same flat color circles as before. Each flavor has a different pattern: up: vertical lines down: horizontal lines charm: checkerboard strange: square grid with irregular shading top: light dot grid bottom: dark rhombus grid hadron: solid (unchanged) I don’t know if this makes the quarks look nicer or not, but it definitely makes them more accessible. If the abbreviation text isn’t visible for whatever reason (e.g. because the chamber is in count layout mode), quark flavors used to be distinguished solely by color. But the new patterns make them distinguishable without color, which is important for colorblind accessibility."}, {"post_id": 28687, "ts": "2026-07-15T02:53:52Z", "hours": 2.3578, "text": "Minor graphics improvements This is a smaller devlog. Stuff I did since last devlog: Fixed the winning animation to work with the new layout planner Added transitions to the quark text. Whenever a quark changes its display text (e.g. from a ‘?’ to a flavor abbreviation like ‘s’), rather than instantly snapping to the new text, it’ll do a quick crossfade. Changing the font used for the quark text from the default to a font called Degheest that I think looks nice. Merging the layout refactor into prod because I’ve decided that it seems stable enough. Next, I’m going to work on improving the quark graphics. I’m trying to go for an aesthetic that looks like it’s from a physics textbook (hence the dot grid backdrop I’ve had for a while), so it’s already pretty close, but imo it looks a bit too plain right now. I don’t have a precise vision for exactly what I want the quarks to look like, so I’ll need to figure that out."}, {"post_id": 28484, "ts": "2026-07-14T19:10:09Z", "hours": 0.4922, "text": "Touchscreen support Idk why I was worried that this would be difficult. Less than 20 lines of code later, Hadronize now automatically detects whether you’re using a fine pointer (e.g. a mouse) or a coarse pointer (e.g. a touchscreen), and changes its behavior accordingly. So now you can select chambers on touchscreen just by tapping on them. You don’t have to drag the superposed quark, you just tap. I recorded a video showcasing this in action using Firefox’s mobile device simulator (aka RDM). As you can see, when I disable touch simulation, the chambers respond to hovering and I have to drag the quark around. But when I enable touch, the chambers don’t react at all until I click one, and then the superposed quark gets added to that chamber like normal. I’ve also tested this on an actual phone and it works perfectly, but it’s more difficult to record on there which is why I used Firefox’s simulator for the video."}, {"post_id": 28121, "ts": "2026-07-14T06:24:57Z", "hours": 8.2808, "text": "Layout optimization algorithm It took an entire day, but I did it. Hadronize will now automatically adjust 5 different layout variables in order of priority to make everything fit on screen. I think that the algorithm is probably the most complicated part of this entire project. I’m going to try to explain it really simply in this devlog, but if you want to see how it actually works, I wrote a bunch of comments that explain the priority pipeline in this file . So basically, every time a new layout update is triggered, the layout manager calculates a brand new layout plan from scratch. Once it’s finished calculating, it applies the layout plan onto the actual layout variables that are used to move the quarks on the screen. If I modified the layout variables directly, the rapid-fire modifications while calculating would trigger a bajillion reactive updates from Svelte which would slow the page down. Anyways, the way that the layout plan is calculated is that it starts by assuming ideal conditions: there is more than enough room for everything to fit comfortably. So it does the calculations using the preferred ideal variables, it modifies the plan, and then it actually checks to see if anything is overlapping. If there is any overlap, it tries to resolve it using the least-disruptive adjustment it can make. If that doesn’t work, it tries the next least-disruptive adjustment. And so on. Also, each time it moves up the chain of disruptiveness, it tries to use the ideal variables for all of the less-disruptive adjustments. If that makes sense. Here are the adjustments that it can make, in ascending order of disruptiveness: Increasing the radius of the ring of quarks of a single chamber Adjusting the radius of the ring of chambers around the center of the screen Switching chambers to use count mode, which is when it only displays the number of quarks of each flavor rather than displaying each quark individually. Switching the global layout from ring mode to grid mode. This is the thing that I built last devlog. Decreasing the size of all quarks I’m pleased to report that when I tested it on my phone, everything worked perfectly. I still haven’t implemented mobile input yet, but I started a 6-player game of all bots, and the layout planner managed to keep all of the quarks visible all of the time, even when a single chamber had more than 20 quarks. Never once did I see two chambers overlap with each other or go partially offscreen, which used to happen 100% of the time on small mobile screens. It just changed layout modes and decreased the quark size whenever it started to run out of room. Anyways, I’m not going to merge the new layout planner just yet because I’m not 100% sure how stable it is, but I’ll do that soon. Next up is mobile input."}, {"post_id": 27452, "ts": "2026-07-13T01:01:10Z", "hours": 1.7111, "text": "So the first step to mobile support is making the all of the quarks in all of the chambers actually fit on a phone screen. Right now they just overlap a bunch and you can’t tell which quarks belong to who. I have some ideas for an algorithm that can automatically adjust layout variables until everything fits, but first I need to give the algorithm things that it can adjust. The crux of the problem is that there’s simply no way to fit 6 chambers in a circular ring around the center of the screen on mobile. There’s just not enough screen space. So I made a new layout that places chambers in a grid instead of a ring. It works on desktop in addition to mobile. I don’t think it looks quite as nice, but it’s much more space efficient. I attached some side-by-side comparison screenshots. As you can see, the quarks still don’t quite fit on mobile even with the grid layout, but it’s much closer. Next step is either writing the automatic layout algorithm, or making input work on mobile."}, {"post_id": 27350, "ts": "2026-07-12T20:49:30Z", "hours": 3.1975, "text": "Sound effects! I added sound effects to the game UI. A unique sound plays for each of these: Starting a game Dragging a quark over a chamber Dropping a quark onto a chamber A quark hadronizing A quark tunneling Winning a game Closing a game I sourced them all from https://freesound.org/ , and I left attribution for each one in sounds.svelte.ts . I also modified a few in Audacity to trim them or apply simple effects. I’m not sure that I’m 100% satisfied with the sounds. I sourced almost all of the effects from different freesound sounds because I couldn’t find a sound pack that I liked, so the sounds don’t quite match tonally. Some of them are generic UI sounds while others are clearly scifi-ey. I may change some of the sounds later if I find more cohesive ones. I’d never done audio in HTML/JS before, so this was new for me. I originally just used the Audio() constructor because that was the most obvious way to play, but when I realized the many issues with it (though it did work!), I rewrote my code to use AudioContext . I also made a multi-step preloading and decoding pipeline that fetches all sound effects on page load, but doesn’t decode them until the user presses a button because otherwise JS throws a warning in the console and suspends the audio context. I think that the sound effects make Hadronize feel a lot more polished and nicer to play. Next up on my list is mobile support. I’m not looking forward to it. (Make sure to turn on sound for the video below)"}, {"post_id": 27016, "ts": "2026-07-12T04:52:57Z", "hours": 1.6675, "text": "Mouse handler refactor https://github.com/ethmarks/hadronize/commit/3a5adcb I started working on writing audio code and looking through sound effect libraries, but when I tried to hook my WIP sound-playing function into the mouse handler, I realized what an awful mess my mouse handler code was. So I spent over an hour refactoring it. While I was at it, I optimized it a tiny bit and fixed the hover thrashing bug that had been bugging me for nearly 2 weeks now."}, {"post_id": 26956, "ts": "2026-07-12T01:34:57Z", "hours": 2.6592, "text": "Style improvements and new pages So, funny story about the site styles. When I first made the CLI page 3 weeks ago (has it really been that long?! wow), I added holiday.css to make it look nice as a stopgap measure until I made the real styles. However, as the old saying goes, there’s nothing more permanent than a temporary solution. I’ve decided to just embrace using holiday.css for the entire site because it looks much nicer than anything I could make. The styles in the actual game component are entirely my own, of course, but the homepage, rule page, and rewritten CLI page all use holiday.css. “what rule page and rewritten CLI page?”, you ask? That’s the other thing that I did this devlog. I created a dedicated page on the site for the rules, and I rewrote the CLI page to only contain instructions on how to use the CLI rather than a playable browser CLI. Don’t worry, you can still play Hadronize via the browser console. The main UI has had that functionality since the beginning. I just didn’t see a reason to maintain two different game UIs, especially because the main UI can do everything that the playable CLI page could (and much more). I think that next I’ll start polishing the game UI. It’s long overdue. I’ll add sound effects, add mobile support, and maybe (don’t hold me to this) improve the graphics."}, {"post_id": 26635, "ts": "2026-07-11T15:55:24Z", "hours": 8.3731, "text": "UI Setup Flow diff from last devlog to this one I added a setup flow to the main UI page, and did a lot of refactoring. I also removed support for setting up the game via browser console. I didn’t make this choice lightly because it was a fun feature, but the tradeoffs were just too much and I decided that it wasn’t worth it, especially because the console setup is much clunkier than just using the HTML form, so I doubt anyone would even use it. But anyways, the main focus of this devlog is the setup flow on the main UI page (aka the play page). I also added some pretty sleek animations when activating and deactivating the game overlay."}, {"post_id": 20570, "ts": "2026-07-02T05:53:52Z", "hours": 3.7103, "text": "UI Refactor diff from last devlog to this one I refactored the Hadronize UI code. Rather than one giant 570-line file that handled the quark positioning, state tracking, mouse movement, and game loop, I split the code into four different files, each dedicated to one specific thing, with an average line count of ~154 (191, 184, 111, and 132, respectively). This makes the codebase way more maintainable and easy to work in. I also deduplicated most of the main game loop code. Before, I had just copied the entire content of the executeTurn() function, pasted it into the UI code, and customized it until the logic code correctly interfaced with the UI. Maintaining two separate functions that do basically the same thing is bad practice, so today I came up with an alternative solution: adding a bunch of “hooks” as optional parameters, which are just functions that the executeTurn() function runs at specific stages. In a CLI game, the hooks are never provided to the function, so they’re never run and nothing changes. But the UI code does provide hooks, to do things like trigger re-renders. This way, the same code can be reused for two different use cases (CLI and UI). Next Steps There’s still more refactoring to do, but I don’t think that I’ll do any more major restructuring."}, {"post_id": 19746, "ts": "2026-07-01T04:11:24Z", "hours": 14.7989, "text": "Huge UI Progress diff from last devlog to this one I’ve been working a lot on the Hadronize UI. Last devlog, all that it could do was render all of the quarks into a big overlapping heap and you could drag around one specific quark. Now, you can play a full game in the UI from start to finish, and it’s reasonably polished. How to play the UI prototype Visit https://ethmarks.github.io/hadronize/play . Make sure that you’ve read the game rules in the README . I haven’t implemented a setup flow in the main UI yet, so right now it’s pre-configured with two human players named Arthur and Ford, one bot player named Marvin, and seed 42. On each human player’s turn (their name will be highlighted in yellow), click and drag the superposed quark to the chamber of the player who you want to observe it. The superposed quark will collapse, get added to the chamber you selected, possibly react with existing quarks, and then play will proceed to the next player. Continue this until someone wins. It will probably be Marvin. Refresh the page to play again. Playtest I also conducted the first playtest with a few friends. Nothing broke during the playtest and they all liked it and gave positive feedback, which was really encouraging. We all got absolutely crushed by the expected value driver I built last devlog. Next Steps It sounds hyperbolic to say that this UI is the messiest code I’ve ever written, but I legitimately can’t think of any other contenders. Of the 800+ lines of code in the UI, about 570 of them are in one massive Game.svelte component. This component handles state tracking, mouse movement, the main game loop, and most of the geometry to position the quarks. The very next thing that I need to do is massively refactor the UI code. After that, I have a few ideas: A setup flow that lets the user choose the seed to use and configure the players. Sound effects, UI indicators (e.g. “you formed a baryon!”), and other game juice. Proper mobile support. Right now it kind of works on mobile, but the layout gets really cramped. I’ve been working a lot on the Hadronize UI. Last devlog, all that it could do was render all of the quarks into a big overlapping heap and you could drag around one specific quark. Now, you can play a full game in the UI from start to finish, and it’s reasonably polished."}, {"post_id": 17689, "ts": "2026-06-28T16:19:54Z", "hours": 3.3139, "text": "Drivers Each player in Hadronize is controlled by a Driver, which is basically just a function that takes the current game state as an input and outputs a player. I implemented drivers on like day #2, but I don’t think I’ve talked about them in a devlog yet. The first driver I made is the dogpile driver. It’s logic is extremely simple: it just selects the player who goes first. It doesn’t even reference the game state at all. If every player is a dogpile driver, this means that everyone just dogpiles onto the first player and ends up stealing basically all of its quarks before it can use them. This is obviously a terrible strategy because it’s not even capable of trying to score, but it was very simple to implement and I use it as a placeholder. The second driver I made is the rng driver. It just makes random decisions. However, because I insist on everything being deterministic, it can’t just use Math.random . Instead, it stringifies the game state, converts that string into a 32-bit integer via a djb2 hash, then uses that integer to seed a mulberry32 pseudorandom number generator, then uses the output of the mulberry to make its player selection. The newest driver that I just finished developing is the expected value driver. It does actual strategic calculations to determine what the expected value of choosing each player would be based on the information it has available, then selects the player that maximizes that value. Next Steps I’ve started building the UI, but I’ve still been procrastinating on actually working on it in earnest. I should probably do that."}, {"post_id": 15374, "ts": "2026-06-25T00:16:45Z", "hours": 5.18, "text": "Tests and CLI Args You can now add arguments to the Hadronize CLI in the terminal, which lets you avoid having to use the setup flow. Here’s an example. pnpm run cli --seed 12345 --player Alice:human --player Bob:bot It also works if you run the CLI as a remote script. deno run -A http://ethmarks.github.io/hadronize/cli.ts -s 8 -p a:bot -p b:bot -p c:bot This was pretty easy to implement. I just used Node’s parseArgs utility for the main arg parsing and wrote a bunch of validation logic that converts the raw arguments (which are always strings) into the data types that my code uses. Tests Over the past couple days, I’ve made a little test suite for the game logic using Vitest. I’ve written 19 individual tests, but some of them repeat multiple times with different game seeds and whatnot to ensure that it works with a variety of inputs, so Vitest actually runs 101 tests in total. All of the tests pass, and I didn’t discover any bugs, which either means that I managed to get all the game logic correct on the first try, or that there’s something wrong with my tests. Next Steps I think that I’ve probably spent too much time on the CLI. I don’t think that it was time wasted, but I probably ought to get started on the main game UI."}, {"post_id": 14724, "ts": "2026-06-23T22:42:34Z", "hours": 6.3972, "text": "CLI Remote Script You can now run Hadronize CLI in a terminal without cloning the repo. If you run the command below, Deno will automatically fetch all the dependencies. deno run -A http://ethmarks.github.io/hadronize/cli.ts Node doesn’t support remote scripts because it lacks Deno’s awesomeness, but because of the Deno binary on npm , you can run Deno (and therefore Hadronize) through any of the other package managers! npx deno run -A http://ethmarks.github.io/hadronize/cli.ts pnpm dlx deno run -A http://ethmarks.github.io/hadronize/cli.ts bunx deno run -A http://ethmarks.github.io/hadronize/cli.ts For example, in the attached screenshot, I SSH-ed into one of my home servers that hadn’t cloned the Hadronize repo nor installed Deno, and tried to run Hadronize as a remote script via pnpm . After resolving dependencies for a few seconds, it ran flawlessly. How it works I first encountered Deno remote scripts in Lume’s init command , and my implementation is heavily inspired by it. Basically, all that the cli.ts file does is fetch the CLI code from JSDelivr, which fetches it directly from the GitHub repo. From there, Deno is smart enough to resolve all of the CLI code’s dependencies and run it. Compatibility Before today’s changes, running Hadronize via Deno worked perfectly fine. deno task cli behaved identically to pnpm run cli . However, that’s because Deno has an automatic Node compatibility layer , not because Deno can actually run the code natively. That compatibility layer doesn’t really work with remote scripts (because Deno can’t find the package.json ), so when I first tried to run the remote script while developing it, it crashed and burned immediately. This was because, without the compatibility layer, Deno and Node handle things fundamentally differently. There were several differences, some of which I expected and some of which I didn’t, but the easiest one to understand is NPM imports. NPM imports My CLI code relies on the picocolors library for getting ANSI escape codes. When I was first writing the code, I added the picocolors package via NPM and imported it in the normal Node way: import pc from \" picocolors \" ; The problem is that Deno can’t parse bare imports like that. Deno expects this format, which Node cannot parse: import pc from \" npm:picocolors \" ; I tried configuring an import map in deno.json , but it didn’t work. I considered just hardcoding the ANSI escape sequences, but I decided that I would need to figure out how to polyglottally import NPM packages in both Node and Deno at some point, so I might as well figure it out now. My solution was to create a deps/picocolors.ts file to proxy the picocolors import by dynamically importing it based on whether it’s being run in Deno or not: const { default : pc } = \" Deno \" in globalThis ? await import ( \" npm:picocolors \" ) : await import ( \" picocolors \" ); export default pc ; NPM imports were only one of the issues that sprung up. Frustratingly, the only way to test whether or not a solution worked was to commit, push to main, and test on production. The whole Deno compatibility saga required 12 commits in total. Next Steps I’m still working on writing unit tests for the game logic. I already have a few tests, but they’re definitely not comprehensive. I’ll write a devlog about the tests once I’m finished with them."}, {"post_id": 13920, "ts": "2026-06-22T20:31:39Z", "hours": 5.8247, "text": "Setup Flow diff from last devlog to this one Since my last devlog, I added a flow that lets users set up each game before starting it. The setup includes specifying the seed, player count, the names of each player, and whether each player should be a human or a bot. I made it work in three different formats, each of which had to be implemented individually: The terminal : at its core, this format is just a normal TUI. It prints input prompts, awaits the user’s input using the abstracted NbrInputFunc I mentioned last time, and repeats this until the user provides an input that passes the validation function. Pretty standard stuff. The browser console : I used the same trick that I described last time to allow users to enter their input via the browser console. It creates a custom window property that resumes execution, then halts execution with a Promise<void> until the window property is called. Unfortunately, it wasn’t possible to use the anonymous getter trick that I used last time. If I did that, I would have to create custom window properties for every possible 32-bit number to allow user to enter the seed, and create custom properties for every possible string to allow users to enter player names. That obviously wasn’t possible, so instead I just created a window.r function that takes any input type. The “r” stands for “respond”. To set the seed to 42, you type r(42) into the console, which is a reasonably clean UX, I think, though not as clean as just typing 42 like you can in the terminal. The webpage : this uses HTML <input> s and SvelteKit’s reactivity. The trickiest part was navigating the fact that the value of one of the inputs (player count) controls the structure of some of the other inputs (player configs). At first I tried writing code to dynamically construct a variable-length Array, but that was a nightmare of complexity. Then I tried making all 6 possible player configs visible all the time and just adding the “Disabled” type, but that made the UI look ugly and was also kind of complicated to implement. The solution I settled on was to internally use an Array with a fixed length, automatically hide the player config UI elements with an index less than the player count value, and slice the player config Array before passing it into the main game function. I think that this solution is the best of both worlds while also being fairly simple to implement. Next Steps I know that I’ve been saying this for the past 4 days, but I need to write some internal docs for my game logic code and write tests. I haven’t noticed any bugs during my playtests while building the CLI, but I’d like the peace of mind to be fairly confident that I’ve implemented my game rules correctly."}, {"post_id": 12947, "ts": "2026-06-21T05:52:51Z", "hours": 10.3317, "text": "Browser CLI Since my last devlog, I implemented a CLI for Hadronize that works across Node, Deno, Bun, and browsers. You can try it out by visiting https://ethmarks.github.io/hadronize/cli or running the following commands (you only have to run one of the Node/Deno/Bun commands): # Clone the repo git clone https://github.com/ethmarks/hadronize.git cd hadronize # Run with Node (via npm or pnpm) npm install npm run cli # Run with Deno deno task cli # Run with Bun bun install bun run cli Link to the diff between last devlog and this one Abstraction In case you’re not familiar with the JS ecosystem, a cross-runtime CLI like this is not normal. My CLI uses styled text, but the different runtimes have different ways of logging styled text. Node, Deno, and Bun all use ANSI escape characters, but browsers use %c placeholders (Deno also supports %c because Deno is awesome, but none of the others do). Node uses the readline API to get user input, but Deno and Bun both use prompt() , and browsers don’t even have a way to get user input without clever tricks (as you’ll see later). My solution to the styled text problem was to create a custom micro-library which I call styledLog.ts (or sl for short) which invents an easy-to-use syntax for rich-text logging called slChunk , then automatically detects if it’s running in a browser and renders slChunks with either ANSI escapes or %c placeholders accordingly. Cross-runtime user input My solution to the user input problem was a little less elegant, but in my opinion it’s much cleverer. Node, Deno, and Bun were the low-hanging fruit. All I had to do was create an abstracted NbrInputFunc() function that automatically detects which runtime is running the code, then switches out the method it internally uses to fetch input accordingly. Easy. But implementing a CLI in the browser was a lot more tricky. I could have just used the window.prompt() method , but that opens a disruptive pop-up window that looks terrible. Instead, my code dynamically adds custom properties to the window object, then halts the script execution via a Promise<void> . Each custom property is named after a player name and has an anonymous getter function. When you type a player’s name (e.g. alice ) in the console, it automatically evaluates window.alice , which triggers the getter. The getter sets the userInput variable then resolves the frozen Promise to resume execution. I hope that made sense. It’s a really hacky solution, but it does work, and it provides an elegant input syntax that resembles that of terminal CLIs. My first idea (which is still used as the fallback) was to just define a window.turn() function, so you would enter your input with turn(\"alice\") . The current solution is much more elegant, in my opinion, because the user doesn’t need to type parenthesis or quotes. Here’s a link to the code if you want to check it out for yourself. Beginnings of the UI I also started working on the UI the tiniest bit. Not anything that’ll make it into the final version, mind you, but I added a page that demos the Hadronize CLI. It seemed wrong to make the demo page blank and not include instructions, so I wrote some. It seemed wrong to use unstyled bare HTML, so I added holidaycss . Next Steps I think that there’s still some work I need to do in the game logic and CLI before I start working on the UI. The CLI demo currently doesn’t have any way to customize the game settings (e.g. how many players there are and what deterministic seed to use), so I’ll probably work on that next. Thanks for reading!"}, {"post_id": 11813, "ts": "2026-06-19T07:15:15Z", "hours": 6.4697, "text": "Core Game Logic Today I implemented most of the core game logic in TypeScript. My code is pretty messy, probably has some bugs, and definitely has some idiosyncrasies that I should add docs for, but it does work correctly. Mostly. Here are a few highlights from today: Determinism The rules specify that quarks are created on-the-fly at the start of each turn, and that it’s impossible to predict what flavor a superposition will collapse into. Nondeterministic code makes me uncomfortable, so I decided to cheat a bit behind the scenes to make the whole thing pseudorandom and fully deterministic. In the game constructor, every quark that will ever be used during the game is pre-generated based on values from a mulberry32 function, then the collapsed flavor is predetermined ahead of time. Those two things: the list of future quarks that will be “created” on subsequent turns, and the flavor that each superposition will collapse into, are secret information that the players aren’t allowed to know, which means I have to be careful to sanitize the game state before it’s given to players. I hate references So, one of the first things that I did was create the Quark class. It has a few methods, but mainly it’s just a DTO for a flavor and a superposition. So my original plan was involved doing normal OOP and having each quark be owned by a Player class or the Game class itself. But once I actually started coding it, I remembered that I hate having to remember what’s stored as a value and what’s stored as a reference in JS. This is especially annoying when moving quarks between containers. So instead, I decided to just store an array of every extant quark, including not only a flavor and superposition but also an index. When a player class “owns” a quark, it really just owns that quark’s index number which corresponds to a quark in the game class’s SSoT. Crucially, the index number is a simple integer that doesn’t have any of JS’s object reference silliness. Timeline I decided that the game class should save every past state that it’s been in for some reason. I might use it in the UI to let users scroll back in time to see how the game played out, or maybe use it to make neat statistics at the end of the game, or something like that. It might also be useful for bots (more on that in a future devlog). But anyways, actually implementing the timeline was extremely frustrating, mainly due to Typescript. The final implementation that I settled on is pretty clean, but it was not my first thought, and I went through maybe a dozen different iterations over the course of an hour. Next Steps I’m probably going to spent a bit more time in the game logic before starting work on the UI. As I mentioned, I need to write docs for the idiosyncrasies of my code because otherwise I’ll forget how it works and that’s how bugs happen. Speaking of bugs, I’m sure that there are a few in my code, so I’ll probably write some tests to try to find them. Thanks for reading!"}, {"post_id": 11089, "ts": "2026-06-18T04:06:18Z", "hours": 3.65, "text": "Hadronize This is my first devlog for this project. It’s a multiplayer strategy game that you can play in your browser. https://github.com/ethmarks/hadronize Basically the only things that I’ve done so far are write the rules in the README and brainstorm a bunch. The rules are pretty important, so I’ll write them in this devlog. Because there’s a 4000-character limit to Stardance devlogs, I’m going to try to keep the rules shorter and less thorough than I did in the README. Rules Hadronize is a 2-6 player game which will probably take about ~10 minutes per game. The goal is to be the first player to hadronize 10 or more quarks. Quarks are basically the cards. There are 6 different flavors of quark: up, down, strange, charm, bottom, and top. By the way, I’m not making that part up . Quarks start out as Superposed Quarks, which are quarks in a state of superposition between three different flavors. Once the superposition collapses (more on that later), it chooses one of the three flavors in its superposition and becomes a normal quark with a single flavor. Each player starts with four collapsed quarks with randomly-chosen flavors in their respective cloud chamber . On each turn, a new superposed quark appears. The players know that the quark will be one of the three flavors in its superposition, but they don’t know which one. The player whose turn it is (aka the active player) will choose any player (including themselves) to be the observing player. The observing player observes the superposed quark, which collapses it and adds it to their cloud chamber. If the observing player has none of that flavor (e.g. the new quark collapsed into charm and the player only has down quarks), then nothing else happens and the turn ends. But if the observing player does have at least one quark of the same flavor, something does happen. If the active player chose themselves to be the observing player, the new quark reacts with all existing quarks of the same flavor, and they all hadronize together. If the active player chose a different player to be the observing player, the new quark reacts with all existing quarks of the same flavor, and they all quantum tunnel from the observing player’s chamber into the active player’s chamber. In other words, the active player steals some of the observing player’s quarks. If my explanation is unclear, check out the README because I probably explained it better there. If the README is unclear too, feel free to let me know by commenting on this devlog or opening an issue or whatever. Mantis If the rules sound familiar, it’s because I mostly just stole them from the card game Mantis by Exploding Kittens. My original idea was to just create a digital version of Mantis, but I was concerned about running into copyright trouble if I called it “Mantis” and used the same terminology and whatnot. Game mechanics can’t be copyrighted, but names and terminology absolutely can. I considered just making my game about abstract colors, but then I suddenly realized that making it about quarks would fit really well, so I did that instead. I did make a few changes to the core mechanics (e.g. using 6 flavors instead of 7 colors, and combining “scoring” and “stealing” into “observing”), but it’s still basically just a reskin of Mantis. Next Steps The next thing I’m going to work on is actually implementing the rules in TypeScript. After that I’ll probably work on the UI. P.S. I also spent like an hour making a terrible-looking banner for Hadronize to use as the Stardance project image."}]...
|
Title: Hadronize by @ethmarks | Stardance
Devlogs Title: Hadronize by @ethmarks | Stardance
Devlogs:
Hadronize This is my first devlog for this project. It’s a multiplayer strategy game that you can play in your browser. https://github.com/ethmarks/hadronize Basically the only things that I’ve done so far are write the rules in the README and brainstorm a bunch. The rules are pretty important, so I’ll write them in this devlog. Because there’s a 4000-character limit to Stardance devlogs, I’m going to try to keep the rules shorter and less thorough than I did in the README. Rules Hadronize is a 2-6 player game which will probably take about ~10 minutes per game. The goal is to be the first player to hadronize 10 or more quarks. Quarks are basically the cards. There are 6 different flavors of quark: up, down, strange, charm, bottom, and top. By the way, I’m not making that part up . Quarks start out as Superposed Quarks, which are quarks in a state of superposition between three different flavors. Once the superposition collapses (more on that later), it chooses one of the three flavors in its superposition and becomes a normal quark with a single flavor. Each player starts with four collapsed quarks with randomly-chosen flavors in their respective cloud chamber . On each turn, a new superposed quark appears. The players know that the quark will be one of the three flavors in its superposition, but they don’t know which one. The player whose turn it is (aka the active player) will choose any player (including themselves) to be the observing player. The observing player observes the superposed quark, which collapses it and adds it to their cloud chamber. If the observing player has none of that flavor (e.g. the new quark collapsed into charm and the player only has down quarks), then nothing else happens and the turn ends. But if the observing player does have at least one quark of the same flavor, something does happen. If the active player chose themselves to be the observing player, the new quark reacts with all existing quarks of the same flavor, and they all hadronize together. If the active player chose a different player to be the observing player, the new quark reacts with all existing quarks of the same flavor, and they all quantum tunnel from the observing player’s chamber into the active player’s chamber. In other words, the active player steals some of the observing player’s quarks. If my explanation is unclear, check out the README because I probably explained it better there. If the README is unclear too, feel free to let me know by commenting on this devlog or opening an issue or whatever. Mantis If the rules sound familiar, it’s because I mostly just stole them from the card game Mantis by Exploding Kittens. My original idea was to just create a digital version of Mantis, but I was concerned about running into copyright trouble if I called it “Mantis” and used the same terminology and whatnot. Game mechanics can’t be copyrighted, but names and terminology absolutely can. I considered just making my game about abstract colors, but then I suddenly realized that making it about quarks would fit really well, so I did that instead. I did make a few changes to the core mechanics (e.g. using 6 flavors instead of 7 colors, and combining “scoring” and “stealing” into “observing”), but it’s still basically just a reskin of Mantis. Next Steps The next thing I’m going to work on is actually implementing the rules in TypeScript. After that I’ll probably work on the UI. P.S. I also spent like an hour making a terrible-looking banner for Hadronize to use as the Stardance project image.
Core Game Logic Today I implemented most of the core game logic in TypeScript. My code is pretty messy, probably has some bugs, and definitely has some idiosyncrasies that I should add docs for, but it does work correctly. Mostly. Here are a few highlights from today: Determinism The rules specify that quarks are created on-the-fly at the start of each turn, and that it’s impossible to predict what flavor a superposition will collapse into. Nondeterministic code makes me uncomfortable, so I decided to cheat a bit behind the scenes to make the whole thing pseudorandom and fully deterministic. In the game constructor, every quark that will ever be used during the game is pre-generated based on values from a mulberry32 function, then the collapsed flavor is predetermined ahead of time. Those two things: the list of future quarks that will be “created” on subsequent turns, and the flavor that each superposition will collapse into, are secret information that the players aren’t allowed to know, which means I have to be careful to sanitize the game state before it’s given to players. I hate references So, one of the first things that I did was create the Quark class. It has a few methods, but mainly it’s just a DTO for a flavor and a superposition. So my original plan was involved doing normal OOP and having each quark be owned by a Player class or the Game class itself. But once I actually started coding it, I remembered that I hate having to remember what’s stored as a value and what’s stored as a reference in JS. This is especially annoying when moving quarks between containers. So instead, I decided to just store an array of every extant quark, including not only a flavor and superposition but also an index. When a player class “owns” a quark, it really just owns that quark’s index number which corresponds to a quark in the game class’s SSoT. Crucially, the index number is a simple integer that doesn’t have any of JS’s object reference silliness. Timeline I decided that the game class should save every past state that it’s been in for some reason. I might use it in the UI to let users scroll back in time to see how the game played out, or maybe use it to make neat statistics at the end of the game, or something like that. It might also be useful for bots (more on that in a future devlog). But anyways, actually implementing the timeline was extremely frustrating, mainly due to Typescript. The final implementation that I settled on is pretty clean, but it was not my first thought, and I went through maybe a dozen different iterations over the course of an hour. Next Steps I’m probably going to spent a bit more time in the game logic before starting work on the UI. As I mentioned, I need to write docs for the idiosyncrasies of my code because otherwise I’ll forget how it works and that’s how bugs happen. Speaking of bugs, I’m sure that there are a few in my code, so I’ll probably write some tests to try to find them. Thanks for reading!
Browser CLI Since my last devlog, I implemented a CLI for Hadronize that works across Node, Deno, Bun, and browsers. You can try it out by visiting https://ethmarks.github.io/hadronize/cli or running the following commands (you only have to run one of the Node/Deno/Bun commands): # Clone the repo git clone https://github.com/ethmarks/hadronize.git cd hadronize # Run with Node (via npm or pnpm) npm install npm run cli # Run with Deno deno task cli # Run with Bun bun install bun run cli Link to the diff between last devlog and this one Abstraction In case you’re not familiar with the JS ecosystem, a cross-runtime CLI like this is not normal. My CLI uses styled text, but the different runtimes have different ways of logging styled text. Node, Deno, and Bun all use ANSI escape characters, but browsers use %c placeholders (Deno also supports %c because Deno is awesome, but none of the others do). Node uses the readline API to get user input, but Deno and Bun both use prompt() , and browsers don’t even have a way to get user input without clever tricks (as you’ll see later). My solution to the styled text problem was to create a custom micro-library which I call styledLog.ts (or sl for short) which invents an easy-to-use syntax for rich-text logging called slChunk , then automatically detects if it’s running in a browser and renders slChunks with either ANSI escapes or %c placeholders accordingly. Cross-runtime user input My solution to the user input problem was a little less elegant, but in my opinion it’s much cleverer. Node, Deno, and Bun were the low-hanging fruit. All I had to do was create an abstracted NbrInputFunc() function that automatically detects which runtime is running the code, then switches out the method it internally uses to fetch input accordingly. Easy. But implementing a CLI in the browser was a lot more tricky. I could have just used the window.prompt() method , but that opens a disruptive pop-up window that looks terrible. Instead, my code dynamically adds custom properties to the window object, then halts the script execution via a Promise<void> . Each custom property is named after a player name and has an anonymous getter function. When you type a player’s name (e.g. alice ) in the console, it automatically evaluates window.alice , which triggers the getter. The getter sets the userInput variable then resolves the frozen Promise to resume execution. I hope that made sense. It’s a really hacky solution, but it does work, and it provides an elegant input syntax that resembles that of terminal CLIs. My first idea (which is still used as the fallback) was to just define a window.turn() function, so you would enter your input with turn("alice") . The current solution is much more elegant, in my opinion, because the user doesn’t need to type parenthesis or quotes. Here’s a link to the code if you want to check it out for yourself. Beginnings of the UI I also started working on the UI the tiniest bit. Not anything that’ll make it into the final version, mind you, but I added a page that demos the Hadronize CLI. It seemed wrong to make the demo page blank and not include instructions, so I wrote some. It seemed wrong to use unstyled bare HTML, so I added holidaycss . Next Steps I think that there’s still some work I need to do in the game logic and CLI before I start working on the UI. The CLI demo currently doesn’t have any way to customize the game settings (e.g. how many players there are and what deterministic seed to use), so I’ll probably work on that next. Thanks for reading!
Setup Flow diff from last devlog to this one Since my last devlog, I added a flow that lets users set up each game before starting it. The setup includes specifying the seed, player count, the names of each player, and whether each player should be a human or a bot. I made it work in three different formats, each of which had to be implemented individually: The terminal : at its core, this format is just a normal TUI. It prints input prompts, awaits the user’s input using the abstracted NbrInputFunc I mentioned last time, and repeats this until the user provides an input that passes the validation function. Pretty standard stuff. The browser console : I used the same trick that I described last time to allow users to enter their input via the browser console. It creates a custom window property that resumes execution, then halts execution with a Promise<void> until the window property is called. Unfortunately, it wasn’t possible to use the anonymous getter trick that I used last time. If I did that, I would have to create custom window properties for every possible 32-bit number to allow user to enter the seed, and create custom properties for every possible string to allow users to enter player names. That obviously wasn’t possible, so instead I just created a window.r function that takes any input type. The “r” stands for “respond”. To set the seed to 42, you type r(42) into the console, which is a reasonably clean UX, I think, though not as clean as just typing 42 like you can in the terminal. The webpage : this uses HTML <input> s and SvelteKit’s reactivity. The trickiest part was navigating the fact that the value of one of the inputs (player count) controls the structure of some of the other inputs (player configs). At first I tried writing code to dynamically construct a variable-length Array, but that was a nightmare of complexity. Then I tried making all 6 possible player configs visible all the time and just adding the “Disabled” type, but that made the UI look ugly and was also kind of complicated to implement. The solution I settled on was to internally use an Array with a fixed length, automatically hide the player config UI elements with an index less than the player count value, and slice the player config Array before passing it into the main game function. I think that this solution is the best of both worlds while also being fairly simple to implement. Next Steps I know that I’ve been saying this for the past 4 days, but I need to write some internal docs for my game logic code and write tests. I haven’t noticed any bugs during my playtests while building the CLI, but I’d like the peace of mind to be fairly confident that I’ve implemented my game rules correctly.
CLI Remote Script You can now run Hadronize CLI in a terminal without cloning the repo. If you run the command below, Deno will automatically fetch all the dependencies. deno run -A http://ethmarks.github.io/hadronize/cli.ts Node doesn’t support remote scripts because it lacks Deno’s awesomeness, but because of the Deno binary on npm , you can run Deno (and therefore Hadronize) through any of the other package managers! npx deno run -A http://ethmarks.github.io/hadronize/cli.ts pnpm dlx deno run -A http://ethmarks.github.io/hadronize/cli.ts bunx deno run -A http://ethmarks.github.io/hadronize/cli.ts For example, in the attached screenshot, I SSH-ed into one of my home servers that hadn’t cloned the Hadronize repo nor installed Deno, and tried to run Hadronize as a remote script via pnpm . After resolving dependencies for a few seconds, it ran flawlessly. How it works I first encountered Deno remote scripts in Lume’s init command , and my implementation is heavily inspired by it. Basically, all that the cli.ts file does is fetch the CLI code from JSDelivr, which fetches it directly from the GitHub repo. From there, Deno is smart enough to resolve all of the CLI code’s dependencies and run it. Compatibility Before today’s changes, running Hadronize via Deno worked perfectly fine. deno task cli behaved identically to pnpm run cli . However, that’s because Deno has an automatic Node compatibility layer , not because Deno can actually run the code natively. That compatibility layer doesn’t really work with remote scripts (because Deno can’t find the package.json ), so when I first tried to run the remote script while developing it, it crashed and burned immediately. This was because, without the compatibility layer, Deno and Node handle things fundamentally differently. There were several differences, some of which I expected and some of which I didn’t, but the easiest one to understand is NPM imports. NPM imports My CLI code relies on the picocolors library for getting ANSI escape codes. When I was first writing the code, I added the picocolors package via NPM and imported it in the normal Node way: import pc from " picocolors " ; The problem is that Deno can’t parse bare imports like that. Deno expects this format, which Node cannot parse: import pc from " npm:picocolors " ; I tried configuring an import map in deno.json , but it didn’t work. I considered just hardcoding the ANSI escape sequences, but I decided that I would need to figure out how to polyglottally import NPM packages in both Node and Deno at some point, so I might as well figure it out now. My solution was to create a deps/picocolors.ts file to proxy the picocolors import by dynamically importing it based on whether it’s being run in Deno or not: const { default : pc } = " Deno " in globalThis ? await import ( " npm:picocolors " ) : await import ( " picocolors " ); export default pc ; NPM imports were only one of the issues that sprung up. Frustratingly, the only way to test whether or not a solution worked was to commit, push to main, and test on production. The whole Deno compatibility saga required 12 commits in total. Next Steps I’m still working on writing unit tests for the game logic. I already have a few tests, but they’re definitely not comprehensive. I’ll write a devlog about the tests once I’m finished with them.
Tests and CLI Args You can now add arguments to the Hadronize CLI in the terminal, which lets you avoid having to use the setup flow. Here’s an example. pnpm run cli --seed 12345 --player Alice:human --player Bob:bot It also works if you run the CLI as a remote script. deno run -A http://ethmarks.github.io/hadronize/cli.ts -s 8 -p a:bot -p b:bot -p c:bot This was pretty easy to implement. I just used Node’s parseArgs utility for the main arg parsing and wrote a bunch of validation logic that converts the raw arguments (which are always strings) into the data types that my code uses. Tests Over the past couple days, I’ve made a little test suite for the game logic using Vitest. I’ve written 19 individual tests, but some of them repeat multiple times with different game seeds and whatnot to ensure that it works with a variety of inputs, so Vitest actually runs 101 tests in total. All of the tests pass, and I didn’t discover any bugs, which either means that I managed to get all the game logic correct on the first try, or that there’s something wrong with my tests. Next Steps I think that I’ve probably spent too much time on the CLI. I don’t think that it was time wasted, but I probably ought to get started on the main game UI.
Drivers Each player in Hadronize is controlled by a Driver, which is basically just a function that takes the current game state as an input and outputs a player. I implemented drivers on like day #2, but I don’t think I’ve talked about them in a devlog yet. The first driver I made is the dogpile driver. It’s logic is extremely simple: it just selects the player who goes first. It doesn’t even reference the game state at all. If every player is a dogpile driver, this means that everyone just dogpiles onto the first player and ends up stealing basically all of its quarks before it can use them. This is obviously a terrible strategy because it’s not even capable of trying to score, but it was very simple to implement and I use it as a placeholder. The second driver I made is the rng driver. It just makes random decisions. However, because I insist on everything being deterministic, it can’t just use Math.random . Instead, it stringifies the game state, converts that string into a 32-bit integer via a djb2 hash, then uses that integer to seed a mulberry32 pseudorandom number generator, then uses the output of the mulberry to make its player selection. The newest driver that I just finished developing is the expected value driver. It does actual strategic calculations to determine what the expected value of choosing each player would be based on the information it has available, then selects the player that maximizes that value. Next Steps I’ve started building the UI, but I’ve still been procrastinating on actually working on it in earnest. I should probably do that.
Huge UI Progress diff from last devlog to this one I’ve been working a lot on the Hadronize UI. Last devlog, all that it could do was render all of the quarks into a big overlapping heap and you could drag around one specific quark. Now, you can play a full game in the UI from start to finish, and it’s reasonably polished. How to play the UI prototype Visit https://ethmarks.github.io/hadronize/play . Make sure that you’ve read the game rules in the README . I haven’t implemented a setup flow in the main UI yet, so right now it’s pre-configured with two human players named Arthur and Ford, one bot player named Marvin, and seed 42. On each human player’s turn (their name will be highlighted in yellow), click and drag the superposed quark to the chamber of the player who you want to observe it. The superposed quark will collapse, get added to the chamber you selected, possibly react with existing quarks, and then play will proceed to the next player. Continue this until someone wins. It will probably be Marvin. Refresh the page to play again. Playtest I also conducted the first playtest with a few friends. Nothing broke during the playtest and they all liked it and gave positive feedback, which was really encouraging. We all got absolutely crushed by the expected value driver I built last devlog. Next Steps It sounds hyperbolic to say that this UI is the messiest code I’ve ever written, but I legitimately can’t think of any other contenders. Of the 800+ lines of code in the UI, about 570 of them are in one massive Game.svelte component. This component handles state tracking, mouse movement, the main game loop, and most of the geometry to position the quarks. The very next thing that I need to do is massively refactor the UI code. After that, I have a few ideas: A setup flow that lets the user choose the seed to use and configure the players. Sound effects, UI indicators (e.g. “you formed a baryon!”), and other game juice. Proper mobile support. Right now it kind of works on mobile, but the layout gets really cramped. I’ve been working a lot on the Hadronize UI. Last devlog, all that it could do was render all of the quarks into a big overlapping heap and you could drag around one specific quark. Now, you can play a full game in the UI from start to finish, and it’s reasonably polished.
UI Refactor diff from last devlog to this one I refactored the Hadronize UI code. Rather than one giant 570-line file that handled the quark positioning, state tracking, mouse movement, and game loop, I split the code into four different files, each dedicated to one specific thing, with an average line count of ~154 (191, 184, 111, and 132, respectively). This makes the codebase way more maintainable and easy to work in. I also deduplicated most of the main game loop code. Before, I had just copied the entire content of the executeTurn() function, pasted it into the UI code, and customized it until the logic code correctly interfaced with the UI. Maintaining two separate functions that do basically the same thing is bad practice, so today I came up with an alternative solution: adding a bunch of “hooks” as optional parameters, which are just functions that the executeTurn() function runs at specific stages. In a CLI game, the hooks are never provided to the function, so they’re never run and nothing changes. But the UI code does provide hooks, to do things like trigger re-renders. This way, the same code can be reused for two different use cases (CLI and UI). Next Steps There’s still more refactoring to do, but I don’t think that I’ll do any more major restructuring.
UI Setup Flow diff from last devlog to this one I added a setup flow to the main UI page, and did a lot of refactoring. I also removed support for setting up the game via browser console. I didn’t make this choice lightly because it was a fun feature, but the tradeoffs were just too much and I decided that it wasn’t worth it, especially because the console setup is much clunkier than just using the HTML form, so I doubt anyone would even use it. But anyways, the main focus of this devlog is the setup flow on the main UI page (aka the play page). I also added some pretty sleek animations when activating and deactivating the game overlay.
Style improvements and new pages So, funny story about the site styles. When I first made the CLI page 3 weeks ago (has it really been that long?! wow), I added holiday.css to make it look nice as a stopgap measure until I made the real styles. However, as the old saying goes, there’s nothing more permanent than a temporary solution. I’ve decided to just embrace using holiday.css for the entire site because it looks much nicer than anything I could make. The styles in the actual game component are entirely my own, of course, but the homepage, rule page, and rewritten CLI page all use holiday.css. “what rule page and rewritten CLI page?”, you ask? That’s the other thing that I did this devlog. I created a dedicated page on the site for the rules, and I rewrote the CLI page to only contain instructions on how to use the CLI rather than a playable browser CLI. Don’t worry, you can still play Hadronize via the browser console. The main UI has had that functionality since the beginning. I just didn’t see a reason to maintain two different game UIs, especially because the main UI can do everything that the playable CLI page could (and much more). I think that next I’ll start polishing the game UI. It’s long overdue. I’ll add sound effects, add mobile support, and maybe (don’t hold me to this) improve the graphics.
Mouse handler refactor https://github.com/ethmarks/hadronize/commit/3a5adcb I started working on writing audio code and looking through sound effect libraries, but when I tried to hook my WIP sound-playing function into the mouse handler, I realized what an awful mess my mouse handler code was. So I spent over an hour refactoring it. While I was at it, I optimized it a tiny bit and fixed the hover thrashing bug that had been bugging me for nearly 2 weeks now.
Sound effects! I added sound effects to the game UI. A unique sound plays for each of these: Starting a game Dragging a quark over a chamber Dropping a quark onto a chamber A quark hadronizing A quark tunneling Winning a game Closing a game I sourced them all from https://freesound.org/ , and I left attribution for each one in sounds.svelte.ts . I also modified a few in Audacity to trim them or apply simple effects. I’m not sure that I’m 100% satisfied with the sounds. I sourced almost all of the effects from different freesound sounds because I couldn’t find a sound pack that I liked, so the sounds don’t quite match tonally. Some of them are generic UI sounds while others are clearly scifi-ey. I may change some of the sounds later if I find more cohesive ones. I’d never done audio in HTML/JS before, so this was new for me. I originally just used the Audio() constructor because that was the most obvious way to play, but when I realized the many issues with it (though it did work!), I rewrote my code to use AudioContext . I also made a multi-step preloading and decoding pipeline that fetches all sound effects on page load, but doesn’t decode them until the user presses a button because otherwise JS throws a warning in the console and suspends the audio context. I think that the sound effects make Hadronize feel a lot more polished and nicer to play. Next up on my list is mobile support. I’m not looking forward to it. (Make sure to turn on sound for the video below)
So the first step to mobile support is making the all of the quarks in all of the chambers actually fit on a phone screen. Right now they just overlap a bunch and you can’t tell which quarks belong to who. I have some ideas for an algorithm that can automatically adjust layout variables until everything fits, but first I need to give the algorithm things that it can adjust. The crux of the problem is that there’s simply no way to fit 6 chambers in a circular ring around the center of the screen on mobile. There’s just not enough screen space. So I made a new layout that places chambers in a grid instead of a ring. It works on desktop in addition to mobile. I don’t think it looks quite as nice, but it’s much more space efficient. I attached some side-by-side comparison screenshots. As you can see, the quarks still don’t quite fit on mobile even with the grid layout, but it’s much closer. Next step is either writing the automatic layout algorithm, or making input work on mobile.
Layout optimization algorithm It took an entire day, but I did it. Hadronize will now automatically adjust 5 different layout variables in order of priority to make everything fit on screen. I think that the algorithm is probably the most complicated part of this entire project. I’m going to try to explain it really simply in this devlog, but if you want to see how it actually works, I wrote a bunch of comments that explain the priority pipeline in this file . So basically, every time a new layout update is triggered, the layout manager calculates a brand new layout plan from scratch. Once it’s finished calculating, it applies the layout plan onto the actual layout variables that are used to move the quarks on the screen. If I modified the layout variables directly, the rapid-fire modifications while calculating would trigger a bajillion reactive updates from Svelte which would slow the page down. Anyways, the way that the layout plan is calculated is that it starts by assuming ideal conditions: there is more than enough room for everything to fit comfortably. So it does the calculations using the preferred ideal variables, it modifies the plan, and then it actually checks to see if anything is overlapping. If there is any overlap, it tries to resolve it using the least-disruptive adjustment it can make. If that doesn’t work, it tries the next least-disruptive adjustment. And so on. Also, each time it moves up the chain of disruptiveness, it tries to use the ideal variables for all of the less-disruptive adjustments. If that makes sense. Here are the adjustments that it can make, in ascending order of disruptiveness: Increasing the radius of the ring of quarks of a single chamber Adjusting the radius of the ring of chambers around the center of the screen Switching chambers to use count mode, which is when it only displays the number of quarks of each flavor rather than displaying each quark individually. Switching the global layout from ring mode to grid mode. This is the thing that I built last devlog. Decreasing the size of all quarks I’m pleased to report that when I tested it on my phone, everything worked perfectly. I still haven’t implemented mobile input yet, but I started a 6-player game of all bots, and the layout planner managed to keep all of the quarks visible all of the time, even when a single chamber had more than 20 quarks. Never once did I see two chambers overlap with each other or go partially offscreen, which used to happen 100% of the time on small mobile screens. It just changed layout modes and decreased the quark size whenever it started to run out of room. Anyways, I’m not going to merge the new layout planner just yet because I’m not 100% sure how stable it is, but I’ll do that soon. Next up is mobile input.
Touchscreen support Idk why I was worried that this would be difficult. Less than 20 lines of code later, Hadronize now automatically detects whether you’re using a fine pointer (e.g. a mouse) or a coarse pointer (e.g. a touchscreen), and changes its behavior accordingly. So now you can select chambers on touchscreen just by tapping on them. You don’t have to drag the superposed quark, you just tap. I recorded a video showcasing this in action using Firefox’s mobile device simulator (aka RDM). As you can see, when I disable touch simulation, the chambers respond to hovering and I have to drag the quark around. But when I enable touch, the chambers don’t react at all until I click one, and then the superposed quark gets added to that chamber like normal. I’ve also tested this on an actual phone and it works perfectly, but it’s more difficult to record on there which is why I used Firefox’s simulator for the video.
Minor graphics improvements This is a smaller devlog. Stuff I did since last devlog: Fixed the winning animation to work with the new layout planner Added transitions to the quark text. Whenever a quark changes its display text (e.g. from a ‘?’ to a flavor abbreviation like ‘s’), rather than instantly snapping to the new text, it’ll do a quick crossfade. Changing the font used for the quark text from the default to a font called Degheest that I think looks nice. Merging the layout refactor into prod because I’ve decided that it seems stable enough. Next, I’m going to work on improving the quark graphics. I’m trying to go for an aesthetic that looks like it’s from a physics textbook (hence the dot grid backdrop I’ve had for a while), so it’s already pretty close, but imo it looks a bit too plain right now. I don’t have a precise vision for exactly what I want the quarks to look like, so I’ll need to figure that out.
New quark style I made new quark graphics, like I promised last devlog. I’m not really sure if it fits the aesthetic I’m going for, but it’s something , and I tried to make it extensible so that I can experiment with more styles later. I also added a dropdown menu in the setup flow so that you can select which style you want to use, though I might remove that in the future if I decide on one style to be the definitive one. The new style is just patterns masked onto the same flat color circles as before. Each flavor has a different pattern: up: vertical lines down: horizontal lines charm: checkerboard strange: square grid with irregular shading top: light dot grid bottom: dark rhombus grid hadron: solid (unchanged) I don’t know if this makes the quarks look nicer or not, but it definitely makes them more accessible. If the abbreviation text isn’t visible for whatever reason (e.g. because the chamber is in count layout mode), quark flavors used to be distinguished solely by color. But the new patterns make them distinguishable without color, which is important for colorblind accessibility.
QuickJS drivers I can now store driver strategy code as strings, execute the strings as JS code using QuickJS , read the quickjs output, and use it as driver output. This might not sound like much of a difference, but it completely changes how I can run drivers. Before, all driver strategies had to be present in the actual source code. Now, they just have to be strings. Because we can manipulate strings at runtime, this means that we can create new drivers while the site is running without modifying the source code. In other words: this lays the groundwork for letting you create and play against your own drivers without making a PR to the repo. To make sure that my implementation works, I converted the expected value driver to use quickjs. I enclosed all of the actual logic in backticks, making it a giant string, and then passed the string through my quickjs driver factory function. I ran the expected value driver test suite, and it failed immediately because I forgot to remove the type annotations (quickjs can only execute plain JS, not TS). But once I fixed that, all 19 tests passed, and it seems to work perfectly from my playtests. I eventually plan on adding a page that uses Prism code editor to let users edit driver strategies and save them to localStorage. But first I’m going to add more features to the quickjs runtime. For example, I want to have it swap all Math.random() calls with a deterministic psuedorandom generator, so that way developers can use randomness without making it non-deterministic.
Bot editor I integrated the QuickJS driver code that I made last devlog into the rest of the site. Things I did: I made the QuickJS VM override the default Math.random function and replace it with a mulberry32 prng seeded by stringifying the game state and hashing it through djbs2 . So now drivers can still use Math.random without making the rng predictable or sacrificing perfect determinism. I gave the drivers names and descriptions. The prng driver is named “Bogo” (after Bogosort ) and the expected value driver is named “EVan” (because it’s a normal name that starts with the abbreviation of “ E xpected V alue”). I moved the code for the existing drivers into a centralized array, rather than in multiple different files that had to be imported individually. I’m calling this array the “stock drivers”. I added a bot editor page. You can check it out at https://ethmarks.github.io/hadronize/bots . I used contenteditable and Svelte’s bind:textContent to let users edit the title, ID, and description. I used Prism code editor as the embedded IDE for editing the actual driver code. I made the play page fetch the list of drivers from localstorage on page load, defaulting to the stock drivers. I also made the bot editor automatically sync the drivers to localstorage . I added a new driver strategy: tit for tat . As expected, it plays pretty terribly because that strategy just isn’t very good in Hadronize. I mostly made it so that users looking at the stock drivers can learn how to reference the timeline from the state. I think that next I’ll work on a driver ranking system so that when I make more drivers, I’ll know whether they’re better or worse than the others. I might research how chess ranking systems work and copy concepts from those.
Benchmark Before I started working on the bot ranking arena, I did a quick sidequest to figure out how many games per second I could simulate. So I wrote this script to execute a bunch of games sequentially, then print the elapsed time and calculate the games per second rate. I ran the benchmark in Node 24.15.0 on my 4.40 GHz Intel i5-12450H using Bogo drivers: Simulated 82157 turns across 1000 games Took 109048ms (109.048s). Speed is 9.170273640965446 games per second So that was surprising. I was expecting a speed in the low thousands, but instead it was less than 10. I had a suspicion what was causing the slowdowns. To make sure, I swapped out the Bogo driver (which uses QuickJS) with a non-QuickJS driver that I made for testing, and reran the same benchmark: Simulated 53854 turns across 1000 games. Took 130ms (0.13s). Speed is 7692.307692307692 games per second (the turn count is smaller because the drivers used a different strategy which made games end faster) So, obviously, the slowdown is caused entirely by QuickJS. Which makes sense. Every time a QuickJS driver is invoked, it spins up a brand new QuickJS VM, configures it, executes the actual code, extracts the return value from the VM, disposes of the VM to avoid memory leaks, and then finally returns the value. Non-QuickJS drivers can just execute the code directly, and the code can be optimized very well by the JIT compiler that Node uses. So the solution seems simple, right? Just don’t use QuickJS for the drivers. Whatever the advantages of using QuickJS are, surely they aren’t worth an 839x decrease in performance. Well, unfortunately that’s not an option. More specifically, dynamically running strings of JS (like the driver code that users write at runtime) as native code is not possible, so I have to use a JS VM. And QuickJS is by far the best embeddable JS VM that I know of. So I just have to accept the slowness. This means that I’ll have to be clever about the bot arena, though. I can’t just brute-force a ranking with thousands of games if I can only run 10 games per second. btw, if you’d like to see how your PC does on my benchmark, just run these commands: git clone https://github.com/ethmarks/hadronize.git cd hadronize pnpm install pnpm bench --count 1000 --driver prng If your time is faster than mine, leave a comment to gloat.
Discontinuing the ranking arena I’ve decided to stop working on the driver ranking arena. I already have an MVP that works well enough to kinda sorta determine which drivers are good and which are bad, but it’s not robust and it just sums up rankings rather than implementing an actual Elo algorithm . The reason I’m not going to continue working on it is that it seems like a lot of work, and I don’t think that it’ll provide any value. Like, at all. The root of the problem is that Hadronize just isn’t a strategic-enough game. There’s certainly some strategy, of course, and probabilistic modeling, but luck plays just as much of a factor. The cleverest Hadronize driver can still routinely lose to the dumbest one just due to slightly bad luck. So it doesn’t really make sense to build tooling for strategic bots if the strategy is not a very big aspect of the game. Thinking back, I’m not really sure why I decided to start working on the driver arena in the first place. It just seemed like the right thing to do at the time even though I now realize that it would be kind of useless. Anyways, I also created two new drivers. The first is called Kingslayer, and it just tries to steal from the player who’s currently winning. It’s not very good at actually winning, but it does make things more challenging for the other players. The second is called Gentleman (aka charm ). It’s obsessed with trying to collect charm quarks, because its a charming gentleman. I made it as a joke because I thought it was funny, but to my complete surprise it turns out to be a pretty good strategy? Not charm quarks in particular, but trying to collect a specific flavor of quark at all costs turns out to be surprisingly effective. It consistently wins more often than EVan, the driver that I specifically built to be a good strategy and that actually does probabilistic expected value calculations. I think that next I’ll start working on the README and documentation, because I haven’t updated the README in like 3 weeks and it’s extremely outdated.
How to play page I wrote a page that explains how to play, assuming zero knowledge. I think that this’ll be helpful for onboarding, because this way they learn the rules at the same time as they learn how to use the UI, rather than reading the abstract and theoretical rules and then trial-and-erroring their way through the UI. The actual writing part took a few hours, and most of it was revision and trying to find better ways to phrase things. It’s nearly 1000 words, meaning I could turn it in for an essay assignment and not fail the word count, which is funny. But what also took a lot of time was making the visual aid. I had to record myself performing the same action in the UI many times to get a perfect take, and then I had to craft an ffmpeg command to crop and trim it because I refuse to use graphical video editors. Also my recording software kept stuffing H.264 video data in a webm container, which made ffmpeg freak out because that file is technically corrupted. I also had to figure out how to screen record on my phone to get a tap indicator, which I’d never done before. You can read the page here: https://ethmarks.github.io/hadronize/how
Revised README I worked on updating and basically completely rewriting the README to something more polished. I still need to add more sections and revise what I have, but I think that it’s alright. I’m trying to strike a balance between not having enough content and being a wall of text. It’s also surprisingly difficult to come up with bullet points for the features list. After I finish up the README, I’m going to redesign the home page a bit. After that, I think I might be ready to ship.
Revised Readme (again) Still working on the README. I think that Hadronize is more or less ready to ship now, but there’s probably still a bit more polishing I can do. In my other Stardance projects, I’ve gotten really positive feedback on my READMEs, so apparently my writing style and README format of choice is a winning combination. I’ve been referencing my past READMEs and the Stardance README guide a lot while writing this one. The bulk of what I added was the How it Works section, which explains some of the technical details and design choices that I made. It’s a dense topic so it’s obviously a long section. At first it was just a wall of text, even when I tried to break it up with lists and subheadings. So I spent about half an hour taking screenshots and editing them in GIMP until I had decorative images that I was satisfied with for each subsection. I think that drop shadows on transparent backgrounds look really cool in README images, so I used GIMP’s drop shadow filter to add them to my screenshots (in addition to cropping, rounding corners, et cetera). I kept fiddling with the drop shadow settings and I didn’t want to go back and redo the images that I’d already done, so the shadows are kind of inconsistent, which really irks me but I don’t think is very noticeable. I also added a Running Locally section and fixed a few typos throughout the README. Lastly, I did a bit of work on the home page. I added a big screenshot below the intro paragraph, thanks to feedback from the awesome @Luksus , whose project you should totally check out .
Shipping I did a few miscellaneous things like make the remote script endpoint production-ready, fix some typos across the project, and create a favicon in Inkscape. After I write this devlog, I’m going to press the big “Ship your project!” button. If you’re a reviewer reading this: I hope you enjoy Hadronize. It’s one of my biggest projects ever, and I’m really proud of how it’s turned out.
Ships:
Hadronize: a quark-themed set collection game. It has a web UI with a custom SvelteKit virtual layout engine, a polyglot CLI that runs across Node, Deno, Bun, and the browser console, a QuickJS bot sandbox, a comprehensive test suite, and more. I’m really proud of Hadronize and hope that you enjoy it....
|
1793087335.1261265
|
1793173735.1261265
|
|
29102
|
AniSuffle by @PAPER_01 | Stardance
|
PAPER_01
|
1
|
118.0
|
1811
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T11:29:39Z", "hours": 77.0, "multiplier": 19.59, "payout": 1811, "blessing": "blessed", "text": "# Welcome to the shipping devlog (I guess , I don't know what its called) (≧▽≦) Hey um.. In this section I will be giving the overview of my entire project , I will try to keep things simple and short. *(please read github as i m facing limit issue here)* (╥﹏╥) Ok, so my project **\"AniSuffle\"** is a webpage where you can get random Anime/Manga recommendations. But there is way more things I worked on , please let me explain. ( •̀ ω •́ )✧ ## Features ### Generate Random Anime/Manga I have integrated **4 APIs** (**Jikan, Anilist, Kitsu And MangaDex**) for fetching Anime/Manga recommendations. Jikan, Anilist and Kitsu can fetch both Anime and Manga while MangaDex fetches Manga only. They all work together as a fallback system, so if one API fails, another will handle it , you (solving the rate limit issue). =) ### Authentication (Login/SignUP) Logging in or signing in is **NOT COMPULSORY**. I repeat , as I can understand that its such a pain, I had to add it so that you could access the list anywhere in any device . **Make sure to enter unique username in the signup page** The only thing it gives you is access to your saved list across different devices. If you don't want to use your personal email while reviewing, you can use a temporary email. I have also uploaded a video in **Devlog #12** showing how to do it Just in case you dont know how to do that =) ### LocalStorage & Database * Not signed in → saves are stored in **LocalStorage**. * Signed in → saves are stored in the **Database**. * Existing LocalStorage saves are automatically transferred to the database after login to avoid duplication. ### Genre Selection You can generate recommendations based on your selected genre. Some APIs name genres differently, so in a few cases you may receive a closely related genre instead. ### Other Features * Embedded YouTube trailers (when available) * Switch between Anime & Manga * High Rated First (7+ rating) * Double click the poster to save * External links to Crunchyroll, Netflix, AnimeSuge, MangaDex, Viz, BookWalker and YouTube (if available on the API) --- ## Detailed Explanation Please read the **README** on the GitHub repository if you'd like the detailed explanation of how everything works. I had to shorten this because I'm exceeding the character limit. (>﹏<) --- Thank you so so so much. I really really really hope you will like this project. (づ。◕‿‿◕。)づ", "repo": "https://github.com/sudipstha-01/AniSuffle", "demo": "https://shrestha-project-07.wuaze.com"}]...
|
[{"post_id": 35576, "ts": "202 [{"post_id": 35576, "ts": "2026-07-27T03:30:46Z", "hours": 3.0, "text": "Devlog #23 Hello everyone, Welcome to Devlog #23 of AniSuffle ! Update One more bug ,fixed and found . So, till now the username stored would only be saved if someone entered the name in the intro and played the guess rating game. And now its fixed and Now the username is stored in the database immediately after the username name is submitted in the intro username section. Also One more thing , if someone took the username as “PAPER” and later if someone tries “paper” then the name will not be allowed. I did it just to be safe and later no any confusion or bug to occur just becase of the case of the entered word . I will add a screenshot of username is taken below(As I dont know what screenshot to add on this devlog :p ). I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 35163, "ts": "2026-07-26T12:39:55Z", "hours": 4.0, "text": "Devlog #22 Hello everyone, Welcome to Devlog #22 of AniSuffle ! Update Ok , so This time I was working on the intro side and I realized that before I changed some data structure while storing the username and i am now COOKED (╥﹏╥). Also I was searching for the error in my backend becuase of which the skip btn never appeared and even after asking ai , It was not able to help me ,and after giving it a tons of screenshots of the project , console and networks , It told me to remove a comment - - . And even more annoying or good thing (i dont even know what to call it anymore) was that the code worked after removing the comment. It made no sense to me , and honestly I still dont know why even that comment was causing the issue . Trust me I stared that code for more than an hour only to remove the comment at the end. Anyway , the code is now working (but i know there are still bunch of more bug to fix), so the main addition i would say rn is the live checking of the username . The username entered will be checked at the live time (every 400ms to be more precise). I guess thats all. I know it might sound like not much addition but it was more debug i did this time - -. I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 34550, "ts": "2026-07-25T11:03:49Z", "hours": 2.0, "text": "Devlog #21 Hello everyone, Welcome to Devlog #21 of AniSuffle ! Update I made a rough templete or a rough design on what the guess highest rating might look like , I mean the structure only , I will change the design and animation later on . Nothing much to explain but I will keep the design image below . Also I am still building the functionality . Right now they only fetch 4 differenct anime poster name and score . I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 34441, "ts": "2026-07-25T04:49:42Z", "hours": 0.0, "text": "Devlog #20 Hello everyone, Welcome to Devlog #20 of AniSuffle ! Update Hey everyone , a quick update . I again changed my plan and I have now decided to use the intro username as the unique username which will be used everwhere , like in the database and the leaderboard. I apologize for creating the confusion but I felt like asking multiple username might be even more confusing (ó﹏ò。). So i planned to stick with the single username to maintain consistency and to avoid confusion. I would not expand the devlog anymore unnecessarily and waste your time. And I hope I made everything clear If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 34014, "ts": "2026-07-24T12:40:39Z", "hours": 6.0, "text": "Devlog #19 Hello everyone, Welcome to Devlog #19 of AniSuffle ! First , Our project got SuperStar title and I thank you all,Without ya all my this project would not have got that level of attention. Thanks to all of you and the reviewer for marking it as a SuperStar Project . It made me so happy. Thank you so much (˶>⩊<˶) Update After creating and deleting the same table , the same database many times . I have finally decided to remove the username from the signin option and kept it on the rate game page , which means while signing in you wont have to use username , rather you will sign up using only gmail . Also , I am thinking of linking the gmail with the username automatically after the user has signed in so the progress is stored in the connected account. I am currently working on the backend so there is nothing intresting to show but i will keep the site image for now … I would not expand the devlog anymore. If you have any question please comment ,though I am myself not so sure about the username thing, I mean… I might change the data structure if things go wrong,so if you ask me rn about how i will be storing data exactly then my answer might not be that clear but I will still try , thank you so much . Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 33487, "ts": "2026-07-23T14:04:01Z", "hours": 6.0, "text": "Devlog #18 Hello everyone, Welcome to Devlog #18 of AniSuffle ! I know it has been a while , but to be honest , i dont really have much to show for this devlog . Even though I have been working on something fun to be added in this site. Update I the last devlog I told that I will be working on the treding section ,but while making that I dont know for some reason I wanted to make a game like thing in this site. Lemme give a brief description . so I was thinking of making a Rating Guess game , where you will be shown any 4 anime poster and its name and you would have to choose a anime and you will be given a score and I am also planning to make a leaderboard so that the game feels even more competetive, but the problem is that I dont want to make sign in compulsory and I would need a username for that . So I have been working on the game but still am unsure about the usernames , as asking multiple usernames might be confusing so, I am still thinking on what to do about this. I would not expand the devlog anymore. If you have any question please comment , I will try to explaing things there , thank you so much . Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 32840, "ts": "2026-07-22T07:51:31Z", "hours": 5.0, "text": "Devlog #17 Hello everyone, Welcome to Devlog #17 of AniSuffle ! Update I have changed the background of the intro page and added a video as a background instead (i will provide the link below)(as the old one was AI made, not a copy paste though).There is a skip button in the intro incase its boring for you . Also on one of the feedback , I saw one reviewer was not able to access the for some reason i really dont know why, so now i have moved the site to https://shrestha-project-07.wuaze.com this url, even though the old site will be active , the new updates will be availble on this site only . I might update this link on old devlogs as well. Currently I am working on the trending section , where you will be able to see the trending anime list or in card form, but i will try to make it intresting somehow =) Also , both sites share same database so if you have logged in before then , you can still use that id to login in both site. Credit: https://www.youtube.com/watch?v=1L7mzyGhXCA (there are few edits/cuts i did) I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 32164, "ts": "2026-07-21T04:15:25Z", "hours": 1.0, "text": "Devlog #16 Hello everyone, Welcome to Devlog #16 of AniSuffle ! Update I have made few changes , I changed the Hover Trailer text from Hover Trailer On / Off to a checkbox ,as I found a cool looking (i guess it is) checkbox on a site and also a mute and unmute btn . So I changed them . I will keep a clip below rather then explaining with words . ##Credit Mute Btn (when hover trailer is on) : https://uiverse.io/catraco/dry-robin-61CheckBox Animation (On hover trailer) : https://uiverse.io/00Kubi/hot-dragonfly-56 I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 31842, "ts": "2026-07-20T15:25:21Z", "hours": 6.0, "text": "Devlog #15 Hello everyone, Welcome to Devlog #15 of AniSuffle ! So first, I have a few announcements. I got some more feedback, and in respect of those, I will now be making the devlogs shorter and use limited/less kaomoji (ó﹏ò。), so that you can read the devlogs more clearly. Update So, I have finally finished working on the Hover to Play Trailer feature. I just have a mute and unmute button which will be displayed on the trailer when hovered. When hovering, for a few seconds, it will also show titles, the YouTube logo, and other YouTube things. I tried to hide those but was unable to. When I asked AI, it told me that it was not possible. Rather, it gave me alternative ways, which I thought would not be a great user experience, so I left it as default. (ᵕ—ᴗ—) I had a hard time fixing the overlapping of the hover and click animations, but those are finally gone. Now I guess that’s it for this devlog. Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 31216, "ts": "2026-07-19T13:11:07Z", "hours": 8.0, "text": "Devlog #14 Hello everyone, Welcome to Devlog #14 of AniSuffle ! (≧▽≦) Okay, so this is the first devlog after I have shipped the project. And yes… I’m still working on the project. ( ̄▽ ̄)ゞ Thanks to @Gideonthegreat for the feedbacks! Yeah, I mean, I got some awesome feedback, and I really wanted to add more and make more changes. (๑•̀ㅂ•́)و✧ After thinking and looking around the code for a while… (and staring at it for way longer than I should have) I finally decided to integrate the Hover to Play Trailer feature first . I did not want to just replace the click ripple animation. That’s why I decided to add it as an option ,you can click on the hamburger menu (the three horizontal lines in the top-right corner), where you can turn the Hover to Play Trailer option on and off. ヽ(・∀・)ノ. [I will update the live site later on, as i am still working on it (ó﹏ò。)] It is still not complete. (ᵕ—ᴗ—) I’m still working on it! So I’ll show you a demo video[My laptop is potato so the video is abit laggy, plz dont mind that], but please don’t take it as the final version. I’m still thinking of making more changes to it… hehehe. (,,¬﹏¬,,) I accept that I still need to optimize this feature, and the clip was short as my laptop was lagging alot 😭 (see the CPU usage ( top blue bars)) Maybe I’ll end up changing something again before the next devlog. Who knows? (☞゚ヮ゚)☞ I guess that’s it for this devlog! (ノ◕ヮ◕)ノ*:・゚✧ I will still love feedback if you have any =) Thank you so much for reading! <(_ _)> See you in the next one Thank you again and have a nice day =)"}, {"post_id": 28210, "ts": "2026-07-14T11:04:07Z", "hours": 0.0, "text": "We are finally shiping!!!!⸜(。˃ ᵕ ˂ )⸝♡ Here is the link https://shrestha-project-07.wuaze.com"}, {"post_id": 28114, "ts": "2026-07-14T05:45:33Z", "hours": 1.0, "text": "Hello everyone I was late for class while deployign the site so I M WRITING IT IN CLASS RN (・–・;)ゞ(teacher might come anytime now)But I wanted to share this project so bad . Thank you Here is the link : https://shrestha-project-07.wuaze.com Bye"}, {"post_id": 28041, "ts": "2026-07-14T01:59:46Z", "hours": 3.0, "text": "Devlog #13 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #13 of Anime Shuffle ! (≧▽≦) Hope you all are doing well! (๑˃ᴗ˂)ﻭ This will probably be one of the shortest devlogs before the release, but I wanted to share one last little update. (ᵔᗜᵔ) ** Font Updates** I made a few typography changes to make the site feel a little cleaner and more unique. The Anime Shuffle title on the top-left now uses the Godber font. The titles of the anime/manga cards, along with the “High Rated First” label, now use the Morien font. They’re small changes, but I think they give the site a much nicer personality. (。•̀ᴗ-)✧ ** Responsiveness** I totally forgot to mention, I also added Responsiveness, even though it’s not best as the site is optimized mainly for laptop/PC screen but…. Umm it’s not worst (๑•﹏•) ** Shipping Today…?** If everything goes well on the server side, I’ll be shipping Anime Shuffle today! (ノ◕ヮ◕)ノ*:・゚✧ Hopefully there won’t be any last-minute bugs deciding to appear out of nowhere… (╥﹏╥) Fingers crossed! (๑•̀ㅂ•́)و✧ Any questions , please let me know Thank you all so much for being part of this journey. (づ。◕‿‿◕。)づ It has genuinely meant a lot to me, and I really appreciate everyone who took the time to read the devlogs, give feedback, and support the project along the way. Thank you so much! (´꒳`)♡ Have a wonderful day! (。♥‿♥。)"}, {"post_id": 27673, "ts": "2026-07-13T13:28:43Z", "hours": 6.0, "text": "Devlog #12 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #12 of Anime Shuffle ! (≧▽≦) Hope you all are doing great! (๑˃ᴗ˂)ﻭ This devlog will be a bit shorter (Hopefully….) , but I wanted to share the final updates before the release because… ** Yep… we’re shipping soon!!** (ノ◕ヮ◕)ノ*:・゚✧ Hopefully within the next two days! (ᵕ—ᴗ—) Intro Animation The first thing I added is a small intro screen (around 7–8 seconds long) where you’ll be asked to enter a username. (ᵔᗜᵔ) Don’t worry, I’m not checking whether the username is already taken or not (just yet). You can type anything you want here. The purpose of this intro is simply to make the experience feel a bit more personal and fun. (。•̀ᴗ-)✧ I hope you’ll like it! =) When you eventually sign up, you’ll enter your username again, and that one will need to be unique. (ᵕ—ᴗ—) After entering your name, a short animated intro will play before taking you into the site. (✧ω✧) And yes… I used AI to help create this animation. Not completely, but it definitely helped speed things up. ( ̄▽ ̄)ゞ I also changed the background of the site because the previous one made some buttons a little difficult to see. I received that as feedback, so thank you very much! The site now uses a live wallpaper instead, which should make everything much clearer. I hope you will like that (ó﹏ò。) ** Double Tap = Save** Just like on social media apps, you can now double-tap (or double-click) an anime or manga poster to save it instantly. (☞゚ヮ゚)☞ When you do, a small star animation appears , yeyyy…. ** Email Verification Improvements** I also made a few improvements to the email verification system. (。•ᴗ•。) The verification email has been redesigned slightly so that the verification code is much easier to spot and copy. (´꒳`) ** Shipping Soon…** That’s pretty much it for this devlog! (ノ´ヮ`)ノ*:・゚ Right now I’m focusing on making the site fully responsive across different screen sizes. ૮₍ ˃ ⤙ ˂ ₎ა Also, the email shown in the disposable-email demo video isn’t the actual email theme used by AniShuffle. The disposable email website simply couldn’t render the HTML email correctly. (╥﹏╥) After that’s done, I might write one final devlog before releasing it… or maybe I’ll just ship it immediately. (¬‿¬) My goal is to release Anime Shuffle within the next two days , so stay tuned! (๑>◡<๑) ** Note for Reviewers** If you’re reviewing Anime Shuffle and don’t want to use your personal email address , don’t worry! I’ll also include a short guide video showing **how to get a free disposable (dummy) email,just in case you dont know ** so you can test the authentication system without using your own email. (。•̀ᴗ-)✧ Of course, anyone is welcome to use it—not just reviewers. =) Thank you so much for reading and for following the development journey. It really means a lot! (づ。◕‿‿◕。)づ See you all in the next devlog… or maybe in the release post! (ᵔᗜᵔ) If anything was unclear, please let me know. I’d really appreciate the feedback! Have a wonderful day! (。♥‿♥。)"}, {"post_id": 27177, "ts": "2026-07-12T14:35:42Z", "hours": 9.0, "text": "Devlog #11 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #11 of AniSuffle . Hope you all are doing great. (≧▽≦) In this devlog, I’ll be sharing the recent changes and improvement i have mad on the site. Ummm.. This devlog will be abit longer, but I want to make sure I explain everything correctly. (ᵕ—ᴗ—) Soooo lets start~ SVG Animation The first update is the addition of SVG animation beside the title. I have also replaced the placehodler (those book and video like emoji) that was displayed on the poster card with the same svg (but the animation will be different). (。•̀ᴗ-)✧ Also about the source of the svg, For the “anime” svg, I got it from AnimeJs and i asked AI to make another svg “manga” , honestly it was quite difficult to make AI understand what I really wanted on the svg, and its still not perfect but ummm its fine and I hope you like those. ( ̄▽ ̄*) LocalStorage Also I have now integrated localStorage so, now you wont have to be logged in to save anime and manga anymore. (๑˃ᴗ˂)ﻭ It works in this way, lemme explain in simple: If you are logged out and you saved few anime/mangas and then you signned in, then all your localStorage saves will be automatically be transfered to the database (and your localStorage will be empty, I had to do this so that There is no duplicate data). ( •̀ ω •́ )✧ Email Verification And the most time consuming, I have integrated email verification which means now, the email you signup with should be a valied email (you can nomore login/signup with [email protected] ). And currently i have used brevo for sending emails and i m on free trial so it has the limit of 300 emails per day , And I assume its more than enough for me right now,also the code expires in 1 hour. (╹◡╹) . [I had to keep authorizing my ip address while setting it up and i thought it was error on my code and I was searching it for hours (╥﹏╥)] I will tell you how you can get a dummy email (just in case you dont know how to get one) if you want to check the authentication system without using your personal email [especially if you are a reviewer reading this.] but anyone willing to test it, you can use that method. But I will be doing that in the next devlog… probably, as In this devlog i might upload the video of showing current updates. (= ̄ω ̄=) I guess I will keep this much for this devlog. I hope I made things clear. [You might have seen manga on the save list even though i didnt add that in this video , and lemme make things clear, it was imported from the localstorage , which i have saved while checking my project =] If anything was unclear then please do tell me. (◕‿◕)♡ Helper tools SVG : https://animejs.com/documentation/svg/createdrawable SMTP : https://www.brevo.com/ Thank you so much for reading. (≧▽≦)♡ Have a nice day! (˶ᵔᗜᵔ˶)ノ゙"}, {"post_id": 26508, "ts": "2026-07-11T10:50:48Z", "hours": 6.0, "text": "Devlog #10 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #10 of AniSuffle . Ok this time I will keep the devlog abit shorter maybe… (ᵕ—ᴗ—) Lets start The first and main change for this devlog is the Ripple like animation when you click the image. (Its just like the circle expanding from a point when you throw a stone on a still lake or pound.) Hope you like it! (๑˃ᴗ˂)ﻭ . Also a little bit change in brightness near the cursor ;) I will keep a video of the clip. As I told in previous devlog, I have finally seperated the Anime and Manga section in the save list, and also I kept the Sign In and Login option in the hamburger menu (the three horizontal lines). (。•̀ᴗ-)✧ A small optimization, I have added the APIs in the head section of HTML with rel=\"preconnect\" , so that the connection is established as soon as the site loads. (Just keeping APIs ready for fetching data from them.) ( •̀ ω •́ )✧ Also just to avoid confusion , you will not need to signin to save the anime/manga when i finally ship the project , I am still working on it . (ó﹏ò。)It is just a sample and doesnt represent the final product =) Also the save button on Manga section didnt worked before refreshing the site , and I will be transparent , that it was fault of my site and I am still trying to figure it out (ó﹏ò。) In the video I have wrote a random email , they might not work when I ship it, its just a dummy after all. ( ̄▽ ̄*) I will like to end the devlog now. (ᵔᗜᵔ) If anything was unclear please comment, I will try to explain again there. (╹◡╹) Thank you for reading! Have a nice day! (≧▽≦)ノ"}, {"post_id": 25971, "ts": "2026-07-10T14:45:19Z", "hours": 7.0, "text": "Devlog #09 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #09 of AniSuffle . In this devlog I will be sharing you all the recent changes I made on my site. Okay… lemme explain. (๑˃ᴗ˂)ﻭ Auth(Login & SignUp) is finally working Soooo… Finally the Auth(Login and SignUp) feature is working. (≧▽≦) You can now login and save your info on the database and you would be able to login into another device and access your list / saves. I am planning to work on the email verification system as well, but dont worry I will be explaining you all how you can get a disposable email if you dont want to use your personal email, (I respect your Privacy(ᵔᵕᵔ)). Save Feature Also the save feature is now working just like I mentioned earlier. But for now you would have to login to use it. But dont worry. Before I ship this site, I will integrate the localstorage feature , to make the save feature work even without the signing in. I know signing up is kind of annoying sometimes… at least to me it is. ( ̄▽ ̄) So I wanted everyone to still be able to use the save feature even without making an account. Saved Anime & Manga Currently the stored anime and manga are stored in the same place[To be more specific they will be displayed on the same save list ]. But I guess I will make a seperate list for them. I will update in the upcoming devlog about it if I do make that change. (•̀ᴗ•́)و UI Changes Becuase of the sign up and login option the Anime and Manga buttons are on the center for now. I dont really like how it looks either. (ᵕ—ᴗ—) So I am planning to move those buttons back to the right side again. And also add a Hamburger menu (just in case you dont know… It’s The three horizontal line menu, actually i didnt know either before googling it just before writing this devlog (╹ڡ╹ )) . That menu will probably contain more features as I continue working on the site. Backend Debugging Most of my time actually went into debugging. (ó﹏ò。) For some reason I just couldnt figure out why my data wasnt being stored correctly. Sometimes it would save. Sometimes it wouldnt. Sometimes the stored data just refused to show itself in the list (probably it was abit shy (´꒳`)) . So… that took quite a bit longer than I thought. (・–・;)ゞ But yeah, finally things seems to be working [At least for now (・–・;)ゞ] Oh… The last devlog went incredibly long even though I thought it would be shorter… Looks like this one also became longer than I expected. (ㅅ •᷄ ₃•᷅ ) . (My apologies) I dont want to bore ya all. (´▽`) But still I hope I was able to make everything clear. If not, please do comment below and I will try my best to explain it there as well. ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)"}, {"post_id": 25135, "ts": "2026-07-09T04:56:00Z", "hours": 6.0, "text": "Devlog #08 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #08 of AniSuffle . Hope you all are doing great. Okay, now let me explain quickly of my recent changes or update on the site. I am not sure but maybe this will be abit shorter devlog, maybeeee(ᵕ—ᴗ—)…. since most of the work is about backend (so nothing flashy to explain) also I will try to not bore anyone reading this.[also i try keeping the devlogs raw and unfiltered] Okay now lemme explain. Save Button & Auth Feature Sooo, the feature I have recently added to my site, actually not added, am still working on it is the save button and also adding a auth feature (the login and signup feature to be more simple =)) . Its not complete though. And one more thing, you definitely dont need to login or signup to use any of the features and tools I have made so far beacuse I understand that signing up is such a pain, I mean at least to me it isss. But there is one feature I want to add, and for this I think the signup is necessary. Now let me expalin how the save feature is going to work. It might be abit different as I am still working on it, I will just tell what I am planning to do. ** Why am I writing this devlog now?** And before that If you ask why am I writing a devlog if I have not done the job, then ummm…∘ ∘ ∘ ( °ヮ° ) Actually I am working on the backend and I am scared I might mess anything up, as I am not too confident on backend and storing user data safely is my top priority( ◡̀_◡́)ᕤ whenever I am dealing with the backend and while doing this I didnt realize that I have already 5 or maybe 6 hours I am not sure but maybe its around 6 hours of time logged already so I thought of updating the devlog, even though I am in the middle of the function (I mean the development process(ᵕ ó ᴗ ò)). I feel like I sound abit unclear (ó﹏ò。)ummm, lemme just explain properly how the save feature is going to (or supposed to) work. So there are two scenerios . ** When not signed in** When you are not signed it, you will still be able to access all the feature of the site, even the save button. But there is a catch. All your saved animes/mangas will be stored on the localstorage . Just a small explaination just in case you have no idea of what localstorage is, ummm… In simple terms you can think it as the browser’s storage area, its typically around 4 MB or 5 MB i assume, but they should be more than enough to us as we are just storing the anime/manga url, source, id and stuff.. lets not go too deep into itദ്ദി(˵ •̀ ᴗ - ˵ ) ✧. So you will still be able to save animes/mangas but you would need to be on the same browser with same browser profile to access those info. When signed in When you are signed in, your saved infos will be stored on the database of the server and you will be able to access them from any device and any browser . and This is the reason I am adding the Singup feature Oh… The devlog doesnt seems small any more. I’m i’m i’m sorry for that(ㅅ •᷄ ₃•᷅ ) Lemme wrap up quick umm but wait I will drop the screenshot of the site by pointing at the save button. Currently its with no css, but dont worry I will update that ugly default button design (and maybe position as well) as soon as i finish my backed(・–・;)ゞ I guess thats it for this devlog , If I forget to mention anything , I will surely update it in the next devlog. If you didnt understand any of the point , please do comment and I will try to explain you there ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)"}, {"post_id": 24613, "ts": "2026-07-08T10:14:54Z", "hours": 5.0, "text": "Devlog #07 Hello Everyone (•◡•) / , Welcome to Devlog #07 of AniSuffle . In this devlog I will be sharing the latest updates and improvements I’ve made to the site. ** Back and Forward History** I have finally added the Back and Forward (a sort of histroy) like feature . Lemme explain it in simple : If you generate a recommendation and another and another and again another and suddenly you feel like going back then you can press the Back button (just beside the Recommend Btn [to left]) and you will be able to review that anime or even manga. And then you can come back to your current one or just click on Recommend Me on the very same point and the new anime will be recommeded to you. Note: Though the anime ahead of you will be cleared out. ** Watch Anime** I have linked Crunchyroll Netflix AnimeSuge (¬‿¬) to my site. Which means when a anime is recommended to you, you will get these options: Crunchyroll Netflix AnimeSuge Watch Trailer Watch trailer on Youtube, it will be displayed only if the trailer link is available on the APIs I used (Jikan,Anilist,Kitsu) for anime. You can click on them and it will open a new tab and will automaticly search the title of the anime on the corresponding platform. [YouTube trailer is embeded on the site so you wont be redirected just to watch the trailer =)] Also Credit to the creator for the hover animation of Netflix Button : https://www.educrush.in/projects/netflix-button-animation And one more thing, Even though clicking on that link wont pinpoint the exact anime all the time since it is sending data on the search box of that corresponding site and redirecting you to that link, but still it should work for most of the anime, if the anime is available on that particular site. ** Read Manga** I have linked MangaDex Viz BookWalker to my site and the working of it also same as that of the manga. One thing I must say (ゝ。∂) This website is made entirely for entertainment, educational and learning purposes only , and it doesnt support any sort of piracy . That’s it for this Devlog I guess thats it for this devlog and if you have any suggestions or question that you think I didnt explain well or enough (always sucked at explaining others but i do try😅) then plz comment below, I will reply as soon as possible. Thank you everyone for reading. Have a nice day =)"}, {"post_id": 24056, "ts": "2026-07-07T11:21:11Z", "hours": 4.0, "text": "Hello Everyone, Welcome to Devlog #06 of AniSuffle. I am very excited (*≧▽≦) to share what I was working on and also what I will be working after this devlog. The biggest milestone for this devlog might be that I have finally integrated all four APIs I mentioned in the early devlogs. (i.e. Jikan, anilistGenreList, mangadexTagId, Kitsu). All four of them are backing up eachother ᕕ( ᐛ )ᕗ. This took quite a while because ya know different APIs has different structure and some return data in so weird format as well. Anyway, the next change I made is background poster change, lemme explain. Before, I had a backgorund of some live color gradient (actually thats a ovel with diffetent color on it and is rotating and has blur effect applied on it though ⊙﹏⊙). But now its changed, at first untill any image from either anime or manga is loaded the backgroundImage remains as the old one but as soon as user clicks on Recommend Me button and image is loaded, the backgorund image changes to the poster image and it looks kinda cool (at least to me ●﹏●). Also it has some blur effect on it as the direct plane image looked kinda weired without blur and a little bit of brightness lowered. And The last update for this devlog which I am really exited to share is Trailerssss!!!! . Now You can also watch the anime trailers, you get the option of Watch Trailer, and when you click the button, it will play the trailer from the YouTube and more importantly you would not even have to leave the site to watch the trailer, which means you wont be redireted to any site, you will stay and watch the trailer on the VERY same site ヽ(⌐■_■)ノ♪♬. (only used Jikan and Anilist as the source of anime Trailer link). and if any Anime doent have trailer integrated then the Watch Trailer button will not appear, it will stay hidden. So, thats not a bug ok =). I will leave a screenshot below =) I guess thats it for this Devlog. If I forget to mention anything, I will defenitiely update you all in the next Devlog. Also, Next I am planning to work on adding forward and backward option, if you dont get it right now, please dont worry I will be explaining it once I have successfully added it. and I am thinging of adding favourite or watch later like section. I guess thats it for this devlog. Thank you so much for reading. Have a nice day =)"}, {"post_id": 23504, "ts": "2026-07-06T14:59:47Z", "hours": 5.0, "text": "Hello Everyone , Welcome to Devlog #05 of AniSuffle Finally some good news to share (>‿◠)✌. Jikan API Ban Recovery While working on the site, I ended up sending too many request on the jikan API and it temporarily got my IP address banned and thankfully thats over now \\0-0/ and I was still able to make some good progress during that time , as i worked with another API (i.e anilist) and guess what it worksssss!!!! (the structures of different APIs are so different so its kindaa abit ….. you know..) Poster Improvement One of the imporvement is the poster display of the anime. Now the poster can resize itself as the size of the image changes, with a small transition between them (it looks kinda cool to me) Also the information is displayed in quite orgainzed way as well (though i removed the scroll on the description as that seemed abit off) currently it displays title, ratings , released date , status (like its onging or finished releasing ). Screenshot I will drop the image below \\0_0/ High Rated First I have also made a little change on how the High reated first feature work , before it used to compare among the few fetched and now it displays the anime/manga with ratings higher than 7 and if not found among currently fetched then it fetches or requests for more data . I also decided to add a name at the bottom right of the API to see which one is fetched from which (i mean the info) . Notch Change Also I forgot to mention one thing that the notch (apple like degin will disapear when the image is loaded as that looked abit kind of starnge wit the image but still it will appear while the image is in loading state(or when its not totally laoded). If I didnt forget to mention anything then thats it for this devlog . If I didnt make anything clear then please consider commenting , I will Try again to expalin =) Thank you so much for reading . Have a nice day =)"}, {"post_id": 23207, "ts": "2026-07-06T00:58:11Z", "hours": 5.0, "text": "Devlog #04 Hello everyone , Welcome to the devlog #04 of AniSuffle, (A site which recommends you random anime or manga , you can also choose genre of your choice). Recently , I have been facing an issue with the Posters. Actually the size of posters of different for different anime (some are potrait , some are landscape , some are square and some are soooo huge and if i compress them to one size the quality of the image is lost and it looks sooo bad (╥﹏╥)) . But I still plan to keep on working on it (I will try…). A new feature A new feature , I have added a feature “ High rated First ” . Its going to recommend you some of the High rated anime. (Not the highest of all time ,or else if i call for the highest rated anime/manga only then only one might repeat , so i tried making the feature work for high rated animes or mangas). I hope I was able to make you clear , if not plz do comment and I will try again to explain =) **Info about the API ** Currently I am fetching the data from Jikan API . I will leave the API link below if anyone wants to check it out . also, since its a free API , it has a few limitations. Its abit slow and request limit is also low , and thats why I will be trying to fetch APIs from few more other free APIs , I will provide there link below as well . I guess thats it for this devlog . If I get any update to share , I will definitely write another Devlog . Thank You so much for reading. //planning to fetch info from them jikanBaseUrl = https://api.jikan.moe/v4 anilistUrl = https://graphql.anilist.co mangadexUrl = https://api.mangadex.org kitsuUrl = https://kitsu.io/api/edge Have a nice day (ง︡’-’︠)ง **Also here is a quick shot of what my site looks right now (╥﹏╥) **"}, {"post_id": 22618, "ts": "2026-07-05T05:15:09Z", "hours": 4.0, "text": "Hello everyone , Welcome to the **Devlog #03 ** of AniSuffle Here’s a quick update on what i’ve been working on .Till now I wasnt able to make much progress on the JavaScript side , especially the API integration part . Instead , I spent most of my time improving the design of the card (in which anime/manga poster will be displayed). I worked on adding some borders and tried to make the card look abit cooler by adding the apple notch (the top part, i am not sure but i guess its called notch,maybeeee…..) . I might still make more changes on it , i m done totally satisfied with it (╥﹏╥). On the top of that , I added almost every anime/manga genre that I could find online , and the users will also be able to genre on the basis of genre selected . Thats pretty much everything , for this devlog . Thank You so much . Have a nice day (˶ˆᗜˆ˵) Here is a quick shot of the project :"}, {"post_id": 22164, "ts": "2026-07-04T14:16:22Z", "hours": 4.0, "text": "Hello everyone , Welcome to another Devlog #02 of AniSuffle! I just changed the look of the website (had to write whole html and css as my new design was conflicting with the old one (╥ ᴗ ╥) ) But I am satisfied with the new look (atleast for now (ᵕ—ᴗ—)). [I might see new design on Insta (。ŏ﹏ŏ)] And more importantly I made a seperate section for** Manga** as well which means Not only anime but AniSuffle will be recommending Manga as well (i mean i’ll try). I am currently working on the functionality of the site . Thank you so much , here is the latest screen shot . Have a nice day"}, {"post_id": 19650, "ts": "2026-07-01T00:59:35Z", "hours": 4.0, "text": "Devlog #01 Hello, Everyone ! I started working on a project “AniSuffle”. Let me tell you about what I did so far and what I will be doing ahead . I am planing to make a website where you can get anime any random anime recommendation . I would try to integrate multiple APIs on the same site as one API get exhausted pretty quickly . Till now , I have learned to make a live gradient like effect for the background and also made animation for the cards and text , whenever the site loads. Will report again soon . Thank You ! Have a nice day =)"}]...
|
Title: AniSuffle by @PAPER_01 | Stardance
Devlogs Title: AniSuffle by @PAPER_01 | Stardance
Devlogs:
Devlog #01 Hello, Everyone ! I started working on a project “AniSuffle”. Let me tell you about what I did so far and what I will be doing ahead . I am planing to make a website where you can get anime any random anime recommendation . I would try to integrate multiple APIs on the same site as one API get exhausted pretty quickly . Till now , I have learned to make a live gradient like effect for the background and also made animation for the cards and text , whenever the site loads. Will report again soon . Thank You ! Have a nice day =)
Hello everyone , Welcome to another Devlog #02 of AniSuffle! I just changed the look of the website (had to write whole html and css as my new design was conflicting with the old one (╥ ᴗ ╥) ) But I am satisfied with the new look (atleast for now (ᵕ—ᴗ—)). [I might see new design on Insta (。ŏ﹏ŏ)] And more importantly I made a seperate section for** Manga** as well which means Not only anime but AniSuffle will be recommending Manga as well (i mean i’ll try). I am currently working on the functionality of the site . Thank you so much , here is the latest screen shot . Have a nice day
Hello everyone , Welcome to the **Devlog #03 ** of AniSuffle Here’s a quick update on what i’ve been working on .Till now I wasnt able to make much progress on the JavaScript side , especially the API integration part . Instead , I spent most of my time improving the design of the card (in which anime/manga poster will be displayed). I worked on adding some borders and tried to make the card look abit cooler by adding the apple notch (the top part, i am not sure but i guess its called notch,maybeeee…..) . I might still make more changes on it , i m done totally satisfied with it (╥﹏╥). On the top of that , I added almost every anime/manga genre that I could find online , and the users will also be able to genre on the basis of genre selected . Thats pretty much everything , for this devlog . Thank You so much . Have a nice day (˶ˆᗜˆ˵) Here is a quick shot of the project :
Devlog #04 Hello everyone , Welcome to the devlog #04 of AniSuffle, (A site which recommends you random anime or manga , you can also choose genre of your choice). Recently , I have been facing an issue with the Posters. Actually the size of posters of different for different anime (some are potrait , some are landscape , some are square and some are soooo huge and if i compress them to one size the quality of the image is lost and it looks sooo bad (╥﹏╥)) . But I still plan to keep on working on it (I will try…). A new feature A new feature , I have added a feature “ High rated First ” . Its going to recommend you some of the High rated anime. (Not the highest of all time ,or else if i call for the highest rated anime/manga only then only one might repeat , so i tried making the feature work for high rated animes or mangas). I hope I was able to make you clear , if not plz do comment and I will try again to explain =) **Info about the API ** Currently I am fetching the data from Jikan API . I will leave the API link below if anyone wants to check it out . also, since its a free API , it has a few limitations. Its abit slow and request limit is also low , and thats why I will be trying to fetch APIs from few more other free APIs , I will provide there link below as well . I guess thats it for this devlog . If I get any update to share , I will definitely write another Devlog . Thank You so much for reading. //planning to fetch info from them jikanBaseUrl = https://api.jikan.moe/v4 anilistUrl = https://graphql.anilist.co mangadexUrl = https://api.mangadex.org kitsuUrl = https://kitsu.io/api/edge Have a nice day (ง︡’-’︠)ง **Also here is a quick shot of what my site looks right now (╥﹏╥) **
Hello Everyone , Welcome to Devlog #05 of AniSuffle Finally some good news to share (>‿◠)✌. Jikan API Ban Recovery While working on the site, I ended up sending too many request on the jikan API and it temporarily got my IP address banned and thankfully thats over now \0-0/ and I was still able to make some good progress during that time , as i worked with another API (i.e anilist) and guess what it worksssss!!!! (the structures of different APIs are so different so its kindaa abit ….. you know..) Poster Improvement One of the imporvement is the poster display of the anime. Now the poster can resize itself as the size of the image changes, with a small transition between them (it looks kinda cool to me) Also the information is displayed in quite orgainzed way as well (though i removed the scroll on the description as that seemed abit off) currently it displays title, ratings , released date , status (like its onging or finished releasing ). Screenshot I will drop the image below \0_0/ High Rated First I have also made a little change on how the High reated first feature work , before it used to compare among the few fetched and now it displays the anime/manga with ratings higher than 7 and if not found among currently fetched then it fetches or requests for more data . I also decided to add a name at the bottom right of the API to see which one is fetched from which (i mean the info) . Notch Change Also I forgot to mention one thing that the notch (apple like degin will disapear when the image is loaded as that looked abit kind of starnge wit the image but still it will appear while the image is in loading state(or when its not totally laoded). If I didnt forget to mention anything then thats it for this devlog . If I didnt make anything clear then please consider commenting , I will Try again to expalin =) Thank you so much for reading . Have a nice day =)
Hello Everyone, Welcome to Devlog #06 of AniSuffle. I am very excited (*≧▽≦) to share what I was working on and also what I will be working after this devlog. The biggest milestone for this devlog might be that I have finally integrated all four APIs I mentioned in the early devlogs. (i.e. Jikan, anilistGenreList, mangadexTagId, Kitsu). All four of them are backing up eachother ᕕ( ᐛ )ᕗ. This took quite a while because ya know different APIs has different structure and some return data in so weird format as well. Anyway, the next change I made is background poster change, lemme explain. Before, I had a backgorund of some live color gradient (actually thats a ovel with diffetent color on it and is rotating and has blur effect applied on it though ⊙﹏⊙). But now its changed, at first untill any image from either anime or manga is loaded the backgroundImage remains as the old one but as soon as user clicks on Recommend Me button and image is loaded, the backgorund image changes to the poster image and it looks kinda cool (at least to me ●﹏●). Also it has some blur effect on it as the direct plane image looked kinda weired without blur and a little bit of brightness lowered. And The last update for this devlog which I am really exited to share is Trailerssss!!!! . Now You can also watch the anime trailers, you get the option of Watch Trailer, and when you click the button, it will play the trailer from the YouTube and more importantly you would not even have to leave the site to watch the trailer, which means you wont be redireted to any site, you will stay and watch the trailer on the VERY same site ヽ(⌐■_■)ノ♪♬. (only used Jikan and Anilist as the source of anime Trailer link). and if any Anime doent have trailer integrated then the Watch Trailer button will not appear, it will stay hidden. So, thats not a bug ok =). I will leave a screenshot below =) I guess thats it for this Devlog. If I forget to mention anything, I will defenitiely update you all in the next Devlog. Also, Next I am planning to work on adding forward and backward option, if you dont get it right now, please dont worry I will be explaining it once I have successfully added it. and I am thinging of adding favourite or watch later like section. I guess thats it for this devlog. Thank you so much for reading. Have a nice day =)
Devlog #07 Hello Everyone (•◡•) / , Welcome to Devlog #07 of AniSuffle . In this devlog I will be sharing the latest updates and improvements I’ve made to the site. ** Back and Forward History** I have finally added the Back and Forward (a sort of histroy) like feature . Lemme explain it in simple : If you generate a recommendation and another and another and again another and suddenly you feel like going back then you can press the Back button (just beside the Recommend Btn [to left]) and you will be able to review that anime or even manga. And then you can come back to your current one or just click on Recommend Me on the very same point and the new anime will be recommeded to you. Note: Though the anime ahead of you will be cleared out. ** Watch Anime** I have linked Crunchyroll Netflix AnimeSuge (¬‿¬) to my site. Which means when a anime is recommended to you, you will get these options: Crunchyroll Netflix AnimeSuge Watch Trailer Watch trailer on Youtube, it will be displayed only if the trailer link is available on the APIs I used (Jikan,Anilist,Kitsu) for anime. You can click on them and it will open a new tab and will automaticly search the title of the anime on the corresponding platform. [YouTube trailer is embeded on the site so you wont be redirected just to watch the trailer =)] Also Credit to the creator for the hover animation of Netflix Button : https://www.educrush.in/projects/netflix-button-animation And one more thing, Even though clicking on that link wont pinpoint the exact anime all the time since it is sending data on the search box of that corresponding site and redirecting you to that link, but still it should work for most of the anime, if the anime is available on that particular site. ** Read Manga** I have linked MangaDex Viz BookWalker to my site and the working of it also same as that of the manga. One thing I must say (ゝ。∂) This website is made entirely for entertainment, educational and learning purposes only , and it doesnt support any sort of piracy . That’s it for this Devlog I guess thats it for this devlog and if you have any suggestions or question that you think I didnt explain well or enough (always sucked at explaining others but i do try😅) then plz comment below, I will reply as soon as possible. Thank you everyone for reading. Have a nice day =)
Devlog #08 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #08 of AniSuffle . Hope you all are doing great. Okay, now let me explain quickly of my recent changes or update on the site. I am not sure but maybe this will be abit shorter devlog, maybeeee(ᵕ—ᴗ—)…. since most of the work is about backend (so nothing flashy to explain) also I will try to not bore anyone reading this.[also i try keeping the devlogs raw and unfiltered] Okay now lemme explain. Save Button & Auth Feature Sooo, the feature I have recently added to my site, actually not added, am still working on it is the save button and also adding a auth feature (the login and signup feature to be more simple =)) . Its not complete though. And one more thing, you definitely dont need to login or signup to use any of the features and tools I have made so far beacuse I understand that signing up is such a pain, I mean at least to me it isss. But there is one feature I want to add, and for this I think the signup is necessary. Now let me expalin how the save feature is going to work. It might be abit different as I am still working on it, I will just tell what I am planning to do. ** Why am I writing this devlog now?** And before that If you ask why am I writing a devlog if I have not done the job, then ummm…∘ ∘ ∘ ( °ヮ° ) Actually I am working on the backend and I am scared I might mess anything up, as I am not too confident on backend and storing user data safely is my top priority( ◡̀_◡́)ᕤ whenever I am dealing with the backend and while doing this I didnt realize that I have already 5 or maybe 6 hours I am not sure but maybe its around 6 hours of time logged already so I thought of updating the devlog, even though I am in the middle of the function (I mean the development process(ᵕ ó ᴗ ò)). I feel like I sound abit unclear (ó﹏ò。)ummm, lemme just explain properly how the save feature is going to (or supposed to) work. So there are two scenerios . ** When not signed in** When you are not signed it, you will still be able to access all the feature of the site, even the save button. But there is a catch. All your saved animes/mangas will be stored on the localstorage . Just a small explaination just in case you have no idea of what localstorage is, ummm… In simple terms you can think it as the browser’s storage area, its typically around 4 MB or 5 MB i assume, but they should be more than enough to us as we are just storing the anime/manga url, source, id and stuff.. lets not go too deep into itദ്ദി(˵ •̀ ᴗ - ˵ ) ✧. So you will still be able to save animes/mangas but you would need to be on the same browser with same browser profile to access those info. When signed in When you are signed in, your saved infos will be stored on the database of the server and you will be able to access them from any device and any browser . and This is the reason I am adding the Singup feature Oh… The devlog doesnt seems small any more. I’m i’m i’m sorry for that(ㅅ •᷄ ₃•᷅ ) Lemme wrap up quick umm but wait I will drop the screenshot of the site by pointing at the save button. Currently its with no css, but dont worry I will update that ugly default button design (and maybe position as well) as soon as i finish my backed(・–・;)ゞ I guess thats it for this devlog , If I forget to mention anything , I will surely update it in the next devlog. If you didnt understand any of the point , please do comment and I will try to explain you there ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)
Devlog #09 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #09 of AniSuffle . In this devlog I will be sharing you all the recent changes I made on my site. Okay… lemme explain. (๑˃ᴗ˂)ﻭ Auth(Login & SignUp) is finally working Soooo… Finally the Auth(Login and SignUp) feature is working. (≧▽≦) You can now login and save your info on the database and you would be able to login into another device and access your list / saves. I am planning to work on the email verification system as well, but dont worry I will be explaining you all how you can get a disposable email if you dont want to use your personal email, (I respect your Privacy(ᵔᵕᵔ)). Save Feature Also the save feature is now working just like I mentioned earlier. But for now you would have to login to use it. But dont worry. Before I ship this site, I will integrate the localstorage feature , to make the save feature work even without the signing in. I know signing up is kind of annoying sometimes… at least to me it is. ( ̄▽ ̄) So I wanted everyone to still be able to use the save feature even without making an account. Saved Anime & Manga Currently the stored anime and manga are stored in the same place[To be more specific they will be displayed on the same save list ]. But I guess I will make a seperate list for them. I will update in the upcoming devlog about it if I do make that change. (•̀ᴗ•́)و UI Changes Becuase of the sign up and login option the Anime and Manga buttons are on the center for now. I dont really like how it looks either. (ᵕ—ᴗ—) So I am planning to move those buttons back to the right side again. And also add a Hamburger menu (just in case you dont know… It’s The three horizontal line menu, actually i didnt know either before googling it just before writing this devlog (╹ڡ╹ )) . That menu will probably contain more features as I continue working on the site. Backend Debugging Most of my time actually went into debugging. (ó﹏ò。) For some reason I just couldnt figure out why my data wasnt being stored correctly. Sometimes it would save. Sometimes it wouldnt. Sometimes the stored data just refused to show itself in the list (probably it was abit shy (´꒳`)) . So… that took quite a bit longer than I thought. (・–・;)ゞ But yeah, finally things seems to be working [At least for now (・–・;)ゞ] Oh… The last devlog went incredibly long even though I thought it would be shorter… Looks like this one also became longer than I expected. (ㅅ •᷄ ₃•᷅ ) . (My apologies) I dont want to bore ya all. (´▽`) But still I hope I was able to make everything clear. If not, please do comment below and I will try my best to explain it there as well. ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)
Devlog #10 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #10 of AniSuffle . Ok this time I will keep the devlog abit shorter maybe… (ᵕ—ᴗ—) Lets start The first and main change for this devlog is the Ripple like animation when you click the image. (Its just like the circle expanding from a point when you throw a stone on a still lake or pound.) Hope you like it! (๑˃ᴗ˂)ﻭ . Also a little bit change in brightness near the cursor ;) I will keep a video of the clip. As I told in previous devlog, I have finally seperated the Anime and Manga section in the save list, and also I kept the Sign In and Login option in the hamburger menu (the three horizontal lines). (。•̀ᴗ-)✧ A small optimization, I have added the APIs in the head section of HTML with rel="preconnect" , so that the connection is established as soon as the site loads. (Just keeping APIs ready for fetching data from them.) ( •̀ ω •́ )✧ Also just to avoid confusion , you will not need to signin to save the anime/manga when i finally ship the project , I am still working on it . (ó﹏ò。)It is just a sample and doesnt represent the final product =) Also the save button on Manga section didnt worked before refreshing the site , and I will be transparent , that it was fault of my site and I am still trying to figure it out (ó﹏ò。) In the video I have wrote a random email , they might not work when I ship it, its just a dummy after all. ( ̄▽ ̄*) I will like to end the devlog now. (ᵔᗜᵔ) If anything was unclear please comment, I will try to explain again there. (╹◡╹) Thank you for reading! Have a nice day! (≧▽≦)ノ
Devlog #11 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #11 of AniSuffle . Hope you all are doing great. (≧▽≦) In this devlog, I’ll be sharing the recent changes and improvement i have mad on the site. Ummm.. This devlog will be abit longer, but I want to make sure I explain everything correctly. (ᵕ—ᴗ—) Soooo lets start~ SVG Animation The first update is the addition of SVG animation beside the title. I have also replaced the placehodler (those book and video like emoji) that was displayed on the poster card with the same svg (but the animation will be different). (。•̀ᴗ-)✧ Also about the source of the svg, For the “anime” svg, I got it from AnimeJs and i asked AI to make another svg “manga” , honestly it was quite difficult to make AI understand what I really wanted on the svg, and its still not perfect but ummm its fine and I hope you like those. ( ̄▽ ̄*) LocalStorage Also I have now integrated localStorage so, now you wont have to be logged in to save anime and manga anymore. (๑˃ᴗ˂)ﻭ It works in this way, lemme explain in simple: If you are logged out and you saved few anime/mangas and then you signned in, then all your localStorage saves will be automatically be transfered to the database (and your localStorage will be empty, I had to do this so that There is no duplicate data). ( •̀ ω •́ )✧ Email Verification And the most time consuming, I have integrated email verification which means now, the email you signup with should be a valied email (you can nomore login/signup with [email protected] ). And currently i have used brevo for sending emails and i m on free trial so it has the limit of 300 emails per day , And I assume its more than enough for me right now,also the code expires in 1 hour. (╹◡╹) . [I had to keep authorizing my ip address while setting it up and i thought it was error on my code and I was searching it for hours (╥﹏╥)] I will tell you how you can get a dummy email (just in case you dont know how to get one) if you want to check the authentication system without using your personal email [especially if you are a reviewer reading this.] but anyone willing to test it, you can use that method. But I will be doing that in the next devlog… probably, as In this devlog i might upload the video of showing current updates. (= ̄ω ̄=) I guess I will keep this much for this devlog. I hope I made things clear. [You might have seen manga on the save list even though i didnt add that in this video , and lemme make things clear, it was imported from the localstorage , which i have saved while checking my project =] If anything was unclear then please do tell me. (◕‿◕)♡ Helper tools SVG : https://animejs.com/documentation/svg/createdrawable SMTP : https://www.brevo.com/ Thank you so much for reading. (≧▽≦)♡ Have a nice day! (˶ᵔᗜᵔ˶)ノ゙
Devlog #12 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #12 of Anime Shuffle ! (≧▽≦) Hope you all are doing great! (๑˃ᴗ˂)ﻭ This devlog will be a bit shorter (Hopefully….) , but I wanted to share the final updates before the release because… ** Yep… we’re shipping soon!!** (ノ◕ヮ◕)ノ*:・゚✧ Hopefully within the next two days! (ᵕ—ᴗ—) Intro Animation The first thing I added is a small intro screen (around 7–8 seconds long) where you’ll be asked to enter a username. (ᵔᗜᵔ) Don’t worry, I’m not checking whether the username is already taken or not (just yet). You can type anything you want here. The purpose of this intro is simply to make the experience feel a bit more personal and fun. (。•̀ᴗ-)✧ I hope you’ll like it! =) When you eventually sign up, you’ll enter your username again, and that one will need to be unique. (ᵕ—ᴗ—) After entering your name, a short animated intro will play before taking you into the site. (✧ω✧) And yes… I used AI to help create this animation. Not completely, but it definitely helped speed things up. ( ̄▽ ̄)ゞ I also changed the background of the site because the previous one made some buttons a little difficult to see. I received that as feedback, so thank you very much! The site now uses a live wallpaper instead, which should make everything much clearer. I hope you will like that (ó﹏ò。) ** Double Tap = Save** Just like on social media apps, you can now double-tap (or double-click) an anime or manga poster to save it instantly. (☞゚ヮ゚)☞ When you do, a small star animation appears , yeyyy…. ** Email Verification Improvements** I also made a few improvements to the email verification system. (。•ᴗ•。) The verification email has been redesigned slightly so that the verification code is much easier to spot and copy. (´꒳`) ** Shipping Soon…** That’s pretty much it for this devlog! (ノ´ヮ`)ノ*:・゚ Right now I’m focusing on making the site fully responsive across different screen sizes. ૮₍ ˃ ⤙ ˂ ₎ა Also, the email shown in the disposable-email demo video isn’t the actual email theme used by AniShuffle. The disposable email website simply couldn’t render the HTML email correctly. (╥﹏╥) After that’s done, I might write one final devlog before releasing it… or maybe I’ll just ship it immediately. (¬‿¬) My goal is to release Anime Shuffle within the next two days , so stay tuned! (๑>◡<๑) ** Note for Reviewers** If you’re reviewing Anime Shuffle and don’t want to use your personal email address , don’t worry! I’ll also include a short guide video showing **how to get a free disposable (dummy) email,just in case you dont know ** so you can test the authentication system without using your own email. (。•̀ᴗ-)✧ Of course, anyone is welcome to use it—not just reviewers. =) Thank you so much for reading and for following the development journey. It really means a lot! (づ。◕‿‿◕。)づ See you all in the next devlog… or maybe in the release post! (ᵔᗜᵔ) If anything was unclear, please let me know. I’d really appreciate the feedback! Have a wonderful day! (。♥‿♥。)
Devlog #13 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #13 of Anime Shuffle ! (≧▽≦) Hope you all are doing well! (๑˃ᴗ˂)ﻭ This will probably be one of the shortest devlogs before the release, but I wanted to share one last little update. (ᵔᗜᵔ) ** Font Updates** I made a few typography changes to make the site feel a little cleaner and more unique. The Anime Shuffle title on the top-left now uses the Godber font. The titles of the anime/manga cards, along with the “High Rated First” label, now use the Morien font. They’re small changes, but I think they give the site a much nicer personality. (。•̀ᴗ-)✧ ** Responsiveness** I totally forgot to mention, I also added Responsiveness, even though it’s not best as the site is optimized mainly for laptop/PC screen but…. Umm it’s not worst (๑•﹏•) ** Shipping Today…?** If everything goes well on the server side, I’ll be shipping Anime Shuffle today! (ノ◕ヮ◕)ノ*:・゚✧ Hopefully there won’t be any last-minute bugs deciding to appear out of nowhere… (╥﹏╥) Fingers crossed! (๑•̀ㅂ•́)و✧ Any questions , please let me know Thank you all so much for being part of this journey. (づ。◕‿‿◕。)づ It has genuinely meant a lot to me, and I really appreciate everyone who took the time to read the devlogs, give feedback, and support the project along the way. Thank you so much! (´꒳`)♡ Have a wonderful day! (。♥‿♥。)
Hello everyone I was late for class while deployign the site so I M WRITING IT IN CLASS RN (・–・;)ゞ(teacher might come anytime now)But I wanted to share this project so bad . Thank you Here is the link : https://shrestha-project-07.wuaze.com Bye
We are finally shiping!!!!⸜(。˃ ᵕ ˂ )⸝♡ Here is the link https://shrestha-project-07.wuaze.com
Devlog #14 Hello everyone, Welcome to Devlog #14 of AniSuffle ! (≧▽≦) Okay, so this is the first devlog after I have shipped the project. And yes… I’m still working on the project. ( ̄▽ ̄)ゞ Thanks to @Gideonthegreat for the feedbacks! Yeah, I mean, I got some awesome feedback, and I really wanted to add more and make more changes. (๑•̀ㅂ•́)و✧ After thinking and looking around the code for a while… (and staring at it for way longer than I should have) I finally decided to integrate the Hover to Play Trailer feature first . I did not want to just replace the click ripple animation. That’s why I decided to add it as an option ,you can click on the hamburger menu (the three horizontal lines in the top-right corner), where you can turn the Hover to Play Trailer option on and off. ヽ(・∀・)ノ. [I will update the live site later on, as i am still working on it (ó﹏ò。)] It is still not complete. (ᵕ—ᴗ—) I’m still working on it! So I’ll show you a demo video[My laptop is potato so the video is abit laggy, plz dont mind that], but please don’t take it as the final version. I’m still thinking of making more changes to it… hehehe. (,,¬﹏¬,,) I accept that I still need to optimize this feature, and the clip was short as my laptop was lagging alot 😭 (see the CPU usage ( top blue bars)) Maybe I’ll end up changing something again before the next devlog. Who knows? (☞゚ヮ゚)☞ I guess that’s it for this devlog! (ノ◕ヮ◕)ノ*:・゚✧ I will still love feedback if you have any =) Thank you so much for reading! <(_ _)> See you in the next one Thank you again and have a nice day =)
Devlog #15 Hello everyone, Welcome to Devlog #15 of AniSuffle ! So first, I have a few announcements. I got some more feedback, and in respect of those, I will now be making the devlogs shorter and use limited/less kaomoji (ó﹏ò。), so that you can read the devlogs more clearly. Update So, I have finally finished working on the Hover to Play Trailer feature. I just have a mute and unmute button which will be displayed on the trailer when hovered. When hovering, for a few seconds, it will also show titles, the YouTube logo, and other YouTube things. I tried to hide those but was unable to. When I asked AI, it told me that it was not possible. Rather, it gave me alternative ways, which I thought would not be a great user experience, so I left it as default. (ᵕ—ᴗ—) I had a hard time fixing the overlapping of the hover and click animations, but those are finally gone. Now I guess that’s it for this devlog. Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #16 Hello everyone, Welcome to Devlog #16 of AniSuffle ! Update I have made few changes , I changed the Hover Trailer text from Hover Trailer On / Off to a checkbox ,as I found a cool looking (i guess it is) checkbox on a site and also a mute and unmute btn . So I changed them . I will keep a clip below rather then explaining with words . ##Credit Mute Btn (when hover trailer is on) : https://uiverse.io/catraco/dry-robin-61CheckBox Animation (On hover trailer) : https://uiverse.io/00Kubi/hot-dragonfly-56 I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #17 Hello everyone, Welcome to Devlog #17 of AniSuffle ! Update I have changed the background of the intro page and added a video as a background instead (i will provide the link below)(as the old one was AI made, not a copy paste though).There is a skip button in the intro incase its boring for you . Also on one of the feedback , I saw one reviewer was not able to access the for some reason i really dont know why, so now i have moved the site to https://shrestha-project-07.wuaze.com this url, even though the old site will be active , the new updates will be availble on this site only . I might update this link on old devlogs as well. Currently I am working on the trending section , where you will be able to see the trending anime list or in card form, but i will try to make it intresting somehow =) Also , both sites share same database so if you have logged in before then , you can still use that id to login in both site. Credit: https://www.youtube.com/watch?v=1L7mzyGhXCA (there are few edits/cuts i did) I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #18 Hello everyone, Welcome to Devlog #18 of AniSuffle ! I know it has been a while , but to be honest , i dont really have much to show for this devlog . Even though I have been working on something fun to be added in this site. Update I the last devlog I told that I will be working on the treding section ,but while making that I dont know for some reason I wanted to make a game like thing in this site. Lemme give a brief description . so I was thinking of making a Rating Guess game , where you will be shown any 4 anime poster and its name and you would have to choose a anime and you will be given a score and I am also planning to make a leaderboard so that the game feels even more competetive, but the problem is that I dont want to make sign in compulsory and I would need a username for that . So I have been working on the game but still am unsure about the usernames , as asking multiple usernames might be confusing so, I am still thinking on what to do about this. I would not expand the devlog anymore. If you have any question please comment , I will try to explaing things there , thank you so much . Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #19 Hello everyone, Welcome to Devlog #19 of AniSuffle ! First , Our project got SuperStar title and I thank you all,Without ya all my this project would not have got that level of attention. Thanks to all of you and the reviewer for marking it as a SuperStar Project . It made me so happy. Thank you so much (˶>⩊<˶) Update After creating and deleting the same table , the same database many times . I have finally decided to remove the username from the signin option and kept it on the rate game page , which means while signing in you wont have to use username , rather you will sign up using only gmail . Also , I am thinking of linking the gmail with the username automatically after the user has signed in so the progress is stored in the connected account. I am currently working on the backend so there is nothing intresting to show but i will keep the site image for now … I would not expand the devlog anymore. If you have any question please comment ,though I am myself not so sure about the username thing, I mean… I might change the data structure if things go wrong,so if you ask me rn about how i will be storing data exactly then my answer might not be that clear but I will still try , thank you so much . Thanks for reading! <(_ _)> Have a nice day!
Devlog #20 Hello everyone, Welcome to Devlog #20 of AniSuffle ! Update Hey everyone , a quick update . I again changed my plan and I have now decided to use the intro username as the unique username which will be used everwhere , like in the database and the leaderboard. I apologize for creating the confusion but I felt like asking multiple username might be even more confusing (ó﹏ò。). So i planned to stick with the single username to maintain consistency and to avoid confusion. I would not expand the devlog anymore unnecessarily and waste your time. And I hope I made everything clear If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Devlog #21 Hello everyone, Welcome to Devlog #21 of AniSuffle ! Update I made a rough templete or a rough design on what the guess highest rating might look like , I mean the structure only , I will change the design and animation later on . Nothing much to explain but I will keep the design image below . Also I am still building the functionality . Right now they only fetch 4 differenct anime poster name and score . I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Devlog #22 Hello everyone, Welcome to Devlog #22 of AniSuffle ! Update Ok , so This time I was working on the intro side and I realized that before I changed some data structure while storing the username and i am now COOKED (╥﹏╥). Also I was searching for the error in my backend becuase of which the skip btn never appeared and even after asking ai , It was not able to help me ,and after giving it a tons of screenshots of the project , console and networks , It told me to remove a comment - - . And even more annoying or good thing (i dont even know what to call it anymore) was that the code worked after removing the comment. It made no sense to me , and honestly I still dont know why even that comment was causing the issue . Trust me I stared that code for more than an hour only to remove the comment at the end. Anyway , the code is now working (but i know there are still bunch of more bug to fix), so the main addition i would say rn is the live checking of the username . The username entered will be checked at the live time (every 400ms to be more precise). I guess thats all. I know it might sound like not much addition but it was more debug i did this time - -. I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Devlog #23 Hello everyone, Welcome to Devlog #23 of AniSuffle ! Update One more bug ,fixed and found . So, till now the username stored would only be saved if someone entered the name in the intro and played the guess rating game. And now its fixed and Now the username is stored in the database immediately after the username name is submitted in the intro username section. Also One more thing , if someone took the username as “PAPER” and later if someone tries “paper” then the name will not be allowed. I did it just to be safe and later no any confusion or bug to occur just becase of the case of the entered word . I will add a screenshot of username is taken below(As I dont know what screenshot to add on this devlog :p ). I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Ships:
# Welcome to the shipping devlog (I guess , I don't know what its called) (≧▽≦) Hey um.. In this section I will be giving the overview of my entire project , I will try to keep things simple and short. *(please read github as i m facing limit issue here)* (╥﹏╥) Ok, so my project **"AniSuffle"** is a webpage where you can get random Anime/Manga recommendations. But there is way more things I worked on , please let me explain. ( •̀ ω •́ )✧ ## Features ### Generate Random Anime/Manga I have integrated **4 APIs** (**Jikan, Anilist, Kitsu And MangaDex**) for fetching Anime/Manga recommendations. Jikan, Anilist and Kitsu can fetch both Anime and Manga while MangaDex fetches Manga only. They all work together as a fallback system, so if one API fails, another will handle it , you (solving the rate limit issue). =) ### Authentication (Login/SignUP) Logging in or signing in is **NOT COMPULSORY**. I repeat , as I can understand that its such a pain, I had to add it so that you could access the list anywhere in any device . **Make sure to enter unique username in the signup page** The only thing it gives you is access to your saved list across different devices. If you don't want to use your personal email while reviewing, you can use a temporary email. I have also uploaded a video in **Devlog #12** showing how to do it Just in case you dont know how to do that =) ### LocalStorage & Database * Not signed in → saves are stored in **LocalStorage**. * Signed in → saves are stored in the **Database**. * Existing LocalStorage saves are automatically transferred to the database after login to avoid duplication. ### Genre Selection You can generate recommendations based on your selected genre. Some APIs name genres differently, so in a few cases you may receive a closely related genre instead. ### Other Features * Embedded YouTube trailers (when available) * Switch between Anime & Manga * High Rated First (7+ rating) * Double click the poster to save * External links to Crunchyroll, Netflix, AnimeSuge, MangaDex, Viz, BookWalker and YouTube (if available on the API) --- ## Detailed Explanation Please read the **README** on the GitHub repository if you'd like the detailed explanation of how everything works. I had to shorten this because I'm exceeding the character limit. (>﹏<) --- Thank you so so so much. I really really really hope you will like this project. (づ。◕‿‿◕。)づ...
|
1792878842.9091005
|
1793742842.9091005
|
|
29956
|
Barrel Roll Bullet by @ShinyMist | Stardance
|
ShinyMist
|
1
|
118.0
|
2120
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:55:16Z", "hours": 118.0, "multiplier": 17.91, "payout": 2120, "blessing": "neutral", "text": "Barrel Roll Bullet A recoil-based platformer where, instead of traditional jumping and movement, you shoot to propel yourself around each level. My game includes multiple abilities, unlockable gun skins and 50 levels. The biggest challenge I faced was developing an accurate and efficient collision system. Initially, I planned to use AABB collision, but because it relies on rectangular bounding boxes, I found that the gun barrel could appear to float when rotating or interacting with objects. I then experimented with mask collision to achieve pixel-perfect accuracy. However, using a large number of masks throughout a level caused noticeable drops in performance. I eventually settled on a middle ground using SAT (Separating Axis Theorem) polygon-based collision. This provided much more accurate collision detection for the rotating gun while being significantly more performant than mask collision, allowing me to maintain both responsive gameplay and consistent performance. I am proud of the persistence I have demonstrated throughout the project. During the early stages of development, I encountered significant gaps in my knowledge, particularly as I was new to object-oriented programming. At times, I struggled with seemingly simple tasks, such as correctly initialising a game window or positioning a rectangle where I intended it to be. Despite these difficulties, I continued to learn, troubleshoot and refine my approach rather than abandoning features when they became challenging.", "repo": "https://github.com/Oliver-Attoe/StarDanceProject_FLStudioGrind", "demo": "https://github.com/Oliver-Attoe/StarDanceProject_FLStudioGrind/releases/tag/v1.0.0"}]...
|
[{"post_id": 73026, "ts": "202 [{"post_id": 73026, "ts": "2026-09-24T07:21:08Z", "hours": 0.5231, "text": "Dev Log #39 . THE FINAL DEV LOG . I am finally ready to ship!!! . I did the following: Made a working read me Made a working exe file of my game Removed de-bugging features so game works as intended. Stopped music overlap from happening Removed all copyrighted music (may have mentioned this previously) I used pyinstaller tocreate my exe file. . Level buttons now only work if player max player level is less than or equal to the level you are selecting. . Stopped music overlap by puting stop music into every game state + in load room function . Its been a pleasure to take part in the stardance event. Lets have a look to see how far this project has come!!!"}, {"post_id": 71415, "ts": "2026-09-20T19:44:37Z", "hours": 2.6217, "text": "Dev Log #38 . DONE . I did the following: Added music that plays while in level Removed copyrighted music Finished all GUI Made code neat using ruff Will ship at some point soon. See you on ship day!!!!"}, {"post_id": 71257, "ts": "2026-09-20T15:13:48Z", "hours": 4.6078, "text": "Dev Log #37 . All code is 100% complete now, the only thing left to do is finish all of the UI and then I am ready to ship. . Today I: Fixed portals Added level skip button Displayed bonus objectives Made button rotation work when pressed also Made gun select display gun images Portal code issue was caused by object overlapping with tiles, cause tile collision resolution to push the player out of the tile, and at times out of the map. Fixed this by teleporting player slightly above the object (above being determined by orientation). . Level skip increases player level, restarts level and spawns player in next level. . Bonus objectives screen.blitted on win, text appears green when objective met, red when it hasn’t . Used updated rotated button rect rather then previous and changed screen.blit to use center of rect rather than topleft . For each button in gun group, i screen.blited that gun into the center of the select gun skin rect . Thats all, hope to ship by tonight."}, {"post_id": 69536, "ts": "2026-09-17T07:47:24Z", "hours": 5.2261, "text": "Dev Log #36 . I have done most of the updating of UI, having only a few assests left and one level left to edit. . In addition to this, I have also made it so that buttons now appear pressed when pressed, rather than disappearing. . My easter egg room also stops the music correctly on level complete. . The final objectives are as follows: Have gun select each have image of gun Waiver has displayed text Hint video made and linked correctly All button can only be pressed when on screen Finish misc Assets Add death, win, and coins/stars collected based on mission objectives complete Thats all, I think 20/09/2026 could still be the date for the books, but I’ve got to put the burners on to get this finsished to a level of polish I’m happy with."}, {"post_id": 66573, "ts": "2026-09-12T12:32:48Z", "hours": 1.6919, "text": "Dev Log #35 . Been a bit distracted from this project due to school starting but I’ve been able to get a few things done. . I have done the following: Finished dialogue texts Made it so that dialogue box only appears when there is text Given kill tiles rotatable counterparts Added muzzle flash Added ability pick up sounds Updated a few more assets My Git commits have started to get a bit sloppy as i do these little bits on during my free periods, but im getting back into the swing of things . The dialogue box will only appear if text != “” and will put the player in the start playing state, without requiring a mouse click like it did previously. . Adding sounds was pretty simple so I wil leave an example bellow if self.rect.colliderect(ability[\"rect\"]): if self.gravity_flip > 0: up_gravity_fx.play() else: down_gravity_fx.play() ability[\"collected\"] = True self.gravity_flip *= -1 That’s all, I think 20/09/2026 will be a date for the books as I’m confident I will be finished by then. ALSO, if anyone sees this before ship, could you let me know any ideas for what my 16x16 tile for regular tiles could look like? Many thanks if you respond"}, {"post_id": 64309, "ts": "2026-09-08T16:27:15Z", "hours": 5.7308, "text": "Dev Log #34. . Just cleaning some things up now, we are in the home stretch . I did the following: Updated assest Updated object display code fixed broken dialogue Most assets have a fresh new look created in photopea . Buttons can now be loaded at rotated orientations . Dialogue now does display and does not disapear on first level load. This is because the start playing state was being skipped, i fixed this by using a continue, which skipped the rest of the current loop iteration, preventing the start-state code from continuing to run after changing playing_state. . Thats all, most of my time when into design. See you next devlog"}, {"post_id": 57440, "ts": "2026-08-29T16:21:03Z", "hours": 9.3847, "text": "Dev Log #33 . As you can probably guess, I have done alot I have done the following: • Gave all levels the correct level variables • Made buttons work correctly when rotated • Made teleport bullets work as intended • Made gates and broken tiles allow bullets to pass through when collision is removed • Created an EXE file of my game for friends to use for playtesting • Made a stat tracker to use playtest information to improve my game • Corrected all file directories that had to be moved for PyInstaller to work properly • Fixed the Easter egg room so it now loads correctly • Added AI declaration comments That is a lots, so let me quick fire explain how i did them Painful repetition, change variables, restart level, change tiles, reset level, change ability position, reset. Repeat for level in levels (do this 50 times) . This was partially assisted by AI, but from what I understand the buttons’ Tiled rotation number is used to adjust the collision rectangle’s position so it matches the rotated button object in tiled. Collision check works as did previously. . Teleport bullets originally tp the player if a bullet fired priviously hit a way after pickup, despite no bullet being fired after pickup and also sometimes caused the player to shoot downwards through tiles. . I fixed the wrong bullet tp by using a self.variable rather than a global one as previously, allowing each bullet to know if they were teleport enabled, rather than all bullets being teleport enabled. . The tile collision isssue was fixed by by moving the player backwards along the bullet’s path until they are outside the tile, preventing the gun from passing through walls and being pulled down . This one will just explain itself (if tile in list, then ignore kill on contact): for tile in Tiles.tiles: if self.rect.colliderect(tile[\"rect\"]): tile_property = tile[\"property\"].get(\"type\") if tile_property in Tiles.open_gates: continue This used pyinstaller, not something i really code or anything so, I’ll just say i did it sucessfully . Stat tracker records bullet count, time and deaths/restarts that a level took on completion. Difficulty of a level can also be decided by a play tester by pressing any number button during a level. . This data is level specific, and on key press of /, will create a json file that holds all the data, which can then be sent for me for review of things like bullet max, time complete bonus time, ect. . Self explanatory, just changed things like “Image/buttn.png” to “Game/Image/button.png” . Restart all function was required in load room function as it contains map load, so the level map that was supposed to load is not displayed instead of the secret easter egg map. . 9.Should have declared AI usage earlier, but I have been checking my chat history and I have been able to determine what sections of my code are AI generated . That’s all, gotta try and keep my daily streak alive this time to score myself a free plush."}, {"post_id": 54686, "ts": "2026-08-25T19:01:58Z", "hours": 3.5433, "text": "Dev Log #32 . Made 50 levels today, that is all. . Every 3 levels, a new ability/feature is added. This allows the player to get used to the new thing added, making their later appearance managble as the player is now used to how they function. . I have not set the player and goal location co-ordinates for each level, or other variables like if mini stars are required. . That’s all for today."}, {"post_id": 54018, "ts": "2026-08-24T19:16:39Z", "hours": 2.2183, "text": "Dev Log #31 . I AM FINISHED!!! . Well, pretty much at least. . Today I: Completed the Waiver Made some more levels I made it so that the text box works with word wrap, enter key and backspace key. . I did this by splitting the text into words and lines, then checking each word’s width against the rect boundaries. . If the word exceeds the boundaries x, the texts’ x position is reset and the Y-coordinate is incremented, creating a new line. . The Enter key creates a new line by resetting x and incrementing y, while Backspace removes the last character from the text string, preventing it from being displayed. . The waiver now checks if all fields are filled and allows you to press a button that is connected to a hyperlink that will, in the future, take you to a video created my me showing how each level is complete. . Also made 12 levels today, each new feature is slowly implemented one at time. . That’s all for today."}, {"post_id": 53326, "ts": "2026-08-23T20:00:08Z", "hours": 2.7178, "text": "Dev Log #30 . The big 30!!! . Done quite a bit today, just last bit of polishing and then we move towards UI, music, level design, ect. . Today I: FINISHED THE DIALOGUE SYTEM Added a leave waiver button (was a softlock) Added a text box to waiver [WIP] Dialogue system works fully (minus sound but thats still a win in my books). Plays on level start and level completion and once dialogue is viewed by the player, it is not shown to them again. . Mouse can be clicked to remove dialogue from the screen, without triggering bullet fire. . Also fixed the issue of the text backround being displayed on re-entry and re-completion of the level, but fixed that easily with a variable, setting it to true or false if level had already been completed, then only displaying the text bg when it was true. . Waiver leave button pretty simple, basic pygame rect collidepoint detection. . Text box sets text_active to true on mouse click, mouse clicks anywhere else set it to false, meaning player can only type when they have clicked on it (when they want to). . I appened every event.unicode into a list on key press, meaning I had a list of the players key storkes, then screen.blitted each letter in the list. . Final touches are making all fields complete required to acess button that is a hyperlink to video of me completing stages with instuctions to help, and also backspace and enter and wordwrap working with the text_box. . Then I think I’m done for the most part on the coding side of things, and will move onto level creation. . The only thing I haven’t completed from my long list from a preious dev_log are: Level editor Upside down ability James bond level start Hint dialogue on multiple deaths Boss fight Not to say these aren’t going to be added but they are not simple things and will not really add to much to my game in all honesty. Given the deadline of end of this month I have given myself, I don’t know if I will have time to add these (except for the James bond level start thing as that is a UI thing that will require art, music ect so might work on that when not coding. . That’s all, thanks for reading (:"}, {"post_id": 52887, "ts": "2026-08-23T08:25:38Z", "hours": 2.2633, "text": "Dev Log #29 . I’m pretty close to finishing the code side of my game now, the rest of my efforts will soon be focous toward things like: Writing dialogue Making nicer looking UI Making tiles look good rather than coloured blocks Animations Music Today I did the following: Re made the dialogue system AGAIN Created a gun selection screen My dialogue system displays a word at a time and plays a short noise for each word shown, similarily to undertale voice blips. However, I think it sounds quite bad and I plan to replace it with a set dialogue sound that plays at the start, like animal crossing. . My dialogue system now plays on level start and level completion, and does not re-trigger on level repeat, using similar code used in my star tracking code. . Gun select code is similar to my level select code, using a different class but the same code, just changing the lock out code to only unlock once star count is >= button number - 1 * 6, so that each button is unlocked for each 6 stars earned, as well as having the default gun already unlocked. . That’s all for today, I hope to have a complete game by the end of the month so I can have this finished before the school year starts."}, {"post_id": 51905, "ts": "2026-08-21T20:16:23Z", "hours": 2.1786, "text": "Dev Log #28 . Didn’t do alot today, or for the 2 other days… . I finally made ghost bullets work correctly and have changed the dialogue sytem a bit . The ghost bullets working and not working previously was juts a matter of using variables inside the bullet class rather than global ones, making it work better for some reason, I had the assistance of a friend in fixing the issue, and safe to say it solved it . Dialogue sytem has only been changed slightly so not much point documenting the changes, spacing, timing of letters, ect. . Sorry for short devlog, I hope I have more tommorrow."}, {"post_id": 49659, "ts": "2026-08-18T15:26:51Z", "hours": 3.4011, "text": "Dev Log #27 . More things checked of the list today: . Today I did: Added gravity flip ability Added teleport bullets Added player mission objectives However, some other things i worked on today are still a work in progress, such as: Diologue system Ghost bullets (travel through walls) Gravity flip works similarily to how slow time works, settings the variable self.gravity_flip to -1 on contact, then multiplying graivty strenght by it, reversing the direction of gravity . This however made my realign function not work when on the ceiling, so i added to re-align that if gravity_flip was negative, to detect ceiling hit rather than grounded, allowing it to work why gravity was flipped. . Teleport bullets work by setting a can teleport function to True on contact, then when true, if bullet collidesrect with tile, self.rect of bullet is equal to self.rect of gun. the can tele[port function is then set to false, making the ability only work once as intended. . Player mission objects are as follows: Complete level Complete level in set ammount of time Complete level with less bullets than provided This uses lists in a way i have never used them before and looks like this total_stars = 0 level_stars = [[False, False, False] for _ in range(levels)] If player completes level, level_stars[Settings.player_level - 1][0] for current player level is set to True. . If player completes level quickly (complete_time < bonus_time), then …[1] is set to true . If player reaches has_won game state with a number of bullets lower than the bullet max, then then …[2] is set to True. . Total stars is incremented by one for each goal completed, and if level_stars[Settings.player_level - 1][1,2 or 3] is already set to true, then the increment is skipped, meaning you can only get 3 stars per level. . That’s all for now, hope to fix the issues I had today in tomorrows devlog!!"}, {"post_id": 49172, "ts": "2026-08-17T20:15:54Z", "hours": 2.1058, "text": "Dev Log #26 . Popped ULT today!!! . Today I added the following: Slow time ability Breakable surfaces Bullet pickup Fixed up dialogue system (Not fully complete) Slow time ability works by setting a time to a decimal then multplying the following by it: Velocity (Bullet + Player) Rotation speed Gravity strength Multiplying by a decimal reduces the numbers, emulating slowed time rather than reducing fps which is a bit of a cop-out . Breakable surfaces work similarly to the gate tiles, the tiles having a alpha value of 0 when bullet rect makes contact with tile of that class and adding that tile type to a list: broken_tiles. . All tiles in that list are then ignored by tile collision . Bullet pickup works by detecting rect collision between the player and the surface, when contact is made the players bullet count (representing bullets shot total) is reduced by one, increasing the number of shots available to the player by one. . Dialogue system now works with full words, voice blips are annoying but will fix late stage when adding polish. Will also make it that player has to click mouse to go to next dialogue screen to give them time to read the text. . That is 3 and a bit things of the list, very good progress, juggling summer work, this and most importantly my Minecraft duties has been an upward hill battle but I’m getting there. . See you next develop with more progress!!!"}, {"post_id": 48445, "ts": "2026-08-16T19:54:18Z", "hours": 0.6561, "text": "Dev Log #25 . My love for videojuegos has got the better of me. . Over theses 2 days all I have done is made some level maps and fixed the spawing positions of both win condition and the player based on the new maps. . But I have structure now, and rather than geting destracted, I have set myself some goals to complete hopefully by the end of the month, leaving me time to make the UI look nice. . I present to you. THE TOD0 LIST: . A - DIOLOGUE Fix dialogue system Add hint dialogue Add new level dialogue Add completed dialogue B - ABILITIES/TILES Bullet Pickup Ghost bullets Teleport bullets Time SLOW (not stop) Gravity flip ? Map flip ? Breakable tiles Level editor ? C - UI James bond level start animation Gun skin menu All menus with all required buttons D - Miscellaneous Mission objectives (Bad piggies esque) Determine gun skin unlock criteria A FINAL BOSS !?!?! I hope tomorrow if filled with WAY more advancements of the work kind rather than the Minecraft kind (;"}, {"post_id": 47115, "ts": "2026-08-14T19:25:06Z", "hours": 2.7211, "text": "Dev Log #24 . A progress full day today, but mabye not for the best?? . Today I done the following: Added a charcater diologue box Fixes re-align function so that it works when rotation direction is reversed Just doing little sidequests for now as I’m trying to hide from my enemy, level design. The things is I’m not very good at games, so i dont have the reaction time to create very punishing levels with little room for error. . So to combat this, I end up making really hard levels or super easy ones. . Additionally, I barley add any time to my total when creating levels as it uses a piece of software outside of visual studio. . My character text box is pretty much a recreation of the ones seen in undertale, even using the voice blip of toriel as a place holder. . This should allow me to add a small story that I will make sure to keep simple, like a mario esque plot. . The re-align function was fixed by using the variable rotation direction, then setting that to 1 or -1 depending on contact with reverse direction ability or not . Then multiplying rot_speed by that value reverse the direction that re-align moves. . I will have to knuckle down on level design tomorrow and make sure each level introduces the abilities and tiles one at a time, letting the player get used to them, allowing for levels that include a mix of multiple to be more approachable."}, {"post_id": 46505, "ts": "2026-08-13T19:34:14Z", "hours": 3.1664, "text": "Dev Log #23 . Very good day today, embracing the foddian likeness of my game, making sure that the player gets as angry as possible, just to make that feeling of victory feel so sweet. . Here’s what I did today: LOSER document created (must be filled in to reveal hints, which will be added later) Change rotation direction ability New map (Still a WIP) Document uses follow mouse function and draw line function. Starting the line at the mouses previous position and ending it at its new position. . This happens very fast, so the lines do not appear blocky and appear like real pencil drawing. . The change rotation ability uses the pbject layer like my previous time stop ability, and now that I understand how object layers work, i was easily able to make this ability by copying my clock abiltiy load and changing the result of contact. . The result being making rotation speed negative, reversing direction of rotation. . The new map uses a mix of many abilities and objects, but I have not added them in just yet. . I could quite easily I feel but I’ve reached my 3 hour brain capacity limit, because realisticly with the time spent making pngs, finding sounds, reading pygame documentation and waching tutorials, I’ve probably spent about 5. . But rewards are not for the weak or the lazy, and this little project of mine is helping me leaps and bounds for my future A-level comp sci journey. . See you next time, with some jucy new progress!!!!"}, {"post_id": 45899, "ts": "2026-08-12T17:26:00Z", "hours": 3.3278, "text": "Dev log #22 . Back to business!! . Today I added: Uncompleted level select lockout Separated tile load into own file Easter egg room added Level lockout works by calculating max_player_level, the furthest level a player can select based on if they have beat the previous levels. . This works buy using a function to check if current player_level is greater than max_player_level, if it is then max_player_level = player level. . Then for level select button with number greater than max_player_level, a red cross is screen.blited ontop,as well as not allowing mouse clicks of the rect from having any function. . Tile file separation helped me remove 150 lines from my main file, improving readability. . My easter egg has a 2% chance of happening and gives the player a custom gun appearance on discovery. . The code used to change the guns appearenece should let me, in future, make custom skins for the gun, skins that could be rewarded for levels complete, secondary level goals reached, ect… . I will not share how to reach my secret room, but I think it would be better for someone to stumble across it by accident. . Good day today, progress is picking up pace again, good job me!!! . Strange, it seems, there is a man here…."}, {"post_id": 45339, "ts": "2026-08-11T18:45:05Z", "hours": 2.1411, "text": "Dev Log #21 . Getting lazy now, saw hacktime was down and decided not to bother doing anything before 12, but I hope I will break this cycle. . Today I added working buttons that when pressed, remove gate blocking path. . Had to over hall all my tile loading and map loading and parts of my collision resolution to allow me to reduce the lag being caused in some levels and be able to remove collision selectively for tile types. . I learn how to use set today. I used a set to store the types of gates that have been opened because it prevents duplicates and allows me to quickly check whether a specific gate is open. . No animations for button presses yet as I want to leave that stuff for the end. . I’m feeling the time crunch now because I really want this to be finished before I get back to school and focus on my studies, but this still counts as practice so I’ll continue a little bit during school days. . I will do better tomorrow I promise, cause I’ve got this far, it would be a waste to stop now."}, {"post_id": 44821, "ts": "2026-08-10T20:55:15Z", "hours": 2.8053, "text": "Dev Log #20 . Sorry for the hiatus, not a lot done, but sure I will be soaring tomorrow. . Today I addded: Killable enemies New reset all function Killable enemies act as win conditions, similar to the mini stars, having to all be killed for the goal polygon to spawn. . The reset function made my code much more readable and allowed me to condense all of the restart events like lose velocity, set position here, screen.blit things again if needed. . I started working on 3 buttons that when pressed, open a gate but didn’t get to finishing it sadly. . I want each button to have different press conditions, one can be pressed by bullets only, one only on direct gun contact and the other working with either or. . In later stages, I will have to think how i will communicate this functionality to the player but I’m saving texturing and making the game look good for last. . Hope to have more progress tomorrow. Fingers crossed."}, {"post_id": 42861, "ts": "2026-08-07T20:19:50Z", "hours": 2.4408, "text": "Dev Log #19 . Getting lazy, need to lock in and get 3 hours tomorrow. . Today I added: Working portals Time stop ability Portals and time stop ability use object layers in tiles, a much easier solution compared to my use of polygons for complete goals, may change that but not sure. . Time stop ability is pretty simple, works like pause menu, but allows image rotation and enables follow mouse. . Portals work by on contact, moving player position centre to other portal centre. . The velocity changes with the exit direction using the following code: rotation_difference = entry_angle - exit_angle self.velocity.rotate_ip(rotation_difference) Overall, ok day, not sure what I’ll do tmr, but I’m sure theres something hiding on my checklist. . ALSO!!, Fix this horrible performance issue I had, see bellow for comparison"}, {"post_id": 42135, "ts": "2026-08-06T18:44:20Z", "hours": 2.5461, "text": "Dev Log #18 . Good day, but stopped early today beacuse, well, i’m afraid… . What I did today: Added mini_stars Added re-align option when grounded Added new map Mini stars are to be collected first, unlocking the finish goal. They are hard coded right now so cant be moved for new levels, but I can change that if need be. . Re-align was initially supposed to allow A to rotate the player one direction and D the other, but my game seemed to really not like decreasing the angle value when grounded. . So I’ve made it so rotation only happens one direction, but a full 360 range of motion is possible. . The new map that uses portals, but the portals are not actually functional yet so, thats a job for tomorrow . . Almost everything added from last devlogs check list, but decided against adding placeholder music during playing state as i think I would go insane from listening to it on loop, so that can wait till the end. . Hope to have a longer more prosperous dev log next time, see you then!!!"}, {"post_id": 41536, "ts": "2026-08-05T20:08:05Z", "hours": 3.6981, "text": "Dev Log #17 . Feel kinda stuck in-between, but once a pass my last hurdle, all of my efforts will be focused on new abilities, new tiles and art, but the basics are sooo close to being complete. . Today i did the following: Level stopwatch Level complete goal changed Edited map Complete goal had to be changed to make animation of win goal possible, like coin pick up in Mario. Uses polygon collision, freezes on contact currently but working on fix. . Level stopwatch works well, and works with pause menu by subtracting time passed in pause menu from counter total on continue button pressed. . Map needed editing as I feel my game is too hard and my muscle memory from 100’s of tries makes it feel easy, but really isn’t. . Tried making a new map that requires you to collect many little stars to reveal the goal but found it hard to find a map that works with wide range of movement. . This issue is caused by gun being useless most of the time on collision with floor as it is aimed the wrong way. . I plan to have the player be able to rotate the gun while its grounded using A or D, this re-ajusting stopping players getting stuck. That or a jump ability. . Next devlog hope to have: Mini stars working New map Rotate/jump when grounded Game in progress music See you next devlog, no 1 day hiatus next time (;"}, {"post_id": 40339, "ts": "2026-08-03T19:40:47Z", "hours": 2.6639, "text": "Dev Log #16 . Today was good. I was welmed. . I did the following today: Added working kill tile Fixed image lagging behind player polygon Switched over to match cases Kill tile works as intended, but doen’t ‘kill’ the player yet, it just freezes everything, plays a sound and propts you to restart. . Image lagging behind was a big issue, causing the kill tile to look as if it were killing without contact, but this was cause by the image lag behind. . I tried changing the order of functions in update() but that didn’t work, tried other stuff like changing how some functions work, in the end, it was because i called update after player_group.draw(). Silly me!! . Match case switch over was easy, just the indentation was at times a pain, but I’ve sorted it now, thank goodness! . Going to try and finish the loss screen that appears, adding a level select button and a return to start, but might not as its not strictly necessary, but does look nice. . Not sure what other stuff to add, maybe a new level? . Who knows, see you next Dev Log!!!!"}, {"post_id": 39640, "ts": "2026-08-02T19:23:20Z", "hours": 3.0406, "text": "#Dev Log 15 . Good day at the office. . Did the following today: Working level select Fixed Music Issue Fixed map loading issues (didn’t discover until today) Added tile classes to replace gid based system for tile specific collision My issues today were caused by my moving of code into separate files, but I’m getting there. I’m no longer using from ___ import * and I am instead using import ______. . The sound issue was caused by a variable in settings setting play music to False without my knowledge. . Map loading broke because my maps are only loaded once outside of the while loop, so I fixed that. . Tiles now have a class that can be checked, allowing for different interactions with tiles dependent on tile class. . Thinking about storing some of my variables into match statements for readability but I find using match cases in Settings.py to be really difficult so I will proceed with caution and immense fear!!! . Not sure what tomorrow holds, thinking about making the kill and win tiles do something rather than print win or killed, but might be held up by this switch from many elifs to match cases. . Staying determined, see you next dev log. . PS, a little hint to my little easter egg 📂︎🖮︎"}, {"post_id": 39080, "ts": "2026-08-01T19:29:51Z", "hours": 4.105, "text": "#Dev Log 14 . Ying ang Yang session today: . I did the following: 2 new maps - one I’m keeping a secret for the complete game >;] Level select rect load (not working YET) Kill tile (detection only) Separating code into files outside of main Music Broke…. Level select menu was a perfect mix of challenge and enjoyability. . I loaded the squares in this even patter by creating a rect at (360, 260), then after the first rectangle is created, add 120 to the x value, until x >= 960. . Then I added 120 to y to create a new line and set x back to 360. . The kill tile collision was done the same way as the win tile collision, using tile ID’s. . The only issue I’ve come across is the music suddenyl not working after moving it into its own seperate file, despite it working like an hour before. . I’ve left this issue for tomorrow as I’ve already got a lot of hours under my belt today. . Also the new level is not possible despite all my effort so will have to change that also. . Good progress today, I’ve made a lit of all I want to achieve in Barrel Roll Bullet before the dedline and one by one, I’m checking that list of. . See you next devlog. Maybe then I’ll reveal the space in-between 💣︎♋︎■︎📬︎□︎♑︎♑︎"}, {"post_id": 38447, "ts": "2026-07-31T20:17:36Z", "hours": 2.0106, "text": "Dev Log #13.Unlucky for some, but not for me! . Collision resolution finally working!!!! . Here’s how it works: . SAT algorithm returns the axis with the smallest overlap (this is the shortest distance to separate the player and the tile). . Correct normal line direction so that it points from the tile to the player. . Move player across MTV (Minimum Translation Vector), pushing player out of the tile. Note: MTV is calculated by choosing the smallest overlap in the direction that moves the two shapes apart. . Remove velocity that is parallel to the collision surface, allowing the object to glide across it without getting stuck. . That’s the jist of it. There are some other things I didn’t include, like how only polygons are made for tiles touching the player’s polygon/rect, but I discussed this in a past dev log. . In all honesty, I don’t fully understand the maths behind it, but I was still able to make my own SAT collision system, so I obviously know enough. . Also added some smaller things like a bullet limit and a restart caused by holding the R button down. . This is good progress and should allow me to add more easily things like level select, new Tiled maps, new tile variants that cause different effects, etc. . Next dev log is going to be packed with stuff!!!!.See you then (;"}, {"post_id": 37832, "ts": "2026-07-30T19:46:46Z", "hours": 2.4217, "text": "#Dev Log 12 . Good honest session today. . Changed my collision resolution as it seemed to be causing me alot of trouble and hurting preformance. . Now using polygon collision detection instead of mask collision as it greatly improves preformance and simplicty of colllision resolution. . Although that is still not perfect. . I had it working quite well to a point but once I tried to prevent wall riding through on ground variables set to True or False, everyhting seemed to go wibledy wobeldy from there. . My collision detection works as follow: Dictionary of tiles is made, each tile with a rect and id (needed to make certain tile types do different things). . From that list, add the tiles with rectangles that colide with the player into a new list . 3.With this list, I then draw a mask on the tile, setting the co-ordinates to the corners of the rect . Last step, use self.polygon_collision() to check for collision . This worked without a hitch, but my collision resolution sytem is not so flawless. . This has been a 3ish day long ordeal, but I want to get it solved now so that once I’ve got the basics done I can divert my attention to more fun things like gun abilities, kill tiles, moving platforms, ect. . Progress is not necessarily slow, just stuck on one convoluted thing. I hope I get things sorted soon, this is starting to be a real de-motervator. . But I got that frisk undertale in me so I’ll stay DETERMINED!!!"}, {"post_id": 37179, "ts": "2026-07-29T18:07:52Z", "hours": 3.7003, "text": "Dev Log #11 . Not Good. Very NOT Good. . What I achieved today Victory tile added Aiming reticle completely destroyed Fixed aiming reticle Mask detection not working as intended Gun no longer stopping rotation on collision complete loss of sanity OK, fun. How did this all happen? . My aiming reticle misangling issue was caused by setting initial rotation angle to 15. I did this to increse rotation speed. . The issue being this caused my gun image to also be rotated 15 degrees, causing the barrel not to point to my mouse. . I solved the issue by making initial rotation angle to 0, only += it to = 15 once first shot had been fired. . The next issue I have yet to solve is collision resolution. . It had been an underlying issue for some time, and i still don’t yet know how to fix it. But in my attempt to fix it, I then broke my stop_rotation function, meaning rotation now continues despite collision. . Hope to fix these issues by next devlog, then also give my recoil a bit of calibrating as each bullet seems to be weaker than the last, i think this is caused by my collision resolution setting velocity to 0. . Next devlog will hopefully be more fruitful!"}, {"post_id": 36456, "ts": "2026-07-28T16:14:07Z", "hours": 3.5108, "text": "Dev log #10 . DOUBLE DIGITS!! . What I did today: Added a working pause menu Fixed start screen size Spruced up mask collisions An issue im having with my new and improved collision sytem is that when i reduce player velocity on collision, as well as rotation speed, my player comes to a hault. . In real life, as im sure many of you know, a gun isnt likely to ballance on the barrel verticly, its handle will fall due to being heavier. . I do not yet know how to combat this issue, but I have brain stormed some ideas. . I was going to try and find a center of mass, but that wouldn’t work because that would cause my barrel to float at times due to being disproportionally lighter compared to the gun grip, meaning when gravity acted on it, it would be lob sided. . My other idea was to break the gun into 3 rectangles, barrel, handel and inbetween, then give these rectangles set weights. But i was unable to implement that. . I’m going to try some other solutions, but i think this is going to be some of my toughest challenges yet! . Still undesided on the goals for next devlog, we will see what my brain decided that faithfull day."}, {"post_id": 35966, "ts": "2026-07-27T19:09:25Z", "hours": 3.4547, "text": "Dev Log #9 . Not the best keyboard clacking session, but not the worst. Looking at you Dev Log #4 >:[ . Today I added pixel perfect collision. . First I got the players mask and a list of the rectangle tiles touching my player rectangle. I then listed these rectangles and was able to detect collision based on if they made contact with the players mask. . The next step was collision resolution. . After a detected collision, the location of collision is then increase the y co-ordinate of the player mask, effectivly keeping the player above the ground. This is how collision resolution works for all the other directions, just with varying positions. . With this I then attempted to add a feature that stopped rotation as a surface was hit, to prevent a constanly spinning gun that sits on the floor. . This is still a WIP, but I have been able to make the gun stop all movement once on contact on a wall, but this is unrealistic as in real life if an object makes contact with a wall it does not loose all its momentum. . I will try to combat this isse by adding a bounce effect that gradually reduces momentum on wall contact, rather than causing it to loose all of it. . Next devlog I hope to have a working wall bounce system and maybe a finish goal that, when entered, plays a victory noise and victory screen. . Holding out hope for the future!!"}, {"post_id": 35259, "ts": "2026-07-26T15:42:00Z", "hours": 2.6272, "text": "Dev Log #8 . I new it was too good to be true, progress has slowed yet again. ): . Today I added: ‘Working’ collisions While my collisions ‘work’, they only work when my player rectangle is unchanged. . The issue being when my gun rotates, its rectangle changes size. . This change of size is interpreted as a movement by my collision sytem, therefore once I come in contact with a tile, the bottom of the rectangle slowly becomes bigger and smaller. . this caused it to move to the tops of different tiles, eventually causing it to be flung out of the game window at rapid speed. . I plan to combat this issue with either of these methods: . OPTION A: Pixel perfect collision done through player masks. . This option is harder and can effect preformance if not implemented properly, but with give a smooth and finished collision effect . OPTION B: Set hitbox collision . This option creates a set region on the player, only that region (probably a rectangle shape to make collision detection easy) being able to collide with tiles. . This option will likely be easier, but will look less pollished as the gun barrel would not fall due to gravity, it would stay above the ground while the grip sits on the ground. . My goals for next dev-log are unclear, but for now I hope to have a working collision system at least!!!"}, {"post_id": 34808, "ts": "2026-07-25T20:07:27Z", "hours": 2.8481, "text": "Dev Log #7 . Another prosperous coding session today! . I have added the following features: Correct bullet orientation Sound effects Tiled surface (no collisions) I also had to change the screen size as its height and length needed to be divisible by 16 in order for my tiles to be used easily. . I added the pytmx python library to allow me to use Tiled, a software that makes level creation very simple and quickly repeatable. . It should significantly increase my workflow speed when I get far enough in development to actually be making levels. . I also did some fine tuning on the strength of recoil, making it stronger but controllable. . Additionally, I increased the speed at which the gun rotates in air to make aiming more difficult but still manageable. . Overall, 7/10 work day today. . By next devlog I hope to have some of the following complete: Working collision Finish goal that takes you to the next level Possible moving colidable tile Bullet limit and UI to show this I’m back in business now, regained most of the knowledge I lost from my 1 week hiatus. Wishing future me luck for the next devlog! . And all you others out there as well. STAY DETERMINED!!!!!"}, {"post_id": 34255, "ts": "2026-07-24T19:58:07Z", "hours": 3.2694, "text": "Dev Log #6 . I have made some absolute serious progress!! . I have added: . Working recoil In-air gun rotation Aiming phase and playing phase (turning aiming guide on and off) Dotted aiming guide This has by far been my best coding session as of late and had little to no complications… . Well there was one… Where my entire recoil system was built on mouse position, a mouse which only controls the direction of the bullet once and never again per level. . So that caused me some grief. But I was able to calculate recoil based on the bullet’s movement rather than the mouse’s position. . A bullet which would spawn and move forward from the barrel despite orientation, solving my problem and making the rest of the other features added much simpler to implement. . In the next few dev logs I hope to have added the following: . Make bullet orientation match barrel orientation Add a start menu soundtrack Bullet trail Sound effects (e.g. gunshot, start button pressed) Complete level (with collisions) I hope progress continues at the rate it is, because if so, I will be drowning in stardust."}, {"post_id": 33415, "ts": "2026-07-23T10:41:34Z", "hours": 1.5733, "text": "Dev Log #5 . I have redeemed myself 10 fold. I have finally added recoil to my game!!!! . This moment shows real progress. I have been trying to implement recoil for a while now, and I have finally done it. . I did this by using the velocity I calculated to determine what direction and what speed bullets are shot at from the gun: def __init__(self, barrel_pos, m_pos): super().__init__() self.image = pygame.image.load(\"Images/BULLET.png\").convert_alpha() self.rect = self.image.get_rect(center=barrel_pos) direction = pygame.Vector2( m_pos[0] - barrel_pos[0], m_pos[1] - barrel_pos[1] ) if direction.length() > 0: direction = direction.normalize() self.velocity = direction * 10 Passing the velocity into my player group and subtracting it from the player’s centre, effectively creating movement opposite to the direction of the bullets, aka recoil!!! def recoil(self, velocity): self.recoiled = velocity self.rect.x -= (self.recoiled.x * 10) self.rect.y -= (self.recoiled.y * 10) I also made it so that bullets despawn once off-screen, optimising performance. . Finally, I re-ordered my code, making debugging and overall readability much easier. . While my recoil is not fully complete, this is a large step in the right direction. . I hope by the next devlog I have a fully working recoil system and possibly a working level. Who knows! . Aim for the stars and you’ll at least reach the moon."}, {"post_id": 33031, "ts": "2026-07-22T16:18:00Z", "hours": 5.3169, "text": "Dev Log Number 4 . With the amount of time logged, you would think a lot has been achieved. But no… . After an almost 2 week long holiday induced hiatus, it seemed I had lost my confidence with pygame, and at some points, felt like i had lost my brain entirely. . My attempt to add shootable bullets should have been a simple task, yet it seemed to be impossible. And its not like I could have packed up shop and tried something else, a shootable bullet is esential for a game where the only playable charcater is, well, A GUN! . The first challenge was getting the bullet to spawn from the correct location. Initially, the bullets appeared from the centre of the gun rather than the barrel. Obviously that was not the intent. . I eventually solved the issue (casued by my own ignorance) and passed the barrel position calculated previously into my bullet class rather than re-calculating this (why would i do this, what on earth was I thinking 😩) . With that issue conquered, i then had to do the maths required to shoot a bullet from the barrel to the position of the mouse. Easy enough. NOT. . To cut a long story short, I used the code attatched to finally make my gun work. . My shootable bullets are far from perfect, they sometimes don’t shoot at all even when the mouse is pressed, their orientation does not match the direction the gun is facing and they are far too small. . I plan to fix this by: killing bullets as they go offscreen, adding some sort of rotation to the bullets and for the bullets not being shot when intended, i have no real plan on how I’m going to fix that. . I hope I come back to you in the next dev log with some actually real progress, because this is a sad excuse. . But with determination and grit and endless scrolling of the pygame documentation, I am sure progress will come as fast as a speeding train [or some sort of blue mammal with quills (^_~)]"}, {"post_id": 24165, "ts": "2026-07-07T15:40:34Z", "hours": 2.0261, "text": "Dev log #3 . Today I got a bit sidetracked and decided to move all of my code within a sprite class to reduce clutter. As a newbie, this was my greatest challenge (besides my arch enemy recoil physics). . This process was tedious and caused my entire code to break completely on multiple occasions. But the risk and complication was worth the reward. I reduced my codes line count by 15. . Due to the length of this process, very little was added. However, I did manage to add a aiming reticle for your first initial shot of the gun. . As seen in the images below, this feature came with its own plethora of annoyances. Annoyances such as multiplying rapidly and staying fixed on the gun trigger rather than the barrel. . I also created a new gun sprite that now faced the mouse correctly. . In the next dev log, I hope I come bearing more features. . I plan to add: .Basic bullet firing .Dotted aiming line instead of solid .Player start game (in which gravity will be applied) .NOT recoil, sadly that will have to wait . Went back to my roots today and used my beginner tutorial to help me learn how to apply the sprite class, video linked here: https://youtu.be/AY9MnQ4x3zk?si=9UtUnmyWYpsHZ6d5 . While the sprite class has acted as a roadblock to speed of development, I believe that by the next devlog, my progress will be sure to amaze (I say with confidence 🤞)"}, {"post_id": 23525, "ts": "2026-07-06T15:26:32Z", "hours": 2.0483, "text": "Dev Log #2 – Start and Turn . Now with the basics ingrained in my head, my game is beginning to take shape. While I wasn’t able to add the recoil mechanics I had hoped for, I was able to: .Create a functioning start screen. .Make my player sprite follow the mouse direction. . Today I used a different tutorial to assist me, linked here: https://youtu.be/WnIycS9Gf_c?si=UhNQQ8ekJLdPhRZO . While these are small achievements, they will help build a much greater finished product. Thanks to implementing these new features, I now understand the importance of game states and how to apply them, as well as how to track mouse movement and mouse input. . The reason I implemented sprite rotation based on mouse direction was to allow the player to aim their initial shot and determine their trajectory. . Later, the player will have to use well-timed shots to control their direction rather than relying on this simpler aiming system, making my game’s movement feel more unique and rewarding fast reaction times. . By the next dev log, I hope to create a new gun sprite that follows the mouse correctly, make a shootable bullet, and finally implement the recoil effect when the gun is fired, although this still seems to be my biggest hurdle. . Progress is picking up pace. Every new feature is another lesson learned, helping build the foundations of what I hope will become my magnum opus. See you in the next dev log. ;)"}, {"post_id": 22879, "ts": "2026-07-05T14:44:05Z", "hours": 2.0386, "text": "Dev Log #1 – Grasping the Basics of Pygame . Since I’m new to Pygame, my first goal has been learning the fundamentals and applying them to build the foundations of my game. . So far I’ve implemented: . .Basic gravity .Collision detection with the floor .Upward player movement using mouse input .Loading and displaying sprites and backgrounds . Building these simple features helped me understand how the game loop works, how collision is detected using rectangles, and how offsetting the player’s y-coordinate can be used to create gravity. . At the moment, the player is represented with a placeholder sprite, as my focus is on the code behind my game (and art has never been my strong suit). . I’ve been using the following tutorial, a learning resource that has helped me greatly: . https://youtu.be/AY9MnQ4x3zk?si=x9KrrOI12N1CwT29 . Now that I have an understanding of the basics, I’m going to start moving towards creating the mechanics required for the actual game. . My goal before the next dev log is to have a basic title screen completed and, if possible, implement the recoil mechanic for my player. . Progress is slow at the moment, but every feature I build teaches me something new. Hopefully, the next update will be bigger and come together more quickly (as long as all goes well 🤞)."}]...
|
Title: Barrel Roll Bullet by @ShinyMist | Stardanc Title: Barrel Roll Bullet by @ShinyMist | Stardance
Devlogs:
Dev Log #1 – Grasping the Basics of Pygame . Since I’m new to Pygame, my first goal has been learning the fundamentals and applying them to build the foundations of my game. . So far I’ve implemented: . .Basic gravity .Collision detection with the floor .Upward player movement using mouse input .Loading and displaying sprites and backgrounds . Building these simple features helped me understand how the game loop works, how collision is detected using rectangles, and how offsetting the player’s y-coordinate can be used to create gravity. . At the moment, the player is represented with a placeholder sprite, as my focus is on the code behind my game (and art has never been my strong suit). . I’ve been using the following tutorial, a learning resource that has helped me greatly: . https://youtu.be/AY9MnQ4x3zk?si=x9KrrOI12N1CwT29 . Now that I have an understanding of the basics, I’m going to start moving towards creating the mechanics required for the actual game. . My goal before the next dev log is to have a basic title screen completed and, if possible, implement the recoil mechanic for my player. . Progress is slow at the moment, but every feature I build teaches me something new. Hopefully, the next update will be bigger and come together more quickly (as long as all goes well 🤞).
Dev Log #2 – Start and Turn . Now with the basics ingrained in my head, my game is beginning to take shape. While I wasn’t able to add the recoil mechanics I had hoped for, I was able to: .Create a functioning start screen. .Make my player sprite follow the mouse direction. . Today I used a different tutorial to assist me, linked here: https://youtu.be/WnIycS9Gf_c?si=UhNQQ8ekJLdPhRZO . While these are small achievements, they will help build a much greater finished product. Thanks to implementing these new features, I now understand the importance of game states and how to apply them, as well as how to track mouse movement and mouse input. . The reason I implemented sprite rotation based on mouse direction was to allow the player to aim their initial shot and determine their trajectory. . Later, the player will have to use well-timed shots to control their direction rather than relying on this simpler aiming system, making my game’s movement feel more unique and rewarding fast reaction times. . By the next dev log, I hope to create a new gun sprite that follows the mouse correctly, make a shootable bullet, and finally implement the recoil effect when the gun is fired, although this still seems to be my biggest hurdle. . Progress is picking up pace. Every new feature is another lesson learned, helping build the foundations of what I hope will become my magnum opus. See you in the next dev log. ;)
Dev log #3 . Today I got a bit sidetracked and decided to move all of my code within a sprite class to reduce clutter. As a newbie, this was my greatest challenge (besides my arch enemy recoil physics). . This process was tedious and caused my entire code to break completely on multiple occasions. But the risk and complication was worth the reward. I reduced my codes line count by 15. . Due to the length of this process, very little was added. However, I did manage to add a aiming reticle for your first initial shot of the gun. . As seen in the images below, this feature came with its own plethora of annoyances. Annoyances such as multiplying rapidly and staying fixed on the gun trigger rather than the barrel. . I also created a new gun sprite that now faced the mouse correctly. . In the next dev log, I hope I come bearing more features. . I plan to add: .Basic bullet firing .Dotted aiming line instead of solid .Player start game (in which gravity will be applied) .NOT recoil, sadly that will have to wait . Went back to my roots today and used my beginner tutorial to help me learn how to apply the sprite class, video linked here: https://youtu.be/AY9MnQ4x3zk?si=9UtUnmyWYpsHZ6d5 . While the sprite class has acted as a roadblock to speed of development, I believe that by the next devlog, my progress will be sure to amaze (I say with confidence 🤞)
Dev Log Number 4 . With the amount of time logged, you would think a lot has been achieved. But no… . After an almost 2 week long holiday induced hiatus, it seemed I had lost my confidence with pygame, and at some points, felt like i had lost my brain entirely. . My attempt to add shootable bullets should have been a simple task, yet it seemed to be impossible. And its not like I could have packed up shop and tried something else, a shootable bullet is esential for a game where the only playable charcater is, well, A GUN! . The first challenge was getting the bullet to spawn from the correct location. Initially, the bullets appeared from the centre of the gun rather than the barrel. Obviously that was not the intent. . I eventually solved the issue (casued by my own ignorance) and passed the barrel position calculated previously into my bullet class rather than re-calculating this (why would i do this, what on earth was I thinking 😩) . With that issue conquered, i then had to do the maths required to shoot a bullet from the barrel to the position of the mouse. Easy enough. NOT. . To cut a long story short, I used the code attatched to finally make my gun work. . My shootable bullets are far from perfect, they sometimes don’t shoot at all even when the mouse is pressed, their orientation does not match the direction the gun is facing and they are far too small. . I plan to fix this by: killing bullets as they go offscreen, adding some sort of rotation to the bullets and for the bullets not being shot when intended, i have no real plan on how I’m going to fix that. . I hope I come back to you in the next dev log with some actually real progress, because this is a sad excuse. . But with determination and grit and endless scrolling of the pygame documentation, I am sure progress will come as fast as a speeding train [or some sort of blue mammal with quills (^_~)]
Dev Log #5 . I have redeemed myself 10 fold. I have finally added recoil to my game!!!! . This moment shows real progress. I have been trying to implement recoil for a while now, and I have finally done it. . I did this by using the velocity I calculated to determine what direction and what speed bullets are shot at from the gun: def __init__(self, barrel_pos, m_pos): super().__init__() self.image = pygame.image.load("Images/BULLET.png").convert_alpha() self.rect = self.image.get_rect(center=barrel_pos) direction = pygame.Vector2( m_pos[0] - barrel_pos[0], m_pos[1] - barrel_pos[1] ) if direction.length() > 0: direction = direction.normalize() self.velocity = direction * 10 Passing the velocity into my player group and subtracting it from the player’s centre, effectively creating movement opposite to the direction of the bullets, aka recoil!!! def recoil(self, velocity): self.recoiled = velocity self.rect.x -= (self.recoiled.x * 10) self.rect.y -= (self.recoiled.y * 10) I also made it so that bullets despawn once off-screen, optimising performance. . Finally, I re-ordered my code, making debugging and overall readability much easier. . While my recoil is not fully complete, this is a large step in the right direction. . I hope by the next devlog I have a fully working recoil system and possibly a working level. Who knows! . Aim for the stars and you’ll at least reach the moon.
Dev Log #6 . I have made some absolute serious progress!! . I have added: . Working recoil In-air gun rotation Aiming phase and playing phase (turning aiming guide on and off) Dotted aiming guide This has by far been my best coding session as of late and had little to no complications… . Well there was one… Where my entire recoil system was built on mouse position, a mouse which only controls the direction of the bullet once and never again per level. . So that caused me some grief. But I was able to calculate recoil based on the bullet’s movement rather than the mouse’s position. . A bullet which would spawn and move forward from the barrel despite orientation, solving my problem and making the rest of the other features added much simpler to implement. . In the next few dev logs I hope to have added the following: . Make bullet orientation match barrel orientation Add a start menu soundtrack Bullet trail Sound effects (e.g. gunshot, start button pressed) Complete level (with collisions) I hope progress continues at the rate it is, because if so, I will be drowning in stardust.
Dev Log #7 . Another prosperous coding session today! . I have added the following features: Correct bullet orientation Sound effects Tiled surface (no collisions) I also had to change the screen size as its height and length needed to be divisible by 16 in order for my tiles to be used easily. . I added the pytmx python library to allow me to use Tiled, a software that makes level creation very simple and quickly repeatable. . It should significantly increase my workflow speed when I get far enough in development to actually be making levels. . I also did some fine tuning on the strength of recoil, making it stronger but controllable. . Additionally, I increased the speed at which the gun rotates in air to make aiming more difficult but still manageable. . Overall, 7/10 work day today. . By next devlog I hope to have some of the following complete: Working collision Finish goal that takes you to the next level Possible moving colidable tile Bullet limit and UI to show this I’m back in business now, regained most of the knowledge I lost from my 1 week hiatus. Wishing future me luck for the next devlog! . And all you others out there as well. STAY DETERMINED!!!!!
Dev Log #8 . I new it was too good to be true, progress has slowed yet again. ): . Today I added: ‘Working’ collisions While my collisions ‘work’, they only work when my player rectangle is unchanged. . The issue being when my gun rotates, its rectangle changes size. . This change of size is interpreted as a movement by my collision sytem, therefore once I come in contact with a tile, the bottom of the rectangle slowly becomes bigger and smaller. . this caused it to move to the tops of different tiles, eventually causing it to be flung out of the game window at rapid speed. . I plan to combat this issue with either of these methods: . OPTION A: Pixel perfect collision done through player masks. . This option is harder and can effect preformance if not implemented properly, but with give a smooth and finished collision effect . OPTION B: Set hitbox collision . This option creates a set region on the player, only that region (probably a rectangle shape to make collision detection easy) being able to collide with tiles. . This option will likely be easier, but will look less pollished as the gun barrel would not fall due to gravity, it would stay above the ground while the grip sits on the ground. . My goals for next dev-log are unclear, but for now I hope to have a working collision system at least!!!
Dev Log #9 . Not the best keyboard clacking session, but not the worst. Looking at you Dev Log #4 >:[ . Today I added pixel perfect collision. . First I got the players mask and a list of the rectangle tiles touching my player rectangle. I then listed these rectangles and was able to detect collision based on if they made contact with the players mask. . The next step was collision resolution. . After a detected collision, the location of collision is then increase the y co-ordinate of the player mask, effectivly keeping the player above the ground. This is how collision resolution works for all the other directions, just with varying positions. . With this I then attempted to add a feature that stopped rotation as a surface was hit, to prevent a constanly spinning gun that sits on the floor. . This is still a WIP, but I have been able to make the gun stop all movement once on contact on a wall, but this is unrealistic as in real life if an object makes contact with a wall it does not loose all its momentum. . I will try to combat this isse by adding a bounce effect that gradually reduces momentum on wall contact, rather than causing it to loose all of it. . Next devlog I hope to have a working wall bounce system and maybe a finish goal that, when entered, plays a victory noise and victory screen. . Holding out hope for the future!!
Dev log #10 . DOUBLE DIGITS!! . What I did today: Added a working pause menu Fixed start screen size Spruced up mask collisions An issue im having with my new and improved collision sytem is that when i reduce player velocity on collision, as well as rotation speed, my player comes to a hault. . In real life, as im sure many of you know, a gun isnt likely to ballance on the barrel verticly, its handle will fall due to being heavier. . I do not yet know how to combat this issue, but I have brain stormed some ideas. . I was going to try and find a center of mass, but that wouldn’t work because that would cause my barrel to float at times due to being disproportionally lighter compared to the gun grip, meaning when gravity acted on it, it would be lob sided. . My other idea was to break the gun into 3 rectangles, barrel, handel and inbetween, then give these rectangles set weights. But i was unable to implement that. . I’m going to try some other solutions, but i think this is going to be some of my toughest challenges yet! . Still undesided on the goals for next devlog, we will see what my brain decided that faithfull day.
Dev Log #11 . Not Good. Very NOT Good. . What I achieved today Victory tile added Aiming reticle completely destroyed Fixed aiming reticle Mask detection not working as intended Gun no longer stopping rotation on collision complete loss of sanity OK, fun. How did this all happen? . My aiming reticle misangling issue was caused by setting initial rotation angle to 15. I did this to increse rotation speed. . The issue being this caused my gun image to also be rotated 15 degrees, causing the barrel not to point to my mouse. . I solved the issue by making initial rotation angle to 0, only += it to = 15 once first shot had been fired. . The next issue I have yet to solve is collision resolution. . It had been an underlying issue for some time, and i still don’t yet know how to fix it. But in my attempt to fix it, I then broke my stop_rotation function, meaning rotation now continues despite collision. . Hope to fix these issues by next devlog, then also give my recoil a bit of calibrating as each bullet seems to be weaker than the last, i think this is caused by my collision resolution setting velocity to 0. . Next devlog will hopefully be more fruitful!
#Dev Log 12 . Good honest session today. . Changed my collision resolution as it seemed to be causing me alot of trouble and hurting preformance. . Now using polygon collision detection instead of mask collision as it greatly improves preformance and simplicty of colllision resolution. . Although that is still not perfect. . I had it working quite well to a point but once I tried to prevent wall riding through on ground variables set to True or False, everyhting seemed to go wibledy wobeldy from there. . My collision detection works as follow: Dictionary of tiles is made, each tile with a rect and id (needed to make certain tile types do different things). . From that list, add the tiles with rectangles that colide with the player into a new list . 3.With this list, I then draw a mask on the tile, setting the co-ordinates to the corners of the rect . Last step, use self.polygon_collision() to check for collision . This worked without a hitch, but my collision resolution sytem is not so flawless. . This has been a 3ish day long ordeal, but I want to get it solved now so that once I’ve got the basics done I can divert my attention to more fun things like gun abilities, kill tiles, moving platforms, ect. . Progress is not necessarily slow, just stuck on one convoluted thing. I hope I get things sorted soon, this is starting to be a real de-motervator. . But I got that frisk undertale in me so I’ll stay DETERMINED!!!
Dev Log #13.Unlucky for some, but not for me! . Collision resolution finally working!!!! . Here’s how it works: . SAT algorithm returns the axis with the smallest overlap (this is the shortest distance to separate the player and the tile). . Correct normal line direction so that it points from the tile to the player. . Move player across MTV (Minimum Translation Vector), pushing player out of the tile. Note: MTV is calculated by choosing the smallest overlap in the direction that moves the two shapes apart. . Remove velocity that is parallel to the collision surface, allowing the object to glide across it without getting stuck. . That’s the jist of it. There are some other things I didn’t include, like how only polygons are made for tiles touching the player’s polygon/rect, but I discussed this in a past dev log. . In all honesty, I don’t fully understand the maths behind it, but I was still able to make my own SAT collision system, so I obviously know enough. . Also added some smaller things like a bullet limit and a restart caused by holding the R button down. . This is good progress and should allow me to add more easily things like level select, new Tiled maps, new tile variants that cause different effects, etc. . Next dev log is going to be packed with stuff!!!!.See you then (;
#Dev Log 14 . Ying ang Yang session today: . I did the following: 2 new maps - one I’m keeping a secret for the complete game >;] Level select rect load (not working YET) Kill tile (detection only) Separating code into files outside of main Music Broke…. Level select menu was a perfect mix of challenge and enjoyability. . I loaded the squares in this even patter by creating a rect at (360, 260), then after the first rectangle is created, add 120 to the x value, until x >= 960. . Then I added 120 to y to create a new line and set x back to 360. . The kill tile collision was done the same way as the win tile collision, using tile ID’s. . The only issue I’ve come across is the music suddenyl not working after moving it into its own seperate file, despite it working like an hour before. . I’ve left this issue for tomorrow as I’ve already got a lot of hours under my belt today. . Also the new level is not possible despite all my effort so will have to change that also. . Good progress today, I’ve made a lit of all I want to achieve in Barrel Roll Bullet before the dedline and one by one, I’m checking that list of. . See you next devlog. Maybe then I’ll reveal the space in-between 💣︎♋︎■︎📬︎□︎♑︎♑︎
#Dev Log 15 . Good day at the office. . Did the following today: Working level select Fixed Music Issue Fixed map loading issues (didn’t discover until today) Added tile classes to replace gid based system for tile specific collision My issues today were caused by my moving of code into separate files, but I’m getting there. I’m no longer using from ___ import * and I am instead using import ______. . The sound issue was caused by a variable in settings setting play music to False without my knowledge. . Map loading broke because my maps are only loaded once outside of the while loop, so I fixed that. . Tiles now have a class that can be checked, allowing for different interactions with tiles dependent on tile class. . Thinking about storing some of my variables into match statements for readability but I find using match cases in Settings.py to be really difficult so I will proceed with caution and immense fear!!! . Not sure what tomorrow holds, thinking about making the kill and win tiles do something rather than print win or killed, but might be held up by this switch from many elifs to match cases. . Staying determined, see you next dev log. . PS, a little hint to my little easter egg 📂︎🖮︎
Dev Log #16 . Today was good. I was welmed. . I did the following today: Added working kill tile Fixed image lagging behind player polygon Switched over to match cases Kill tile works as intended, but doen’t ‘kill’ the player yet, it just freezes everything, plays a sound and propts you to restart. . Image lagging behind was a big issue, causing the kill tile to look as if it were killing without contact, but this was cause by the image lag behind. . I tried changing the order of functions in update() but that didn’t work, tried other stuff like changing how some functions work, in the end, it was because i called update after player_group.draw(). Silly me!! . Match case switch over was easy, just the indentation was at times a pain, but I’ve sorted it now, thank goodness! . Going to try and finish the loss screen that appears, adding a level select button and a return to start, but might not as its not strictly necessary, but does look nice. . Not sure what other stuff to add, maybe a new level? . Who knows, see you next Dev Log!!!!
Dev Log #17 . Feel kinda stuck in-between, but once a pass my last hurdle, all of my efforts will be focused on new abilities, new tiles and art, but the basics are sooo close to being complete. . Today i did the following: Level stopwatch Level complete goal changed Edited map Complete goal had to be changed to make animation of win goal possible, like coin pick up in Mario. Uses polygon collision, freezes on contact currently but working on fix. . Level stopwatch works well, and works with pause menu by subtracting time passed in pause menu from counter total on continue button pressed. . Map needed editing as I feel my game is too hard and my muscle memory from 100’s of tries makes it feel easy, but really isn’t. . Tried making a new map that requires you to collect many little stars to reveal the goal but found it hard to find a map that works with wide range of movement. . This issue is caused by gun being useless most of the time on collision with floor as it is aimed the wrong way. . I plan to have the player be able to rotate the gun while its grounded using A or D, this re-ajusting stopping players getting stuck. That or a jump ability. . Next devlog hope to have: Mini stars working New map Rotate/jump when grounded Game in progress music See you next devlog, no 1 day hiatus next time (;
Dev Log #18 . Good day, but stopped early today beacuse, well, i’m afraid… . What I did today: Added mini_stars Added re-align option when grounded Added new map Mini stars are to be collected first, unlocking the finish goal. They are hard coded right now so cant be moved for new levels, but I can change that if need be. . Re-align was initially supposed to allow A to rotate the player one direction and D the other, but my game seemed to really not like decreasing the angle value when grounded. . So I’ve made it so rotation only happens one direction, but a full 360 range of motion is possible. . The new map that uses portals, but the portals are not actually functional yet so, thats a job for tomorrow . . Almost everything added from last devlogs check list, but decided against adding placeholder music during playing state as i think I would go insane from listening to it on loop, so that can wait till the end. . Hope to have a longer more prosperous dev log next time, see you then!!!
Dev Log #19 . Getting lazy, need to lock in and get 3 hours tomorrow. . Today I added: Working portals Time stop ability Portals and time stop ability use object layers in tiles, a much easier solution compared to my use of polygons for complete goals, may change that but not sure. . Time stop ability is pretty simple, works like pause menu, but allows image rotation and enables follow mouse. . Portals work by on contact, moving player position centre to other portal centre. . The velocity changes with the exit direction using the following code: rotation_difference = entry_angle - exit_angle self.velocity.rotate_ip(rotation_difference) Overall, ok day, not sure what I’ll do tmr, but I’m sure theres something hiding on my checklist. . ALSO!!, Fix this horrible performance issue I had, see bellow for comparison
Dev Log #20 . Sorry for the hiatus, not a lot done, but sure I will be soaring tomorrow. . Today I addded: Killable enemies New reset all function Killable enemies act as win conditions, similar to the mini stars, having to all be killed for the goal polygon to spawn. . The reset function made my code much more readable and allowed me to condense all of the restart events like lose velocity, set position here, screen.blit things again if needed. . I started working on 3 buttons that when pressed, open a gate but didn’t get to finishing it sadly. . I want each button to have different press conditions, one can be pressed by bullets only, one only on direct gun contact and the other working with either or. . In later stages, I will have to think how i will communicate this functionality to the player but I’m saving texturing and making the game look good for last. . Hope to have more progress tomorrow. Fingers crossed.
Dev Log #21 . Getting lazy now, saw hacktime was down and decided not to bother doing anything before 12, but I hope I will break this cycle. . Today I added working buttons that when pressed, remove gate blocking path. . Had to over hall all my tile loading and map loading and parts of my collision resolution to allow me to reduce the lag being caused in some levels and be able to remove collision selectively for tile types. . I learn how to use set today. I used a set to store the types of gates that have been opened because it prevents duplicates and allows me to quickly check whether a specific gate is open. . No animations for button presses yet as I want to leave that stuff for the end. . I’m feeling the time crunch now because I really want this to be finished before I get back to school and focus on my studies, but this still counts as practice so I’ll continue a little bit during school days. . I will do better tomorrow I promise, cause I’ve got this far, it would be a waste to stop now.
Dev log #22 . Back to business!! . Today I added: Uncompleted level select lockout Separated tile load into own file Easter egg room added Level lockout works by calculating max_player_level, the furthest level a player can select based on if they have beat the previous levels. . This works buy using a function to check if current player_level is greater than max_player_level, if it is then max_player_level = player level. . Then for level select button with number greater than max_player_level, a red cross is screen.blited ontop,as well as not allowing mouse clicks of the rect from having any function. . Tile file separation helped me remove 150 lines from my main file, improving readability. . My easter egg has a 2% chance of happening and gives the player a custom gun appearance on discovery. . The code used to change the guns appearenece should let me, in future, make custom skins for the gun, skins that could be rewarded for levels complete, secondary level goals reached, ect… . I will not share how to reach my secret room, but I think it would be better for someone to stumble across it by accident. . Good day today, progress is picking up pace again, good job me!!! . Strange, it seems, there is a man here….
Dev Log #23 . Very good day today, embracing the foddian likeness of my game, making sure that the player gets as angry as possible, just to make that feeling of victory feel so sweet. . Here’s what I did today: LOSER document created (must be filled in to reveal hints, which will be added later) Change rotation direction ability New map (Still a WIP) Document uses follow mouse function and draw line function. Starting the line at the mouses previous position and ending it at its new position. . This happens very fast, so the lines do not appear blocky and appear like real pencil drawing. . The change rotation ability uses the pbject layer like my previous time stop ability, and now that I understand how object layers work, i was easily able to make this ability by copying my clock abiltiy load and changing the result of contact. . The result being making rotation speed negative, reversing direction of rotation. . The new map uses a mix of many abilities and objects, but I have not added them in just yet. . I could quite easily I feel but I’ve reached my 3 hour brain capacity limit, because realisticly with the time spent making pngs, finding sounds, reading pygame documentation and waching tutorials, I’ve probably spent about 5. . But rewards are not for the weak or the lazy, and this little project of mine is helping me leaps and bounds for my future A-level comp sci journey. . See you next time, with some jucy new progress!!!!
Dev Log #24 . A progress full day today, but mabye not for the best?? . Today I done the following: Added a charcater diologue box Fixes re-align function so that it works when rotation direction is reversed Just doing little sidequests for now as I’m trying to hide from my enemy, level design. The things is I’m not very good at games, so i dont have the reaction time to create very punishing levels with little room for error. . So to combat this, I end up making really hard levels or super easy ones. . Additionally, I barley add any time to my total when creating levels as it uses a piece of software outside of visual studio. . My character text box is pretty much a recreation of the ones seen in undertale, even using the voice blip of toriel as a place holder. . This should allow me to add a small story that I will make sure to keep simple, like a mario esque plot. . The re-align function was fixed by using the variable rotation direction, then setting that to 1 or -1 depending on contact with reverse direction ability or not . Then multiplying rot_speed by that value reverse the direction that re-align moves. . I will have to knuckle down on level design tomorrow and make sure each level introduces the abilities and tiles one at a time, letting the player get used to them, allowing for levels that include a mix of multiple to be more approachable.
Dev Log #25 . My love for videojuegos has got the better of me. . Over theses 2 days all I have done is made some level maps and fixed the spawing positions of both win condition and the player based on the new maps. . But I have structure now, and rather than geting destracted, I have set myself some goals to complete hopefully by the end of the month, leaving me time to make the UI look nice. . I present to you. THE TOD0 LIST: . A - DIOLOGUE Fix dialogue system Add hint dialogue Add new level dialogue Add completed dialogue B - ABILITIES/TILES Bullet Pickup Ghost bullets Teleport bullets Time SLOW (not stop) Gravity flip ? Map flip ? Breakable tiles Level editor ? C - UI James bond level start animation Gun skin menu All menus with all required buttons D - Miscellaneous Mission objectives (Bad piggies esque) Determine gun skin unlock criteria A FINAL BOSS !?!?! I hope tomorrow if filled with WAY more advancements of the work kind rather than the Minecraft kind (;
Dev Log #26 . Popped ULT today!!! . Today I added the following: Slow time ability Breakable surfaces Bullet pickup Fixed up dialogue system (Not fully complete) Slow time ability works by setting a time to a decimal then multplying the following by it: Velocity (Bullet + Player) Rotation speed Gravity strength Multiplying by a decimal reduces the numbers, emulating slowed time rather than reducing fps which is a bit of a cop-out . Breakable surfaces work similarly to the gate tiles, the tiles having a alpha value of 0 when bullet rect makes contact with tile of that class and adding that tile type to a list: broken_tiles. . All tiles in that list are then ignored by tile collision . Bullet pickup works by detecting rect collision between the player and the surface, when contact is made the players bullet count (representing bullets shot total) is reduced by one, increasing the number of shots available to the player by one. . Dialogue system now works with full words, voice blips are annoying but will fix late stage when adding polish. Will also make it that player has to click mouse to go to next dialogue screen to give them time to read the text. . That is 3 and a bit things of the list, very good progress, juggling summer work, this and most importantly my Minecraft duties has been an upward hill battle but I’m getting there. . See you next develop with more progress!!!
Dev Log #27 . More things checked of the list today: . Today I did: Added gravity flip ability Added teleport bullets Added player mission objectives However, some other things i worked on today are still a work in progress, such as: Diologue system Ghost bullets (travel through walls) Gravity flip works similarily to how slow time works, settings the variable self.gravity_flip to -1 on contact, then multiplying graivty strenght by it, reversing the direction of gravity . This however made my realign function not work when on the ceiling, so i added to re-align that if gravity_flip was negative, to detect ceiling hit rather than grounded, allowing it to work why gravity was flipped. . Teleport bullets work by setting a can teleport function to True on contact, then when true, if bullet collidesrect with tile, self.rect of bullet is equal to self.rect of gun. the can tele[port function is then set to false, making the ability only work once as intended. . Player mission objects are as follows: Complete level Complete level in set ammount of time Complete level with less bullets than provided This uses lists in a way i have never used them before and looks like this total_stars = 0 level_stars = [[False, False, False] for _ in range(levels)] If player completes level, level_stars[Settings.player_level - 1][0] for current player level is set to True. . If player completes level quickly (complete_time < bonus_time), then …[1] is set to true . If player reaches has_won game state with a number of bullets lower than the bullet max, then then …[2] is set to True. . Total stars is incremented by one for each goal completed, and if level_stars[Settings.player_level - 1][1,2 or 3] is already set to true, then the increment is skipped, meaning you can only get 3 stars per level. . That’s all for now, hope to fix the issues I had today in tomorrows devlog!!
Dev Log #28 . Didn’t do alot today, or for the 2 other days… . I finally made ghost bullets work correctly and have changed the dialogue sytem a bit . The ghost bullets working and not working previously was juts a matter of using variables inside the bullet class rather than global ones, making it work better for some reason, I had the assistance of a friend in fixing the issue, and safe to say it solved it . Dialogue sytem has only been changed slightly so not much point documenting the changes, spacing, timing of letters, ect. . Sorry for short devlog, I hope I have more tommorrow.
Dev Log #29 . I’m pretty close to finishing the code side of my game now, the rest of my efforts will soon be focous toward things like: Writing dialogue Making nicer looking UI Making tiles look good rather than coloured blocks Animations Music Today I did the following: Re made the dialogue system AGAIN Created a gun selection screen My dialogue system displays a word at a time and plays a short noise for each word shown, similarily to undertale voice blips. However, I think it sounds quite bad and I plan to replace it with a set dialogue sound that plays at the start, like animal crossing. . My dialogue system now plays on level start and level completion, and does not re-trigger on level repeat, using similar code used in my star tracking code. . Gun select code is similar to my level select code, using a different class but the same code, just changing the lock out code to only unlock once star count is >= button number - 1 * 6, so that each button is unlocked for each 6 stars earned, as well as having the default gun already unlocked. . That’s all for today, I hope to have a complete game by the end of the month so I can have this finished before the school year starts.
Dev Log #30 . The big 30!!! . Done quite a bit today, just last bit of polishing and then we move towards UI, music, level design, ect. . Today I: FINISHED THE DIALOGUE SYTEM Added a leave waiver button (was a softlock) Added a text box to waiver [WIP] Dialogue system works fully (minus sound but thats still a win in my books). Plays on level start and level completion and once dialogue is viewed by the player, it is not shown to them again. . Mouse can be clicked to remove dialogue from the screen, without triggering bullet fire. . Also fixed the issue of the text backround being displayed on re-entry and re-completion of the level, but fixed that easily with a variable, setting it to true or false if level had already been completed, then only displaying the text bg when it was true. . Waiver leave button pretty simple, basic pygame rect collidepoint detection. . Text box sets text_active to true on mouse click, mouse clicks anywhere else set it to false, meaning player can only type when they have clicked on it (when they want to). . I appened every event.unicode into a list on key press, meaning I had a list of the players key storkes, then screen.blitted each letter in the list. . Final touches are making all fields complete required to acess button that is a hyperlink to video of me completing stages with instuctions to help, and also backspace and enter and wordwrap working with the text_box. . Then I think I’m done for the most part on the coding side of things, and will move onto level creation. . The only thing I haven’t completed from my long list from a preious dev_log are: Level editor Upside down ability James bond level start Hint dialogue on multiple deaths Boss fight Not to say these aren’t going to be added but they are not simple things and will not really add to much to my game in all honesty. Given the deadline of end of this month I have given myself, I don’t know if I will have time to add these (except for the James bond level start thing as that is a UI thing that will require art, music ect so might work on that when not coding. . That’s all, thanks for reading (:
Dev Log #31 . I AM FINISHED!!! . Well, pretty much at least. . Today I: Completed the Waiver Made some more levels I made it so that the text box works with word wrap, enter key and backspace key. . I did this by splitting the text into words and lines, then checking each word’s width against the rect boundaries. . If the word exceeds the boundaries x, the texts’ x position is reset and the Y-coordinate is incremented, creating a new line. . The Enter key creates a new line by resetting x and incrementing y, while Backspace removes the last character from the text string, preventing it from being displayed. . The waiver now checks if all fields are filled and allows you to press a button that is connected to a hyperlink that will, in the future, take you to a video created my me showing how each level is complete. . Also made 12 levels today, each new feature is slowly implemented one at time. . That’s all for today.
Dev Log #32 . Made 50 levels today, that is all. . Every 3 levels, a new ability/feature is added. This allows the player to get used to the new thing added, making their later appearance managble as the player is now used to how they function. . I have not set the player and goal location co-ordinates for each level, or other variables like if mini stars are required. . That’s all for today.
Dev Log #33 . As you can probably guess, I have done alot I have done the following: • Gave all levels the correct level variables • Made buttons work correctly when rotated • Made teleport bullets work as intended • Made gates and broken tiles allow bullets to pass through when collision is removed • Created an EXE file of my game for friends to use for playtesting • Made a stat tracker to use playtest information to improve my game • Corrected all file directories that had to be moved for PyInstaller to work properly • Fixed the Easter egg room so it now loads correctly • Added AI declaration comments That is a lots, so let me quick fire explain how i did them Painful repetition, change variables, restart level, change tiles, reset level, change ability position, reset. Repeat for level in levels (do this 50 times) . This was partially assisted by AI, but from what I understand the buttons’ Tiled rotation number is used to adjust the collision rectangle’s position so it matches the rotated button object in tiled. Collision check works as did previously. . Teleport bullets originally tp the player if a bullet fired priviously hit a way after pickup, despite no bullet being fired after pickup and also sometimes caused the player to shoot downwards through tiles. . I fixed the wrong bullet tp by using a self.variable rather than a global one as previously, allowing each bullet to know if they were teleport enabled, rather than all bullets being teleport enabled. . The tile collision isssue was fixed by by moving the player backwards along the bullet’s path until they are outside the tile, preventing the gun from passing through walls and being pulled down . This one will just explain itself (if tile in list, then ignore kill on contact): for tile in Tiles.tiles: if self.rect.colliderect(tile["rect"]): tile_property = tile["property"].get("type") if tile_property in Tiles.open_gates: continue This used pyinstaller, not something i really code or anything so, I’ll just say i did it sucessfully . Stat tracker records bullet count, time and deaths/restarts that a level took on completion. Difficulty of a level can also be decided by a play tester by pressing any number button during a level. . This data is level specific, and on key press of /, will create a json file that holds all the data, which can then be sent for me for review of things like bullet max, time complete bonus time, ect. . Self explanatory, just changed things like “Image/buttn.png” to “Game/Image/button.png” . Restart all function was required in load room function as it contains map load, so the level map that was supposed to load is not displayed instead of the secret easter egg map. . 9.Should have declared AI usage earlier, but I have been checking my chat history and I have been able to determine what sections of my code are AI generated . That’s all, gotta try and keep my daily streak alive this time to score myself a free plush.
Dev Log #34. . Just cleaning some things up now, we are in the home stretch . I did the following: Updated assest Updated object display code fixed broken dialogue Most assets have a fresh new look created in photopea . Buttons can now be loaded at rotated orientations . Dialogue now does display and does not disapear on first level load. This is because the start playing state was being skipped, i fixed this by using a continue, which skipped the rest of the current loop iteration, preventing the start-state code from continuing to run after changing playing_state. . Thats all, most of my time when into design. See you next devlog
Dev Log #35 . Been a bit distracted from this project due to school starting but I’ve been able to get a few things done. . I have done the following: Finished dialogue texts Made it so that dialogue box only appears when there is text Given kill tiles rotatable counterparts Added muzzle flash Added ability pick up sounds Updated a few more assets My Git commits have started to get a bit sloppy as i do these little bits on during my free periods, but im getting back into the swing of things . The dialogue box will only appear if text != “” and will put the player in the start playing state, without requiring a mouse click like it did previously. . Adding sounds was pretty simple so I wil leave an example bellow if self.rect.colliderect(ability["rect"]): if self.gravity_flip > 0: up_gravity_fx.play() else: down_gravity_fx.play() ability["collected"] = True self.gravity_flip *= -1 That’s all, I think 20/09/2026 will be a date for the books as I’m confident I will be finished by then. ALSO, if anyone sees this before ship, could you let me know any ideas for what my 16x16 tile for regular tiles could look like? Many thanks if you respond
Dev Log #36 . I have done most of the updating of UI, having only a few assests left and one level left to edit. . In addition to this, I have also made it so that buttons now appear pressed when pressed, rather than disappearing. . My easter egg room also stops the music correctly on level complete. . The final objectives are as follows: Have gun select each have image of gun Waiver has displayed text Hint video made and linked correctly All button can only be pressed when on screen Finish misc Assets Add death, win, and coins/stars collected based on mission objectives complete Thats all, I think 20/09/2026 could still be the date for the books, but I’ve got to put the burners on to get this finsished to a level of polish I’m happy with.
Dev Log #37 . All code is 100% complete now, the only thing left to do is finish all of the UI and then I am ready to ship. . Today I: Fixed portals Added level skip button Displayed bonus objectives Made button rotation work when pressed also Made gun select display gun images Portal code issue was caused by object overlapping with tiles, cause tile collision resolution to push the player out of the tile, and at times out of the map. Fixed this by teleporting player slightly above the object (above being determined by orientation). . Level skip increases player level, restarts level and spawns player in next level. . Bonus objectives screen.blitted on win, text appears green when objective met, red when it hasn’t . Used updated rotated button rect rather then previous and changed screen.blit to use center of rect rather than topleft . For each button in gun group, i screen.blited that gun into the center of the select gun skin rect . Thats all, hope to ship by tonight.
Dev Log #38 . DONE . I did the following: Added music that plays while in level Removed copyrighted music Finished all GUI Made code neat using ruff Will ship at some point soon. See you on ship day!!!!
Dev Log #39 . THE FINAL DEV LOG . I am finally ready to ship!!! . I did the following: Made a working read me Made a working exe file of my game Removed de-bugging features so game works as intended. Stopped music overlap from happening Removed all copyrighted music (may have mentioned this previously) I used pyinstaller tocreate my exe file. . Level buttons now only work if player max player level is less than or equal to the level you are selecting. . Stopped music overlap by puting stop music into every game state + in load room function . Its been a pleasure to take part in the stardance event. Lets have a look to see how far this project has come!!!
Ships:
Barrel Roll Bullet A recoil-based platformer where, instead of traditional jumping and movement, you shoot to propel yourself around each level. My game includes multiple abilities, unlockable gun skins and 50 levels. The biggest challenge I faced was developing an accurate and efficient collision system. Initially, I planned to use AABB collision, but because it relies on rectangular bounding boxes, I found that the gun barrel could appear to float when rotating or interacting with objects. I then experimented with mask collision to achieve pixel-perfect accuracy. However, using a large number of masks throughout a level caused noticeable drops in performance. I eventually settled on a middle ground using SAT (Separating Axis Theorem) polygon-based collision. This provided much more accurate collision detection for the rotating gun while being significantly more performant than mask collision, allowing me to maintain both responsive gameplay and consistent performance. I am proud of the persistence I have demonstrated throughout the project. During the early stages of development, I encountered significant gaps in my knowledge, particularly as I was new to object-oriented programming. At times, I struggled with seemingly simple tasks, such as correctly initialising a game window or positioning a rectangle where I intended it to be. Despite these difficulties, I continued to learn, troubleshoot and refine my approach rather than abandoning features when they became challenging....
|
1793004700.526266
|
1793091100.526266
|
|
35097
|
Stillwater Farm by @devlsx | Stardance
|
devlsx
|
1
|
118.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T04:27:39Z", "hours": 118.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Stillwater farm: A walkable ASCII overworld: six hand-drawn areas (homestead, lake, town, river, marsh, deep lake) linked at their edges, with a scrolling camera and smart box-drawing walls so the big maps render cleanly in an 80-col terminal. The fishing loop I actually cared about: cast → wait for a bite weighted by spot/season/weather/time-of-day/bait/rod → set the hook → a tension-bar reel fight where you ease off when the fish darts and reel when it’s calm. 45 hand-written fish across four seasons and four water types, a fish journal that tracks first catches, 6 baits and 4 rod tiers in a little tackle shop. An in-game clock (6am→2am), energy, sleep, and seeded weather, all deterministic off one rng, which made it testable. A restoration spine: fund three projects (clear the reeds, mend the river path, repair the rowboat) to open the marsh, river, and finally the deep lake, where the legendary giants live and get their own multi-phase boss fight. A main menu, a settings screen, a paged story about inheriting the lake from your great-aunt Wren, and a step-by-step guided tutorial for the first day. Hand-rolled versioned save/load (no serde), a headless render path so the whole thing is unit-testable, ~110 tests. Biggest lesson was keeping everything seeded and headless-testable from early on, being able to render a frame to a string and assert on it made the later systems", "repo": "https://github.com/AlexanderGese/stillwater", "demo": "https://crates.io/crates/stillwater-game"}]...
|
[{"post_id": 47786, "ts": "202 [{"post_id": 47786, "ts": "2026-08-15T23:19:50Z", "hours": 3.9844, "text": "stillwater is done a cozy terminal fishing game in Rust, crossterm + std only, no other dependencies"}, {"post_id": 47302, "ts": "2026-08-15T05:23:48Z", "hours": 4.0486, "text": "structural night, making the brain of the game built the game state machine around a Mode enum: Menu, Explore, Fishing, Shop, Journal and friends everything routes through one apply(action) dispatch, so input and logic stay decoupled each mode owns what actions it accepts, no more tangled if-forests got mode transitions firing cleanly in tests"}, {"post_id": 46697, "ts": "2026-08-14T04:17:39Z", "hours": 4.0908, "text": "onboarding and polish night, a lot of little things to do tutorial now walks you through a guided first day step by step, plus a context hint engine that works based on proximity to certain parts of the game added settings toggles for hints, colour and the guide wrote the colour module, ANSI styling per tile so water reads blue and paths read warm started the game state machine colour made the maps suddenly look like a place instead of a wall of grey text. small change but a crayz big impact"}, {"post_id": 45933, "ts": "2026-08-12T18:35:52Z", "hours": 4.0433, "text": "story’s finished, ending included wrote the closing beat, what the lake becomes once you’ve restored it and what Wren left you beyond the deed tried to make the ending feel earned rather than a credits dump started the tutorial, a paged howto that won’t take fo r ever structured it so a returning player can skip straight past"}, {"post_id": 45468, "ts": "2026-08-11T23:20:55Z", "hours": 3.9828, "text": "wrote the story tonight and got a bit sentimental during the setup: you inherit a lakeside homestead from your late great-aunt Wren and come to put it right wrote the opening pages that ease you in without a wall of text each restoration project has its own story beat, a little more of Wren’s world revealed as you rebuild it kept it gentle, this isn’t a game with a villain"}, {"post_id": 44896, "ts": "2026-08-10T23:09:40Z", "hours": 4.1031, "text": "shop wrapped and the heart of the progression buying flows cleanly and updates the player’s kit started sketching the story"}, {"post_id": 44582, "ts": "2026-08-10T13:17:08Z", "hours": 3.9097, "text": "good progress, two systems moved. journal is done, first-catch flags and record sizes tracked built the shop, spend gold on rods and bait, prices pulled from the tackle and bait tables the economy loop, catch, sell, upgrade, catch better, is now technically closeable and works"}, {"post_id": 43830, "ts": "2026-08-09T08:14:35Z", "hours": 4.0403, "text": "world’s done, started the collection side finished world transitions, gating and all, everything reachable in the right order the journal is the quiet longterm goal of the game, so its nice to see it start to grow and make sense"}, {"post_id": 43213, "ts": "2026-08-08T10:44:17Z", "hours": 3.9131, "text": "stitched the world together tonight. added restoration gating, some areas stay closed until you’ve fixed them up wandered the whole loop on foot in a test harness walking off the homestead and onto the lake for the first time felt like the game finally being close to its finish line"}, {"post_id": 42151, "ts": "2026-08-06T19:16:45Z", "hours": 4.0314, "text": "finished the map drawing and built the thing that reads them. The parser maps each glyph back to a Tile and yells if it hits an unknown character"}, {"post_id": 41485, "ts": "2026-08-05T18:37:33Z", "hours": 5.0517, "text": "tidied the town map and added the river, a narrower moving-water area with its own species"}, {"post_id": 40437, "ts": "2026-08-03T23:09:06Z", "hours": 3.9972, "text": "drew the town map, shops and paths and somewhere to spend your gold eventually these are big hand-authored ASCII tile areas, every wall and dock placed by hand"}, {"post_id": 40298, "ts": "2026-08-03T18:46:58Z", "hours": 1.9981, "text": "finished the fishing flow including multi-phase boss fights for the legendaries, they change behavior between phases so you can’t just muscle them"}, {"post_id": 39477, "ts": "2026-08-02T13:26:47Z", "hours": 10.1067, "text": "set-the-hook timing window is in, miss it and it’s gonebuilt the tension-bar reel fight: you reel against ease, the line has slack and strain and the fish darts when you least want it totoo much reeling snaps the line, too little and it runs, so you’re feathering itdifficulty and rod power feed straight into how twitchy the bar isit’s genuinely tense already with placeholder rendering. the core minigame works and i’m grinning."}, {"post_id": 38066, "ts": "2026-07-31T08:11:51Z", "hours": 6.4972, "text": "tackle finished, rod tiers all costed and their reach/power curves feel fair wrote the flavor text tables: the little lines when you cast, when nothing bites, when you land something, when it gets away keyed some flavor to weather and time so a foggy dawn reads different from a clear noon kept the tone warm but still dry"}, {"post_id": 36887, "ts": "2026-07-29T08:19:02Z", "hours": 0.9372, "text": "finished the baits (all 6) with prices and all and builf some more rods with different rarities and added the deep waters"}, {"post_id": 35630, "ts": "2026-07-27T05:46:18Z", "hours": 4.05, "text": "tackle box night. finished bait, all 6 with their per-species pull and rarity nudgesbuilt the tackle module, 4 rod tiers from a bent starter pole up to something propereach rod has a reach (how far out you can cast) and power (how hard you can fight a fish)reach gating deeper water is going to tie nicely into the restoration idea latertwo of the equipment systems standing now. the progression spine is quietly forming under all this."}, {"post_id": 34883, "ts": "2026-07-25T23:23:13Z", "hours": 4.1964, "text": "registry is DONE and it’s a chunky one. 45 species total including a few legendaries hiding at the bottom of the rarity tablegave the legendaries proper standout glyphs and brutal difficulty so they feel like eventsstarted the bait registry, 6 baits so far, each shifting bite odds and which species show interestsanity-checked the whole list for dead entries one more time.45 fish feels like the right amount, enough to fill a journal without me writing content until winter. good night’s work."}, {"post_id": 33924, "ts": "2026-07-24T07:13:55Z", "hours": 1.9183, "text": "kept feeding the registry and wired up the lookup side. more species in, edging toward the deeper and rarer end nowadded the fish lookup so systems can query by id or by what’s currently biteableintroduced the Catch type, a caught fish plus its rolled size and the conditions it was landed inCatch is what the journal and shop will eventually pass aroundgetting close to a full roster. once lookup and Catch are solid the actual fishing can start pulling from real data."}, {"post_id": 33721, "ts": "2026-07-23T21:04:46Z", "hours": 6.15, "text": "more fish. head down, tables growing. another batch of species across the seasons, some spring spawners and a couple summer night biterstuned size ranges so the same species varies believably, a small bass vs a hefty onedouble checked every entry lists at least one valid water and time or it’d never be catchableno new systems, purely contentjust filling the registry out. it’s oddly relaxing writing little fish biographies after work."}, {"post_id": 32805, "ts": "2026-07-22T05:56:48Z", "hours": 7.7981, "text": "the fun part begins. defining what actually lives in the water. laid out the fish registry, each species carries name, glyph, valid seasons, waters, times of day, rarity, size range, difficulty, sell price and a bait preferencegot the first handful of common species written, your bluegill and perch tierrarity and difficulty are separate on purpose, a fish can be common but a pain to reeleverything is plain data, no serde, just const-ish tablesthis is the content grind i’ve been looking forward to. going to be a lot of nights of just adding fish."}, {"post_id": 31650, "ts": "2026-07-20T07:03:03Z", "hours": 4.9886, "text": "weather came alive tonight and it already changes how the game feels. 7 weather types in: clear, cloudy, rain, storm, fog, snow, windyeach one nudges fishing, rain perks up bites, storms open the door for rare stuff, fog is moody and slowweather picks per day weighted by season, no snow in summer thankfullystarted the fish registry, the big onerain making the lake livelier is exactly the kind of small texture i wanted. onto the actual fish."}, {"post_id": 30542, "ts": "2026-07-18T06:23:39Z", "hours": 4.0325, "text": "short session but still good progress calendar is done: 4 seasons of 28 days each, so a clean 112-day yearday rolls into season rolls into year, all wrapping correctlywrote a couple tests for the boundary days because off-by-one on day 28 would haunt mestarted stubbing the weather systemnot much to show, just the machinery that makes tomorrow actually be tomorrow."}, {"post_id": 30007, "ts": "2026-07-17T07:51:43Z", "hours": 3.9572, "text": "time is a surprisingly fiddly thing to model. season module now has Season, TimeOfDay and WaterType, built the in-game clock, days run 6am to roughly 2am and advance in 10-minute tickspassing out or sleeping rolls it forward to the next morningstarted the calendar on top of itspent way too long deciding when “night” begins for fishing purposes. settled on it, moved on. WaterType is going to matter a lot once fish exist."}, {"post_id": 29344, "ts": "2026-07-16T07:02:15Z", "hours": 4.0136, "text": "good chunk of the skeleton went in tonight. finished tile, every variant has its glyph and walkability nowmap is a 2D grid with bounds checks and a walkable() querysketched the player struct: position, facing, energy, gold, equipped rod and baitbegan the season enumsstill can’t do anything but it’s starting to have shape. the player just sits at a Point staring into the void, which is honestly relatable."}, {"post_id": 28743, "ts": "2026-07-15T05:58:56Z", "hours": 8.6356, "text": "first real evening of code. mostly laying pipe under the floor. added a .gitignore so target/ stops following me aroundwrote geom with Point, Dir and Rect helpers, the small stuff everything else leans onrolled my own rng, a seeded splitmix64. std only, no getrandom, i want catches to be reproducible from a seedstarted the tile module, the enum and per-tile glyphsno graphics, no game, just the vocabulary the rest of the code will speak in. slow but satisfying."}]...
|
Title: Stillwater Farm by @devlsx | Stardance
Dev Title: Stillwater Farm by @devlsx | Stardance
Devlogs:
first real evening of code. mostly laying pipe under the floor. added a .gitignore so target/ stops following me aroundwrote geom with Point, Dir and Rect helpers, the small stuff everything else leans onrolled my own rng, a seeded splitmix64. std only, no getrandom, i want catches to be reproducible from a seedstarted the tile module, the enum and per-tile glyphsno graphics, no game, just the vocabulary the rest of the code will speak in. slow but satisfying.
good chunk of the skeleton went in tonight. finished tile, every variant has its glyph and walkability nowmap is a 2D grid with bounds checks and a walkable() querysketched the player struct: position, facing, energy, gold, equipped rod and baitbegan the season enumsstill can’t do anything but it’s starting to have shape. the player just sits at a Point staring into the void, which is honestly relatable.
time is a surprisingly fiddly thing to model. season module now has Season, TimeOfDay and WaterType, built the in-game clock, days run 6am to roughly 2am and advance in 10-minute tickspassing out or sleeping rolls it forward to the next morningstarted the calendar on top of itspent way too long deciding when “night” begins for fishing purposes. settled on it, moved on. WaterType is going to matter a lot once fish exist.
short session but still good progress calendar is done: 4 seasons of 28 days each, so a clean 112-day yearday rolls into season rolls into year, all wrapping correctlywrote a couple tests for the boundary days because off-by-one on day 28 would haunt mestarted stubbing the weather systemnot much to show, just the machinery that makes tomorrow actually be tomorrow.
weather came alive tonight and it already changes how the game feels. 7 weather types in: clear, cloudy, rain, storm, fog, snow, windyeach one nudges fishing, rain perks up bites, storms open the door for rare stuff, fog is moody and slowweather picks per day weighted by season, no snow in summer thankfullystarted the fish registry, the big onerain making the lake livelier is exactly the kind of small texture i wanted. onto the actual fish.
the fun part begins. defining what actually lives in the water. laid out the fish registry, each species carries name, glyph, valid seasons, waters, times of day, rarity, size range, difficulty, sell price and a bait preferencegot the first handful of common species written, your bluegill and perch tierrarity and difficulty are separate on purpose, a fish can be common but a pain to reeleverything is plain data, no serde, just const-ish tablesthis is the content grind i’ve been looking forward to. going to be a lot of nights of just adding fish.
more fish. head down, tables growing. another batch of species across the seasons, some spring spawners and a couple summer night biterstuned size ranges so the same species varies believably, a small bass vs a hefty onedouble checked every entry lists at least one valid water and time or it’d never be catchableno new systems, purely contentjust filling the registry out. it’s oddly relaxing writing little fish biographies after work.
kept feeding the registry and wired up the lookup side. more species in, edging toward the deeper and rarer end nowadded the fish lookup so systems can query by id or by what’s currently biteableintroduced the Catch type, a caught fish plus its rolled size and the conditions it was landed inCatch is what the journal and shop will eventually pass aroundgetting close to a full roster. once lookup and Catch are solid the actual fishing can start pulling from real data.
registry is DONE and it’s a chunky one. 45 species total including a few legendaries hiding at the bottom of the rarity tablegave the legendaries proper standout glyphs and brutal difficulty so they feel like eventsstarted the bait registry, 6 baits so far, each shifting bite odds and which species show interestsanity-checked the whole list for dead entries one more time.45 fish feels like the right amount, enough to fill a journal without me writing content until winter. good night’s work.
tackle box night. finished bait, all 6 with their per-species pull and rarity nudgesbuilt the tackle module, 4 rod tiers from a bent starter pole up to something propereach rod has a reach (how far out you can cast) and power (how hard you can fight a fish)reach gating deeper water is going to tie nicely into the restoration idea latertwo of the equipment systems standing now. the progression spine is quietly forming under all this.
finished the baits (all 6) with prices and all and builf some more rods with different rarities and added the deep waters
tackle finished, rod tiers all costed and their reach/power curves feel fair wrote the flavor text tables: the little lines when you cast, when nothing bites, when you land something, when it gets away keyed some flavor to weather and time so a foggy dawn reads different from a clear noon kept the tone warm but still dry
set-the-hook timing window is in, miss it and it’s gonebuilt the tension-bar reel fight: you reel against ease, the line has slack and strain and the fish darts when you least want it totoo much reeling snaps the line, too little and it runs, so you’re feathering itdifficulty and rod power feed straight into how twitchy the bar isit’s genuinely tense already with placeholder rendering. the core minigame works and i’m grinning.
finished the fishing flow including multi-phase boss fights for the legendaries, they change behavior between phases so you can’t just muscle them
drew the town map, shops and paths and somewhere to spend your gold eventually these are big hand-authored ASCII tile areas, every wall and dock placed by hand
tidied the town map and added the river, a narrower moving-water area with its own species
finished the map drawing and built the thing that reads them. The parser maps each glyph back to a Tile and yells if it hits an unknown character
stitched the world together tonight. added restoration gating, some areas stay closed until you’ve fixed them up wandered the whole loop on foot in a test harness walking off the homestead and onto the lake for the first time felt like the game finally being close to its finish line
world’s done, started the collection side finished world transitions, gating and all, everything reachable in the right order the journal is the quiet longterm goal of the game, so its nice to see it start to grow and make sense
good progress, two systems moved. journal is done, first-catch flags and record sizes tracked built the shop, spend gold on rods and bait, prices pulled from the tackle and bait tables the economy loop, catch, sell, upgrade, catch better, is now technically closeable and works
shop wrapped and the heart of the progression buying flows cleanly and updates the player’s kit started sketching the story
wrote the story tonight and got a bit sentimental during the setup: you inherit a lakeside homestead from your late great-aunt Wren and come to put it right wrote the opening pages that ease you in without a wall of text each restoration project has its own story beat, a little more of Wren’s world revealed as you rebuild it kept it gentle, this isn’t a game with a villain
story’s finished, ending included wrote the closing beat, what the lake becomes once you’ve restored it and what Wren left you beyond the deed tried to make the ending feel earned rather than a credits dump started the tutorial, a paged howto that won’t take fo r ever structured it so a returning player can skip straight past
onboarding and polish night, a lot of little things to do tutorial now walks you through a guided first day step by step, plus a context hint engine that works based on proximity to certain parts of the game added settings toggles for hints, colour and the guide wrote the colour module, ANSI styling per tile so water reads blue and paths read warm started the game state machine colour made the maps suddenly look like a place instead of a wall of grey text. small change but a crayz big impact
structural night, making the brain of the game built the game state machine around a Mode enum: Menu, Explore, Fishing, Shop, Journal and friends everything routes through one apply(action) dispatch, so input and logic stay decoupled each mode owns what actions it accepts, no more tangled if-forests got mode transitions firing cleanly in tests
stillwater is done a cozy terminal fishing game in Rust, crossterm + std only, no other dependencies
Ships:
Stillwater farm: A walkable ASCII overworld: six hand-drawn areas (homestead, lake, town, river, marsh, deep lake) linked at their edges, with a scrolling camera and smart box-drawing walls so the big maps render cleanly in an 80-col terminal. The fishing loop I actually cared about: cast → wait for a bite weighted by spot/season/weather/time-of-day/bait/rod → set the hook → a tension-bar reel fight where you ease off when the fish darts and reel when it’s calm. 45 hand-written fish across four seasons and four water types, a fish journal that tracks first catches, 6 baits and 4 rod tiers in a little tackle shop. An in-game clock (6am→2am), energy, sleep, and seeded weather, all deterministic off one rng, which made it testable. A restoration spine: fund three projects (clear the reeds, mend the river path, repair the rowboat) to open the marsh, river, and finally the deep lake, where the legendary giants live and get their own multi-phase boss fight. A main menu, a settings screen, a paged story about inheriting the lake from your great-aunt Wren, and a step-by-step guided tutorial for the first day. Hand-rolled versioned save/load (no serde), a headless render path so the whole thing is unit-testable, ~110 tests. Biggest lesson was keeping everything seeded and headless-testable from early on, being able to render a frame to a string and assert on it made the later systems...
|
1792878758.2553768
|
1793742758.2553768
|
|
6101
|
VisionArch by @raslanyossif | Stardance
|
raslanyossif
|
1
|
117.23
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-03T06:45:42Z", "hours": 101.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "VisionArch is an AI-based architectural design software that allows users to upload 2D floor plans on the platform or draw them manually before receiving an instantaneous top-down 3D photo rendering of the plan. The new changes fixed the bug of the bar displaying incorrect progress, added an authentication blocker that prevents unauthorized users from causing backend errors, created a worker keep alive ping so there are no cold start CORS failures, and repaired missing environment variables, making API calls possible. To try it out, go to vision-arch-two.vercel.app, register using Puter, upload the floor plan, or use the Draw mode to draw the floor plan. After that, just hit Generate 3D Render. You can also share your renderings with other users and rate their projects in return.", "repo": "https://github.com/Yossifraslan/VisionArch", "demo": "https://vision-arch-two.vercel.app/"}]...
|
[{"post_id": 77190, "ts": "202 [{"post_id": 77190, "ts": "2026-10-06T00:37:05Z", "hours": 6.6897, "text": "I decided to change the complete look of this website to something that feels a bit more housy vibe. and made the dark mode into green colored. fixed a bug for generating because each user has a limit, so this time once you reach your limit you will get a message."}, {"post_id": 55500, "ts": "2026-08-27T12:01:14Z", "hours": 7.67, "text": "Spent this session tracking down a login bug that had been bugging me - turns out a security header on my site was quietly blocking the auth popup from talking back to the app, so users had to refresh after signing in for it to actually register. Fixed that, then made the upload box actually prompt you to sign in instead of just… doing nothing when you’re logged out. After that I gave the whole site a real visual identity instead of the generic AI-startup look it had - leaned into a blueprint/drafting theme since it fits an architecture tool, ditched the soft gradient blobs for a grid background, and rebuilt all the buttons with a chunky neo brutalist shadow style. Also added dark mode from scratch - toggle in the navbar, remembers your preference, styled across every page - and caught a dumb bug along the way where one page’s card was using the wrong color variable and turned into an unreadable white blob in dark mode. Fun catch."}, {"post_id": 51522, "ts": "2026-08-21T09:04:00Z", "hours": 1.8747, "text": "What was broken: Login/upload silently failed for signed-out users, and after signing in, the UI wouldn’t reflect it until a manual refresh. What you found: Console showed Cross-Origin-Opener-Policy policy would block the window.closed call - the site’s COOP header was preventing Puter’s auth popup from reporting back to the app. The fix: Added vercel.json with Cross-Origin-Opener-Policy: unsafe-none, plus made the upload dropzone and “Get Started” button properly prompt/guard sign-in instead of failing silently. Verified: Signed in -> UI updated instantly, no refresh -> uploaded a floor plan -> rendered correctly end-to-end."}, {"post_id": 39911, "ts": "2026-08-03T06:41:10Z", "hours": 8.8069, "text": "TIME FOR DEVLOG :> For VisionArch you can test it/ generate 4-5 times then you hit limit and need to wait for your limit to reset. Resolved issues regarding the progress bar which was working incorrectly. Introduced a new authorization guard to prevent unauthorized people from causing authentication issues upon webpage loading. Added a silent worker ping to ensure that the Puter worker is awake prior to requests and thereby eliminate cold starts with multiple CORS errors and 404s during access of community pages. Corrected the missing environment variables in local configuration and Vercel dashboard."}, {"post_id": 18248, "ts": "2026-06-29T10:08:25Z", "hours": 9.4314, "text": "TIME FOR DEVLOG> was busy so I slowed down. Fixed: The Puter consent popup was getting shown to all visitors, instantly Discovered that the getCurrentUser() function is executing puter.auth.getUser() every time the page loads, for every single visitor, including those who haven’t signed in at all. This was triggering the Puter consent modal asking whether the user consents to seeing “this site uses Puter”. Fixed by adding an additional call to puter.auth.isSignedIn(), a synchronous function that doesn’t require network access, which checks if a session already exists. Users who aren’t logged in get directed straight to the homepage now. Fixed: Regeneration with a different style required a refresh. This was due to double invocation of the setCurrentImage() method, which overrode the just-completed AI-rendered image with the stored hosted URL. Removed the redundant call, so that the UI respects the freshly generated image. Improved the “no text in renders” requirement. Some renders featured room labels like “Bathroom” or “Bedroom”. Re-wrote the prompt to the AI, putting text-removal above all other rules, emphasizing that the room label informs furniture choices but should not be present itself, and instructing the AI to include the self-check step in the result. Added README Credits, features, tech stack, architecture notes, local development instructions, Vercel deployment instructions. Next: going through the whole app end-to-end once more - code and UI - before calling this fully submitted"}, {"post_id": 14959, "ts": "2026-06-24T09:16:23Z", "hours": 9.4006, "text": "WHAT’S NEW Projects no longer have to stay stuck as “Residence 1239812737128.” Now you can simply click the title in the visualizer, and it becomes editable, just edit and hit enter to save. I also added a Floor plan template on draw page because not everyone wants to start from a blank canvas, so I added 5 starter templates (Studio, 1-Bedroom, 2-Bedroom, Open Loft, Family Home) built with tldraw’s shape API. One click loads a labeled room layout onto the canvas, which you can edit and all before generating the 3D render. Additionally, I added a hint for new users, so they immediately understand that they need to draw and generate instead of just thinking it’s blank canvas not knowing what to do. Fixed: logged-out visitors couldn’t see Community at all This is an issue that had a greater depth than it appeared to be. All calls made through the workers.exec() of Puter’s automatically attach the user’s session to the call. Although, this thoroughly works for authenticated actions, any calls made by un-logged-in users will not execute properly, even on routes that are not required to be authenticated on the server side. The read-only endpoints (public project list, and comments) were switched to plain fetch() calls, as they do not require a user session to execute in any way. Therefore, un-logged-in users can now browse the Community and view designs. Fixed: voting did nothing when logged out Similar to the above issue, there were simply no active buttons for guests to ‘vote’ at all. Now, when an un-logged-in visitor clicks on the Upvote / Downvote button (or tries to comment), it now brings up the Puter sign-in pop-up automatically. So, it allows for a real call to action rather than a ‘dead click’."}, {"post_id": 12934, "ts": "2026-06-21T05:24:55Z", "hours": 9.4869, "text": "WHAT’S NEW: Not everyone has a floor plan image lying around, so I added a full drawing canvas using tldraw. You can now sketch a layout freehand, with shapes and text, then hit “Generate 3D Render” and it feeds straight into the same AI pipeline as an uploaded image. I recently discovered that my style picker feature (Modern/Minimalist/Industrial/Luxury) created random styled images as opposed to rendering the correct object from the actual floor plan and thus would just replace my existing prompt with a new one capable of producing an appropriate render. To remedy this issue, I created short style modifiers that will all be appending themselves to a single base prompt. As a result, there are now clear differences between Modern/Industrial/Luxury styles, and the base wall geometric shapes are maintained no matter which style is used. Still need to improve upon the Minimalist-style image as it still looks so close to the other styles due to its similarity with the original base aesthetic."}, {"post_id": 11827, "ts": "2026-06-19T08:24:22Z", "hours": 9.5761, "text": "It’s been a TOUGH coding day :> WHAT’ NEW: Share/unshare system allows users to share files from their local ‘Storage’ with other users and vice versa. I learned that Puter’s data model has separate user (for their own files) and me (for shared/app files), which has taken me a number of attempts to understand. Added a confirmation dialog with custom styling to the delete function instead of a boring confirmation dialog. In the works are an upvote/downvote and threaded comment feature to allow users to vote on designs in the community similar to Reddit’s. Biggest debugging lesson of the day: CORS preflight requests need to define OPTIONS handlers on all routes, not just those that need CORS. One example was an attempt to resolve a CORS Access-Control-Allow-Methods header, which took so long to debug."}, {"post_id": 10453, "ts": "2026-06-17T05:45:25Z", "hours": 9.7019, "text": "The pull request adds image export functionality and a before/after comparison slider to the visualizer route, expands WebP upload support, and introduces the react-compare-slider dependency. Configuration files and memory tracking are updated accordingly. Changes: Image Export & Comparison UI - Added HandleExport function to trigger PNG downloads of currentImage; introduced ReactCompareSlider UI panel to display before (sourceimage) and after (currentimage) comparison with conditional rendering; added react-compare-slider dependency. Upload Enchantment - Expanded accepted file types to include .webp format alongside existing .jpg, jpeg, and .png support. Workspace & Development Tracking - Rebalanced IDE ChangeListManager entries; added two new trajectory analysis entries documenting plans for handling sensitive env file history and cross-origin image downloads."}, {"post_id": 9100, "ts": "2026-06-15T06:38:33Z", "hours": 9.4303, "text": "This pull request introduces a backend project management system via a new Puter worker module that provides REST APIs for persisting, listing, and retrieving design projects. The frontend is updated to load projects on startup, handle project creation with persistence, and enable navigation between project visualization with stateful project data. Next, I’m planning on doing a comparison between before and after."}, {"post_id": 7962, "ts": "2026-06-13T09:02:05Z", "hours": 9.8583, "text": "A new AI-powered 3D visualization feature is introduced with fetchAsDataUrl and generate3DView functions in lib/ai/action.ts that integrate with puter.ai for image generation. The Visualizer route is enhanced with state management, automatic generation flow, and a complete UI redesign including navigation, project metadata render area and loading states."}, {"post_id": 6209, "ts": "2026-06-10T12:53:25Z", "hours": 9.5592, "text": "I Implemented project persistence and retrieval functionality by introducing hosting utilities for image uploads, a project creation action that prepares and saves project data with hosted assets, enables dynamic project listing on the home page, and updates the visualizer to consume project state from router navigation. I faced multiple Errors where when I drag n drop a PNG file the loading freezes which took time to fix but made it work. The goal is to create a whole 3D architectural render of this boring 2D design. and also design this page itself and make it nicer."}, {"post_id": 4133, "ts": "2026-06-07T10:27:01Z", "hours": 8.3689, "text": "Added a Projects list section, so everything is saved under that. I’ve been dealing with a bunch of errors that I’m fixing, took me time to find that specific error. Working on Hosting-Images in a branch and thinking of other ideas to come up with. This is my first big project that I did, so that may be the reason I’m facing many problems. However, everything is going good so far. Hope it becomes good when I have the end webpage."}, {"post_id": 2628, "ts": "2026-06-05T08:17:18Z", "hours": 5.5428, "text": "In the video, I’ve made it to be able to upload your floor plan by drag and drop or simply clicking like what was shown in the video. I’ve faced some errors with branches mixing up. Also, next step will be hosting images."}, {"post_id": 2013, "ts": "2026-06-04T09:16:29Z", "hours": 2.0736, "text": "I’m working on an architectural 3D design where you can upload your floor plan and edit it. Currently I did the Homepage and I’m working on being able to upload your floor plan."}]...
|
Title: VisionArch by @raslanyossif | Stardance
De Title: VisionArch by @raslanyossif | Stardance
Devlogs:
I’m working on an architectural 3D design where you can upload your floor plan and edit it. Currently I did the Homepage and I’m working on being able to upload your floor plan.
In the video, I’ve made it to be able to upload your floor plan by drag and drop or simply clicking like what was shown in the video. I’ve faced some errors with branches mixing up. Also, next step will be hosting images.
Added a Projects list section, so everything is saved under that. I’ve been dealing with a bunch of errors that I’m fixing, took me time to find that specific error. Working on Hosting-Images in a branch and thinking of other ideas to come up with. This is my first big project that I did, so that may be the reason I’m facing many problems. However, everything is going good so far. Hope it becomes good when I have the end webpage.
I Implemented project persistence and retrieval functionality by introducing hosting utilities for image uploads, a project creation action that prepares and saves project data with hosted assets, enables dynamic project listing on the home page, and updates the visualizer to consume project state from router navigation. I faced multiple Errors where when I drag n drop a PNG file the loading freezes which took time to fix but made it work. The goal is to create a whole 3D architectural render of this boring 2D design. and also design this page itself and make it nicer.
A new AI-powered 3D visualization feature is introduced with fetchAsDataUrl and generate3DView functions in lib/ai/action.ts that integrate with puter.ai for image generation. The Visualizer route is enhanced with state management, automatic generation flow, and a complete UI redesign including navigation, project metadata render area and loading states.
This pull request introduces a backend project management system via a new Puter worker module that provides REST APIs for persisting, listing, and retrieving design projects. The frontend is updated to load projects on startup, handle project creation with persistence, and enable navigation between project visualization with stateful project data. Next, I’m planning on doing a comparison between before and after.
The pull request adds image export functionality and a before/after comparison slider to the visualizer route, expands WebP upload support, and introduces the react-compare-slider dependency. Configuration files and memory tracking are updated accordingly. Changes: Image Export & Comparison UI - Added HandleExport function to trigger PNG downloads of currentImage; introduced ReactCompareSlider UI panel to display before (sourceimage) and after (currentimage) comparison with conditional rendering; added react-compare-slider dependency. Upload Enchantment - Expanded accepted file types to include .webp format alongside existing .jpg, jpeg, and .png support. Workspace & Development Tracking - Rebalanced IDE ChangeListManager entries; added two new trajectory analysis entries documenting plans for handling sensitive env file history and cross-origin image downloads.
It’s been a TOUGH coding day :> WHAT’ NEW: Share/unshare system allows users to share files from their local ‘Storage’ with other users and vice versa. I learned that Puter’s data model has separate user (for their own files) and me (for shared/app files), which has taken me a number of attempts to understand. Added a confirmation dialog with custom styling to the delete function instead of a boring confirmation dialog. In the works are an upvote/downvote and threaded comment feature to allow users to vote on designs in the community similar to Reddit’s. Biggest debugging lesson of the day: CORS preflight requests need to define OPTIONS handlers on all routes, not just those that need CORS. One example was an attempt to resolve a CORS Access-Control-Allow-Methods header, which took so long to debug.
WHAT’S NEW: Not everyone has a floor plan image lying around, so I added a full drawing canvas using tldraw. You can now sketch a layout freehand, with shapes and text, then hit “Generate 3D Render” and it feeds straight into the same AI pipeline as an uploaded image. I recently discovered that my style picker feature (Modern/Minimalist/Industrial/Luxury) created random styled images as opposed to rendering the correct object from the actual floor plan and thus would just replace my existing prompt with a new one capable of producing an appropriate render. To remedy this issue, I created short style modifiers that will all be appending themselves to a single base prompt. As a result, there are now clear differences between Modern/Industrial/Luxury styles, and the base wall geometric shapes are maintained no matter which style is used. Still need to improve upon the Minimalist-style image as it still looks so close to the other styles due to its similarity with the original base aesthetic.
WHAT’S NEW Projects no longer have to stay stuck as “Residence 1239812737128.” Now you can simply click the title in the visualizer, and it becomes editable, just edit and hit enter to save. I also added a Floor plan template on draw page because not everyone wants to start from a blank canvas, so I added 5 starter templates (Studio, 1-Bedroom, 2-Bedroom, Open Loft, Family Home) built with tldraw’s shape API. One click loads a labeled room layout onto the canvas, which you can edit and all before generating the 3D render. Additionally, I added a hint for new users, so they immediately understand that they need to draw and generate instead of just thinking it’s blank canvas not knowing what to do. Fixed: logged-out visitors couldn’t see Community at all This is an issue that had a greater depth than it appeared to be. All calls made through the workers.exec() of Puter’s automatically attach the user’s session to the call. Although, this thoroughly works for authenticated actions, any calls made by un-logged-in users will not execute properly, even on routes that are not required to be authenticated on the server side. The read-only endpoints (public project list, and comments) were switched to plain fetch() calls, as they do not require a user session to execute in any way. Therefore, un-logged-in users can now browse the Community and view designs. Fixed: voting did nothing when logged out Similar to the above issue, there were simply no active buttons for guests to ‘vote’ at all. Now, when an un-logged-in visitor clicks on the Upvote / Downvote button (or tries to comment), it now brings up the Puter sign-in pop-up automatically. So, it allows for a real call to action rather than a ‘dead click’.
TIME FOR DEVLOG> was busy so I slowed down. Fixed: The Puter consent popup was getting shown to all visitors, instantly Discovered that the getCurrentUser() function is executing puter.auth.getUser() every time the page loads, for every single visitor, including those who haven’t signed in at all. This was triggering the Puter consent modal asking whether the user consents to seeing “this site uses Puter”. Fixed by adding an additional call to puter.auth.isSignedIn(), a synchronous function that doesn’t require network access, which checks if a session already exists. Users who aren’t logged in get directed straight to the homepage now. Fixed: Regeneration with a different style required a refresh. This was due to double invocation of the setCurrentImage() method, which overrode the just-completed AI-rendered image with the stored hosted URL. Removed the redundant call, so that the UI respects the freshly generated image. Improved the “no text in renders” requirement. Some renders featured room labels like “Bathroom” or “Bedroom”. Re-wrote the prompt to the AI, putting text-removal above all other rules, emphasizing that the room label informs furniture choices but should not be present itself, and instructing the AI to include the self-check step in the result. Added README Credits, features, tech stack, architecture notes, local development instructions, Vercel deployment instructions. Next: going through the whole app end-to-end once more - code and UI - before calling this fully submitted
TIME FOR DEVLOG :> For VisionArch you can test it/ generate 4-5 times then you hit limit and need to wait for your limit to reset. Resolved issues regarding the progress bar which was working incorrectly. Introduced a new authorization guard to prevent unauthorized people from causing authentication issues upon webpage loading. Added a silent worker ping to ensure that the Puter worker is awake prior to requests and thereby eliminate cold starts with multiple CORS errors and 404s during access of community pages. Corrected the missing environment variables in local configuration and Vercel dashboard.
What was broken: Login/upload silently failed for signed-out users, and after signing in, the UI wouldn’t reflect it until a manual refresh. What you found: Console showed Cross-Origin-Opener-Policy policy would block the window.closed call - the site’s COOP header was preventing Puter’s auth popup from reporting back to the app. The fix: Added vercel.json with Cross-Origin-Opener-Policy: unsafe-none, plus made the upload dropzone and “Get Started” button properly prompt/guard sign-in instead of failing silently. Verified: Signed in -> UI updated instantly, no refresh -> uploaded a floor plan -> rendered correctly end-to-end.
Spent this session tracking down a login bug that had been bugging me - turns out a security header on my site was quietly blocking the auth popup from talking back to the app, so users had to refresh after signing in for it to actually register. Fixed that, then made the upload box actually prompt you to sign in instead of just… doing nothing when you’re logged out. After that I gave the whole site a real visual identity instead of the generic AI-startup look it had - leaned into a blueprint/drafting theme since it fits an architecture tool, ditched the soft gradient blobs for a grid background, and rebuilt all the buttons with a chunky neo brutalist shadow style. Also added dark mode from scratch - toggle in the navbar, remembers your preference, styled across every page - and caught a dumb bug along the way where one page’s card was using the wrong color variable and turned into an unreadable white blob in dark mode. Fun catch.
I decided to change the complete look of this website to something that feels a bit more housy vibe. and made the dark mode into green colored. fixed a bug for generating because each user has a limit, so this time once you reach your limit you will get a message.
Ships:
VisionArch is an AI-based architectural design software that allows users to upload 2D floor plans on the platform or draw them manually before receiving an instantaneous top-down 3D photo rendering of the plan. The new changes fixed the bug of the bar displaying incorrect progress, added an authentication blocker that prevents unauthorized users from causing backend errors, created a worker keep alive ping so there are no cold start CORS failures, and repaired missing environment variables, making API calls possible. To try it out, go to vision-arch-two.vercel.app, register using Puter, upload the floor plan, or use the Draw mode to draw the floor plan. After that, just hit Generate 3D Render. You can also share your renderings with other users and rate their projects in return....
|
1792979606.6073353
|
1793066006.6073353
|
|
21397
|
Vita (Rust) by @TKanX | Stardance
|
TKanX
|
0
|
116.86
|
0
|
[]
|
[{"post_id": 33818, "ts": "202 [{"post_id": 33818, "ts": "2026-07-24T01:54:21Z", "hours": 78.2956, "text": "https://docs.rs/vita/0.3.0/vita/"}, {"post_id": 11078, "ts": "2026-06-18T03:36:34Z", "hours": 38.5661, "text": "[email protected] -> [email protected]"}]...
|
Title: Vita (Rust) by @TKanX | Stardance
Devlogs: Title: Vita (Rust) by @TKanX | Stardance
Devlogs:
[email protected] -> [email protected]
https://docs.rs/vita/0.3.0/vita/...
|
1792706092.7027953
|
1793310892.7027953
|
|
26877
|
Dycosystem by @JoonHyuk | Stardance
|
JoonHyuk
|
0
|
116.19
|
0
|
[]
|
[{"post_id": 38222, "ts": "202 [{"post_id": 38222, "ts": "2026-07-31T14:52:51Z", "hours": 12.0031, "text": "Dycosystem — Devlog What’s up guys! This one was mostly math, not code. Got the Neural_network class doing an actual feedforward pass now, but honestly most of my time this session wasn’t spent typing, it was spent on a whiteboard (well, my head) trying to actually understand the math before I wrote a single line. The part that took forever Matrix multiplication only works if the columns of the first matrix match the rows of the second, and figuring out WHY that has to be true, not just memorizing it, is what ate most of my time. Once that clicked, the actual network made a lot more sense: weights between input and hidden layer have to be shaped (hidden_nodes, input_nodes) specifically so the multiplication lines up correctly, same for hidden to output. It’s not arbitrary, the shape IS the math. What actually got built Weight matrices between input→hidden and hidden→output, plus bias matrices for each layer A sigmoid function to squash the raw weighted sums into something usable feedforward(input) : turn the input into a matrix, multiply by weights, add bias, sigmoid, repeat for the next layer, turn the result back into a normal array Fed it [1, 0] and got a real guess back out. Random weights so the guess means nothing yet, but the math pipeline actually works end to end now, and I understand every step of it instead of just copying it. Small but important fix Weights used to randomize as integers 0-9 which is wrong for a neural network, changed it to floats between -1 and 1, which is what weights are actually supposed to start as. What’s left train() exists but does nothing yet. That’s the next math rabbit hole, figuring out how to actually adjust these weights based on how wrong the guess was. Slower progress than usual but way more understanding behind it. Thanks for reading, see you next devlog! (I am posting a picture of my dog since I have nothing to post a picture of, this is probably the devlog with the most pictures!)"}, {"post_id": 36996, "ts": "2026-07-29T13:28:41Z", "hours": 10.0214, "text": "Dycosystem — Devlog What’s up guys! Big one this time — the network can actually think now. Wired the Neural_network class up to a real feedforward pass. Before this it was just remembering how many nodes it had — now it actually takes an input and produces a guess. Feedforward is alive Added weight matrices between input→hidden and hidden→output, plus bias matrices for each layer, all randomized on creation Added a sigmoid activation function so the outputs squash into a usable range instead of just raw numbers feedforward(input) now does the full pass: multiply by weights, add the bias, squash through sigmoid, twice (once per layer), and hands back a real guess Ran it with a plain input array [1, 0] and got an actual output back. First time this thing has done anything resembling thinking, even if the “thinking” is currently just random weights. Matrix got two new helpers Matrix.make_from_array() turns a plain array into a column matrix make_to_array() turns a matrix back into a plain array Needed both since the network has to convert real inputs into matrix form to do the math, then convert the result back into something normal code can use. Also fixed something small randomize_matrix() used to fill values with random integers 0-9, which makes no sense for neural network weights. Changed it to random floats between -1 and 1, which is the actual range weights should start in. What’s still missing train() exists but it’s empty right now — the network can guess, it just can’t learn from being wrong yet. That’s next. Genuinely exciting one, this is the first time the neural network side of the project has produced output instead of just being scaffolding. Thanks for reading, see you in the next one!"}, {"post_id": 36761, "ts": "2026-07-29T01:00:08Z", "hours": 13.9783, "text": "Dycosystem — Devlog What’s up guys! Small but satisfying update. I went back through my Matrix class and actually fixed a bug that was sitting in the matrix multiplication code — I was resetting my running sum inside the innermost loop instead of before it, so it was only ever keeping the last multiplication instead of adding them all up. Classic off-by-scope mistake. Fixed: matrix multiplication Moved the sum reset outside the loop so it actually accumulates properly Pulled it out of scalar_mult and made it its own static matrix_mult function, since cramming two different operations into one method never made much sense New: map and map_index map(fx) runs a function over every value in the matrix map_index(fx) does the same but also passes in the row/column, so the function can behave differently depending on position This is going to matter a lot once I get to activation functions — applying something like sigmoid to every node is exactly what map is for New: print_table Small helper so I stop retyping console.table(this.matrix_values) everywhere Why this matters Feels like boring plumbing work, but this is the stuff the whole neural network is going to be built on top of. I’d rather get it solid now than debug it later once there’s an actual brain depending on it. Thanks for reading, see you in the next one!"}, {"post_id": 36216, "ts": "2026-07-28T04:40:23Z", "hours": 12.6506, "text": "Dycosystem — Devlog What’s up guys! Quick but important update this time. I leveled up from just a single perceptron to actually starting a real multi-layer neural network. First thing I had to do for that was build my own Matrix class, since it turns out neural networks are basically just matrix math wearing a trench coat — the weights, the inputs, the outputs, all matrices, and “guessing” is really just multiplying them together. Matrix class So I wrote one from scratch. It can zero itself out, randomize itself, transpose, multiply by a number or by another matrix, and add stuff to itself. Not the most exciting thing to build, but literally every neural network sits on top of this, so I wanted to actually get it instead of just grabbing a library and moving on. The actual network I also started the real Neural_network class, but honestly it’s not doing much yet — right now it just remembers how many input, hidden, and output nodes it has. No actual thinking happening in there yet. Next up is hooking the Matrix class into it so it can take inputs and spit out a real guess, and after that, actually learn from being wrong. Also reorganized everything Now that I’ve got two real tracks going I split the project up — Genetic_Algorithms/ for the ecosystem sim, and NeuralNetwork/ for all this neuroevolution groundwork. Slow progress this time, but it’s the kind of slow that matters — I’d rather actually understand the math than fake my way through it. Thanks for reading, see you in the next one!"}, {"post_id": 34599, "ts": "2026-07-25T13:42:03Z", "hours": 15.7167, "text": "What’s up guys! Smaller update this time, but an important one… I reorganized the project into folders first — all the ecosystem stuff now lives in Genetic_Algorithms/, since I’m about to start a second track of the project: Neuroevolution/.That’s right, I started learning how to actually give my creatures brains instead of hardcoded behavior! First step was building a single Perceptron from scratch — the simplest possible neural network, just one neuron with weights. I trained it to learn how to separate points above and below a line, and you can literally watch it learn live: it starts with a random decision line, and one point at a time it adjusts its own weights until the line converges to match the real one. Points get circled green when the perceptron guesses right and purple when it’s wrong, so you can watch it get better in real time.This is step one of a much bigger plan — eventually I want my creatures’ behavior to come from an evolved neural network instead of me hardcoding “flee predator, seek food.” A perceptron obviously can’t do that on its own, but it’s the building block everything else is made of, so I wanted to actually understand it before jumping straight to neuroevolution. Next up is stacking these into a real multi-layer network, and then evolving them instead of training them with math. Thanks for reading, see you next devlog!"}, {"post_id": 33943, "ts": "2026-07-24T08:32:56Z", "hours": 9.8586, "text": "What’s up guys! Big update this time… I finally added predators — they hunt prey and meat, and now have their own mating animation that’s different from prey’s (gliding together with a little weave, nose-to-nose instead of tail-to-tail, then a baby appears). Prey also got real genders now, and mating actually mixes both parents’ DNA (with a chance of mutation) instead of just copying one parent. Prey can flee from predators too.The coolest new thing is “predatorify” — if a prey eats enough meat, it transforms into a predator! Still tuning how easy that should be to trigger.Also added a population graph (rolling + full history) and a click-to-inspect feature so I can click any creature and see its type, lifetime, health, gender, and DNA. Microorganisms are wandering around chasing meat now too.Basically this session was about making all the systems actually talk to each other — hunting, fleeing, mating, dying, and feeding back into the ecosystem. Starting to feel alive! Thanks for reading, see you next devlog!"}, {"post_id": 32948, "ts": "2026-07-22T13:06:10Z", "hours": 10.8747, "text": "What’s up guys! It’s me! And I am here to tell you my progress… I think that this is the most progress I have made yet. I have made a lot of systems, and I am going to run you guys through it. The first system, is the actual environment, and actually made the triangles, but decided that I would make my own design and it is pretty simple. I also made debugging circles that you can turn on and of with right click, and you can add new preys with left click. I have the preys on the environment right now, but I am going to add all sorts of things later! Also, there is mating in the whole environment so the preys don’t get extinct. I am still playing around a bit in the parameters and I am going to add predators, since I added meat into the environment too. I really like this project, and I think I will keep going! Thank you for reading this devlog! (The video is a little taste and the show case of the environment)"}, {"post_id": 32359, "ts": "2026-07-21T14:15:08Z", "hours": 10.6986, "text": "I am here with the new information… I made a new particle system to make a new vehicle that can pursue the mouse, and this will be a great way to start off since we need to teach the vehicle to move and pursue the target. We also need to teach them about avoiding the target. All I did was find a lot of information about that and finished making the particle system. I broke that particle system right now because I want to change that particle system into the vehicle. So I don’t have something to post in my pictures page right now so I just leave the picture of the very first none moving triangle vehicle, just so you can see the very first ever design of it."}, {"post_id": 31769, "ts": "2026-07-20T12:39:40Z", "hours": 8.1494, "text": "What’s up guys, I finally started to start coding and… Hello guys! I started to work on my code for this project! I decided to start from scratch, and start over! The tutorial wants me to use p5.js, but since I want to learn MORE :) I decided to right all of the code and the classes from the start and that is what made me code for THIS LONG! What I have right now is a circle that can accelerate and have velocity, and all of this is based off a custom class, and it also has custom vector creations! The whole this is really going along really well, and I really like the progress! Also, I can learn math along this journey! I hope you can follow along more in this journey and see you in the next devlog! This is the custom, accelerating, velocity, vector, sphere thing :) :"}, {"post_id": 31597, "ts": "2026-07-20T03:51:43Z", "hours": 12.2433, "text": "I am back with a new project! And it is not small… I decided to start a new project, and it is a rather new type of project that I started to plan on. It is called DYCOSYSTEM. Dycosystem is a harware object either a cube or a sphere and there will be a syringe that can control the whole digital ecosystem. The sphere and the cube will both contain a special ecosystem, that will have digital life, and they will evolve as the time goes on. also, I will add special sounds to the animals to add sound and more diversity in the enviroment. I hope you guys can follow along my journey, and I hope I will finish this project! :) Today, I just went through youtube tutorials about vectors and inheriting and artificial life, so I couldn’t code, but still follow along! (I had nothing to add here so I just dropped a picture of my very simple plan below(IT IS ACTUALLY SO SIMPLE))"}]...
|
Title: Dycosystem by @JoonHyuk | Stardance
Devlog Title: Dycosystem by @JoonHyuk | Stardance
Devlogs:
I am back with a new project! And it is not small… I decided to start a new project, and it is a rather new type of project that I started to plan on. It is called DYCOSYSTEM. Dycosystem is a harware object either a cube or a sphere and there will be a syringe that can control the whole digital ecosystem. The sphere and the cube will both contain a special ecosystem, that will have digital life, and they will evolve as the time goes on. also, I will add special sounds to the animals to add sound and more diversity in the enviroment. I hope you guys can follow along my journey, and I hope I will finish this project! :) Today, I just went through youtube tutorials about vectors and inheriting and artificial life, so I couldn’t code, but still follow along! (I had nothing to add here so I just dropped a picture of my very simple plan below(IT IS ACTUALLY SO SIMPLE))
What’s up guys, I finally started to start coding and… Hello guys! I started to work on my code for this project! I decided to start from scratch, and start over! The tutorial wants me to use p5.js, but since I want to learn MORE :) I decided to right all of the code and the classes from the start and that is what made me code for THIS LONG! What I have right now is a circle that can accelerate and have velocity, and all of this is based off a custom class, and it also has custom vector creations! The whole this is really going along really well, and I really like the progress! Also, I can learn math along this journey! I hope you can follow along more in this journey and see you in the next devlog! This is the custom, accelerating, velocity, vector, sphere thing :) :
I am here with the new information… I made a new particle system to make a new vehicle that can pursue the mouse, and this will be a great way to start off since we need to teach the vehicle to move and pursue the target. We also need to teach them about avoiding the target. All I did was find a lot of information about that and finished making the particle system. I broke that particle system right now because I want to change that particle system into the vehicle. So I don’t have something to post in my pictures page right now so I just leave the picture of the very first none moving triangle vehicle, just so you can see the very first ever design of it.
What’s up guys! It’s me! And I am here to tell you my progress… I think that this is the most progress I have made yet. I have made a lot of systems, and I am going to run you guys through it. The first system, is the actual environment, and actually made the triangles, but decided that I would make my own design and it is pretty simple. I also made debugging circles that you can turn on and of with right click, and you can add new preys with left click. I have the preys on the environment right now, but I am going to add all sorts of things later! Also, there is mating in the whole environment so the preys don’t get extinct. I am still playing around a bit in the parameters and I am going to add predators, since I added meat into the environment too. I really like this project, and I think I will keep going! Thank you for reading this devlog! (The video is a little taste and the show case of the environment)
What’s up guys! Big update this time… I finally added predators — they hunt prey and meat, and now have their own mating animation that’s different from prey’s (gliding together with a little weave, nose-to-nose instead of tail-to-tail, then a baby appears). Prey also got real genders now, and mating actually mixes both parents’ DNA (with a chance of mutation) instead of just copying one parent. Prey can flee from predators too.The coolest new thing is “predatorify” — if a prey eats enough meat, it transforms into a predator! Still tuning how easy that should be to trigger.Also added a population graph (rolling + full history) and a click-to-inspect feature so I can click any creature and see its type, lifetime, health, gender, and DNA. Microorganisms are wandering around chasing meat now too.Basically this session was about making all the systems actually talk to each other — hunting, fleeing, mating, dying, and feeding back into the ecosystem. Starting to feel alive! Thanks for reading, see you next devlog!
What’s up guys! Smaller update this time, but an important one… I reorganized the project into folders first — all the ecosystem stuff now lives in Genetic_Algorithms/, since I’m about to start a second track of the project: Neuroevolution/.That’s right, I started learning how to actually give my creatures brains instead of hardcoded behavior! First step was building a single Perceptron from scratch — the simplest possible neural network, just one neuron with weights. I trained it to learn how to separate points above and below a line, and you can literally watch it learn live: it starts with a random decision line, and one point at a time it adjusts its own weights until the line converges to match the real one. Points get circled green when the perceptron guesses right and purple when it’s wrong, so you can watch it get better in real time.This is step one of a much bigger plan — eventually I want my creatures’ behavior to come from an evolved neural network instead of me hardcoding “flee predator, seek food.” A perceptron obviously can’t do that on its own, but it’s the building block everything else is made of, so I wanted to actually understand it before jumping straight to neuroevolution. Next up is stacking these into a real multi-layer network, and then evolving them instead of training them with math. Thanks for reading, see you next devlog!
Dycosystem — Devlog What’s up guys! Quick but important update this time. I leveled up from just a single perceptron to actually starting a real multi-layer neural network. First thing I had to do for that was build my own Matrix class, since it turns out neural networks are basically just matrix math wearing a trench coat — the weights, the inputs, the outputs, all matrices, and “guessing” is really just multiplying them together. Matrix class So I wrote one from scratch. It can zero itself out, randomize itself, transpose, multiply by a number or by another matrix, and add stuff to itself. Not the most exciting thing to build, but literally every neural network sits on top of this, so I wanted to actually get it instead of just grabbing a library and moving on. The actual network I also started the real Neural_network class, but honestly it’s not doing much yet — right now it just remembers how many input, hidden, and output nodes it has. No actual thinking happening in there yet. Next up is hooking the Matrix class into it so it can take inputs and spit out a real guess, and after that, actually learn from being wrong. Also reorganized everything Now that I’ve got two real tracks going I split the project up — Genetic_Algorithms/ for the ecosystem sim, and NeuralNetwork/ for all this neuroevolution groundwork. Slow progress this time, but it’s the kind of slow that matters — I’d rather actually understand the math than fake my way through it. Thanks for reading, see you in the next one!
Dycosystem — Devlog What’s up guys! Small but satisfying update. I went back through my Matrix class and actually fixed a bug that was sitting in the matrix multiplication code — I was resetting my running sum inside the innermost loop instead of before it, so it was only ever keeping the last multiplication instead of adding them all up. Classic off-by-scope mistake. Fixed: matrix multiplication Moved the sum reset outside the loop so it actually accumulates properly Pulled it out of scalar_mult and made it its own static matrix_mult function, since cramming two different operations into one method never made much sense New: map and map_index map(fx) runs a function over every value in the matrix map_index(fx) does the same but also passes in the row/column, so the function can behave differently depending on position This is going to matter a lot once I get to activation functions — applying something like sigmoid to every node is exactly what map is for New: print_table Small helper so I stop retyping console.table(this.matrix_values) everywhere Why this matters Feels like boring plumbing work, but this is the stuff the whole neural network is going to be built on top of. I’d rather get it solid now than debug it later once there’s an actual brain depending on it. Thanks for reading, see you in the next one!
Dycosystem — Devlog What’s up guys! Big one this time — the network can actually think now. Wired the Neural_network class up to a real feedforward pass. Before this it was just remembering how many nodes it had — now it actually takes an input and produces a guess. Feedforward is alive Added weight matrices between input→hidden and hidden→output, plus bias matrices for each layer, all randomized on creation Added a sigmoid activation function so the outputs squash into a usable range instead of just raw numbers feedforward(input) now does the full pass: multiply by weights, add the bias, squash through sigmoid, twice (once per layer), and hands back a real guess Ran it with a plain input array [1, 0] and got an actual output back. First time this thing has done anything resembling thinking, even if the “thinking” is currently just random weights. Matrix got two new helpers Matrix.make_from_array() turns a plain array into a column matrix make_to_array() turns a matrix back into a plain array Needed both since the network has to convert real inputs into matrix form to do the math, then convert the result back into something normal code can use. Also fixed something small randomize_matrix() used to fill values with random integers 0-9, which makes no sense for neural network weights. Changed it to random floats between -1 and 1, which is the actual range weights should start in. What’s still missing train() exists but it’s empty right now — the network can guess, it just can’t learn from being wrong yet. That’s next. Genuinely exciting one, this is the first time the neural network side of the project has produced output instead of just being scaffolding. Thanks for reading, see you in the next one!
Dycosystem — Devlog What’s up guys! This one was mostly math, not code. Got the Neural_network class doing an actual feedforward pass now, but honestly most of my time this session wasn’t spent typing, it was spent on a whiteboard (well, my head) trying to actually understand the math before I wrote a single line. The part that took forever Matrix multiplication only works if the columns of the first matrix match the rows of the second, and figuring out WHY that has to be true, not just memorizing it, is what ate most of my time. Once that clicked, the actual network made a lot more sense: weights between input and hidden layer have to be shaped (hidden_nodes, input_nodes) specifically so the multiplication lines up correctly, same for hidden to output. It’s not arbitrary, the shape IS the math. What actually got built Weight matrices between input→hidden and hidden→output, plus bias matrices for each layer A sigmoid function to squash the raw weighted sums into something usable feedforward(input) : turn the input into a matrix, multiply by weights, add bias, sigmoid, repeat for the next layer, turn the result back into a normal array Fed it [1, 0] and got a real guess back out. Random weights so the guess means nothing yet, but the math pipeline actually works end to end now, and I understand every step of it instead of just copying it. Small but important fix Weights used to randomize as integers 0-9 which is wrong for a neural network, changed it to floats between -1 and 1, which is what weights are actually supposed to start as. What’s left train() exists but does nothing yet. That’s the next math rabbit hole, figuring out how to actually adjust these weights based on how wrong the guess was. Slower progress than usual but way more understanding behind it. Thanks for reading, see you next devlog! (I am posting a picture of my dog since I have nothing to post a picture of, this is probably the devlog with the most pictures!)...
|
1792687989.1467733
|
1793292789.1467733
|
|
18043
|
Seal OS by @indiesealdev | Stardance
|
indiesealdev
|
3
|
116.0
|
920
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T02:36:55Z", "hours": 11.0, "multiplier": 18.0, "payout": 200, "blessing": "neutral", "text": "Hello there!! Well, I’m done with this project, I’m very happy with the result of what I did, and I learnt a lot of JavaScript, HTML and CSS. For this final update I worked on a ton of QOL basically, basically the following: All things you build now get saved when you reset the page. You can now scale and rotate objects (only certain you can rotate), for example, Seals can be scaled up and be slower, or be scaled down and be faster. For rotating and scaling, you can also use your ARROW KEYS :D That was about it, most of my time spent was in structuring my code and making it easier to expand, so the integration of these was pretty easy tbh. Well, thank you for following me on this journey <] SEAl YA!", "repo": "https://github.com/IndieSeal/SealWebOS", "demo": "https://indieseal.github.io/SealWebOS/"}, {"ship_num": 2, "ts": "2026-08-12T06:19:20Z", "hours": 37.0, "multiplier": 19.4, "payout": 720, "blessing": "neutral", "text": "I made 3 new apps, but I did add a heck ton more features! Ok, let’s get started with the apps first: Moving Seals: This is an app that lets you draw seals that move all over your screen and that after they’re spawned you have the possibility to make them explode, or nuke them if you’re so cruel. Sand Builder: An app to decorate your os! Place sand castles, starfishes and sand dollars (didn’t know those existed but they’re really cool). Settings: A simple app to adjust volume settings, and to enable a certain possible jumpscare with a very small chance of it happening every second, hope it doesn’t catch you off guard. They’re also saved if you reload the page (including Seal Clicker!!). About the features, I wanted to add some small things that were fun to play around and fun to discover, very silly! So I made the following: Sleepy but hungry seal: A seal that sits in the top left corner of your screen which if you click, will call it’s guard (an epic cat), which will throw a brick at you lol, this will leave your screen fractured, unless you feed the seal some fish by dragging them into its mouth. Fish: There’s some new decoration, which are fish who like to swim below in your screen in the sea! You can grab them to feed the hungry seal. DVD Seal: I wanted to experiment with 3D, because I saw a really cute seal model, so I made it so you can grab it and throw it around like the DVD Screensaver, I’m not sure why it reminded me of it, but yeah. Foxy Jumpscare: I wanted to scare the user of the website, at first I thought I would do a really creepy seal image, WHICH I FOUND SOME WHICH I WILL NEVER BE ABLE TO ERASE FROM MY BRAIN D:, but I landed on the Foxy Jumpscare as I think it’s funnier and fits the silly vibes more, but I decided to disable it by default so if someone doesn’t know about it, they don’t get jumped or smthing. Since the last update, I updated a lot of the visuals (just UI elements, my weird art will still be there), thanks to my sister which is an artist (thx for the help :D). I had a bit of trouble with the 3D DVD Seal as I thought moving it would be as easy as just getting the input from the canvas, I was so wrong, I was there for hours trying to fix it, and then I thought, what about raycasting? That would literally need the model to be hit! But implementation also took hours as I couldn’t find any guides, but OH WELL. I’m super duper happy with how it turned out, and I hope you love it as much as I enjoyed making it, thanks for watching my devlogs, for reading alla this. and bye <3", "repo": "https://github.com/IndieSeal/SealWebOS", "demo": "https://indieseal.github.io/SealWebOS/"}, {"ship_num": 3, "ts": "2026-08-03T00:56:22Z", "hours": 68.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello there!! I made a very Seal-Inspired WebOS, it has 3 apps, which only two are cool as the other one is just an introduction to the OS and me! The REAL cool apps are these as of right now are: Seal Clicker: A clicker/idle game like Cookie Clicker but if it was seals. SealTok: Wanna brainrot your brain until it only thinks of seals? Me too! Now you can do that here!! I think what was most challenging about making this project was the Seal Clicker app as it went through multiple stages of rebuilding to make expanding the upgrades and seals easier, and in general it’s just a big app lol, I also did all the art myself, I’ve been challenging myself recently to learn to draw, even if they’re not the best drawings, but I’m very happy on how it turned out! I also had barely any knowledge about HTML, CSS and JS, so I learnt everything from scratch, though I was glad to discover that JS is surprisingly similar to my main coding language C#. I’m also VERY proud of the Seal Clicker app, it’s where I learnt that a lot of the concepts from C# were applicable in JS and is where I put my structure optimization hat haha, I ended up loving the drawings I made. And for you to test the project just hit the “Try Project” button and it will take you there! I really hope you enjoy the OS as much as I loved building it, and thanks for taking the time to check it out!!", "repo": "https://github.com/IndieSeal/SealWebOS", "demo": "https://indieseal.github.io/SealWebOS/"}]...
|
[{"post_id": 70954, "ts": "202 [{"post_id": 70954, "ts": "2026-09-20T03:04:48Z", "hours": 3.5997, "text": "Helloooooooo, I again fell into the rabbit hole of OPTIMIZATION As I am on my mission to make everything really approachable for coders that may want to inspect the code and fork it, and make their own silly changes, it is easier than ever. So I made some new sliders that affect multiple things, which I used to replace the audio categories! (sfx and ui for example), audios that fit into the same category and have one slider that affects all of them. Thanks to the new slider system I have, it was very easy to implement a new feature, sizing and rotation for objects! Though not all objects are rotatable, but at least they all are scalable :]! So now you can have annoying cockroach seals that zoom all over the screen, or have big sealies that move as slow as a turtle. OH, I almost forgot. You can also use the arrow keys to rotate and scale the stuff without having to grab the slider and move it around, though I could not find a way to make it so you can press more than 2 keys at the same time, I will be putting some time to research that, but for now, nope :[ Alrighty, that is it for this cool devlog , see ya"}, {"post_id": 65627, "ts": "2026-09-10T21:30:46Z", "hours": 6.7997, "text": "Hello thereeee!! i am back with a pretty boring devlog, oh yea I have been fixing bugs, which that I am aware, everything should be fixed (hopefully) These include: Sealtok autoplaying on page load (videos with audio would be heard from outside, which could be annoying) I have also been busy with structuring code, and I am currently working on optimizing the Audio Categories to translate them into the new settings system! (sfx and ui sliders) I also spent some of the stardust on buying a domain, so I can have my cool OS outside of github >:] (now with cloudflare too) Some really cool things that I have been working on for the Paint Windows is so they get saved, so you can restart the page and have your drawn things there again!! I have a rotation system and scaling system for object painting, but with the structuring of the setting system so that I can create sliders for other things too, it is still a WIP, but it should be out soon! Alright, yippe and bye"}, {"post_id": 50735, "ts": "2026-08-20T02:39:42Z", "hours": 0.7006, "text": "Well, I am back at it, as my goal is to get a 3D printer! As of currently, I just fixed a couple of bugs, including: Making ¨painting¨ apps easier to close. Fixed it so you could not ¨paint¨ when clicking the close or minimize button. Fixed Foxy Jumpscare setting not actually working I already have some ideas in mind of what I want to do next! If you wanna hear my quick vent, go ahead: For WebOS 1 I really placed a lot of time into it so I could have my code structure really well done so it would be really easy to create new apps, and I did spend a lot of time in Seal Clicker lol, but I thought the ratings would count both Web 1 and 2, but sadly not, so I will have to work another 50 hours on this , not annoyed, but I did wanna work on other projects"}, {"post_id": 45597, "ts": "2026-08-12T05:57:52Z", "hours": 8.5486, "text": "Hello there, and welcome to my last devlog, it is been a long journey, but I have done it, I have learned the ways of HTML, CSS and JS. I hate them all, but at least I know them now lol. I made a lot of QOL, a LOT of bug fixing and added some cool little features, you can take a look: Random Foxy Jumpscare: It is an option in the Settings App which can be activated and desactivated, but it is disabled by default. Saved settings: All settings you modify will be kept if you reload the page, this also works with the Seal Clicker app! Fih: Now you will see a bunch of fish swimming around in the bottom of the screen, and they are grabbable!! Sleepy, Hungry seal: The seal in the top corner of the screen is very sleepy, if you click it, it will get mad, but you can fix the damages by feeding it fish. Audio: Added a bunch more of audio Fixes: A lot of bug interactions with the DVD Seal."}, {"post_id": 44959, "ts": "2026-08-11T02:07:57Z", "hours": 10.1906, "text": "I made mostly visual improvements and added some silly stuff in general, because I wanna have fun, you know? These include: Mad Seal: The seal is resting, and you woke them up by clicking them, they are calling the crazy kitty to attack you, for now the damage is permanent (until you refresh the page), but there will soon be a way to revert it by feeding the seal. 🐟 Spinning Seal: You can grab it and throw it around like those DVD Screensavers, its fun! 📀 I want to make something to jumpscare y´all, but I will be thinking of ideas to do so hehe, be prepared >:] I had to make the Desktop App Icons wrap around, so they did not sink into the water, because I do not want that. I am so close to finishing this really cool OS which I am really proud of, I love it so much, and did it all without any frameworks which is really cool. These changes are not published yet, they are on a testing branch as I still need to squash some bugs."}, {"post_id": 43810, "ts": "2026-08-09T07:37:47Z", "hours": 9.8419, "text": "Hello there, I did a lot of expanding on the Seal Moving app, I grabbed it and stripped all of its bones and removed their personality so they were easily modifiable and expandable! YIPPEE. What I am trying to say is, I plan on using the same behaviour of spawning seals for another app to decorate your OS´s background! So i had to spend a lot of time making it easily expandable, and it was worth it!! I also made a variation of the seal´s sprite so you can choose which one to spawn, there is also brushes now for spawning and removing seals, aswell as an icon for nuking them all!! The other app will be for spawning sand castles, sea stars and other stuff like that ONLY in the sand, below everything that is UI. With these two apps, I would just need to add one more app, and I should be done! Probably another game to have some more fun stuff, I know that will take a while, but eh, doesn´t really matter."}, {"post_id": 41328, "ts": "2026-08-05T14:03:48Z", "hours": 8.7142, "text": "These days I have been mostly optimizing the code, so again, it is easier to create new windows and stuff, and I also fixed some annoying window header css issues. I am also thinking to change some of the audio the apps have to sound a bit less THUMPY. I currently have two things I am working on, just a visual update in general for the OS so it feels more silly, which should be in video 2, and a new app >:] This new app, I am still unsure in which direction to take it, maybe both?? But here is the idea: You have seals that move in your screen, and you can click to explode them (sorry sealies ) But I do need to decide wether with this to do this or that: A minigame where seals spawn and you have to explode as many as you can in a limited amount of time. Desktop pets, them just hanging around, and if they are bothering you, just pop them lol. Or I could do a combo of the two, but again, unsure. Would love to know what everyone else thinks"}, {"post_id": 39792, "ts": "2026-08-03T00:23:54Z", "hours": 5.6922, "text": "Final devlog, this was a great journey, and I cannot wait to get started on WebOS 2, this is going to take an eternity with how long this first part took me, but I already have a solid base (I might even do some more structure changes in the code to make it EVEN EASIER to make windows), and I learnt a lot about HTML, CSS and JS! Well, in these last two days I did the following: Fixed the drag audio bug Fixed some CSS which was not working on build Finished adding all the art for Seal Clicker Balanched Seal Clicker so it takes around 10-20 minutes to finish Made App Icons for Seal Clicker and SealTok Made some visual changes Added RESOURCES.md and updated the README.md hope you enjoy it!!! I really loved building it 🦭 (hope there is someone as autistic as me who loves seals lol)"}, {"post_id": 38610, "ts": "2026-08-01T02:54:25Z", "hours": 10.3364, "text": "I have finished my Seal-Tok, I wanted to keep it simple, I do not really want to add likes and comments and stuff as I do not want to overcomplicate myself as much as I did with Seal Clicker lol, but I may add a ¨Share¨ feature which would just take you to the source of the authors video. I am also planning on doing some videos myself for seal-tok, I am already working on some, but it is going to take a while D: I have finally finished my Seal Clicker in terms of systems and having all the upgrades, now I only have to draw the last couple of upgrades (7 more). In terms of what I have to do before publishing the mission is to fix a couple of audio bugs, for some reason windows if left inactive for a while (changing to other tabs of browser), probably because of the deltaTime I have in there? I need to take a look. And soon SealOS will be available for all!! hehe"}, {"post_id": 32758, "ts": "2026-07-22T03:40:05Z", "hours": 9.1253, "text": "I’m no artist but I’ve been working on the art for the game, maybe it’s not the prettiest but ehh, it’s pretty good for me. I’ve been working on implementing audio, on adding some juice to the interactions, which I’m still planning to do a lot more of those, but time will tell. I’ve added the basic first upgrades for all the Seals which is really cool yeaa.. I’m super happy with how I got to optimize the upgrade and seal system as now you only need 3 lines of code to inject HOPE into the html give it their unique id and change icons and text around with ease, I love using classes, seriously can’t even begin to say how happy I am with JavaScript literally being C# but a bit worse ( sorry JS enjoyers :[ ). So now, it should be very easy to add new stuff which I’m thrilled to do, not thrilled about the art part though haha. Probably less than 10 more hours and I should be done with this damned app, and I have already noted down some ideas for which apps I could do next, but I don’t want to spoil, so you’ll have to wait, or if you find the Source Code, maybe you can go search for it, like a treasure hunt, or easter egg? if you actually find the easter egg, what do you think of my suggestion? it’s amazing right? right? idk (also I just got annoyed with my keyboard putting this: ` instead of ’, so I just copied it and pasted it, would be fun to have a onekey for that haha) ok bye, thanks for reading"}, {"post_id": 30250, "ts": "2026-07-17T17:54:40Z", "hours": 9.8186, "text": "Hellooo!! Well, I´ve been working a lot on the Seal Clicker app, it´s taking a whole lot more than I had initially thought, but oh well. All upgrades are working correctly, made a lot of UI improvements, more like the layout specifically, I still need to work on how it overall looks. I´ve been squashing down bugs, and I´ve implemented tooltips! For now only applicable on the upgrades, but I want to see if I can make it modular. My next task is learning how to spawn HTML into a page, because I want there to be a visual way to know how many Seals you´ve bought that help you obtain food (that´s the middle row for ya, I still need to draw some backgrounds lol). Also, I´m actually enjoying a lot learning this as first of all, now I can make websites hehe, but also I got a new language in my ¨can-do¨ list I guess, JavaScript is literally C# but with Dynamic Typing so it´s been quite easy to learn. (i hate dynamic typing though). alright, adios, see ya on the next devlog :]"}, {"post_id": 28500, "ts": "2026-07-14T19:47:15Z", "hours": 8.9739, "text": "I´m about to hit the 10 hour time limit per devlog, so I´m posting this :] As of currently, I´m just trying to make the project more organized, I´ve been making folders to store CSS´s as I´ve been splitting the main one, similarly of how I did with my Java Script files. And I´ve got the basics down of the Seal Clicker, I´m going to be taking a lot of inspiration from Cookie Clicker, so I´m seeing how to land those vibes. I´ve also made it so windows can´t leave your viewport and can´t go on top of the Navbar. I would share a video, but the project still looks exactly the same and feels about the same, the Seal Clicker window has the basic click and upgrade functionality, but it´s just the elements rn and it looks kinda ugly. But I´ll keep y´all updated!! :]"}, {"post_id": 22546, "ts": "2026-07-05T02:07:31Z", "hours": 8.0039, "text": "Thanks to Jenin over on Summer Camp, I´ve been able to grasp the concepts of HTML and CSS better, and I got over some hard bugs I couldn´t squash. Well, I´ve done a lot on this update, I followed a tutorial on how to make a sea, on top of that I added a fish that swims through the sea, and soon will be draggable and will be feedable to a seal! I´ve thought of what I will do app-wise, but I won´t spoil ya! I added some relaxing beach/sea sounds, I changed the background to actually match the water i placed, so not it´s sand! I added a little bar in the taskbar app icons to know wether it is the app that is selected, or if it´s minimized/not selected, I´ll probably need to have a different color for those two states, but for now, I think it´s pretty good, on the future I want to make apps pinnable on the taskbar and they will show up without the bar below! Visually I think it´s looking great, now I only gotta start developing the actuall apps lol. Wish me luck :]"}, {"post_id": 18397, "ts": "2026-06-29T15:16:32Z", "hours": 5.7233, "text": "I have improved my audio system for dragging objects, so it only plays when you´re moving the window and not just by touching it, and finished adding the lerp implementation to the windows, I still gotta fix some bugs though, like the buttons from the windows making sound when hovered WHEN moving the windows too fast, I´m thinking I´ll disable their interactions when the window is grabbed. I also made a very important change, to avoid creating duplicate script and to make my lerp actually work, I made the whole drag script into a class! This way, each window manages itself and can store it’s last position for the lerp purpose, and I’m very proud of how it ended up looking and how it sounds, would’ve loved to be able to fix the bug where looping has a small pause between each loop, but maybe I’ll make the audio longer so it’s not AS noticeable, or it doesn’t happen as often! With these changes, making new windows should be easy peasy :D"}, {"post_id": 11067, "ts": "2026-06-18T03:16:23Z", "hours": 3.8808, "text": "Working on the taskbar, and added some audio to keep it from being so silent, I was getting tired from it! To-do: -Work on Wii-type opening app menu. -Finish adding sounds everywhere -Add more desktop apps -Finish taskbar behaviour"}, {"post_id": 8547, "ts": "2026-06-14T06:38:21Z", "hours": 3.3081, "text": "Finally finished the basic part of the windows, still needs to be polished, but hey they behaviour’s there!"}, {"post_id": 8276, "ts": "2026-06-13T19:23:23Z", "hours": 3.2692, "text": "I finally finished the drag and drop feature, took me a while as I was trying to have different cursors while outside, while hovering and while clicking, which took longer than I thought, but I did it! Next task: Make an app inside of the OS"}]...
|
Title: Seal OS by @indiesealdev | Stardance
Devlo Title: Seal OS by @indiesealdev | Stardance
Devlogs:
I finally finished the drag and drop feature, took me a while as I was trying to have different cursors while outside, while hovering and while clicking, which took longer than I thought, but I did it! Next task: Make an app inside of the OS
Finally finished the basic part of the windows, still needs to be polished, but hey they behaviour’s there!
Working on the taskbar, and added some audio to keep it from being so silent, I was getting tired from it! To-do: -Work on Wii-type opening app menu. -Finish adding sounds everywhere -Add more desktop apps -Finish taskbar behaviour
I have improved my audio system for dragging objects, so it only plays when you´re moving the window and not just by touching it, and finished adding the lerp implementation to the windows, I still gotta fix some bugs though, like the buttons from the windows making sound when hovered WHEN moving the windows too fast, I´m thinking I´ll disable their interactions when the window is grabbed. I also made a very important change, to avoid creating duplicate script and to make my lerp actually work, I made the whole drag script into a class! This way, each window manages itself and can store it’s last position for the lerp purpose, and I’m very proud of how it ended up looking and how it sounds, would’ve loved to be able to fix the bug where looping has a small pause between each loop, but maybe I’ll make the audio longer so it’s not AS noticeable, or it doesn’t happen as often! With these changes, making new windows should be easy peasy :D
Thanks to Jenin over on Summer Camp, I´ve been able to grasp the concepts of HTML and CSS better, and I got over some hard bugs I couldn´t squash. Well, I´ve done a lot on this update, I followed a tutorial on how to make a sea, on top of that I added a fish that swims through the sea, and soon will be draggable and will be feedable to a seal! I´ve thought of what I will do app-wise, but I won´t spoil ya! I added some relaxing beach/sea sounds, I changed the background to actually match the water i placed, so not it´s sand! I added a little bar in the taskbar app icons to know wether it is the app that is selected, or if it´s minimized/not selected, I´ll probably need to have a different color for those two states, but for now, I think it´s pretty good, on the future I want to make apps pinnable on the taskbar and they will show up without the bar below! Visually I think it´s looking great, now I only gotta start developing the actuall apps lol. Wish me luck :]
I´m about to hit the 10 hour time limit per devlog, so I´m posting this :] As of currently, I´m just trying to make the project more organized, I´ve been making folders to store CSS´s as I´ve been splitting the main one, similarly of how I did with my Java Script files. And I´ve got the basics down of the Seal Clicker, I´m going to be taking a lot of inspiration from Cookie Clicker, so I´m seeing how to land those vibes. I´ve also made it so windows can´t leave your viewport and can´t go on top of the Navbar. I would share a video, but the project still looks exactly the same and feels about the same, the Seal Clicker window has the basic click and upgrade functionality, but it´s just the elements rn and it looks kinda ugly. But I´ll keep y´all updated!! :]
Hellooo!! Well, I´ve been working a lot on the Seal Clicker app, it´s taking a whole lot more than I had initially thought, but oh well. All upgrades are working correctly, made a lot of UI improvements, more like the layout specifically, I still need to work on how it overall looks. I´ve been squashing down bugs, and I´ve implemented tooltips! For now only applicable on the upgrades, but I want to see if I can make it modular. My next task is learning how to spawn HTML into a page, because I want there to be a visual way to know how many Seals you´ve bought that help you obtain food (that´s the middle row for ya, I still need to draw some backgrounds lol). Also, I´m actually enjoying a lot learning this as first of all, now I can make websites hehe, but also I got a new language in my ¨can-do¨ list I guess, JavaScript is literally C# but with Dynamic Typing so it´s been quite easy to learn. (i hate dynamic typing though). alright, adios, see ya on the next devlog :]
I’m no artist but I’ve been working on the art for the game, maybe it’s not the prettiest but ehh, it’s pretty good for me. I’ve been working on implementing audio, on adding some juice to the interactions, which I’m still planning to do a lot more of those, but time will tell. I’ve added the basic first upgrades for all the Seals which is really cool yeaa.. I’m super happy with how I got to optimize the upgrade and seal system as now you only need 3 lines of code to inject HOPE into the html give it their unique id and change icons and text around with ease, I love using classes, seriously can’t even begin to say how happy I am with JavaScript literally being C# but a bit worse ( sorry JS enjoyers :[ ). So now, it should be very easy to add new stuff which I’m thrilled to do, not thrilled about the art part though haha. Probably less than 10 more hours and I should be done with this damned app, and I have already noted down some ideas for which apps I could do next, but I don’t want to spoil, so you’ll have to wait, or if you find the Source Code, maybe you can go search for it, like a treasure hunt, or easter egg? if you actually find the easter egg, what do you think of my suggestion? it’s amazing right? right? idk (also I just got annoyed with my keyboard putting this: ` instead of ’, so I just copied it and pasted it, would be fun to have a onekey for that haha) ok bye, thanks for reading
I have finished my Seal-Tok, I wanted to keep it simple, I do not really want to add likes and comments and stuff as I do not want to overcomplicate myself as much as I did with Seal Clicker lol, but I may add a ¨Share¨ feature which would just take you to the source of the authors video. I am also planning on doing some videos myself for seal-tok, I am already working on some, but it is going to take a while D: I have finally finished my Seal Clicker in terms of systems and having all the upgrades, now I only have to draw the last couple of upgrades (7 more). In terms of what I have to do before publishing the mission is to fix a couple of audio bugs, for some reason windows if left inactive for a while (changing to other tabs of browser), probably because of the deltaTime I have in there? I need to take a look. And soon SealOS will be available for all!! hehe
Final devlog, this was a great journey, and I cannot wait to get started on WebOS 2, this is going to take an eternity with how long this first part took me, but I already have a solid base (I might even do some more structure changes in the code to make it EVEN EASIER to make windows), and I learnt a lot about HTML, CSS and JS! Well, in these last two days I did the following: Fixed the drag audio bug Fixed some CSS which was not working on build Finished adding all the art for Seal Clicker Balanched Seal Clicker so it takes around 10-20 minutes to finish Made App Icons for Seal Clicker and SealTok Made some visual changes Added RESOURCES.md and updated the README.md hope you enjoy it!!! I really loved building it 🦭 (hope there is someone as autistic as me who loves seals lol)
These days I have been mostly optimizing the code, so again, it is easier to create new windows and stuff, and I also fixed some annoying window header css issues. I am also thinking to change some of the audio the apps have to sound a bit less THUMPY. I currently have two things I am working on, just a visual update in general for the OS so it feels more silly, which should be in video 2, and a new app >:] This new app, I am still unsure in which direction to take it, maybe both?? But here is the idea: You have seals that move in your screen, and you can click to explode them (sorry sealies ) But I do need to decide wether with this to do this or that: A minigame where seals spawn and you have to explode as many as you can in a limited amount of time. Desktop pets, them just hanging around, and if they are bothering you, just pop them lol. Or I could do a combo of the two, but again, unsure. Would love to know what everyone else thinks
Hello there, I did a lot of expanding on the Seal Moving app, I grabbed it and stripped all of its bones and removed their personality so they were easily modifiable and expandable! YIPPEE. What I am trying to say is, I plan on using the same behaviour of spawning seals for another app to decorate your OS´s background! So i had to spend a lot of time making it easily expandable, and it was worth it!! I also made a variation of the seal´s sprite so you can choose which one to spawn, there is also brushes now for spawning and removing seals, aswell as an icon for nuking them all!! The other app will be for spawning sand castles, sea stars and other stuff like that ONLY in the sand, below everything that is UI. With these two apps, I would just need to add one more app, and I should be done! Probably another game to have some more fun stuff, I know that will take a while, but eh, doesn´t really matter.
I made mostly visual improvements and added some silly stuff in general, because I wanna have fun, you know? These include: Mad Seal: The seal is resting, and you woke them up by clicking them, they are calling the crazy kitty to attack you, for now the damage is permanent (until you refresh the page), but there will soon be a way to revert it by feeding the seal. 🐟 Spinning Seal: You can grab it and throw it around like those DVD Screensavers, its fun! 📀 I want to make something to jumpscare y´all, but I will be thinking of ideas to do so hehe, be prepared >:] I had to make the Desktop App Icons wrap around, so they did not sink into the water, because I do not want that. I am so close to finishing this really cool OS which I am really proud of, I love it so much, and did it all without any frameworks which is really cool. These changes are not published yet, they are on a testing branch as I still need to squash some bugs.
Hello there, and welcome to my last devlog, it is been a long journey, but I have done it, I have learned the ways of HTML, CSS and JS. I hate them all, but at least I know them now lol. I made a lot of QOL, a LOT of bug fixing and added some cool little features, you can take a look: Random Foxy Jumpscare: It is an option in the Settings App which can be activated and desactivated, but it is disabled by default. Saved settings: All settings you modify will be kept if you reload the page, this also works with the Seal Clicker app! Fih: Now you will see a bunch of fish swimming around in the bottom of the screen, and they are grabbable!! Sleepy, Hungry seal: The seal in the top corner of the screen is very sleepy, if you click it, it will get mad, but you can fix the damages by feeding it fish. Audio: Added a bunch more of audio Fixes: A lot of bug interactions with the DVD Seal.
Well, I am back at it, as my goal is to get a 3D printer! As of currently, I just fixed a couple of bugs, including: Making ¨painting¨ apps easier to close. Fixed it so you could not ¨paint¨ when clicking the close or minimize button. Fixed Foxy Jumpscare setting not actually working I already have some ideas in mind of what I want to do next! If you wanna hear my quick vent, go ahead: For WebOS 1 I really placed a lot of time into it so I could have my code structure really well done so it would be really easy to create new apps, and I did spend a lot of time in Seal Clicker lol, but I thought the ratings would count both Web 1 and 2, but sadly not, so I will have to work another 50 hours on this , not annoyed, but I did wanna work on other projects
Hello thereeee!! i am back with a pretty boring devlog, oh yea I have been fixing bugs, which that I am aware, everything should be fixed (hopefully) These include: Sealtok autoplaying on page load (videos with audio would be heard from outside, which could be annoying) I have also been busy with structuring code, and I am currently working on optimizing the Audio Categories to translate them into the new settings system! (sfx and ui sliders) I also spent some of the stardust on buying a domain, so I can have my cool OS outside of github >:] (now with cloudflare too) Some really cool things that I have been working on for the Paint Windows is so they get saved, so you can restart the page and have your drawn things there again!! I have a rotation system and scaling system for object painting, but with the structuring of the setting system so that I can create sliders for other things too, it is still a WIP, but it should be out soon! Alright, yippe and bye
Helloooooooo, I again fell into the rabbit hole of OPTIMIZATION As I am on my mission to make everything really approachable for coders that may want to inspect the code and fork it, and make their own silly changes, it is easier than ever. So I made some new sliders that affect multiple things, which I used to replace the audio categories! (sfx and ui for example), audios that fit into the same category and have one slider that affects all of them. Thanks to the new slider system I have, it was very easy to implement a new feature, sizing and rotation for objects! Though not all objects are rotatable, but at least they all are scalable :]! So now you can have annoying cockroach seals that zoom all over the screen, or have big sealies that move as slow as a turtle. OH, I almost forgot. You can also use the arrow keys to rotate and scale the stuff without having to grab the slider and move it around, though I could not find a way to make it so you can press more than 2 keys at the same time, I will be putting some time to research that, but for now, nope :[ Alrighty, that is it for this cool devlog , see ya
Ships:
Hello there!! I made a very Seal-Inspired WebOS, it has 3 apps, which only two are cool as the other one is just an introduction to the OS and me! The REAL cool apps are these as of right now are: Seal Clicker: A clicker/idle game like Cookie Clicker but if it was seals. SealTok: Wanna brainrot your brain until it only thinks of seals? Me too! Now you can do that here!! I think what was most challenging about making this project was the Seal Clicker app as it went through multiple stages of rebuilding to make expanding the upgrades and seals easier, and in general it’s just a big app lol, I also did all the art myself, I’ve been challenging myself recently to learn to draw, even if they’re not the best drawings, but I’m very happy on how it turned out! I also had barely any knowledge about HTML, CSS and JS, so I learnt everything from scratch, though I was glad to discover that JS is surprisingly similar to my main coding language C#. I’m also VERY proud of the Seal Clicker app, it’s where I learnt that a lot of the concepts from C# were applicable in JS and is where I put my structure optimization hat haha, I ended up loving the drawings I made. And for you to test the project just hit the “Try Project” button and it will take you there! I really hope you enjoy the OS as much as I loved building it, and thanks for taking the time to check it out!!
I made 3 new apps, but I did add a heck ton more features! Ok, let’s get started with the apps first: Moving Seals: This is an app that lets you draw seals that move all over your screen and that after they’re spawned you have the possibility to make them explode, or nuke them if you’re so cruel. Sand Builder: An app to decorate your os! Place sand castles, starfishes and sand dollars (didn’t know those existed but they’re really cool). Settings: A simple app to adjust volume settings, and to enable a certain possible jumpscare with a very small chance of it happening every second, hope it doesn’t catch you off guard. They’re also saved if you reload the page (including Seal Clicker!!). About the features, I wanted to add some small things that were fun to play around and fun to discover, very silly! So I made the following: Sleepy but hungry seal: A seal that sits in the top left corner of your screen which if you click, will call it’s guard (an epic cat), which will throw a brick at you lol, this will leave your screen fractured, unless you feed the seal some fish by dragging them into its mouth. Fish: There’s some new decoration, which are fish who like to swim below in your screen in the sea! You can grab them to feed the hungry seal. DVD Seal: I wanted to experiment with 3D, because I saw a really cute seal model, so I made it so you can grab it and throw it around like the DVD Screensaver, I’m not sure why it reminded me of it, but yeah. Foxy Jumpscare: I wanted to scare the user of the website, at first I thought I would do a really creepy seal image, WHICH I FOUND SOME WHICH I WILL NEVER BE ABLE TO ERASE FROM MY BRAIN D:, but I landed on the Foxy Jumpscare as I think it’s funnier and fits the silly vibes more, but I decided to disable it by default so if someone doesn’t know about it, they don’t get jumped or smthing. Since the last update, I updated a lot of the visuals (just UI elements, my weird art will still be there), thanks to my sister which is an artist (thx for the help :D). I had a bit of trouble with the 3D DVD Seal as I thought moving it would be as easy as just getting the input from the canvas, I was so wrong, I was there for hours trying to fix it, and then I thought, what about raycasting? That would literally need the model to be hit! But implementation also took hours as I couldn’t find any guides, but OH WELL. I’m super duper happy with how it turned out, and I hope you love it as much as I enjoyed making it, thanks for watching my devlogs, for reading alla this. and bye <3
Hello there!! Well, I’m done with this project, I’m very happy with the result of what I did, and I learnt a lot of JavaScript, HTML and CSS. For this final update I worked on a ton of QOL basically, basically the following: All things you build now get saved when you reset the page. You can now scale and rotate objects (only certain you can rotate), for example, Seals can be scaled up and be slower, or be scaled down and be faster. For rotating and scaling, you can also use your ARROW KEYS :D That was about it, most of my time spent was in structuring my code and making it easier to expand, so the integration of these was pretty easy tbh. Well, thank you for following me on this journey <] SEAl YA!...
|
1792990393.52246
|
1793076793.52246
|
|
22325
|
NaOs by @Phonemi | Stardance
|
Phonemi
|
3
|
116.0
|
1730
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T20:49:35Z", "hours": 80.0, "multiplier": 19.49, "payout": 1568, "blessing": "neutral", "text": "NaOS [+_+] NaOS is short for Not an Operating System (it’s cool because Naos is also one of the hottest and most luminous stars you can see with the naked eye) in my project i tried to make the WebOS feel like a normal os that you can daily drive, that’s why there is no fancy feature that just advertises my os (makes no sense if you want something usable) all the features of my os: a bar (clock, launcher, applications, shutdown menu, sound and workspaces) sound effects (some of them are self recorded) a calendar (next to it is the notification overview) notifications app launcher (you can also change settings from the launcher, you have to type > for that) – widgets (you can code infinite ones, but if you don’t there are 2): todo widget (a todo list, you can add counters for things like hours of sleep or drink water, or normal check marks) clock (just a normal clock) – applications (also infinite if you code, but if not there are 12): terminal (34 commands, its own filesystem, nano for editing) files (to browse the virtual filesystem) code (text editor, saves to the filesystem or downloads, you can also compile your code (like 30 programming languages) and interpret it too, clone from github, and if you name a file .window or .widget it becomes an application or a widget (they are html files)) browser (web search, image search, page proxy, downloads into the filesystem. info: youtube is not working, the rest should be fine. you can use google (or bing if you want, but nobody wants to use bing anyway)) paint (draw on a canvas, save into the filesystem or download) viewer (look at wallpapers and anything you drew or downloaded, set any as background) monitor (btop style, real load and fps graphs, memory, filesystem stats, open windows) calculator (just a calculator) snake (it’s snake, not much) settings (change your config, kinda useless because you can do all of it better in my config files) config files pets (easter egg + new AI, you can click to pet them, they won’t leave the white glow) – the stuff that makes it feel like a real wm: 3 window manager layouts: normal (floating windows you drag and resize), hyprland (dwindle tiling, every new window splits the focused one) and niri (scrollable columns) — switch in settings, the terminal or with a keybind 4 workspaces you can switch between and throw windows across, plus an overview windows snap to the edges and you can open multiple instances of the same app a lock screen boot and shutdown animations break reminders (look away from the screen) and drink reminders keybinds dark and light mode self drawn icons very clean closing, hiding and fullscreen animations and it does not run on vercel, it runs on my school’s kubernetes cluster hope you like it [-_-]", "repo": "https://github.com/Phonokles/NaOS", "demo": "https://buyers-russia-investigation-expires.trycloudflare.com/"}, {"ship_num": 2, "ts": "2026-07-17T21:37:17Z", "hours": 16.0, "multiplier": 10.17, "payout": 162, "blessing": "neutral", "text": "This WebOS was made to improve real life. It’s really comfortable and has cool colors, fonts, etc. It has apps: calc, folders, code, terminal, snake, todo, and settings - all resizable and movable. There are pets on your bar. There are WMs (Window Managers), fully movable and resizable widgets (clock and todo), workspaces, and overviews (the overview depends on the WM). There’s a top bar with shutdown, a calendar, and the workspaces. Popups remind you to drink. New features for WebOS2, missions are: the WMs the movable and resizable widgets (including the clock widget) desktop overview (2 different variants) a RAM file system new terminal commands Snake game popups (the drink one)", "repo": "https://github.com/Phonokles/NaOS", "demo": "https://buyers-russia-investigation-expires.trycloudflare.com/"}, {"ship_num": 3, "ts": "2026-07-01T13:30:16Z", "hours": 20.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Get a life WebOS: It’s a web OS which runs smooth and clean its made to make your life a better one (but that’s contradictory, because you’re a loser(Programmer)) but there is a widget which helps you to do your daily to do’s there is a calc(calc is slang for calculator btw), a calendar, terminal and a settings app. You can click on the icons on the Taskbar to open the applications. On the top bar there is a clock and the date if you click on them a calendar pops up which is not draggable same if you press on the power button there is a pop up which allows you to lock, reboot and shutdown the OS On the bar there are animals but don’t put more than 4 on it or something terrible is going to happen. There is an Akita, a Panda and a Fox which only move on the taskbar which follows your cursor. On the top right you can find numbers. They indicate the workspace you’re currently on and if you press on a other number which is not marked, you switch to the workspace. Hope you all like it!", "repo": "https://github.com/Phonokles/NaOS", "demo": "https://buyers-russia-investigation-expires.trycloudflare.com/"}]...
|
[{"post_id": 43505, "ts": "202 [{"post_id": 43505, "ts": "2026-08-08T20:29:14Z", "hours": 8.4136, "text": "last devblog[+_+] so this is the last devblog on the project and here are my last changes I rebranded from get a life WebOS to Na-Os(it is the brightest star in the northern hemisphere) and it is Not an Os i fixed a lot of bugs espacialy when it comes to compiling and searching images it now runs on my schools kubernetes cluster instead of vercel because i used all my vercel limits and i will put a custom sub domain on it tomorow to and it uses a cloud flare tunnel so it was a fun journee never thought that i am gona work over a 100h on this project but yea and i think i did a great job at trying to make it work just like a normal os hope you like it and if you like the project my other ones are cool to so take a look at those[-_-]"}, {"post_id": 41852, "ts": "2026-08-06T10:12:56Z", "hours": 8.2286, "text": "infinite apps backgrounds and widgets[+_+] so i made if you name a html file .window i will pop up as a window and work as a app and also get displayed in the search and if you name a html file .widget it becoes a fully functionale widget also displayed in the settings you can also download images now through the browser so there is a image option and you can download images there and also you can now download files generaly though the browser and you can now clone project from github and also commit through my webos hope you like it[-_-]"}, {"post_id": 39408, "ts": "2026-08-02T11:03:39Z", "hours": 8.1969, "text": "extreme ui changes[+_+] new launcher look aplications reworked: (code, files, paint, browser) icons now work great because i converted them to pngs you can change bar position (no fox and widget bugs) you can change bar and window transparincy new top window design a bit cleaner and a new settings menu plus settings icon browser and todo ando overview bug fixes and redisign hope you like it[-_-]"}, {"post_id": 39109, "ts": "2026-08-01T20:21:45Z", "hours": 5.2419, "text": "the interpreter is working yay[+_+] so this interpreter finaly works front end and you can now execute most py programms i will need to do some things to help you to execute all programm but for that i ned to host this project on a local server so i will do that in the future but not now hope you like it[-_-]"}, {"post_id": 38698, "ts": "2026-08-01T06:53:16Z", "hours": 9.0414, "text": "so i added a compiler to my webos[+_+] in my webos your are now able to execute any file tha you created in the code editor or the ones who sit on your virtual file system they perfectly run in the terminal without any problems to execute them just press the run button or execute the comand it was a bit complicated but a lot of fun hope you like it[-_-]"}, {"post_id": 37671, "ts": "2026-07-30T15:52:02Z", "hours": 2.265, "text": "you can now execute html files in the browser that was pretty easy so you can create a html file with your folder app or with the code app and execute it. it works great and without any problems hope you like it[-_-]"}, {"post_id": 37592, "ts": "2026-07-30T12:57:00Z", "hours": 4.3206, "text": "i think the browser is finished[+_+] the browser can now search the web its not the best search but i am happy with it you can open most websites youtube doas not work but if you have a playing tab so a vid which is not directly in youtube it works some other websites block you to but most of them work (i am so happy i am finished with that shit i had so many burnouts) hope you like it[-_-]"}, {"post_id": 37369, "ts": "2026-07-30T01:14:43Z", "hours": 4.5939, "text": "Browser is kinda working you can now open most websites unfotunatly not youtube or search engins like bing or duck duck they block you because vercel is a data center i am working on the fix for that but its working great and is preaty cool sry if my code is not the best and also my time (i didnt sleep for 2 days to code) so i will tr to if x it in this night and then rest a bit hope you like it"}, {"post_id": 36870, "ts": "2026-07-29T06:53:16Z", "hours": 6.7442, "text": "i added a Browser(but its shitti like most online browsers)[+_+] i added a browser with wiki search and you can open wikipedia articles unfortunatly nothing else i am workin on that right now i needed a bit longer because i worked through the night and was realy tiered hope you like it[-_-]"}, {"post_id": 36642, "ts": "2026-07-28T21:10:39Z", "hours": 4.7825, "text": "i added icons and sound effects and a new animal bot with new fetures[+_+] so there are icons right now they are a bit buggy but i will fix that there are sound effects which are realy bad but hope thats ok and a sound settings menu and a slider the animals dont overlap that often animore and you can pet them and in the end i fixed the ram bug in the drawing app earlyer when you risized your window it wouldonly load evrthing you see in the ram but thats fixed now hope you like it[-_-]"}, {"post_id": 35993, "ts": "2026-07-27T19:55:23Z", "hours": 3.6594, "text": "cool closing hiding and fullscreen animation [+_+] its hard to explain just watch the video hope you like it[-_-]"}, {"post_id": 35844, "ts": "2026-07-27T15:21:40Z", "hours": 5.9306, "text": "So now new changes are online (design rework)[+_+] the launcher looks acceptable now you can see it in a picture below the drawing app looks prety good now to and there is a galary took some insperations from procreate for the layout there is no top bar anymore i thought it was anoying to have 2 bars and it looks better know only 3 apps displayed and if you open a app it doas get displayed you can hover over them to see the windows i removed no fetures there is no welcome screen anymore and you boot directly but there is a welcome app which is prety clean i am working right now on better closing hiding and fulscreen animation, bug fixes, that you can pet pets, a browser where you can download pngs, executable programs and a rework for the pet death easter egg, and sound effects. hope you like it[-_-]"}, {"post_id": 35482, "ts": "2026-07-26T23:05:57Z", "hours": 9.0283, "text": "3 new apps key binds and launcher but all in beta[+_+] so i made 3 new apps paint: where you can paint in and save the image in the ram filesystem or localy but i am still woking on it imageviewer: shows all the image on your desktop and you can also put anything as your background now btop: a fake system where you can see what needs how much power etc mostly fake and random values i added keybinds so you can open up epplicaions per keybinds and do other cool stuff i also added a launcher but its realy ugly so i am working on a 3 redisign but everthing is a bit ugg thats why you cant try out the new fetures sry even though i hope you like it"}, {"post_id": 30090, "ts": "2026-07-17T12:04:52Z", "hours": 4.0786, "text": "i added a desktop overview and a snake game[+_+] i added a desktop overview diferent depending on your wm in hyprland and desktop you have the basic windows 11 overview i think or macos idk and if you chose niri you have the niri desktop overview wich expandes in 2 dimensions and there is a super dupper cool snake game which absulutly works totaly fine. idk know why but my ram file system broke like 1000 times so i fixed that to hope you like it[-_-]"}, {"post_id": 28967, "ts": "2026-07-15T16:16:02Z", "hours": 3.3625, "text": "I added window tiling Managers[+_+] so now there are window tiling manager there is the default (but that is boring)and there is hyprland and niri i dont want to describe them so just watch the video or google it hope u like it [-_-]"}, {"post_id": 28472, "ts": "2026-07-14T18:40:40Z", "hours": 5.9744, "text": "NEW WIDGET AND A FILE SYSTEM[+_+] i added a clock widget with also a liquid glass lok and a supper cool file system that work just like on a normal pc but only on ram you can also resize the widget hope you like it[-_-]"}, {"post_id": 27799, "ts": "2026-07-13T17:51:33Z", "hours": 0.5594, "text": "i changed the color theme a it it looks a lot better"}, {"post_id": 26092, "ts": "2026-07-10T17:56:26Z", "hours": 2.0528, "text": "i added a drink notifiation thee will be more in the future"}, {"post_id": 19471, "ts": "2026-06-30T20:03:23Z", "hours": 1.9661, "text": "I added a lot of things (I don’t know why, but Hackatime didn’t work properly, so it only shows 2 hours. I actually worked around 4–5 hours).There are now multiple pets, a to-do list, a terminal, a code editor, a calculator, and a to-do widget.I also added a little easter egg: if you put more than 4 animals in there, they’ll explode. (I’m still working on the crashout page after that, as well as voice acting and sound effects in general.)There are workspaces now too. Hope you like it!"}, {"post_id": 19171, "ts": "2026-06-30T13:00:15Z", "hours": 2.3544, "text": "I changed a few things, made the calendar a bit shorter, and also added a settings app where you can change background images and switch between light and dark mode. I also added a few new SVGs (grabbed online)."}, {"post_id": 17737, "ts": "2026-06-28T17:33:28Z", "hours": 3.3497, "text": "i added a button on the top bar where you can lock shutdown and reboot with cool animation(i am proud of the lock on sry for the bad quality my laptop is broken so i have to use the old Budget ubuntu laptop of my father)"}, {"post_id": 17488, "ts": "2026-06-28T09:15:18Z", "hours": 2.0619, "text": "now there is a top bar with time and a calendar. i will be focusing on more pets and some calender applications and widgets"}, {"post_id": 17191, "ts": "2026-06-27T22:01:38Z", "hours": 2.7978, "text": "This time i made a boot screen with a checklist of things loading, as well as the rough desktop, for which i added a wallpaper and the fox from the welcome page. That’s all for this devlog, hope you like it, see you next time!"}, {"post_id": 17008, "ts": "2026-06-27T16:34:05Z", "hours": 5.7586, "text": "For the welcome screen, I added a cute little fox and made a button about me, which I made a little bit cleaner since it was somewhat ugly before. I took the fox animations from the VS-Pets vscode extension, but I coded functions myself. For example I made it so that the fox starts moving on its own after 5 seconds of inactivity and it always stays on the green platform which follows the mouse cursor. It also always has a chance to start running and a chance to lie down. The next devlog will be about a boot screen and a desktop. Hope you guys like it!"}, {"post_id": 12080, "ts": "2026-06-19T18:30:34Z", "hours": 1.9469, "text": "i added a welcome screen"}]...
|
Title: NaOs by @Phonemi | Stardance
Devlogs:
i ad Title: NaOs by @Phonemi | Stardance
Devlogs:
i added a welcome screen
For the welcome screen, I added a cute little fox and made a button about me, which I made a little bit cleaner since it was somewhat ugly before. I took the fox animations from the VS-Pets vscode extension, but I coded functions myself. For example I made it so that the fox starts moving on its own after 5 seconds of inactivity and it always stays on the green platform which follows the mouse cursor. It also always has a chance to start running and a chance to lie down. The next devlog will be about a boot screen and a desktop. Hope you guys like it!
This time i made a boot screen with a checklist of things loading, as well as the rough desktop, for which i added a wallpaper and the fox from the welcome page. That’s all for this devlog, hope you like it, see you next time!
now there is a top bar with time and a calendar. i will be focusing on more pets and some calender applications and widgets
i added a button on the top bar where you can lock shutdown and reboot with cool animation(i am proud of the lock on sry for the bad quality my laptop is broken so i have to use the old Budget ubuntu laptop of my father)
I changed a few things, made the calendar a bit shorter, and also added a settings app where you can change background images and switch between light and dark mode. I also added a few new SVGs (grabbed online).
I added a lot of things (I don’t know why, but Hackatime didn’t work properly, so it only shows 2 hours. I actually worked around 4–5 hours).There are now multiple pets, a to-do list, a terminal, a code editor, a calculator, and a to-do widget.I also added a little easter egg: if you put more than 4 animals in there, they’ll explode. (I’m still working on the crashout page after that, as well as voice acting and sound effects in general.)There are workspaces now too. Hope you like it!
i added a drink notifiation thee will be more in the future
i changed the color theme a it it looks a lot better
NEW WIDGET AND A FILE SYSTEM[+_+] i added a clock widget with also a liquid glass lok and a supper cool file system that work just like on a normal pc but only on ram you can also resize the widget hope you like it[-_-]
I added window tiling Managers[+_+] so now there are window tiling manager there is the default (but that is boring)and there is hyprland and niri i dont want to describe them so just watch the video or google it hope u like it [-_-]
i added a desktop overview and a snake game[+_+] i added a desktop overview diferent depending on your wm in hyprland and desktop you have the basic windows 11 overview i think or macos idk and if you chose niri you have the niri desktop overview wich expandes in 2 dimensions and there is a super dupper cool snake game which absulutly works totaly fine. idk know why but my ram file system broke like 1000 times so i fixed that to hope you like it[-_-]
3 new apps key binds and launcher but all in beta[+_+] so i made 3 new apps paint: where you can paint in and save the image in the ram filesystem or localy but i am still woking on it imageviewer: shows all the image on your desktop and you can also put anything as your background now btop: a fake system where you can see what needs how much power etc mostly fake and random values i added keybinds so you can open up epplicaions per keybinds and do other cool stuff i also added a launcher but its realy ugly so i am working on a 3 redisign but everthing is a bit ugg thats why you cant try out the new fetures sry even though i hope you like it
So now new changes are online (design rework)[+_+] the launcher looks acceptable now you can see it in a picture below the drawing app looks prety good now to and there is a galary took some insperations from procreate for the layout there is no top bar anymore i thought it was anoying to have 2 bars and it looks better know only 3 apps displayed and if you open a app it doas get displayed you can hover over them to see the windows i removed no fetures there is no welcome screen anymore and you boot directly but there is a welcome app which is prety clean i am working right now on better closing hiding and fulscreen animation, bug fixes, that you can pet pets, a browser where you can download pngs, executable programs and a rework for the pet death easter egg, and sound effects. hope you like it[-_-]
cool closing hiding and fullscreen animation [+_+] its hard to explain just watch the video hope you like it[-_-]
i added icons and sound effects and a new animal bot with new fetures[+_+] so there are icons right now they are a bit buggy but i will fix that there are sound effects which are realy bad but hope thats ok and a sound settings menu and a slider the animals dont overlap that often animore and you can pet them and in the end i fixed the ram bug in the drawing app earlyer when you risized your window it wouldonly load evrthing you see in the ram but thats fixed now hope you like it[-_-]
i added a Browser(but its shitti like most online browsers)[+_+] i added a browser with wiki search and you can open wikipedia articles unfortunatly nothing else i am workin on that right now i needed a bit longer because i worked through the night and was realy tiered hope you like it[-_-]
Browser is kinda working you can now open most websites unfotunatly not youtube or search engins like bing or duck duck they block you because vercel is a data center i am working on the fix for that but its working great and is preaty cool sry if my code is not the best and also my time (i didnt sleep for 2 days to code) so i will tr to if x it in this night and then rest a bit hope you like it
i think the browser is finished[+_+] the browser can now search the web its not the best search but i am happy with it you can open most websites youtube doas not work but if you have a playing tab so a vid which is not directly in youtube it works some other websites block you to but most of them work (i am so happy i am finished with that shit i had so many burnouts) hope you like it[-_-]
you can now execute html files in the browser that was pretty easy so you can create a html file with your folder app or with the code app and execute it. it works great and without any problems hope you like it[-_-]
so i added a compiler to my webos[+_+] in my webos your are now able to execute any file tha you created in the code editor or the ones who sit on your virtual file system they perfectly run in the terminal without any problems to execute them just press the run button or execute the comand it was a bit complicated but a lot of fun hope you like it[-_-]
the interpreter is working yay[+_+] so this interpreter finaly works front end and you can now execute most py programms i will need to do some things to help you to execute all programm but for that i ned to host this project on a local server so i will do that in the future but not now hope you like it[-_-]
extreme ui changes[+_+] new launcher look aplications reworked: (code, files, paint, browser) icons now work great because i converted them to pngs you can change bar position (no fox and widget bugs) you can change bar and window transparincy new top window design a bit cleaner and a new settings menu plus settings icon browser and todo ando overview bug fixes and redisign hope you like it[-_-]
infinite apps backgrounds and widgets[+_+] so i made if you name a html file .window i will pop up as a window and work as a app and also get displayed in the search and if you name a html file .widget it becoes a fully functionale widget also displayed in the settings you can also download images now through the browser so there is a image option and you can download images there and also you can now download files generaly though the browser and you can now clone project from github and also commit through my webos hope you like it[-_-]
last devblog[+_+] so this is the last devblog on the project and here are my last changes I rebranded from get a life WebOS to Na-Os(it is the brightest star in the northern hemisphere) and it is Not an Os i fixed a lot of bugs espacialy when it comes to compiling and searching images it now runs on my schools kubernetes cluster instead of vercel because i used all my vercel limits and i will put a custom sub domain on it tomorow to and it uses a cloud flare tunnel so it was a fun journee never thought that i am gona work over a 100h on this project but yea and i think i did a great job at trying to make it work just like a normal os hope you like it and if you like the project my other ones are cool to so take a look at those[-_-]
Ships:
Get a life WebOS: It’s a web OS which runs smooth and clean its made to make your life a better one (but that’s contradictory, because you’re a loser(Programmer)) but there is a widget which helps you to do your daily to do’s there is a calc(calc is slang for calculator btw), a calendar, terminal and a settings app. You can click on the icons on the Taskbar to open the applications. On the top bar there is a clock and the date if you click on them a calendar pops up which is not draggable same if you press on the power button there is a pop up which allows you to lock, reboot and shutdown the OS On the bar there are animals but don’t put more than 4 on it or something terrible is going to happen. There is an Akita, a Panda and a Fox which only move on the taskbar which follows your cursor. On the top right you can find numbers. They indicate the workspace you’re currently on and if you press on a other number which is not marked, you switch to the workspace. Hope you all like it!
This WebOS was made to improve real life. It’s really comfortable and has cool colors, fonts, etc. It has apps: calc, folders, code, terminal, snake, todo, and settings - all resizable and movable. There are pets on your bar. There are WMs (Window Managers), fully movable and resizable widgets (clock and todo), workspaces, and overviews (the overview depends on the WM). There’s a top bar with shutdown, a calendar, and the workspaces. Popups remind you to drink. New features for WebOS2, missions are: the WMs the movable and resizable widgets (including the clock widget) desktop overview (2 different variants) a RAM file system new terminal commands Snake game popups (the drink one)
NaOS [+_+] NaOS is short for Not an Operating System (it’s cool because Naos is also one of the hottest and most luminous stars you can see with the naked eye) in my project i tried to make the WebOS feel like a normal os that you can daily drive, that’s why there is no fancy feature that just advertises my os (makes no sense if you want something usable) all the features of my os: a bar (clock, launcher, applications, shutdown menu, sound and workspaces) sound effects (some of them are self recorded) a calendar (next to it is the notification overview) notifications app launcher (you can also change settings from the launcher, you have to type > for that) – widgets (you can code infinite ones, but if you don’t there are 2): todo widget (a todo list, you can add counters for things like hours of sleep or drink water, or normal check marks) clock (just a normal clock) – applications (also infinite if you code, but if not there are 12): terminal (34 commands, its own filesystem, nano for editing) files (to browse the virtual filesystem) code (text editor, saves to the filesystem or downloads, you can also compile your code (like 30 programming languages) and interpret it too, clone from github, and if you name a file .window or .widget it becomes an application or a widget (they are html files)) browser (web search, image search, page proxy, downloads into the filesystem. info: youtube is not working, the rest should be fine. you can use google (or bing if you want, but nobody wants to use bing anyway)) paint (draw on a canvas, save into the filesystem or download) viewer (look at wallpapers and anything you drew or downloaded, set any as background) monitor (btop style, real load and fps graphs, memory, filesystem stats, open windows) calculator (just a calculator) snake (it’s snake, not much) settings (change your config, kinda useless because you can do all of it better in my config files) config files pets (easter egg + new AI, you can click to pet them, they won’t leave the white glow) – the stuff that makes it feel like a real wm: 3 window manager layouts: normal (floating windows you drag and resize), hyprland (dwindle tiling, every new window splits the focused one) and niri (scrollable columns) — switch in settings, the terminal or with a keybind 4 workspaces you can switch between and throw windows across, plus an overview windows snap to the edges and you can open multiple instances of the same app a lock screen boot and shutdown animations break reminders (look away from the screen) and drink reminders keybinds dark and light mode self drawn icons very clean closing, hiding and fullscreen animations and it does not run on vercel, it runs on my school’s kubernetes cluster hope you like it [-_-]...
|
1792878770.693346
|
1793742770.693346
|
|
27454
|
MacWall - Website by @foundrceo | Stardance
|
foundrceo
|
3
|
116.0
|
1090
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T12:01:12Z", "hours": 18.0, "multiplier": 18.8, "payout": 331, "blessing": "neutral", "text": "Redesigned the homepage and site UI New hero, navbar, category strip and License pop-up. Features shown as rows, an Apple-style footer, and new 404 and error pages. New app icon everywhere (favicons, email logo) and a new social share image. New hero app video in 1080p, slowed down. Redesigned pricing page that says “one-time payment”. Install guide with animations, shown after you download. New help center with topic cards, search, and help inside the ⌘K command menu. Moved the whole site from Vercel to Cloudflare Workers macwall.app now runs on Cloudflare; Vercel is kept only as a backup. I connected the domains, moved the scheduled jobs (cron) over, set up caching for the landing pages, and fixed visitor country/IP detection on Cloudflare. Before the move I cut Vercel costs: videos served from R2, longer caching, lighter images, smaller 404 pages. Phone visitors On a phone, “Send to my Mac” emails you the download link instead of downloading a Mac file. “Set on Mac” opens the app directly through a macwall:// link. Wallpaper gallery and search traffic 45 wallpaper collections, more detailed wallpaper pages, and guides written to answer questions directly. Gallery sorted by most liked, with a “Download free” button and a sticky bar at the bottom. Faster loading: static gallery pages, lighter images, and full-size wallpaper files no longer served.", "repo": "https://github.com/foundrceo/MacWall-Web", "demo": "https://macwall.app/"}, {"ship_num": 2, "ts": "2026-09-16T07:40:26Z", "hours": 55.0, "multiplier": 10.94, "payout": 556, "blessing": "neutral", "text": "I just updated the entire ui ux of my website to make it 100x better and get better conversions update all the files and components name also to a professional / enterprise level", "repo": "https://github.com/foundrceo/MacWall-Web", "demo": "https://macwall.app/"}, {"ship_num": 3, "ts": "2026-07-24T10:16:41Z", "hours": 43.0, "multiplier": 9.79, "payout": 203, "blessing": "neutral", "text": "what did you make? macwall.app - the website for my macos live wallpaper app. download the free app buy pro with stripe and activate with a deep link. also pricing blog submit wallpapers and affiliates. what was challenging? getting checkout right. stripe → license email → macwall://activate had a lot of edge cases. india pricing and the reel refund flow took a few rewrites. keeping price copy in sync with real stripe prices was annoying. what are you proud of? it is live and people can actually use it. one click download one click checkout and the app unlocks. the site feels like a real product not a template. what should people know so they can test? open https://macwall.app hit download for macos (or grab the dmg on the github release). you need macos 26. browse pricing if you want to see permanent annual and reel refund. free try works without paying.", "repo": "https://github.com/foundrceo/MacWall-Web", "demo": "https://macwall.app/"}]...
|
[{"post_id": 80623, "ts": "202 [{"post_id": 80623, "ts": "2026-10-18T10:19:19Z", "hours": 10.7622, "text": "Just Shipped a major update in the ui ux overall application."}, {"post_id": 74829, "ts": "2026-09-28T12:06:55Z", "hours": 3.3728, "text": "raised macwall pricing recently and the response has actually been really good traffic is growing a lot too now around 59k visitors and 128k page views been testing pricing changes and polishing the site while watching how people respond to it"}, {"post_id": 72557, "ts": "2026-09-23T06:44:37Z", "hours": 2.4158, "text": "Update: v4.0.3Sep 18, 2026"}, {"post_id": 69630, "ts": "2026-09-17T13:22:36Z", "hours": 1.8347, "text": "mihi"}, {"post_id": 69026, "ts": "2026-09-16T07:39:04Z", "hours": 8.0711, "text": "Updated Entire Website UI/UX to 100x better :)"}, {"post_id": 64279, "ts": "2026-09-08T15:39:49Z", "hours": 0.9261, "text": "Fixes - Older free installs are treated the same as an ended trial: wallpapers stay paused until you unlock Pro."}, {"post_id": 62817, "ts": "2026-09-06T10:44:52Z", "hours": 6.8814, "text": "Improvements Public changelog page synced with shipping updates. Align the site catalog with the nine app categories. Allow timed unique conversion codes at checkout and in recovery mail."}, {"post_id": 43780, "ts": "2026-08-09T06:37:47Z", "hours": 10.1469, "text": "Improvements- Overhaul marketing copy, pricing UX, and hero assets for conversion. Fixes - Fix checkout recovery mail for failed and abandoned payments."}, {"post_id": 41147, "ts": "2026-08-05T05:28:58Z", "hours": 9.2678, "text": "New features - Public wallpaper gallery with search, SEO, and app deep links. Improvements - Clearer pricing cards, benefits, and upgrade prompts. Fixes - Fix blank wallpaper player caused by expired ISR signed URLs. Fix gallery Back wiping Show more and jumping to the footer."}, {"post_id": 39858, "ts": "2026-08-03T03:47:19Z", "hours": 13.9444, "text": "Highlights MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. New features Home rebuilt around Top Charts and Categories for faster browsing. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). One Add Wallpaper flow for private Library imports and community submissions. Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Pro+ licenses now support 10, 15, or 20 Macs. New features - Home rebuilt around Top Charts and Categories for faster browsing. Discord community invite pointed at the new server link. Improvements Liquid Glass navigation, Cause brand type, and tighter Home composition. Pro unlock sheet with glass chrome and smooth open / close motion. Escape closes overlays reliably — no blue focus ring around the window. Native Settings sidebar Forms and simpler window chrome. App icon refreshed to match macwall.app. Instagram handle updated to @macwallapp_ . Discord community invite pointed at the new server link. Highlights - MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Improvements - Liquid Glass navigation, Cause brand type, and tighter Home composition. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes More reliable native wallpaper apply, repair, and extension playback. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes - More reliable native wallpaper apply, repair, and extension playback."}, {"post_id": 35582, "ts": "2026-07-27T03:37:07Z", "hours": 2.1853, "text": "MacWall updates after June 1, 2026"}, {"post_id": 34484, "ts": "2026-07-25T07:47:03Z", "hours": 3.4406, "text": "Working on MacWall.app :)"}, {"post_id": 33965, "ts": "2026-07-24T10:14:34Z", "hours": 0.7647, "text": "I built MacWall because I wanted live wallpapers on Mac that feel native not an Electron wrapper eating battery. The Swift app is the product. This repo is the storefront: marketing, Stripe checkout, license activation, downloads, blog, community submit, and admin tools."}, {"post_id": 33944, "ts": "2026-07-24T08:38:07Z", "hours": 14.6167, "text": "shipped pricing model today let’s go visit for free live wallpapers for your mac 💻 macwall.app get your one now !"}, {"post_id": 17445, "ts": "2026-06-28T07:04:17Z", "hours": 27.6111, "text": "live wallpaper for macos download the app now"}]...
|
Title: MacWall - Website by @foundrceo | Stardance Title: MacWall - Website by @foundrceo | Stardance
Devlogs:
live wallpaper for macos download the app now
shipped pricing model today let’s go visit for free live wallpapers for your mac 💻 macwall.app get your one now !
I built MacWall because I wanted live wallpapers on Mac that feel native not an Electron wrapper eating battery. The Swift app is the product. This repo is the storefront: marketing, Stripe checkout, license activation, downloads, blog, community submit, and admin tools.
Working on MacWall.app :)
MacWall updates after June 1, 2026
Highlights MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. New features Home rebuilt around Top Charts and Categories for faster browsing. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). One Add Wallpaper flow for private Library imports and community submissions. Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Pro+ licenses now support 10, 15, or 20 Macs. New features - Home rebuilt around Top Charts and Categories for faster browsing. Discord community invite pointed at the new server link. Improvements Liquid Glass navigation, Cause brand type, and tighter Home composition. Pro unlock sheet with glass chrome and smooth open / close motion. Escape closes overlays reliably — no blue focus ring around the window. Native Settings sidebar Forms and simpler window chrome. App icon refreshed to match macwall.app. Instagram handle updated to @macwallapp_ . Discord community invite pointed at the new server link. Highlights - MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Improvements - Liquid Glass navigation, Cause brand type, and tighter Home composition. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes More reliable native wallpaper apply, repair, and extension playback. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes - More reliable native wallpaper apply, repair, and extension playback.
New features - Public wallpaper gallery with search, SEO, and app deep links. Improvements - Clearer pricing cards, benefits, and upgrade prompts. Fixes - Fix blank wallpaper player caused by expired ISR signed URLs. Fix gallery Back wiping Show more and jumping to the footer.
Improvements- Overhaul marketing copy, pricing UX, and hero assets for conversion. Fixes - Fix checkout recovery mail for failed and abandoned payments.
Improvements Public changelog page synced with shipping updates. Align the site catalog with the nine app categories. Allow timed unique conversion codes at checkout and in recovery mail.
Fixes - Older free installs are treated the same as an ended trial: wallpapers stay paused until you unlock Pro.
Updated Entire Website UI/UX to 100x better :)
mihi
Update: v4.0.3Sep 18, 2026
raised macwall pricing recently and the response has actually been really good traffic is growing a lot too now around 59k visitors and 128k page views been testing pricing changes and polishing the site while watching how people respond to it
Just Shipped a major update in the ui ux overall application.
Ships:
what did you make? macwall.app - the website for my macos live wallpaper app. download the free app buy pro with stripe and activate with a deep link. also pricing blog submit wallpapers and affiliates. what was challenging? getting checkout right. stripe → license email → macwall://activate had a lot of edge cases. india pricing and the reel refund flow took a few rewrites. keeping price copy in sync with real stripe prices was annoying. what are you proud of? it is live and people can actually use it. one click download one click checkout and the app unlocks. the site feels like a real product not a template. what should people know so they can test? open https://macwall.app hit download for macos (or grab the dmg on the github release). you need macos 26. browse pricing if you want to see permanent annual and reel refund. free try works without paying.
I just updated the entire ui ux of my website to make it 100x better and get better conversions update all the files and components name also to a professional / enterprise level
Redesigned the homepage and site UI New hero, navbar, category strip and License pop-up. Features shown as rows, an Apple-style footer, and new 404 and error pages. New app icon everywhere (favicons, email logo) and a new social share image. New hero app video in 1080p, slowed down. Redesigned pricing page that says “one-time payment”. Install guide with animations, shown after you download. New help center with topic cards, search, and help inside the ⌘K command menu. Moved the whole site from Vercel to Cloudflare Workers macwall.app now runs on Cloudflare; Vercel is kept only as a backup. I connected the domains, moved the scheduled jobs (cron) over, set up caching for the landing pages, and fixed visitor country/IP detection on Cloudflare. Before the move I cut Vercel costs: videos served from R2, longer caching, lighter images, smaller 404 pages. Phone visitors On a phone, “Send to my Mac” emails you the download link instead of downloading a Mac file. “Set on Mac” opens the app directly through a macwall:// link. Wallpaper gallery and search traffic 45 wallpaper collections, more detailed wallpaper pages, and guides written to answer questions directly. Gallery sorted by most liked, with a “Download free” button and a sticky bar at the bottom. Faster loading: static gallery pages, lighter images, and full-size wallpaper files no longer served....
|
1792994075.7772334
|
1793080475.7772334
|
|
58832
|
Hustlenix Music by @Lalith | Stardance
|
Lalith
|
1
|
116.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-22T11:44:50Z", "hours": 116.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hustlenix Music v0.1 is ready to ship 🎧 10 months, a lot of code, and one questionable response to a music teacher later… This started because my school music teacher kept scolding me about my coarse singing voice. Most people would probably practice singing. I decided I was going to write music through code instead. My ego and my coding abilities apparently had other plans. 😭 That’s how I got into Strudel, a live-coding environment for making music. But somewhere along the way, I got a bigger idea. Instead of just writing compositions, why not build an entire music player around them? Something with a library, search, playback controls, and an editor, all wrapped in an interface that feels like an actual music app. That idea became Hustlenix Music . From a music experiment to an actual app The concept sounded simple enough: Strudel for the music, HTML, CSS, and JavaScript for the app. The implementation was another story. I wasn’t just trying to make a page that played audio. I wanted the experience around the music to feel complete, while keeping the ability to experiment with the compositions themselves. I also wanted the interface to feel familiar without making a straight copy of Spotify. I’ve been working on this for around 10 months. Not all that work made it into the devlogs, either. Some development time simply wasn’t recorded, so the logged hours aren’t a complete account of the project’s history. I also used Codex for a substantial part of the implementation, as disclosed in the project’s AI declaration. The goal was to build and finish the product, not pretend every line came directly from my keyboard. What’s in v0.1? The first beta includes: Six original instrumentals that users can listen to. Playback controls for play, pause, resume, and stop. Search to find music. A local library for the available tracks. A composition editor where changes can be previewed live. I’ve kept this release focused on original instrumentals. My experiments studying famous songs aren’t included in the beta. There’s plenty more I could add, but I don’t want the project stuck in development forever because I keep finding one more thing to tweak. Why ship it now? At some point, another feature isn’t as valuable as getting the current version in front of people. This beta is my first proper attempt at bringing the whole idea together: music made with Strudel, a music-player interface, and tools to experiment with compositions in one place. It’s not the final version of what I imagine Hustlenix Music could become. It’s the first version that brings the core idea into a usable product. And honestly, that’s a milestone worth reaching. What’s next? For now, I want to get this version out there, see how the experience holds up, and work out what genuinely needs improving. There will probably be bugs, rough edges, and ideas I’ll want to revisit. That’s part of shipping something instead of leaving it as an unfinished project. What began as a slightly ridiculous reaction to being criticised for my singing has turned into a project I’ve spent months building. I still can’t promise my singing has improved. But at least I built a music player. 💀 Hustlenix Music v0.1: let’s ship it. 🎵 Live demo: [https://hustlenix.github.io/strudelify/] 💻 Source code: [https://github.com/Hustlenix/strudelify]", "repo": "https://github.com/Hustlenix/strudelify", "demo": "https://hustlenix.github.io/strudelify/"}]...
|
[{"post_id": 81756, "ts": "202 [{"post_id": 81756, "ts": "2026-10-22T11:42:04Z", "hours": 0.685, "text": "Hustlenix Music v0.1: Ready to Ship 🎧 I think Hustlenix Music is finally ready for its first release! This project has been in the works for around 10 months, and it’s taken a lot longer than I originally expected. Not all the development time made it into the devlogs, but I’m happy with where it’s ended up. The v0.1 beta includes: 6 original instrumental compositions Play, pause, resume, and stop controls Music search A local library An editor where you can make changes to compositions and preview them live The main idea was to combine Strudel’s live-coded music with the experience of using a proper music player. I wanted something familiar to use, but with the ability to experiment with the music itself. For this beta, I’ve kept the focus on original instrumentals. My famous-song experiments aren’t included. A lot of the implementation was done with Codex, as explained in the project’s AI declaration. I’m shipping this version because I’d rather get the core experience out there than keep endlessly tweaking it without real feedback. This is v0.1, so there’s definitely more to improve. But for now, Hustlenix Music is ready to meet its first listeners."}, {"post_id": 81229, "ts": "2026-10-20T11:34:47Z", "hours": 4.8008, "text": "Devlog 3: Getting Ready to Ship v0.1 I think Hustlenix Music is finally ready to ship! 🎧 The v0.1 beta currently includes: Six original instrumental compositions Play, pause, resume, and stop controls Search for finding music A local music library An editor for previewing changes to compositions The goal for this first release is to get the core experience into people’s hands rather than keep adding features forever. One important detail: the beta focuses on original instrumentals. My studies of famous songs aren’t included in this release. There’s still room to improve the interface and the overall experience, but this feels like a good point to release the first version and see how it holds up outside development. Hustlenix Music started as an attempt to make music through code. Now it’s becoming a music player built around that idea."}, {"post_id": 80203, "ts": "2026-10-16T18:26:36Z", "hours": 0.8875, "text": "Devlog 2: Ten Months in the Making I’ve been working on Hustlenix Music for around 10 months, but not all of that work made it into the devlogs. Some of the time simply wasn’t recorded, so the logged hours don’t represent the entire development journey. I’m now getting close to shipping the first beta, and I’ve been working on the visual design. I want the interface to feel familiar to anyone who’s used a modern music streaming app, without directly copying Spotify’s design. The main challenge is balancing that familiar experience with what makes Hustlenix Music different: its Strudel-based compositions and built-in editor. I’m trying to make it feel like a music player first, rather than a coding tool with a music-player interface attached."}, {"post_id": 80195, "ts": "2026-10-16T17:30:46Z", "hours": 109.6989, "text": "Devlog 1: How It Started This project started because my school music teacher kept scolding me about my coarse singing voice. Naturally, my response was to try writing music through code. Because apparently, that was the reasonable option. 😭 I started experimenting with Strudel, a live-coding environment for making music. But then I had another idea: what if I built an entire music player around it using HTML, CSS, and JavaScript? That became Hustlenix Music. The interesting part isn’t just generating music with code. It’s building the experience around it: a library, search, playback controls, and an editor that lets you experiment with compositions. The goal is to make something that feels like a proper music app while keeping the music itself editable through Strudel. This is a much bigger project than I initially expected, but that’s how it started."}]...
|
Title: Hustlenix Music by @Lalith | Stardance
Dev Title: Hustlenix Music by @Lalith | Stardance
Devlogs:
Devlog 1: How It Started This project started because my school music teacher kept scolding me about my coarse singing voice. Naturally, my response was to try writing music through code. Because apparently, that was the reasonable option. 😭 I started experimenting with Strudel, a live-coding environment for making music. But then I had another idea: what if I built an entire music player around it using HTML, CSS, and JavaScript? That became Hustlenix Music. The interesting part isn’t just generating music with code. It’s building the experience around it: a library, search, playback controls, and an editor that lets you experiment with compositions. The goal is to make something that feels like a proper music app while keeping the music itself editable through Strudel. This is a much bigger project than I initially expected, but that’s how it started.
Devlog 2: Ten Months in the Making I’ve been working on Hustlenix Music for around 10 months, but not all of that work made it into the devlogs. Some of the time simply wasn’t recorded, so the logged hours don’t represent the entire development journey. I’m now getting close to shipping the first beta, and I’ve been working on the visual design. I want the interface to feel familiar to anyone who’s used a modern music streaming app, without directly copying Spotify’s design. The main challenge is balancing that familiar experience with what makes Hustlenix Music different: its Strudel-based compositions and built-in editor. I’m trying to make it feel like a music player first, rather than a coding tool with a music-player interface attached.
Devlog 3: Getting Ready to Ship v0.1 I think Hustlenix Music is finally ready to ship! 🎧 The v0.1 beta currently includes: Six original instrumental compositions Play, pause, resume, and stop controls Search for finding music A local music library An editor for previewing changes to compositions The goal for this first release is to get the core experience into people’s hands rather than keep adding features forever. One important detail: the beta focuses on original instrumentals. My studies of famous songs aren’t included in this release. There’s still room to improve the interface and the overall experience, but this feels like a good point to release the first version and see how it holds up outside development. Hustlenix Music started as an attempt to make music through code. Now it’s becoming a music player built around that idea.
Hustlenix Music v0.1: Ready to Ship 🎧 I think Hustlenix Music is finally ready for its first release! This project has been in the works for around 10 months, and it’s taken a lot longer than I originally expected. Not all the development time made it into the devlogs, but I’m happy with where it’s ended up. The v0.1 beta includes: 6 original instrumental compositions Play, pause, resume, and stop controls Music search A local library An editor where you can make changes to compositions and preview them live The main idea was to combine Strudel’s live-coded music with the experience of using a proper music player. I wanted something familiar to use, but with the ability to experiment with the music itself. For this beta, I’ve kept the focus on original instrumentals. My famous-song experiments aren’t included. A lot of the implementation was done with Codex, as explained in the project’s AI declaration. I’m shipping this version because I’d rather get the core experience out there than keep endlessly tweaking it without real feedback. This is v0.1, so there’s definitely more to improve. But for now, Hustlenix Music is ready to meet its first listeners.
Ships:
Hustlenix Music v0.1 is ready to ship 🎧 10 months, a lot of code, and one questionable response to a music teacher later… This started because my school music teacher kept scolding me about my coarse singing voice. Most people would probably practice singing. I decided I was going to write music through code instead. My ego and my coding abilities apparently had other plans. 😭 That’s how I got into Strudel, a live-coding environment for making music. But somewhere along the way, I got a bigger idea. Instead of just writing compositions, why not build an entire music player around them? Something with a library, search, playback controls, and an editor, all wrapped in an interface that feels like an actual music app. That idea became Hustlenix Music . From a music experiment to an actual app The concept sounded simple enough: Strudel for the music, HTML, CSS, and JavaScript for the app. The implementation was another story. I wasn’t just trying to make a page that played audio. I wanted the experience around the music to feel complete, while keeping the ability to experiment with the compositions themselves. I also wanted the interface to feel familiar without making a straight copy of Spotify. I’ve been working on this for around 10 months. Not all that work made it into the devlogs, either. Some development time simply wasn’t recorded, so the logged hours aren’t a complete account of the project’s history. I also used Codex for a substantial part of the implementation, as disclosed in the project’s AI declaration. The goal was to build and finish the product, not pretend every line came directly from my keyboard. What’s in v0.1? The first beta includes: Six original instrumentals that users can listen to. Playback controls for play, pause, resume, and stop. Search to find music. A local library for the available tracks. A composition editor where changes can be previewed live. I’ve kept this release focused on original instrumentals. My experiments studying famous songs aren’t included in the beta. There’s plenty more I could add, but I don’t want the project stuck in development forever because I keep finding one more thing to tweak. Why ship it now? At some point, another feature isn’t as valuable as getting the current version in front of people. This beta is my first proper attempt at bringing the whole idea together: music made with Strudel, a music-player interface, and tools to experiment with compositions in one place. It’s not the final version of what I imagine Hustlenix Music could become. It’s the first version that brings the core idea into a usable product. And honestly, that’s a milestone worth reaching. What’s next? For now, I want to get this version out there, see how the experience holds up, and work out what genuinely needs improving. There will probably be bugs, rough edges, and ideas I’ll want to revisit. That’s part of shipping something instead of leaving it as an unfinished project. What began as a slightly ridiculous reaction to being criticised for my singing has turned into a project I’ve spent months building. I still can’t promise my singing has improved. But at least I built a music player. 💀 Hustlenix Music v0.1: let’s ship it. 🎵 Live demo: [https://hustlenix.github.io/strudelify/] 💻 Source code: [https://github.com/Hustlenix/strudelify]...
|
1793051386.5976088
|
1793137786.5976088
|
|
50665
|
Hermes Vision by @rayyanfaiq | Stardance
|
rayyanfaiq
|
0
|
115.88
|
0
|
[]
|
[{"post_id": 79412, "ts": "202 [{"post_id": 79412, "ts": "2026-10-13T21:14:22Z", "hours": 11.8667, "text": "#Update 22 #Started Coding — Part 7 Hopefully the final stretch! In my next session, I am going to squash this last annoying gray-screen bug on the video feed (fingers crossed it’s just a loose camera wire or a Windows firewall issue). Once the video is perfectly stable, the real fun begins: integrating MediaPipe! I’ll be adding actual eye tracking so the AI can fuse my iris movements with my head movements. This will give the system an exact, pinpoint location of where I am actually looking, rather than just where my head is pointing. I also need to verify the MAX30102 heart rate sensor against my Apple Watch to see if the readings are actually accurate, or if my heart rate just naturally spikes while troubleshooting hardware lol. Getting so close to the finish line with this AI fusion model! :)"}, {"post_id": 78894, "ts": "2026-10-11T22:28:08Z", "hours": 10.9019, "text": "Update 21 Started Coding — Part 6 Another super long session today, but this was a major breakthrough! I completely overhauled how the system thinks. The ESP32 was doing way too much math and crashing the video stream, so I moved all the heavy lifting to the Python script on my laptop. I also fixed the crazy false alarms on the crash detection (turning my head is definitely not a 10G car crash lol) and stopped the video feed from freezing whenever I moved my head too fast. The code also talks to me to map out exactly where the center road and mirrors are based on my specific seat, and actively warns me if I look away for more than 2 seconds. Next up: Fixing one last gray-screen video bug and finally starting the AI fusion model to combine the head and eye tracking! :)"}, {"post_id": 78117, "ts": "2026-10-09T16:53:32Z", "hours": 13.1947, "text": "Update 20 Started Coding — Part 5 Oops, I think I got carried away, 13 hours is crazy lol. In this session, I was able to fix all the code, and work on all the parts of the project! The project works perfectly now, and I even got video stream onto my laptop :) The ESP can now decide whether the driver is looking at the road and/or the side mirrors or he is distracted. This is a major breakthrough because now I can work on the stream directly. Next up: AI fusion model."}, {"post_id": 77917, "ts": "2026-10-08T19:06:54Z", "hours": 10.4125, "text": "Update 19 Started Coding — Part 4 I think I just need one more session before I am done with this! In today’s session, I fixed all abnormal values, wired it everything together and added a callibration time to the gyroscope (so it knows when the driver is looking at the road and when not). Now, everything works pretty well together, but I still need to work on the AI model which fuses it together :)"}, {"post_id": 77498, "ts": "2026-10-07T07:59:58Z", "hours": 9.3403, "text": "Update 18 Started Coding — Part 3 This is my 4th, almost 10 hour session in a row, and honestly saying, I have no idea where time goes once I start working on this project. I worked more on the code, fixed most of the abnormal values, yet somehow I still sometimes get a heart rate of 12 bpm (i am well and alive) from the sensor :( Apart from that, I was able to start work on the personalised AI model, which fuses all the readings from the sensors to create a personal baseline. I will work more on trying to get as accurate readings as possible, but for now I think I have to work on the AI model (I have attached how I think the AI model will function and display the values)."}, {"post_id": 77237, "ts": "2026-10-06T07:23:30Z", "hours": 9.8667, "text": "Update 18 Started Coding — Part 3 I’m lowk addicted. I got a new heartrate sensor for my project because I JUST found out, all that time where I though something was wrong with my code, it was just that the previous black heart rate sensor was known to have I2C issues :/ Anyway, I got a new one and soldered it (pretty clean ngl, I’ve learned so much this project). I have also assembled the glasses, with zipties, for a first prototype!! I still get abnormal values sometimes though, so that is something I will have to fix :)"}, {"post_id": 77018, "ts": "2026-10-05T11:46:18Z", "hours": 9.3594, "text": "Update 17 Started Coding — Part 2 I completed the code from last session, including the indiviual codes for the ESP32S3, sensors and the ethernet module. I had to rewrite a lot of the code from last session because of how inefficient it was :/ Then, I wired all the components together like my sketch from a while ago, but I was getting I2C issues with the heart rate sensor :( I’ll review the code again, and perhaps replace this heart rate sensor for a new one. I am very excited though because the project is finally coming to life!!!"}, {"post_id": 76835, "ts": "2026-10-04T19:28:35Z", "hours": 7.7314, "text": "Update 16 Started Coding — Part 1 I took a break from stardance to work on my school midterms. However, WE ARE BACK BABY!! Today I started work on coding the ESP32S3 microcontroller. Coding is much more time consuming than making PCBs but I am starting to enjoy writing all these codes. It feels I am connecting puzzle pieces, where with each right one, I am able to a real picture of how the project will turn out. In today’s session, I worked on trying to get the ESP32S3-Cam feed, along with the values from the sensor to my laptop through ethernet. Using ethernet allowed for a more seamless data transfer (internet speeds where I live are pretty trash). Next session, I have to work on making the AI for this thing which will help create a personalised baseline!"}, {"post_id": 72887, "ts": "2026-09-23T22:58:16Z", "hours": 5.4336, "text": "Update 15 KiCAD; Making My First Ever PCB! — Part 2 Today, I was finally able to complete reading the paper on the PCB editor to learn everything (might have over learnt it) about it. I also spent some time on an ESP32S3 pins sketch to make sure I had the wiring correct before I felt ready to make the final PCB! Then on the PCB editor, I spent about an hour to make wire the ESP32S3 to the sensors and the W5500. I have now completed both of the PCBs needed for the project :)"}, {"post_id": 72255, "ts": "2026-09-22T15:18:18Z", "hours": 2.69, "text": "Update 14: KiCAD; Making My First Ever PCB! — Part 1 Knowing nothing about the PCB editor yesterday, to making my first PCB today was quite a fun journey. I started the session by reading a guide to the PCB editor in KiCAD, which helped me learn all the basics I needed to make 1 out of the 3 total PCBs! Even though, I will have to learn a little more about the editor before I can make the PCB for the left temple (ESP32S3, W5500 & MAX 30102) and the front side (MPU6050), I am happy that I was able to complete the PCB for the right temple (Battery, TP4056 & TPS63020) of the glasses :)"}, {"post_id": 72007, "ts": "2026-09-22T00:10:08Z", "hours": 3.2003, "text": "Update 13 KiCAD; Making Footprints but Accurately! — Part 2 Starting from where I left yesterday, I began work on the remaining footprints. TPS63020 proved to kinda difficult to make the footprint for because it followed unconventional pin spacing but I was able to find a workaround using my newly attained knowledge(I had to read a little more :/ lol) I am now done with all the footprints including the battery and the switch. I have placed these footprints in the PCB editor but I unfortunately have no idea how to make the editor work :( I’ll read about it tomorrow and hopefully make the PCB by tomorrow!"}, {"post_id": 71567, "ts": "2026-09-21T02:13:10Z", "hours": 3.7281, "text": "Update 12 KiCAD; Making Footprints but Accurately! — Part 1 I started the session off by reading a paper on how to use the PCB editor in KiCAD. However, mid-way through, I realised that the footprints I custom-made for my parts are not accurate :( So instead of working on the PCB, I spent the rest of the session to remake the footprints 1:1. I was able to make the footprint for the ESP32S3, MPU6050, MAX30102, TP4056 & W5500. This leaved behind a footprint for the battery, the button (no clue how that works) and the TPS63020. Hopefully, in the next session, I’ll be able to complete the footprints for the remaining components, however given that I don’t currently own the TPS63020, I’ll have to research more on its dimensions."}, {"post_id": 71409, "ts": "2026-09-20T19:28:50Z", "hours": 1.4336, "text": "Update 11: KiCAD; Introducing Power! To start the session, I redesigned the ESP32S3’s footprint (I forgot to save the last one). I then moved on to make the footprint for MAX30102 heartrate sensor. Then, I also included the symbol designs for the battery, battery charger and the voltage regulator. The schematic is fully wired now comprising of the sensors, esp, ethernet and the power :) I have placed some of the footprints in the PCB editor on KiCAD but honestly, I have no idea how the PCB editor works. Next session I will read some papers on the PCB editor in KiCAD and start working (finally lol) on the actual PCB!"}, {"post_id": 70677, "ts": "2026-09-19T15:58:30Z", "hours": 2.5575, "text": "Update 10: KiCAD; Fixing all errors & assigning footprints! I started the session off by running an Electric Rule Checker test, which unfortunately gave me 4 errors :( Not sure what to do, I read a paper on wiring in KiCAD, which even though was VERY boring, I was able to pinpoint all 4 errors down to their causes. Thankfully, after debugging for a bit, I was able to get rid of all errors! I also started assigning footprints to all my sensors and components (had to custom make one for ESP32-S3 because they did not have my exact model), so that I can finally move towards making the PCB come to life :)"}, {"post_id": 68945, "ts": "2026-09-16T02:55:59Z", "hours": 2.4594, "text": "Update 9: KiCAD; We Started Wiring! — Part 1 I started this session off by reading some papers on how to wire components in KiCAD. I am getting bored of reading so much lol but reading these papers are really helpful in trying to understand how the wiring works :) Following the reference drawings I made, I was able to connect all the components through wires (or so I thought because the first ERC test showed 19 errors lol). I still have 4 errors left to fix, which I will hopefully do tomorrow before I can move on to the PCB!"}, {"post_id": 68840, "ts": "2026-09-15T20:53:25Z", "hours": 1.7828, "text": "Update 8: Learning KiCAD; but I finally understand it! — Part 2 Starting off where I left last session, I built the scematic designs for all the remaining components (i.e., W5500, ESP32-S3, MPU6050). The ESP32-S3 turned out quite tedious because of the 40 number of pins on it :/ but that wasn’t as bad the W5500 component design vanishing out of no where :( I was able to complete all the components though, which is a plus! I’ll now have to learn how to wire scematics so I can finally wire all the components together and build the PCB :)"}, {"post_id": 68744, "ts": "2026-09-15T17:38:14Z", "hours": 1.1314, "text": "Update 7: Learning KiCAD; but I finally understand it! — Part 1 After yesterday’s uneventful KiCAD session, I looked for more knowledge on KiCAD. That’s where I found a presentation by Oxford University on KiCAD. Reading through the paper was helpful in actually understanding the basics and learning how to design my own components! Hopefully, later today I’ll be able to finish all 4 component designs and place them in one schematic :)"}, {"post_id": 68410, "ts": "2026-09-15T02:15:17Z", "hours": 0.8669, "text": "Update 6: Learning KiCAD — from the basics! I started the session off by reading a paper on KiCAD and PCBs. The paper gave me an overview of how PCBs work and what exactly is KiCAD (I knew nothing about either before this). Then, I tried to make the schematic for the project in KiCAD, but I could not find the exact model of my ESP32-S3 :( Looks like I’ll have to manually make it. Hopefully, by tomorrow I’ll be able to get the models of ESP32-S3, MPU6050, MAX30102 and W5500 in KiCAD!"}, {"post_id": 68337, "ts": "2026-09-14T23:25:23Z", "hours": 1.6547, "text": "Update 5: Hermes Vision; Drawn to Scale! — Part 2 I started a 1:1 scaled drawing of Hermes Vision yesterday. Today I was able to complete the full drawing including the left-outward side, the right-inward side and the right-outward side of the glasses. This complete design will hopefully help out in the making of the CAD for the glasses frame. I was also drew a wiring diagram of the whole project, providing a reference for when I want to make the PCB for these glasses!"}, {"post_id": 67763, "ts": "2026-09-14T00:27:44Z", "hours": 1.5167, "text": "Update 5: Hermes Vision; Drawn to Scale! — Part 1 On my tab, I started a 1:1 scaled drawing of Hermes Vision. The process was fun but tedious because I had to measure the length of each component by hand using a meter rule (I don’t have digital vernier calipars lol). In around 1.5 hours, I was able to complete the front alongwith the left-inward side of the glasses! Hopefully by tomorrow I’ll have the complete drawing so I can move on to properly and accurately designing the CAD for my glasses frame :)"}, {"post_id": 67722, "ts": "2026-09-13T22:38:18Z", "hours": 1.1333, "text": "Update 4: CAD; but I finally can make shapes! In update 1, I started work on bringing the prototype to life, but honestly speaking, I couldn’t even make a shape. Thankfully, this CAD session was a bit better because I was able to make shapes and cut shapes into them! The prototype is far from alive, but I was able to give it a shape. Hopefully I will be able to build on this design in future as I learn more and more about CAD."}, {"post_id": 67684, "ts": "2026-09-13T21:06:21Z", "hours": 1.7497, "text": "Update 3: MPU Soldering — again! I thought the first time I soldering my mpu6050 I did an excellent job, but it was only when I tried turning it on, I realised I had completely fried the SDA and SCL on the chip :/ Hopefully this time I wont get the same I2C issues, letting me proceed to the CAD design and soldering other components."}, {"post_id": 51439, "ts": "2026-08-21T04:44:27Z", "hours": 1.0672, "text": "Upadate 2: First Time Soldering! Who knew melting lead and copper would be this fun haha. I soldered the MPU 6050 Gyroscope with its pins so I could connect it to the breadboard. Now using jumper wires I can easily connect the Gyroscope to the ESP32 for a life feed on the exact coordinates of the chip. I am still trying to debug some I2C wiring issue, which hopefully, will be done by tomorrow."}, {"post_id": 50021, "ts": "2026-08-19T01:35:00Z", "hours": 0.8, "text": "Update 1: Bringing the Prototype to Life! I experimented with CAD (first time lol) to create a 3D model of the glasses. To start things off, I measured the exact dimensions of the front of the glasses I want. Then (after quite a lot of research) I decided to use Onshape to design them. I drew the main lines and construction lines based on the measurements I took, just to get the general shape and size right. It definitely wasn’t perfect at first lol, so I changed a few things around and tried different measurements.I also played around with some basic 3D shapes and features in Onshape just to get a feel for how everything works. Nothing super advanced yet, but it helped me understand the tools and gave me a better idea of how I can build the actual glasses later :))"}]...
|
Title: Hermes Vision by @rayyanfaiq | Stardance
D Title: Hermes Vision by @rayyanfaiq | Stardance
Devlogs:
Update 1: Bringing the Prototype to Life! I experimented with CAD (first time lol) to create a 3D model of the glasses. To start things off, I measured the exact dimensions of the front of the glasses I want. Then (after quite a lot of research) I decided to use Onshape to design them. I drew the main lines and construction lines based on the measurements I took, just to get the general shape and size right. It definitely wasn’t perfect at first lol, so I changed a few things around and tried different measurements.I also played around with some basic 3D shapes and features in Onshape just to get a feel for how everything works. Nothing super advanced yet, but it helped me understand the tools and gave me a better idea of how I can build the actual glasses later :))
Upadate 2: First Time Soldering! Who knew melting lead and copper would be this fun haha. I soldered the MPU 6050 Gyroscope with its pins so I could connect it to the breadboard. Now using jumper wires I can easily connect the Gyroscope to the ESP32 for a life feed on the exact coordinates of the chip. I am still trying to debug some I2C wiring issue, which hopefully, will be done by tomorrow.
Update 3: MPU Soldering — again! I thought the first time I soldering my mpu6050 I did an excellent job, but it was only when I tried turning it on, I realised I had completely fried the SDA and SCL on the chip :/ Hopefully this time I wont get the same I2C issues, letting me proceed to the CAD design and soldering other components.
Update 4: CAD; but I finally can make shapes! In update 1, I started work on bringing the prototype to life, but honestly speaking, I couldn’t even make a shape. Thankfully, this CAD session was a bit better because I was able to make shapes and cut shapes into them! The prototype is far from alive, but I was able to give it a shape. Hopefully I will be able to build on this design in future as I learn more and more about CAD.
Update 5: Hermes Vision; Drawn to Scale! — Part 1 On my tab, I started a 1:1 scaled drawing of Hermes Vision. The process was fun but tedious because I had to measure the length of each component by hand using a meter rule (I don’t have digital vernier calipars lol). In around 1.5 hours, I was able to complete the front alongwith the left-inward side of the glasses! Hopefully by tomorrow I’ll have the complete drawing so I can move on to properly and accurately designing the CAD for my glasses frame :)
Update 5: Hermes Vision; Drawn to Scale! — Part 2 I started a 1:1 scaled drawing of Hermes Vision yesterday. Today I was able to complete the full drawing including the left-outward side, the right-inward side and the right-outward side of the glasses. This complete design will hopefully help out in the making of the CAD for the glasses frame. I was also drew a wiring diagram of the whole project, providing a reference for when I want to make the PCB for these glasses!
Update 6: Learning KiCAD — from the basics! I started the session off by reading a paper on KiCAD and PCBs. The paper gave me an overview of how PCBs work and what exactly is KiCAD (I knew nothing about either before this). Then, I tried to make the schematic for the project in KiCAD, but I could not find the exact model of my ESP32-S3 :( Looks like I’ll have to manually make it. Hopefully, by tomorrow I’ll be able to get the models of ESP32-S3, MPU6050, MAX30102 and W5500 in KiCAD!
Update 7: Learning KiCAD; but I finally understand it! — Part 1 After yesterday’s uneventful KiCAD session, I looked for more knowledge on KiCAD. That’s where I found a presentation by Oxford University on KiCAD. Reading through the paper was helpful in actually understanding the basics and learning how to design my own components! Hopefully, later today I’ll be able to finish all 4 component designs and place them in one schematic :)
Update 8: Learning KiCAD; but I finally understand it! — Part 2 Starting off where I left last session, I built the scematic designs for all the remaining components (i.e., W5500, ESP32-S3, MPU6050). The ESP32-S3 turned out quite tedious because of the 40 number of pins on it :/ but that wasn’t as bad the W5500 component design vanishing out of no where :( I was able to complete all the components though, which is a plus! I’ll now have to learn how to wire scematics so I can finally wire all the components together and build the PCB :)
Update 9: KiCAD; We Started Wiring! — Part 1 I started this session off by reading some papers on how to wire components in KiCAD. I am getting bored of reading so much lol but reading these papers are really helpful in trying to understand how the wiring works :) Following the reference drawings I made, I was able to connect all the components through wires (or so I thought because the first ERC test showed 19 errors lol). I still have 4 errors left to fix, which I will hopefully do tomorrow before I can move on to the PCB!
Update 10: KiCAD; Fixing all errors & assigning footprints! I started the session off by running an Electric Rule Checker test, which unfortunately gave me 4 errors :( Not sure what to do, I read a paper on wiring in KiCAD, which even though was VERY boring, I was able to pinpoint all 4 errors down to their causes. Thankfully, after debugging for a bit, I was able to get rid of all errors! I also started assigning footprints to all my sensors and components (had to custom make one for ESP32-S3 because they did not have my exact model), so that I can finally move towards making the PCB come to life :)
Update 11: KiCAD; Introducing Power! To start the session, I redesigned the ESP32S3’s footprint (I forgot to save the last one). I then moved on to make the footprint for MAX30102 heartrate sensor. Then, I also included the symbol designs for the battery, battery charger and the voltage regulator. The schematic is fully wired now comprising of the sensors, esp, ethernet and the power :) I have placed some of the footprints in the PCB editor on KiCAD but honestly, I have no idea how the PCB editor works. Next session I will read some papers on the PCB editor in KiCAD and start working (finally lol) on the actual PCB!
Update 12 KiCAD; Making Footprints but Accurately! — Part 1 I started the session off by reading a paper on how to use the PCB editor in KiCAD. However, mid-way through, I realised that the footprints I custom-made for my parts are not accurate :( So instead of working on the PCB, I spent the rest of the session to remake the footprints 1:1. I was able to make the footprint for the ESP32S3, MPU6050, MAX30102, TP4056 & W5500. This leaved behind a footprint for the battery, the button (no clue how that works) and the TPS63020. Hopefully, in the next session, I’ll be able to complete the footprints for the remaining components, however given that I don’t currently own the TPS63020, I’ll have to research more on its dimensions.
Update 13 KiCAD; Making Footprints but Accurately! — Part 2 Starting from where I left yesterday, I began work on the remaining footprints. TPS63020 proved to kinda difficult to make the footprint for because it followed unconventional pin spacing but I was able to find a workaround using my newly attained knowledge(I had to read a little more :/ lol) I am now done with all the footprints including the battery and the switch. I have placed these footprints in the PCB editor but I unfortunately have no idea how to make the editor work :( I’ll read about it tomorrow and hopefully make the PCB by tomorrow!
Update 14: KiCAD; Making My First Ever PCB! — Part 1 Knowing nothing about the PCB editor yesterday, to making my first PCB today was quite a fun journey. I started the session by reading a guide to the PCB editor in KiCAD, which helped me learn all the basics I needed to make 1 out of the 3 total PCBs! Even though, I will have to learn a little more about the editor before I can make the PCB for the left temple (ESP32S3, W5500 & MAX 30102) and the front side (MPU6050), I am happy that I was able to complete the PCB for the right temple (Battery, TP4056 & TPS63020) of the glasses :)
Update 15 KiCAD; Making My First Ever PCB! — Part 2 Today, I was finally able to complete reading the paper on the PCB editor to learn everything (might have over learnt it) about it. I also spent some time on an ESP32S3 pins sketch to make sure I had the wiring correct before I felt ready to make the final PCB! Then on the PCB editor, I spent about an hour to make wire the ESP32S3 to the sensors and the W5500. I have now completed both of the PCBs needed for the project :)
Update 16 Started Coding — Part 1 I took a break from stardance to work on my school midterms. However, WE ARE BACK BABY!! Today I started work on coding the ESP32S3 microcontroller. Coding is much more time consuming than making PCBs but I am starting to enjoy writing all these codes. It feels I am connecting puzzle pieces, where with each right one, I am able to a real picture of how the project will turn out. In today’s session, I worked on trying to get the ESP32S3-Cam feed, along with the values from the sensor to my laptop through ethernet. Using ethernet allowed for a more seamless data transfer (internet speeds where I live are pretty trash). Next session, I have to work on making the AI for this thing which will help create a personalised baseline!
Update 17 Started Coding — Part 2 I completed the code from last session, including the indiviual codes for the ESP32S3, sensors and the ethernet module. I had to rewrite a lot of the code from last session because of how inefficient it was :/ Then, I wired all the components together like my sketch from a while ago, but I was getting I2C issues with the heart rate sensor :( I’ll review the code again, and perhaps replace this heart rate sensor for a new one. I am very excited though because the project is finally coming to life!!!
Update 18 Started Coding — Part 3 I’m lowk addicted. I got a new heartrate sensor for my project because I JUST found out, all that time where I though something was wrong with my code, it was just that the previous black heart rate sensor was known to have I2C issues :/ Anyway, I got a new one and soldered it (pretty clean ngl, I’ve learned so much this project). I have also assembled the glasses, with zipties, for a first prototype!! I still get abnormal values sometimes though, so that is something I will have to fix :)
Update 18 Started Coding — Part 3 This is my 4th, almost 10 hour session in a row, and honestly saying, I have no idea where time goes once I start working on this project. I worked more on the code, fixed most of the abnormal values, yet somehow I still sometimes get a heart rate of 12 bpm (i am well and alive) from the sensor :( Apart from that, I was able to start work on the personalised AI model, which fuses all the readings from the sensors to create a personal baseline. I will work more on trying to get as accurate readings as possible, but for now I think I have to work on the AI model (I have attached how I think the AI model will function and display the values).
Update 19 Started Coding — Part 4 I think I just need one more session before I am done with this! In today’s session, I fixed all abnormal values, wired it everything together and added a callibration time to the gyroscope (so it knows when the driver is looking at the road and when not). Now, everything works pretty well together, but I still need to work on the AI model which fuses it together :)
Update 20 Started Coding — Part 5 Oops, I think I got carried away, 13 hours is crazy lol. In this session, I was able to fix all the code, and work on all the parts of the project! The project works perfectly now, and I even got video stream onto my laptop :) The ESP can now decide whether the driver is looking at the road and/or the side mirrors or he is distracted. This is a major breakthrough because now I can work on the stream directly. Next up: AI fusion model.
Update 21 Started Coding — Part 6 Another super long session today, but this was a major breakthrough! I completely overhauled how the system thinks. The ESP32 was doing way too much math and crashing the video stream, so I moved all the heavy lifting to the Python script on my laptop. I also fixed the crazy false alarms on the crash detection (turning my head is definitely not a 10G car crash lol) and stopped the video feed from freezing whenever I moved my head too fast. The code also talks to me to map out exactly where the center road and mirrors are based on my specific seat, and actively warns me if I look away for more than 2 seconds. Next up: Fixing one last gray-screen video bug and finally starting the AI fusion model to combine the head and eye tracking! :)
#Update 22 #Started Coding — Part 7 Hopefully the final stretch! In my next session, I am going to squash this last annoying gray-screen bug on the video feed (fingers crossed it’s just a loose camera wire or a Windows firewall issue). Once the video is perfectly stable, the real fun begins: integrating MediaPipe! I’ll be adding actual eye tracking so the AI can fuse my iris movements with my head movements. This will give the system an exact, pinpoint location of where I am actually looking, rather than just where my head is pointing. I also need to verify the MAX30102 heart rate sensor against my Apple Watch to see if the readings are actually accurate, or if my heart rate just naturally spikes while troubleshooting hardware lol. Getting so close to the finish line with this AI fusion model! :)...
|
1792640866.0266342
|
1793245666.0266342
|
|
28844
|
Signbot by @mitul | Stardance
|
mitul
|
1
|
115.8
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T18:41:43Z", "hours": 18.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Can you hear that? Listen closely… Are you listening to music right now? Maybe, your just in your room, ambient noises and all. If your watching Youtube, surely that’s in the background. Now for a moment, seal your ear, with your palm. Imagine exactly that for hours on end. Motivation It’s hard to imagine the effect on a person’s life, hearing disabilities can cause. Deaf people are ostracized in their means of communication; almost 1 in 3 face an elementary reading level. A thought, that I came across recently was how the usage of chatbots impacted the lives of people hard of hearing. I use chatbots all the time. I search stuff up, sometimes just talk, and of course receive “coding assistance”. But nevertheless, it’s relied on my literacy, something I may have taken for granted. Thus the goal, of this project was to develop a means of LLM communication, that is intended for a deaf audience. Part I: Understanding Sign Language There are 2 parts, or halves to this project. The first is the chatbot understanding what the user is intending to communicate, aka can it understand sign language. You see, despite this being such an incredible application of computer vision technology, much of this research is still, well research. Sign language is quite expressive, almost an art, and to define it under strict object classes is somewhat of a a challenge. After a considerable search, I found that the best approach to this, was sign letters individually, spacing them out using my designated space que (both hands at once). Of course this was slower, however it allows for more possibilities, which is valuable in conversations. I found a repository containing a sign letter recognizing pipeline, which I modified to interface directly with a local LLM (gemma3:4b) through ollama. Then the LLM’s output, would be sent outward through a serial line. Part II: Interpreting Sign Language Now for the second portion: the hand. Thanks to a friend, I was able to access a spare robot hand, which lack a thumb and a wrist, but at least it had 4 fingers. And they were quite capable. I wired up the 4 motors for each finger to an Arduino, though later I would rely on a PWM driver, that talked to the Arduino. To train the hand to implement certain sign, I made a DIY teleoperation setup. I found some flex resistors, which are basically variable resistors that change depending on their state of flexion. When mounted to my hand (through 3d printed rings), the state of my finger, would correspond to a voltage value, dictated by a voltage divider. Thus, I had an input. Using teleoperation, I recorded 24 finger orientations for the 24 letters of the ASL alphabet that didn’t require dynamic wrist movement. This library was used as the basis for communication, from the LLM to the user. When the LLM expresses an idea, the phrase is broken down into letters then expressed through the hand. Of course, an obvious issue was spaces in between words, which I addressed by adding a custom animation (wave) representing the space. Conclusion With those two elements interfacing, the goal of this project was met. While, I feel I could’ve expanded this system to be more robust, either by adding degrees of freedom, or training a custom computer vision model, each of these subsections contain enough rabbit holes, to turn into projects of their own. As such, I decided it would be simpler to open a new project, hence the reason I’m shipping this one. Final Thoughts If you managed to read this all the way through, thank you for sticking around!", "repo": "https://github.com/MiddleSender45/ASL_hand", "demo": ""}]...
|
[{"post_id": 60218, "ts": "202 [{"post_id": 60218, "ts": "2026-09-02T13:28:33Z", "hours": 7.7553, "text": "Controls suck. This entire 8 hour work session was about wiring the hand and making it work, which sounds pretty simple except its not. It’s not. After reprinting the palm and fixing some tolerance issues, I now have space to fit wires through the hand, but the issue wasn’t even wiring stuff onto a breadboard, it was the code to make it work. Every finger has 3 distinct degrees of freedom, and I need to manually calibrate/tune each degree of freedome by testing its range of motion in software and then mapping controls onto it. And that was the easy part. The super annoying thing, is getting closed loop control to work. Because Im using relatively low torque and high speed motors, when trying to designate the fingers onto a certain position, they keep overshooting, which of course is the fundemental problem PD control solves. But tuning PD controls, and solving every wiring issue along the way, is proving to be mad annoying. I keep switching encoder pins, motor polarity, etc. which adds confusion because I can’t tell if the issue is software or hardware. Anyways, after all this I’ve only finished 2 fingers ;(. But Im hoping the next few are going to be much faster, so that’s all for now…"}, {"post_id": 59221, "ts": "2026-08-31T21:51:57Z", "hours": 3.0861, "text": "Bruh fix lapse please. I just lost 6 hours of work because the lapse didn’t save to anything. I’ve already lost like 15 hours, so this is pretty annoying. Anyways, this work session was spent assembling the hand. I know I keep saying this but for real though, I actually managed to assemble the entire hand and wire up the encoders. I still have wiring the motors left to do, and of course software as well, but this is huge! I did notice, however that the fingers had a good amount of shakiness to them, so I am reprinting the knuckle bevels with tighter tolerances such that it is more robust. Also assembling the hand, and then moving it into various orientations is insane to see. Before assembly my vision for what I thought the hand would look like came from a static onshape document, I didn’t realize just how flexible 15 degree of freedom could be. Splay between the fingers is especially lifelike, and despite the hand being large, it still looks good. The wiring situation is purgatory on Earth, but that’s ok. I should’ve made the wire passages much larger, but the filament roll, I’ve been using for the hand is running low, so revising the palm is unlikely. Overall, I am stoked with how its going… …So, that’s all for now folks."}, {"post_id": 54585, "ts": "2026-08-25T16:41:23Z", "hours": 10.0167, "text": "I have more fingers now. Last session we left off, with another redesign of the finger after multiple prototype iterations. Well, this session was more of that, but I’ve finally arrived at a finger that is decent enough to work with. I added bearing, made it more friendly to wiring, and tuned tolerances, enough to not have to use glue! Given this, I’ve printed out 4 fingers only to realize that the base of each finger needs a wire peek through hole, so I’ll be redesigning and printing those I guess ;( Besides that, this session I worked on physically assembling the fingers, which is more tedious than it sounds. I had to solder some breadboard cables and shrik wrap stuff, to use my motors with the standard pins. I also needed to solder wires to the encoder. So, after this I should technically have access to enough pins to program the finger, which is what the alst 3 hours of this session were dedicated to. Normally, when I write code it tends to be “assisted”, but in this case I was really curious to learn the code. So I also choose the path of greater resistance by choosing to code the ESP32 in C++ through ESP-IDF rather than Thonny or Arudino IDE, like usual. It’s okay, I’ve learned a lot, and I’m only halfway through the script. Anyways, that’s all for now folks…"}, {"post_id": 51321, "ts": "2026-08-20T22:06:13Z", "hours": 7.1336, "text": "Ayo call me Teo… …the way my hand got ice on its wrist. Ok, ok ok, new intro style, but today’s session was about the wrist and a couple other things. First off, I realized that to express every character in the sign language alphabet you only need two degrees of freedom, so i worked on a differential wrist design to save space. Basically the wrist is just two stepper motors, with cycloidal gear ratio, that drives a belt to actuate the different axes. Buttt, this was only the first half of this work session session. Off camera I printed the finger to test, and I realized a couple of problems and good things. First, the finger works how i intend it to, mostly. The major limiting factor is friction. On my design friction is both needed and should be avoided, so finding a balance is tricky. On one hand friction between gears, allows the finger to hold position when oriented a certain way, which is good because it means the motor doesn’t experience any holding torque. On the other hand, too much friction stalls the motor out, which could lead to it dying. Basically, im using cheap ahh motors that are NOT designed for anything torque related, so I’m copping out and finding ways to make it work. I plan to add bearing and limit range of motion through stoppers next session, so that’s all for now folks…"}, {"post_id": 47043, "ts": "2026-08-14T17:18:58Z", "hours": 7.1333, "text": "The end is near…. Of the hand design I mean. This session was basically fixing everything, I had concerns about from the printed prototypes of the hand’s knuckles. I made added better tolerances, and designed a neat palm to fit around th finger modules. The finished hand is around 30cm fingertip to wrist, so definitely on the “larger side”. But, that’s all right, because the design seems pretty robust. Also, I noticed that the hand resembled Edward’s from Full Metal Alchemist, so I wanted to add a reference to that somewhere, however it came off kind of weird, and I’m not trying to catch any larp allegations. Towards the end of this session i tried printing the hand parts to put together, but somehow for the fisrt time ever, my fricking printer’s nozzle clogged, so now I wait another 2 days while a replacement arrives >:(. Until that time, I’m going to refine this design further, so I never have to touch the design aspect again (until the wrist of course). As for the wrist, I am lowkey scared that, this hand may require too much torque to make a reliable wrist for, given its size, but I’ll probably just suck it up, and stepper motors should work. Anyways, that’s all for now folks…"}, {"post_id": 45465, "ts": "2026-08-11T23:12:03Z", "hours": 4.6667, "text": "Ballright. Today, I made a discovery. I learned that thumbs have one more degree of freedom than other fingers, yet they also have one less phalange. You see, being at the end of a hand, they have the degree that allows them to move diagonally, which pinkies also have an equivalent motio for. Any way, I only bring this up, because today, I decided to work on the palm, and more specfically the location of the thumb. I found inspiration in this youtube video, and looking into the anatomy of our hand, its genuinely incredible how capable a thumb is. Also, during this time i made a correction to make the finger modules symetrical which saves space, and importantly gives me somthing to reuse for the thumb. Next sesssion, I’ll print out some of the designs I’ve tested and also design a palm. That’s all for now folks…"}, {"post_id": 44379, "ts": "2026-08-10T02:56:15Z", "hours": 4.8167, "text": "Im really pissed. I thought finally, after arriving at this design I could be content, and that everything would work as soon as i finished the distal phalanx coupling mechanism. But, no, there are more problems. Despite taking several hour brainstorming off camera, and then designing for another couple hours, a 4 bar linkage to couple the finger joints cuts off the range of motion, which i dont want to compromise. This is because I reused the bevel joint from the knuckle, which saves vertical space, but not horizontal. Basicallly because of the way the knuckle works this hand has a breadth of around 150mm, which equates to approximately fingers of that length. My current design is not suitable for this, and so I plan to redesign everything from the knuckle up, to be more narrow and allow for coupling without sacrificing range. So until then, that’s all for now folks…"}, {"post_id": 44097, "ts": "2026-08-09T17:05:33Z", "hours": 8.25, "text": "HUGE BREAK!! After so long deliberating the design choices to go with, this session I sat down and actually made progress on the design. As of last time I had developed a bevel mechanism to actuate joints, and that would be read by an encoder. This session I polished all those things, and developed the roll mechanism for the finger, which consists of 3 gears(24 -> 24 -> 12 teeth). Moreover, it just so happens that the dimensions of a servo fit approximately within the dimensions of the bevel mechanism, so I was able to fit the servo stuff directly underneath. This provides a great form factor, and avoids the problem most servo actuated hands have with width(its only 40mm thick!). Also, I developed an encosure for the finger that is to be screwed onto a palm, thus ever finger is independently assembled, and the final design can be modular. Also, something that bothered me very much is wiring, motors and encoders between joints. Thankfully, within this design motors that drive joints are underneath the joints, which means they are closer to the wrist, and because I considered wiring, I was able to add channels and passages to hopefully get everything fitted without wires sticking out. In fact, the whole hand’s wires, should ideally come out through the wrist, allowing for compact control. Overall, I am super excited with how this project is turning out, so stay tuned to see this get crazier ;)"}, {"post_id": 43449, "ts": "2026-08-08T18:19:23Z", "hours": 8.9167, "text": "Another redesign session. The indecision continues, as this session I spent working on 2 entire concepts from scratch. The first idea, was to acutate the proximal joint of the finger from a servo, however, while this worked, I didn’t like how bulky it was. I had the short face of the servo move side to side to allow for roll in the finger joint, but that meant the long side was store in the palm. At this time I also came across some mini dc motors, and while they lacked position readings I also had just enough encoders, to make it all work. So the second half of this session, I designed the finger module using n20 motors, and even animated its motion on onshape. I plan to simulate it on isaacsim possibly later, but for now this allowed me to determine collisions, without any math ;). Anyways, that’s all for now folks."}, {"post_id": 42036, "ts": "2026-08-06T16:21:22Z", "hours": 6.6167, "text": "Fusion is hard on linux. This session, i’ve spent being indecisive about a lot of things. For one, I have been deliberating how I’d proceed with the hand design, specifically whether I would design a palm around the finger modules I have available, or redesign a hand from scratch. In terms of designing a hand from scratch there are a lot design considerations, I didn’t quite account for. From the start I really wanted the hand to be direct drive, because I figured it would give me better position readings, and also because I wanted to differentiate my design from the hundreds of open source tendon hands that exist. Plus there is a higher strength cap, which doesn’t matter for my application but still. Anyways, during all this, I randomly decided, I was sick of windows, and switched to Ubuntu, which has been awesome, except for the for the fact, that all my work has been on fusion, which is unsupported on linux. There is a workaround using WINE, which is what I’ve been using, but it’s been so laggy, I’ve been genuinely questioning switch to onshape. Anyways, I’ve arrived at a decent finger design, which I think I will implement from scratch on onshape, so that’s what’s happening next session. That’s all for now folks (obligatory larp terminal)."}, {"post_id": 37070, "ts": "2026-07-29T15:31:04Z", "hours": 5.8, "text": "Folks. I hate designing hands. Not really, but its kind of frustrating. Last session, I talked about how I am trying to design my very own hand, that is fully direct drive and 20 DOF(degree of freedom), so that there is a much greater range of the sign language vocabulary available. However, very quickly I realized that direct drive motors, involve embedding motors within the finger linkages, which leads to the motor size dictating the finger size. Unfortunately the motor, I am going with(N20), is about as compact and powerful as I could find for this application. Not to mention they’re cheap, and include encoders for positional readings. The motors themselves, account for a very big finger, but also the finger joints being bevel joints make it significantly larger as well. Thus, this session, I tried compacting the bevel joint, by using shorter gears, and removing free space. Halfway into this design revision I realized that clearing the free space in the bevel joint, would shorten its range of motion from 90 degrees to somewhere around 65. The first objective of this hand is to be highly dexterous, so I had to abandon the idea of shrinking the joint. I also got rid of bearing, because of the added complexity and material costs, they brought. Next session, I intend to work on the roll axis of the finger, and then hopefully develop a palm, that can combine 4 fingers. But that’s all for now folks… PS: the screenshot is of fusion crashing, because it keeps doing that ;("}, {"post_id": 33189, "ts": "2026-07-22T21:27:13Z", "hours": 4.7006, "text": "I blew a capacitor. For the first time in my life. Since last update, I’ve been trying to set up the demo with perf board, and realized the I2C lines were inaccessible. So giving up on that, I decided to breadboard it out. This would have been fine, if not for the fact that i took apart the entire breadboard for travel, which when I tried to reassembled, I must have messed something up, because next thing I knew there was a short in my circuit and the pwm driver had blown. From this point, I made a decision to build my own hand, from scratch, that is robust, easy to assemble, modular, and best of all… my very own. Thus, this session was spent researching, how to approach building a robot hand. From prior context, I decided to not build a tendon driven hand, given their abundance in the robotics community, yet lack of implementation in real scenarios, mostly due to wear issues. Looking at the best hands in the world, I noticed most if not all of them were direct drive, and I am particularly a huge fan of the wuji hand. So, I’ve begun the design of a finger, using mini dc actuators, embedded withing the finger, allowing for a thing hand, that is precise and strong. Of course the major drawback, I am not adressing is that the use of embedded motors makes the hand enormous. Like 6inch pinky enormous. In fact, I searched it up, and turns out the hand might be larger than Wemby’s. But that’s all right with me, as long as it works. Anyways, I’ve attached a photo of the wuji hand, which I took inspiration from. But thats all for now folks…."}, {"post_id": 27526, "ts": "2026-07-13T05:05:04Z", "hours": 8.5261, "text": "HUGE PROGRESS This session was spent, designing and assembling the electronics enclosure for the hand, and getting the full working demo. to be compact. When the hand turns I noticed that servo cables would turn with the hand, which made accessing certain wrist positions risky, due to the nature of the wrist design. Thus I needed some way of reduceing the number of wires connecting to the hand, such that it can be more mobile. To do this, I decided to mount the pwm driver and power source directly onto the back, which I designed a bracket for. Because the hand is shaped so oddly, it took me several iterations to find a mount that would screw readily, and the pcbs, the way I inteded. And while, I would send these designs to print, I worked on the electronics. I put tested the complete human to model to hand pathway, and I realized the whining sound and stunt earlier was likely a result of my battery supply. Thus, I switched out the battery for a wall dc-dc power supply, and was able to sustain the hand without a crash. At it’s peak the servos only drew about 1.2A at 12V, so perhaps the issue wasn’t the battery’s current capability, but instead how quickly it could provide it. While I printed these iterations, I noticed how the elctronics on the breadboard were functional but fragile, so I decided to take on the UNNECESSARY decision to turn my electronics into a perfboard. Worst mistake ever. Who knew a perfboard could be so troublesome. Almost every 5 minutes, I’d either bridged a connection, soldered ground to voltage, layed out components in the wrong order, or just burnt myself. Even worse, I was laying on the dirty floor, and my shaky hands and burning elbows have left me more sore, than I’ve ever felt. After some 4 hours recorded, and 3 hours off camera, I got perfboard wired up. Because, I’m almost at 10 hours, however, I’ll share whether it worked in the next log."}, {"post_id": 24299, "ts": "2026-07-07T19:37:08Z", "hours": 3.7442, "text": "Good news and bad news. Bad news is that this session was supposed to be a recovery log for the 4 hour lapse lookout accidentally deleted, except somehow the recording failed again. Good news is that instead of waiting on that fix, I’ve kept working, and we’ve made some huge progress. The wrist design you saw last session was pretty neat, except when I finally got access to the hand to screw it on, I realized my screw tolerances were not enough. And worse that caused the screw to drag across the bearing of the wrist leaving that screeching sound, when a chalkboard is scratched. So I fixed the finicky piece and reprinted it. In the meanwhile, I put together the electronics for the hand, and added the code I’d developed last night. After renumbering the pins, and messing around with stepper speed, I’ve finally gotten to a decent teleoperation phase with the wrist. It’s quite slow, but it works. The only thing that concerns me, is that when I ask the stepper to move to a position to quickly, I hear a peep, then the fingers don’t move. Most likely somewhere downstream, overcurrent is preventing the stepper from drawing too much torque. This makes sense given how shoddy the wiring is… Anyways, I’m about to rerecord the alphabet with my new wrist, and hopefully get the full demo working with wrist by next session. I will then hopefully, record a successful recovery session for my precious 4 hours of work ;( That’s all for now folks…"}, {"post_id": 24114, "ts": "2026-07-07T14:06:55Z", "hours": 3.4011, "text": "This session is technically one in the future, because the sesison before this, I plan to log after this post. It’s kind of tricky, but basically lookout’s recording failed because I closed the tab, so now I’m rerecording the old session, while I work on the new one. Mostly, I spent this time working on 2 things. One I noticed that my wrist, would rotte the entire platform, when rotating the hand, due to the rotational inertia, so I designed a brace to fix it in place. The other thing I did, was develop code for the wrist, so that I could add wrist encoder data to my sign language library, which I actually plan to record in a little bit. Obviously this implies that last session, I designed the wrist fully, and printed it out, but you’ll find about that, next devlog… That’s all for now folks."}, {"post_id": 23050, "ts": "2026-07-05T19:40:22Z", "hours": 3.2333, "text": "Alright folks… I know I already shipped this project, but I kind got an unexpected lead. So the reason, I wanted to leave off this project is because additional improvements, such as thumb dexterity or wrist movements would add rabbit holes that deserved projects of their own. But, the person who lent me the hand, also found the missing thumb; it does lack a shell, however. With that, I figured, I’m pretty close anyway, why not add the wrist? So this work session was spent, predominately, designing a wrist mechanism where a stepper motor could rotate the hand into various orientations. The one thing, that concerned me from the start, was that stepper motors lack positional awareness. At least the kind I’m using does anyway. This means I would need to design a location for an external encoder to fit, that would stay fixed relative to the palm. This design has been very tedious. The hand is already so compact, that the encoder would not fit, so I am thinking, I can attempt the stepper motor based wrist without encoder values first, and if i detect too much drift, then worry about that addition later. I’ve finished designing the wrist, and am about to send it to print and test fit. Next session, I will find out how that goes. See yall soon…"}, {"post_id": 21590, "ts": "2026-07-03T16:54:36Z", "hours": 3.4836, "text": "Folks, this will be the final devlog. For this project anyway… This session wasn’t too much involving actual additions to the project. Following last session, I was brainstorming ideas to expand this project, perhaps to make this a more robust system. In this search I encountered IsaacSim, a simulation software that enables the simulation of robots, which could allow for expanded training to grow the model. But, in all honesty, I wasn’t too interested. Sure, I could add a wrist or thumb, and add more gestures, perhaps train a custom computer vision model, but the point of this entire project was to develop a rapid proof of concept. Given that I’ve achieved that, I’d like to invent my energy into developing a robot hand of my own. That is what I plan to do next, however, that will have to be documented as a separate project, as it doesn’t exactly correspond with the purpose of this one. The rest of this session, I spent documenting my work, so check out the repo if you’re interested! Anyways, that’s all for now."}, {"post_id": 21011, "ts": "2026-07-02T19:18:43Z", "hours": 3.9575, "text": "This session completes my base project. Last time I logged, I’d gotten a chatbot to speak sign language through the robot hand using serial. This means basically half of the interface was done. The other half was for the chatbot to interpret my sign language so it could adequately respond. In one of my earlier logs, I mentioned finding a repo that supported fingerspelling, so you could spell out any word. This session I forked that repo, and edited the script such that, signs it interprets were spoken to a chatbot, and that chatbot would communicate outward through serial. However finger spelling is easier said than done. The first difficulty was that letters were often misinterpreted, which was frustrating, but also a limitation beyond my control. The second difficulty was repeating consecutive letters. If I held my hand too long, the model assumed I intended for the letter to be repeated, which lead me to incorporate a cooldown. Finally to adress spacing between words, I set a condition where both hands must be present for over 2.5s, to include a space character. With this the bridge was effectively complete. What I have left really is optimizing this process, by perhaps improving the hardware design of the hand to grant more freedom, or maybe training a more robust sign language interpreting model. But all of these options sound boring to me. Instead I want to learn something new, so the second half of this work session, I spent deliberating ideas, and I came across IsaacSim, a simulation software for robots developed by NVIDIA. I plan to learn more about this topic, to allow for the simulation of this hand, such that I can attempt a more sophisticated approach to a sign language robot, than just static recorded symbols. Anyways, that’s all for this session folks…"}, {"post_id": 20311, "ts": "2026-07-01T21:34:53Z", "hours": 5.7131, "text": "HUGE UPDATE. I think last work session we left off when I had teleoperation working with the hand. Aka I wore some flex resistors, and the robot mimicked my finger movements. The next task, I mentioned, would be to add buttons to allow for recording and replaying symbols. This would allow me to build an alphabet library for the hand. Today, I did that. I added the button to record and replay movements, and stored the values of the motor positions in a google sheet. And honestly, this actually worked pretty well. The hand’s method of communication relies on spelling out words, rather than actually signing the words, mostly because there are more words, than there are letters. Also most letters are easy to sign, because they are static. The issue is that when spellling out with letters, spaces needed their own symbol to indicate breaks in the sequence; so I came up with a wave pattern that is unlike any letter, thus can be interpreted as a break. Also throughout this time, I rewired my servo setup to rely on a servo driver breakout board(PCA9685), rather than manually connecting the PWM lines, and in the process I must have switched a couple channels, and my sign language library was dysfunctional. So, I rerecorded the letters, and finally, I could comfortably type phrases and receive outputs from the hand that were somewhat discernable, with the slight difference that my hand is missing a thumb of course. Anyway, after this I set up an ollama agent and wrote a script to have the ollama agent output serial messages, which the hand received and interpreted. This was crazy to see in person! I would be talking to ollama, and it would respond through sign language. This project is moving forward significantly faster than I’d expected, so I think I’ll make it better. I still have the sign language to text part to handle, but afterward, I’m thinking of adding a wrist and a thumb to the hand, to improve the clarity of signed letters. That’s all for now, folks, see you in a bit…"}, {"post_id": 19572, "ts": "2026-06-30T22:10:51Z", "hours": 0.8081, "text": "Mini work session. After getting the hand to work with teleoperation, I realized I would need to several things to get this project to work. Firstly, I need to record letters to use, which I plan on doing by incorporating a button system. I’ve set up 2 buttons that default to a high state. When pressed, the low state indicates that the button is pressed. One button is the recording option, to capture the servo positions, I’m maintaining currently, and store that to the next letter in line. I plan to store these values in a vector, which can be accessed later by the LLM to choose letters to spell out words. This session, however, I spent finding a camera based sign language model, and analyzing the source code. I am kind of putting off the vector thing, but that’s all right for now. I found this repo online, that works well for my purpose, and I plan to use it, or at least repurpose it. That’s all for now."}, {"post_id": 19538, "ts": "2026-06-30T21:11:29Z", "hours": 2.3497, "text": "Alright folks, second work session in, and we’ve made huge progress. Last time I left off with a working hand moving demo, where I had the servos go off in sequence to match a pattern. Right after posting that log, I discovered flex resistors, which are basically variable resistors that change value based on the state of their flexion. These things are similar to ribbon cables, and luckily they came with little rings I could mount to my fingers, essentially giving me an analog method of sampling the flexion state of my finger. I had these resistors form a voltage divider alongside a 10k ohm resistor, and thusly I was able to read the variable voltage formed at the divide. I routed the voltage values to the analog input pins of the arduino, and guess what? …. 0.0, 0.0, 0.0….. And literally, I was losing my mind trying to figure out why, because when I check the multimeter, the value seems right. After a bunch of back and forth, I noticed that the read function for the voltage was in setup, and not the loop. So basically, the code was reading the voltage at initialization, and then that value remained static. Stupid mistake, but one I fixed it, it worked. From there I mapped the resistor values to pwm output, and thus the hand exoskeleton was born. My task for the next work session is to add a recording feature on the exoskeleton, to hopefully capture hand poses, to then save as signs for the ASL library to access."}, {"post_id": 19380, "ts": "2026-06-30T17:54:18Z", "hours": 2.0333, "text": "This session is the start of a new project: building a sign language interpreter using a robot hand. Thanks to a local startup, I got access to a robot hand, which I’ve been getting familiar with. My goal is to allow an LLM to communicate through sign language, while simultaneously interpreting motions made by other users. This would be handy in tasks that involve conversation with computers, which have traditionally from deaf people, as they may involve a high degree of technical and traditional literacy. This work session specifically, I spent setting up the servos to be compatible with an arduino microcontroller. I’ve produced a script capable of moving the fingers in a sequence. After that, I tried building a c++ library to store the sequences that I would deem a symbol, aka a sign language library. But halfway through, I got off task, and found a sign language interpreting computer vision model, that I wanted to test out. I’m currently trying to install the dependencies, which has proven tedious, as the repo uses an older version of python. That’s all for this session; this next session, I’m trying to set up flex resistors and get mimicry working…"}]...
|
Title: Signbot by @mitul | Stardance
Devlogs:
Thi Title: Signbot by @mitul | Stardance
Devlogs:
This session is the start of a new project: building a sign language interpreter using a robot hand. Thanks to a local startup, I got access to a robot hand, which I’ve been getting familiar with. My goal is to allow an LLM to communicate through sign language, while simultaneously interpreting motions made by other users. This would be handy in tasks that involve conversation with computers, which have traditionally from deaf people, as they may involve a high degree of technical and traditional literacy. This work session specifically, I spent setting up the servos to be compatible with an arduino microcontroller. I’ve produced a script capable of moving the fingers in a sequence. After that, I tried building a c++ library to store the sequences that I would deem a symbol, aka a sign language library. But halfway through, I got off task, and found a sign language interpreting computer vision model, that I wanted to test out. I’m currently trying to install the dependencies, which has proven tedious, as the repo uses an older version of python. That’s all for this session; this next session, I’m trying to set up flex resistors and get mimicry working…
Alright folks, second work session in, and we’ve made huge progress. Last time I left off with a working hand moving demo, where I had the servos go off in sequence to match a pattern. Right after posting that log, I discovered flex resistors, which are basically variable resistors that change value based on the state of their flexion. These things are similar to ribbon cables, and luckily they came with little rings I could mount to my fingers, essentially giving me an analog method of sampling the flexion state of my finger. I had these resistors form a voltage divider alongside a 10k ohm resistor, and thusly I was able to read the variable voltage formed at the divide. I routed the voltage values to the analog input pins of the arduino, and guess what? …. 0.0, 0.0, 0.0….. And literally, I was losing my mind trying to figure out why, because when I check the multimeter, the value seems right. After a bunch of back and forth, I noticed that the read function for the voltage was in setup, and not the loop. So basically, the code was reading the voltage at initialization, and then that value remained static. Stupid mistake, but one I fixed it, it worked. From there I mapped the resistor values to pwm output, and thus the hand exoskeleton was born. My task for the next work session is to add a recording feature on the exoskeleton, to hopefully capture hand poses, to then save as signs for the ASL library to access.
Mini work session. After getting the hand to work with teleoperation, I realized I would need to several things to get this project to work. Firstly, I need to record letters to use, which I plan on doing by incorporating a button system. I’ve set up 2 buttons that default to a high state. When pressed, the low state indicates that the button is pressed. One button is the recording option, to capture the servo positions, I’m maintaining currently, and store that to the next letter in line. I plan to store these values in a vector, which can be accessed later by the LLM to choose letters to spell out words. This session, however, I spent finding a camera based sign language model, and analyzing the source code. I am kind of putting off the vector thing, but that’s all right for now. I found this repo online, that works well for my purpose, and I plan to use it, or at least repurpose it. That’s all for now.
HUGE UPDATE. I think last work session we left off when I had teleoperation working with the hand. Aka I wore some flex resistors, and the robot mimicked my finger movements. The next task, I mentioned, would be to add buttons to allow for recording and replaying symbols. This would allow me to build an alphabet library for the hand. Today, I did that. I added the button to record and replay movements, and stored the values of the motor positions in a google sheet. And honestly, this actually worked pretty well. The hand’s method of communication relies on spelling out words, rather than actually signing the words, mostly because there are more words, than there are letters. Also most letters are easy to sign, because they are static. The issue is that when spellling out with letters, spaces needed their own symbol to indicate breaks in the sequence; so I came up with a wave pattern that is unlike any letter, thus can be interpreted as a break. Also throughout this time, I rewired my servo setup to rely on a servo driver breakout board(PCA9685), rather than manually connecting the PWM lines, and in the process I must have switched a couple channels, and my sign language library was dysfunctional. So, I rerecorded the letters, and finally, I could comfortably type phrases and receive outputs from the hand that were somewhat discernable, with the slight difference that my hand is missing a thumb of course. Anyway, after this I set up an ollama agent and wrote a script to have the ollama agent output serial messages, which the hand received and interpreted. This was crazy to see in person! I would be talking to ollama, and it would respond through sign language. This project is moving forward significantly faster than I’d expected, so I think I’ll make it better. I still have the sign language to text part to handle, but afterward, I’m thinking of adding a wrist and a thumb to the hand, to improve the clarity of signed letters. That’s all for now, folks, see you in a bit…
This session completes my base project. Last time I logged, I’d gotten a chatbot to speak sign language through the robot hand using serial. This means basically half of the interface was done. The other half was for the chatbot to interpret my sign language so it could adequately respond. In one of my earlier logs, I mentioned finding a repo that supported fingerspelling, so you could spell out any word. This session I forked that repo, and edited the script such that, signs it interprets were spoken to a chatbot, and that chatbot would communicate outward through serial. However finger spelling is easier said than done. The first difficulty was that letters were often misinterpreted, which was frustrating, but also a limitation beyond my control. The second difficulty was repeating consecutive letters. If I held my hand too long, the model assumed I intended for the letter to be repeated, which lead me to incorporate a cooldown. Finally to adress spacing between words, I set a condition where both hands must be present for over 2.5s, to include a space character. With this the bridge was effectively complete. What I have left really is optimizing this process, by perhaps improving the hardware design of the hand to grant more freedom, or maybe training a more robust sign language interpreting model. But all of these options sound boring to me. Instead I want to learn something new, so the second half of this work session, I spent deliberating ideas, and I came across IsaacSim, a simulation software for robots developed by NVIDIA. I plan to learn more about this topic, to allow for the simulation of this hand, such that I can attempt a more sophisticated approach to a sign language robot, than just static recorded symbols. Anyways, that’s all for this session folks…
Folks, this will be the final devlog. For this project anyway… This session wasn’t too much involving actual additions to the project. Following last session, I was brainstorming ideas to expand this project, perhaps to make this a more robust system. In this search I encountered IsaacSim, a simulation software that enables the simulation of robots, which could allow for expanded training to grow the model. But, in all honesty, I wasn’t too interested. Sure, I could add a wrist or thumb, and add more gestures, perhaps train a custom computer vision model, but the point of this entire project was to develop a rapid proof of concept. Given that I’ve achieved that, I’d like to invent my energy into developing a robot hand of my own. That is what I plan to do next, however, that will have to be documented as a separate project, as it doesn’t exactly correspond with the purpose of this one. The rest of this session, I spent documenting my work, so check out the repo if you’re interested! Anyways, that’s all for now.
Alright folks… I know I already shipped this project, but I kind got an unexpected lead. So the reason, I wanted to leave off this project is because additional improvements, such as thumb dexterity or wrist movements would add rabbit holes that deserved projects of their own. But, the person who lent me the hand, also found the missing thumb; it does lack a shell, however. With that, I figured, I’m pretty close anyway, why not add the wrist? So this work session was spent, predominately, designing a wrist mechanism where a stepper motor could rotate the hand into various orientations. The one thing, that concerned me from the start, was that stepper motors lack positional awareness. At least the kind I’m using does anyway. This means I would need to design a location for an external encoder to fit, that would stay fixed relative to the palm. This design has been very tedious. The hand is already so compact, that the encoder would not fit, so I am thinking, I can attempt the stepper motor based wrist without encoder values first, and if i detect too much drift, then worry about that addition later. I’ve finished designing the wrist, and am about to send it to print and test fit. Next session, I will find out how that goes. See yall soon…
This session is technically one in the future, because the sesison before this, I plan to log after this post. It’s kind of tricky, but basically lookout’s recording failed because I closed the tab, so now I’m rerecording the old session, while I work on the new one. Mostly, I spent this time working on 2 things. One I noticed that my wrist, would rotte the entire platform, when rotating the hand, due to the rotational inertia, so I designed a brace to fix it in place. The other thing I did, was develop code for the wrist, so that I could add wrist encoder data to my sign language library, which I actually plan to record in a little bit. Obviously this implies that last session, I designed the wrist fully, and printed it out, but you’ll find about that, next devlog… That’s all for now folks.
Good news and bad news. Bad news is that this session was supposed to be a recovery log for the 4 hour lapse lookout accidentally deleted, except somehow the recording failed again. Good news is that instead of waiting on that fix, I’ve kept working, and we’ve made some huge progress. The wrist design you saw last session was pretty neat, except when I finally got access to the hand to screw it on, I realized my screw tolerances were not enough. And worse that caused the screw to drag across the bearing of the wrist leaving that screeching sound, when a chalkboard is scratched. So I fixed the finicky piece and reprinted it. In the meanwhile, I put together the electronics for the hand, and added the code I’d developed last night. After renumbering the pins, and messing around with stepper speed, I’ve finally gotten to a decent teleoperation phase with the wrist. It’s quite slow, but it works. The only thing that concerns me, is that when I ask the stepper to move to a position to quickly, I hear a peep, then the fingers don’t move. Most likely somewhere downstream, overcurrent is preventing the stepper from drawing too much torque. This makes sense given how shoddy the wiring is… Anyways, I’m about to rerecord the alphabet with my new wrist, and hopefully get the full demo working with wrist by next session. I will then hopefully, record a successful recovery session for my precious 4 hours of work ;( That’s all for now folks…
HUGE PROGRESS This session was spent, designing and assembling the electronics enclosure for the hand, and getting the full working demo. to be compact. When the hand turns I noticed that servo cables would turn with the hand, which made accessing certain wrist positions risky, due to the nature of the wrist design. Thus I needed some way of reduceing the number of wires connecting to the hand, such that it can be more mobile. To do this, I decided to mount the pwm driver and power source directly onto the back, which I designed a bracket for. Because the hand is shaped so oddly, it took me several iterations to find a mount that would screw readily, and the pcbs, the way I inteded. And while, I would send these designs to print, I worked on the electronics. I put tested the complete human to model to hand pathway, and I realized the whining sound and stunt earlier was likely a result of my battery supply. Thus, I switched out the battery for a wall dc-dc power supply, and was able to sustain the hand without a crash. At it’s peak the servos only drew about 1.2A at 12V, so perhaps the issue wasn’t the battery’s current capability, but instead how quickly it could provide it. While I printed these iterations, I noticed how the elctronics on the breadboard were functional but fragile, so I decided to take on the UNNECESSARY decision to turn my electronics into a perfboard. Worst mistake ever. Who knew a perfboard could be so troublesome. Almost every 5 minutes, I’d either bridged a connection, soldered ground to voltage, layed out components in the wrong order, or just burnt myself. Even worse, I was laying on the dirty floor, and my shaky hands and burning elbows have left me more sore, than I’ve ever felt. After some 4 hours recorded, and 3 hours off camera, I got perfboard wired up. Because, I’m almost at 10 hours, however, I’ll share whether it worked in the next log.
I blew a capacitor. For the first time in my life. Since last update, I’ve been trying to set up the demo with perf board, and realized the I2C lines were inaccessible. So giving up on that, I decided to breadboard it out. This would have been fine, if not for the fact that i took apart the entire breadboard for travel, which when I tried to reassembled, I must have messed something up, because next thing I knew there was a short in my circuit and the pwm driver had blown. From this point, I made a decision to build my own hand, from scratch, that is robust, easy to assemble, modular, and best of all… my very own. Thus, this session was spent researching, how to approach building a robot hand. From prior context, I decided to not build a tendon driven hand, given their abundance in the robotics community, yet lack of implementation in real scenarios, mostly due to wear issues. Looking at the best hands in the world, I noticed most if not all of them were direct drive, and I am particularly a huge fan of the wuji hand. So, I’ve begun the design of a finger, using mini dc actuators, embedded withing the finger, allowing for a thing hand, that is precise and strong. Of course the major drawback, I am not adressing is that the use of embedded motors makes the hand enormous. Like 6inch pinky enormous. In fact, I searched it up, and turns out the hand might be larger than Wemby’s. But that’s all right with me, as long as it works. Anyways, I’ve attached a photo of the wuji hand, which I took inspiration from. But thats all for now folks….
Folks. I hate designing hands. Not really, but its kind of frustrating. Last session, I talked about how I am trying to design my very own hand, that is fully direct drive and 20 DOF(degree of freedom), so that there is a much greater range of the sign language vocabulary available. However, very quickly I realized that direct drive motors, involve embedding motors within the finger linkages, which leads to the motor size dictating the finger size. Unfortunately the motor, I am going with(N20), is about as compact and powerful as I could find for this application. Not to mention they’re cheap, and include encoders for positional readings. The motors themselves, account for a very big finger, but also the finger joints being bevel joints make it significantly larger as well. Thus, this session, I tried compacting the bevel joint, by using shorter gears, and removing free space. Halfway into this design revision I realized that clearing the free space in the bevel joint, would shorten its range of motion from 90 degrees to somewhere around 65. The first objective of this hand is to be highly dexterous, so I had to abandon the idea of shrinking the joint. I also got rid of bearing, because of the added complexity and material costs, they brought. Next session, I intend to work on the roll axis of the finger, and then hopefully develop a palm, that can combine 4 fingers. But that’s all for now folks… PS: the screenshot is of fusion crashing, because it keeps doing that ;(
Fusion is hard on linux. This session, i’ve spent being indecisive about a lot of things. For one, I have been deliberating how I’d proceed with the hand design, specifically whether I would design a palm around the finger modules I have available, or redesign a hand from scratch. In terms of designing a hand from scratch there are a lot design considerations, I didn’t quite account for. From the start I really wanted the hand to be direct drive, because I figured it would give me better position readings, and also because I wanted to differentiate my design from the hundreds of open source tendon hands that exist. Plus there is a higher strength cap, which doesn’t matter for my application but still. Anyways, during all this, I randomly decided, I was sick of windows, and switched to Ubuntu, which has been awesome, except for the for the fact, that all my work has been on fusion, which is unsupported on linux. There is a workaround using WINE, which is what I’ve been using, but it’s been so laggy, I’ve been genuinely questioning switch to onshape. Anyways, I’ve arrived at a decent finger design, which I think I will implement from scratch on onshape, so that’s what’s happening next session. That’s all for now folks (obligatory larp terminal).
Another redesign session. The indecision continues, as this session I spent working on 2 entire concepts from scratch. The first idea, was to acutate the proximal joint of the finger from a servo, however, while this worked, I didn’t like how bulky it was. I had the short face of the servo move side to side to allow for roll in the finger joint, but that meant the long side was store in the palm. At this time I also came across some mini dc motors, and while they lacked position readings I also had just enough encoders, to make it all work. So the second half of this session, I designed the finger module using n20 motors, and even animated its motion on onshape. I plan to simulate it on isaacsim possibly later, but for now this allowed me to determine collisions, without any math ;). Anyways, that’s all for now folks.
HUGE BREAK!! After so long deliberating the design choices to go with, this session I sat down and actually made progress on the design. As of last time I had developed a bevel mechanism to actuate joints, and that would be read by an encoder. This session I polished all those things, and developed the roll mechanism for the finger, which consists of 3 gears(24 -> 24 -> 12 teeth). Moreover, it just so happens that the dimensions of a servo fit approximately within the dimensions of the bevel mechanism, so I was able to fit the servo stuff directly underneath. This provides a great form factor, and avoids the problem most servo actuated hands have with width(its only 40mm thick!). Also, I developed an encosure for the finger that is to be screwed onto a palm, thus ever finger is independently assembled, and the final design can be modular. Also, something that bothered me very much is wiring, motors and encoders between joints. Thankfully, within this design motors that drive joints are underneath the joints, which means they are closer to the wrist, and because I considered wiring, I was able to add channels and passages to hopefully get everything fitted without wires sticking out. In fact, the whole hand’s wires, should ideally come out through the wrist, allowing for compact control. Overall, I am super excited with how this project is turning out, so stay tuned to see this get crazier ;)
Im really pissed. I thought finally, after arriving at this design I could be content, and that everything would work as soon as i finished the distal phalanx coupling mechanism. But, no, there are more problems. Despite taking several hour brainstorming off camera, and then designing for another couple hours, a 4 bar linkage to couple the finger joints cuts off the range of motion, which i dont want to compromise. This is because I reused the bevel joint from the knuckle, which saves vertical space, but not horizontal. Basicallly because of the way the knuckle works this hand has a breadth of around 150mm, which equates to approximately fingers of that length. My current design is not suitable for this, and so I plan to redesign everything from the knuckle up, to be more narrow and allow for coupling without sacrificing range. So until then, that’s all for now folks…
Ballright. Today, I made a discovery. I learned that thumbs have one more degree of freedom than other fingers, yet they also have one less phalange. You see, being at the end of a hand, they have the degree that allows them to move diagonally, which pinkies also have an equivalent motio for. Any way, I only bring this up, because today, I decided to work on the palm, and more specfically the location of the thumb. I found inspiration in this youtube video, and looking into the anatomy of our hand, its genuinely incredible how capable a thumb is. Also, during this time i made a correction to make the finger modules symetrical which saves space, and importantly gives me somthing to reuse for the thumb. Next sesssion, I’ll print out some of the designs I’ve tested and also design a palm. That’s all for now folks…
The end is near…. Of the hand design I mean. This session was basically fixing everything, I had concerns about from the printed prototypes of the hand’s knuckles. I made added better tolerances, and designed a neat palm to fit around th finger modules. The finished hand is around 30cm fingertip to wrist, so definitely on the “larger side”. But, that’s all right, because the design seems pretty robust. Also, I noticed that the hand resembled Edward’s from Full Metal Alchemist, so I wanted to add a reference to that somewhere, however it came off kind of weird, and I’m not trying to catch any larp allegations. Towards the end of this session i tried printing the hand parts to put together, but somehow for the fisrt time ever, my fricking printer’s nozzle clogged, so now I wait another 2 days while a replacement arrives >:(. Until that time, I’m going to refine this design further, so I never have to touch the design aspect again (until the wrist of course). As for the wrist, I am lowkey scared that, this hand may require too much torque to make a reliable wrist for, given its size, but I’ll probably just suck it up, and stepper motors should work. Anyways, that’s all for now folks…
Ayo call me Teo… …the way my hand got ice on its wrist. Ok, ok ok, new intro style, but today’s session was about the wrist and a couple other things. First off, I realized that to express every character in the sign language alphabet you only need two degrees of freedom, so i worked on a differential wrist design to save space. Basically the wrist is just two stepper motors, with cycloidal gear ratio, that drives a belt to actuate the different axes. Buttt, this was only the first half of this work session session. Off camera I printed the finger to test, and I realized a couple of problems and good things. First, the finger works how i intend it to, mostly. The major limiting factor is friction. On my design friction is both needed and should be avoided, so finding a balance is tricky. On one hand friction between gears, allows the finger to hold position when oriented a certain way, which is good because it means the motor doesn’t experience any holding torque. On the other hand, too much friction stalls the motor out, which could lead to it dying. Basically, im using cheap ahh motors that are NOT designed for anything torque related, so I’m copping out and finding ways to make it work. I plan to add bearing and limit range of motion through stoppers next session, so that’s all for now folks…
I have more fingers now. Last session we left off, with another redesign of the finger after multiple prototype iterations. Well, this session was more of that, but I’ve finally arrived at a finger that is decent enough to work with. I added bearing, made it more friendly to wiring, and tuned tolerances, enough to not have to use glue! Given this, I’ve printed out 4 fingers only to realize that the base of each finger needs a wire peek through hole, so I’ll be redesigning and printing those I guess ;( Besides that, this session I worked on physically assembling the fingers, which is more tedious than it sounds. I had to solder some breadboard cables and shrik wrap stuff, to use my motors with the standard pins. I also needed to solder wires to the encoder. So, after this I should technically have access to enough pins to program the finger, which is what the alst 3 hours of this session were dedicated to. Normally, when I write code it tends to be “assisted”, but in this case I was really curious to learn the code. So I also choose the path of greater resistance by choosing to code the ESP32 in C++ through ESP-IDF rather than Thonny or Arudino IDE, like usual. It’s okay, I’ve learned a lot, and I’m only halfway through the script. Anyways, that’s all for now folks…
Bruh fix lapse please. I just lost 6 hours of work because the lapse didn’t save to anything. I’ve already lost like 15 hours, so this is pretty annoying. Anyways, this work session was spent assembling the hand. I know I keep saying this but for real though, I actually managed to assemble the entire hand and wire up the encoders. I still have wiring the motors left to do, and of course software as well, but this is huge! I did notice, however that the fingers had a good amount of shakiness to them, so I am reprinting the knuckle bevels with tighter tolerances such that it is more robust. Also assembling the hand, and then moving it into various orientations is insane to see. Before assembly my vision for what I thought the hand would look like came from a static onshape document, I didn’t realize just how flexible 15 degree of freedom could be. Splay between the fingers is especially lifelike, and despite the hand being large, it still looks good. The wiring situation is purgatory on Earth, but that’s ok. I should’ve made the wire passages much larger, but the filament roll, I’ve been using for the hand is running low, so revising the palm is unlikely. Overall, I am stoked with how its going… …So, that’s all for now folks.
Controls suck. This entire 8 hour work session was about wiring the hand and making it work, which sounds pretty simple except its not. It’s not. After reprinting the palm and fixing some tolerance issues, I now have space to fit wires through the hand, but the issue wasn’t even wiring stuff onto a breadboard, it was the code to make it work. Every finger has 3 distinct degrees of freedom, and I need to manually calibrate/tune each degree of freedome by testing its range of motion in software and then mapping controls onto it. And that was the easy part. The super annoying thing, is getting closed loop control to work. Because Im using relatively low torque and high speed motors, when trying to designate the fingers onto a certain position, they keep overshooting, which of course is the fundemental problem PD control solves. But tuning PD controls, and solving every wiring issue along the way, is proving to be mad annoying. I keep switching encoder pins, motor polarity, etc. which adds confusion because I can’t tell if the issue is software or hardware. Anyways, after all this I’ve only finished 2 fingers ;(. But Im hoping the next few are going to be much faster, so that’s all for now…
Ships:
Can you hear that? Listen closely… Are you listening to music right now? Maybe, your just in your room, ambient noises and all. If your watching Youtube, surely that’s in the background. Now for a moment, seal your ear, with your palm. Imagine exactly that for hours on end. Motivation It’s hard to imagine the effect on a person’s life, hearing disabilities can cause. Deaf people are ostracized in their means of communication; almost 1 in 3 face an elementary reading level. A thought, that I came across recently was how the usage of chatbots impacted the lives of people hard of hearing. I use chatbots all the time. I search stuff up, sometimes just talk, and of course receive “coding assistance”. But nevertheless, it’s relied on my literacy, something I may have taken for granted. Thus the goal, of this project was to develop a means of LLM communication, that is intended for a deaf audience. Part I: Understanding Sign Language There are 2 parts, or halves to this project. The first is the chatbot understanding what the user is intending to communicate, aka can it understand sign language. You see, despite this being such an incredible application of computer vision technology, much of this research is still, well research. Sign language is quite expressive, almost an art, and to define it under strict object classes is somewhat of a a challenge. After a considerable search, I found that the best approach to this, was sign letters individually, spacing them out using my designated space que (both hands at once). Of course this was slower, however it allows for more possibilities, which is valuable in conversations. I found a repository containing a sign letter recognizing pipeline, which I modified to interface directly with a local LLM (gemma3:4b) through ollama. Then the LLM’s output, would be sent outward through a serial line. Part II: Interpreting Sign Language Now for the second portion: the hand. Thanks to a friend, I was able to access a spare robot hand, which lack a thumb and a wrist, but at least it had 4 fingers. And they were quite capable. I wired up the 4 motors for each finger to an Arduino, though later I would rely on a PWM driver, that talked to the Arduino. To train the hand to implement certain sign, I made a DIY teleoperation setup. I found some flex resistors, which are basically variable resistors that change depending on their state of flexion. When mounted to my hand (through 3d printed rings), the state of my finger, would correspond to a voltage value, dictated by a voltage divider. Thus, I had an input. Using teleoperation, I recorded 24 finger orientations for the 24 letters of the ASL alphabet that didn’t require dynamic wrist movement. This library was used as the basis for communication, from the LLM to the user. When the LLM expresses an idea, the phrase is broken down into letters then expressed through the hand. Of course, an obvious issue was spaces in between words, which I addressed by adding a custom animation (wave) representing the space. Conclusion With those two elements interfacing, the goal of this project was met. While, I feel I could’ve expanded this system to be more robust, either by adding degrees of freedom, or training a custom computer vision model, each of these subsections contain enough rabbit holes, to turn into projects of their own. As such, I decided it would be simpler to open a new project, hence the reason I’m shipping this one. Final Thoughts If you managed to read this all the way through, thank you for sticking around!...
|
1793054837.4431262
|
1793141237.4431262
|
|
11696
|
FlatCraft by @Blxm | Stardance
|
Blxm
|
1
|
115.21
|
1405
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T23:31:01Z", "hours": 113.0, "multiplier": 12.47, "payout": 1405, "blessing": "neutral", "text": "FlatCraft Basic Info FlatCraft is an open source, MIT licensed 2d Minecraft inspired game. It uses LittleJS for the rendering, and vanilla HTML/CSS/JavaScript for the UI. All the rest was written by me. Challenges: One of the biggest challenge was world generation. The idea was to use simplex noise to make terrain, but there was one problem: It’s uncontrolability. I wanted real biomes, but that coudn’t happen because I didn’t know how to control simplex noise. Nor did I know how to make mountains. I solved it by realizing that this is just a silly 2d Minecraft game for a program designed to get teens to make something, not for teens to make some complex minecraft like game, so I decided to bite the bullet and to just make an array for each biome, and have that array contain the y level of the highest block, and use that array to make the terrain. It’s basically like [1,1,2,2,3,3]. Nothing complicated, and if you played this game long enough you’ll see that each biomes are litterally the same. Most Proud of: I’m actually most proud of the custom skins part of flatcraft. It’s really not that complex, but it took a mesruable amount of time to get it working. I had to learn node.js, finally had a use for a server! and used my old chromebook as my server. I made the precaution of adding a ratelimiter just in case someone tried to take it down or whatever, but yeah. That’s what I’m most proud of. What I learned: Making classes in js NodeJS LittleJS engine Stuff that didnt make it into the game: Game music Mobs Credits Art: Me, mostly me, My little brother Inspired by https://www.planetminecraft.com/texture-pack/digs-simple-pack-1-15-100-complete/ , and https://bloxd.io Programming: Me Libraries used: LittleJS", "repo": "https://github.com/BlxCode/FlatCraft", "demo": "https://flatcraft.blxm.me"}]...
|
[{"post_id": 72489, "ts": "202 [{"post_id": 72489, "ts": "2026-09-23T02:15:22Z", "hours": 0.3167, "text": "FIxed bug where jumping wasn’t scaled to your fps Simple really! it’s on the title Changes & Bug Fixes fixed bug where jumping wasn’t scaled to your fps that bug would have made high fps players not able to jump high, and low fps players to jump SUPER high"}, {"post_id": 71071, "ts": "2026-09-20T08:19:33Z", "hours": 1.8978, "text": "Fixed some issues regarding prod (wont get paied for this 😭) ALright, even though i just shipped, there were stuff that were broken, first of all i realized that if you have a expensive 4k 240 hz ahh monitor, the game would get very fast due to the fact that I didn’t introduce deltat time, so i introduced delta time. Bug fixes Fixed bug when you were very fast on a 60hz+ monitor Fixed glitch where the animation state changes between falling and breaking a block while breaking a block while falling"}, {"post_id": 70883, "ts": "2026-09-19T23:01:44Z", "hours": 5.6633, "text": "Sprinting this will be my last ever devlog! New Features: FULL Random world generation: It works like this: Seeds: Seeds are not that important, though they do play a part for terrain generation. Terrain: The terrain is basically just a huge array with preset Y levels depending on the terrain type, ie: mountianus, hilly, flat. Ores: Ores are truly random. It dosn’t depend on the seed. Trees: Trees are also truly random Sprinting: Double press the key in the direction you want to go to sprint that’s it! plz rate it well"}, {"post_id": 69200, "ts": "2026-09-16T16:09:37Z", "hours": 6.2003, "text": "Saving worlds… I hope Honsetly, school has been removing litterally half of the day I would have used to do flatcraft, so… yeah. im also writing this at school cuz i needed to sleep. dont tell anyone lol New Features: Saving It’s quite simple actually. Just saving an object with some world data to local storage. Honestly, that’s it. Flower flower. very cool Terrain generation Terrain generation, no ore generation lol"}, {"post_id": 66474, "ts": "2026-09-12T09:52:21Z", "hours": 5.9692, "text": "Tools Update!!!!111 3 more hard gh issues to go! yay it’s like 2:30 on a friday. not bad, but considering school is back, not good either. Honestly, i swear Idk if i can actually finish this before sep 20th, so if i can’t i’ll actually do 100 pushups. and it WILL be on a devlog. so uhh… yeh. idk why but you can see me do 100 pushups. defenatly not in a row tho my arms are actually twigs bro. ok enough yapping, let’s actually get into this. New Features: Tools!!111 tools. the final implementaiton was quite simple actually. I just added tools to the textures, and added them to the metadata, added a few bits of code for the speeding up of breaking blocks and boom! tools. Changes & Bugfixes: Compleated Metadata Drops now produce 80% less lag (by making sure that only 1 shadow per x coord can exist)"}, {"post_id": 62583, "ts": "2026-09-06T01:30:40Z", "hours": 8.5536, "text": "Lighting & Dropping stuff i’ve been slacking off recently, and I mean it. I’ve coded less, and played more games due to the uhhh looming school season starting again but like… i’ve still managed to make things like lighting, dropping stuff, and shuffeling stuff in ur inventory by using the number keys. Features Lighting At first, this was one of the reasons why I decided to switch to little js, but like their system is not designed for 2d minecraft use, so I had to improvise. The lighting system consists of two basic things. One is the ambient lighting, which basically fills the whole screen with light / filling the whole screen without light, and the second thing is like “light objects” by that, I mean like point lights, which are like round lightbulbs per say, and they emit light. Those would be used for stuff like torches. Q Dropping things with q didn’t exist in the 2 part drops update, cuz i was too lazy to implement that. But now, I added that. It’s simple really, it just creates a new droppped item every time u press q. and if u press q with control, then it drops everything in the hotbar slot hovered, and u can drop things in ur inven by hovering over it. Moving things around in ur inventory with the top number keys I added that cuz im just used to that in uhhh…. bloxd.io so yeah, i just added that. Attack anim press mouse button 0 to attack. currently just attack animation for now Changes & Bug fixes Random tick events for stuff like grass turning into dirt or vice versa *greijodkmgrfd idk, it was in my commits smth to do with promises"}, {"post_id": 58560, "ts": "2026-08-31T00:30:24Z", "hours": 1.4617, "text": "Custom Skins Settings Front End Uhhhh it’s in the title… nothing interesting. https://github.com/users/BlxCode/projects/5 New Features Custom Skins are now FULLY 100% Out! custom skins. How it works: A gallery with a bunch of skins and their ids a textbox for the skin ids reload Changes & Bug Fixes None lol"}, {"post_id": 57793, "ts": "2026-08-30T02:50:18Z", "hours": 8.83, "text": "Inventory Ok so i’ve basically just coded the inventory system. uhhh New Features Inventory System Ok so this is how it works: There is an object that has all the invetory data There is a function that renders it it works like that so u dont render the inventory every frame. that would cause SOO MUCH LAG Place blocks Uhhh… place blocks and it also checks if the block u placed collides with any blocks or players and if it is next to a block Changes & Bug Fixes Fixed some weird crouching behavior that I cant really explain cuz it’s like weird. Dont mind the fact that the game bugged out… it’s cuz i forgot to add metadata to the pine logs and rickroll block thingy"}, {"post_id": 54123, "ts": "2026-08-24T22:58:00Z", "hours": 8.3086, "text": "Drops Part 2 Last devlog, I finished the drop part of drops! This time, I finished the pickup part of drops, and the hold part, though I feel like I do need to tweak the values, I just don’t know by how much. New Features Pick up: The pickup part of drops is basically just an if statement that runs like every frame to see whether or not the player is near enough to a dropped item for them to pick it up. It’s quite simple. Hotbar: I feel like I finished the hotbar, not the inventory system yet, just the hotbar. I finished the “rendering” part, by that I mean like viewing the inventory object and rendering the stuff that is on the hotbar. Changes: Renamed the id of the Inventory div to the Hotbar Readded the FPS counter, and gave it an overhaul The lower arm animation actually plays now"}, {"post_id": 50200, "ts": "2026-08-19T10:30:30Z", "hours": 8.8847, "text": "Drops Part 1 Drops! Though… you can’t pick them up yet… uhhh, and I’m nearing the 10-hour mark, so… yeah. I also completely rewrote the movement code and tweaked the values in collision detection, so that’s like half of the time. Also, it turns out I am not an engineer, as I rewrote my own drops code TWICE in the span of TWO HOURS because of chatgippity roasting me and me roasting myself, respectively. (Also, new dev log format, yay!) New Features Drops (partially) Drops were annoying to implement, partially because I’m a skill issue, and also because I had to learn new things like making classes and stuff like that. Changes & Bug Fixes Collision system revamp The old system was weird and also sometimes inconsistent, so I rewrote the movement system and tweaked the collision system. Overall, a bit of a smaller update if you ask me, and its ONE AND ONLY FEATURE wasn’t complete. Oh well… looks like we’re going to get the next dev log soon."}, {"post_id": 46768, "ts": "2026-08-14T08:07:02Z", "hours": 8.0811, "text": "Block Breaking and Particles! half of the time was spent fixing bugs uhh… ignore that youtube video… New Features: Shadow Particles when touching ground after falling, walking, and after breaking a block Block Breaking Changes & Fixes: Added more things to the block metadata object Fixed collisions not colliding"}, {"post_id": 43802, "ts": "2026-08-09T07:19:22Z", "hours": 0.2828, "text": "Bug Fix: I didn’t include the no falling if you are crouching in the last update so i just quickly added an if statement to include that feature."}, {"post_id": 43193, "ts": "2026-08-08T09:59:34Z", "hours": 1.7314, "text": "Players! Players are finally out. After what? 2 progress updates? Wow, that was harder than I imagined. Especially the physics. I had to think creatively and outside of the box for this. Also, this devlog continues from the last one. Just pretend that the progress updates like didn’t exist or just aren’t canon. Finished Features: Players: Player Physics Player Animations Changes: Slightly adjusted dirt texture Increased label elements’ font size Patched weird css border glitch Deleted unnecessary assets (like the custom cursor that only existed for like 5 minutes, 2 months ago) What’s Next (In order): Crouching, and not falling ✅ Drawing tools (hardest one, btw) ✅ Breaking blocks with tools and fists Custom Skins (it’s literally 90 % complete now, but my server is down due to some real life events so have to wait) ✅ Sandbox world Mobs if i have time ship ps. if you are wondering why the screen recording has some static noise, it’s because i have a small desktop fan running like really close, because it’s kinda hot indoors. I don’t know why it’s making tha t sound, it dosnt make that sound irl to be clear. I think it’s because i accidently turned on my mic and my mic is currently my crappy very quiet laptop mic"}, {"post_id": 41831, "ts": "2026-08-06T09:09:42Z", "hours": 8.1389, "text": "Progress Update #3 I’m too stupid to do physics. I should have made everything with Box2D. I’m currently fiddling with side collisions, as all other collisions (I hope) are done. I’ve also finished jumping and falling physics. Also, I’ve spent another 8 hours, and I want every minute to be for my new 3d printer. Finished Features Jumping My Jumping physics thingy is like the poor and stupid man’s way to do it, but hey… at least it works. It kinda just has a jump multiplyer and it goes down every frame and every frame the player goes up something like 0.05 block units multiplied by the jump multiplier Falling Falling is basically the same as the jumping one. i added sky yes, its a sky :D only a gradient. ill add sun and moon soon prob hopefully idk if there will be night, idk if i can create a night in time. Unfinished Features Side collisions This is stupidlly harder cuz my blocks’ x center is at 0, not 0.5. this means that a block spans from like -0.5 to 0.5. My brain cant handle this… thing."}, {"post_id": 39389, "ts": "2026-08-02T10:30:17Z", "hours": 10.1594, "text": "Progress Update #2: Why, you may ask, do I do progress updates? It’s because only 10 hours MAX can be logged per dev log, and uhh… I think you get the picture. So, without further adieu, this is what I’ve been working on. Unfinished Features: Players (85% Complete) That’s a huge jump from the last time I’ve updated you on the progress on players. Now the thing is, physics is annoying. And I’m not old enough to study calculus at my high school. Which is a shame, as I really like the idea of calculating values based off of differentiating values. I’ve literally just been playing around with the physics at 3 am!??!? Wow! It’s literally 3:30 in the morning. I should go get some sleep. The jumping and crouching are a bit finicky, but I’ll fix them sometime later. Closing Remarks: First of all, a lot of the 10 hours in this progress update have been miscellaneous things like bug fixes or just general tweaks. I’ve also been realizing that this project is big. But the end of the tunnel is still nowhere in sight. Yet, if I can stop sitting around and start sprinting towards, uhh… any direction, there will be light at the end of the tunnel. I hope I can finish this project before school starts. I’ll have to grind like a lot, and especially at night because my siblings are quite brain-rotted, annoying, and loud."}, {"post_id": 33370, "ts": "2026-07-23T07:19:45Z", "hours": 2.5872, "text": "Custom Skins! After a lot of time getting the back-end setup (with some help from ChatGPT, I’d have to admit), custom skins are here! (Granted… players aren’t here yet so you can’t really try them out lol.) New Features New page ( https://blxcode.github.io/FlatCraft/upload-skin/ ) Think of it like skindex but with a worse ui Searching for skins Skin Uploading Changes & Bug-Fixes Grass Retexture Dirt Retexture"}, {"post_id": 32173, "ts": "2026-07-21T04:55:32Z", "hours": 8.2811, "text": "Progress report: I have been grinding this, and I haven’t posted a dev log in a while because I haven’t really finished anything, so this will be a progress report. Finished Features: New dirt, and grass textures The old textures suck, because in between blocks there would be like a small section where there is like no detail, so I added those details and recolored the grass bit of the grass texture because the old one was too “limy.” Added bedrock Self-explanatory; no interesting thing happened that I would want to yap about Updated Game rendering Last devlog, I ported my rendering side of the game to LittleJS, a browser game engine. Why? Because I realized that I wouldn’t have the time and effort to manually do advanced stuff like lighting and particles. Hence, I ported to LittleJS. Now, in the days after the port, I had to fix a lot of things and bugs. Originally, the game would render everything, even if it wasn’t on screen, so I fixed that. I made it so that if you couldn’t see the blocks in the camera, they wouldn’t be rendered. Unfinished Features: Flat Game Mode (90% Done): I decided that tinkering with sandbox mode first would be stupid, as I would still have to make players, inventory system, etc. I feel like I’ve finished everything, but there is something missing. The sky. I still need to make the sky. I don’t know if it should be an image or something else. Players (10% Done): All I have done for players is literally a goffy ahh skin (which I should make better) and a player variable. I think you would be able to piece together what I want for this. Custom skins (60% Done): I want to make custom skins. I have completed the UI, the security part of the server-side (aka my old broken ahh Chromebook) code, and a simple UI for it. All I need to make now is server-side code to store the custom skin and deliver it to the client."}, {"post_id": 22640, "ts": "2026-07-05T06:00:35Z", "hours": 5.6808, "text": "The LittleJS Update Yes, this doesn’t look like much, but it took 5 hours over the span of multiple days and a LOT of trial and error to get to this point! I had to learn so many things, like Promises, async and await, how to make new classes, and LittleJS. But why? Why go through so much trouble? That’s because I’ve realized that I would not, in my current state, be capable of making a full Minecraft clone using only the vanilla HTML Canvas. I chose littleJS because of the promise of fast and lean, and I had already tried it before but failed; I wanted to redeem myself. New Features The rendering part of the game is now done with LittleJS Popups now have minimum width and heights Create new world form now has placeholder text for those who are lazy to type stuff Fixes Renamed Ebony to Cedar because Ebony trees are not pine trees Removed the useless pausing system Removed all of the old rendering system (NEXT UPDATE: Create worlds from seeds 😭 i need help with this)"}, {"post_id": 14909, "ts": "2026-06-24T06:37:35Z", "hours": 4.1328, "text": "The Terrain Preparation Update This is a BIG UI update, and in the next update I’ll add scripting to most of the world menu UI, which has not yet been scripted. New Features: Play Button (shows after the loading screen is finished (in order to get the main menu audio to play)) Main menu music (from opengameart.org) World Menus UI World Creation UI Temporary Gradient Background (To be replaced by game screenshots) Scrollable Credits Fixes Fixed some spelling mistakes in the code"}, {"post_id": 10957, "ts": "2026-06-17T23:33:42Z", "hours": 2.9889, "text": "The Loading Screen Update Added a loading screen which goes to 90% and then waits for the CrazyGames SDK. Removed all NPM dependancies and replaced them with CDNs Added a squeeze in animation when closing Loading screen and Main Menu And much more! (NEXT UPDATE: Create worlds frm seeds with basic terrein 😭 i need help with this)"}, {"post_id": 8555, "ts": "2026-06-14T06:57:09Z", "hours": 1.3439, "text": "The Backdrop Update Added Backdrops to all popups Added a “pausing” system (just disabling keyboard input for now) Added Animations like popup to the main menu elements Added some NPM packages"}, {"post_id": 7631, "ts": "2026-06-12T19:08:43Z", "hours": 2.4183, "text": "main menu, new cursor"}, {"post_id": 5344, "ts": "2026-06-09T02:33:51Z", "hours": 0.4506, "text": "re-done block rendering, adding a function instead of just drawing it onto the canvas, added more textures (gems in block form) and redid dirt texture. Also added movement (only canvas movemnt)"}, {"post_id": 4754, "ts": "2026-06-08T06:28:44Z", "hours": 0.9686, "text": "maple (oak) trees and fps counter"}, {"post_id": 4657, "ts": "2026-06-08T02:00:46Z", "hours": 1.7033, "text": "Inventory UI, Block Creation, some textures"}]...
|
Title: FlatCraft by @Blxm | Stardance
Devlogs:
In Title: FlatCraft by @Blxm | Stardance
Devlogs:
Inventory UI, Block Creation, some textures
maple (oak) trees and fps counter
re-done block rendering, adding a function instead of just drawing it onto the canvas, added more textures (gems in block form) and redid dirt texture. Also added movement (only canvas movemnt)
main menu, new cursor
The Backdrop Update Added Backdrops to all popups Added a “pausing” system (just disabling keyboard input for now) Added Animations like popup to the main menu elements Added some NPM packages
The Loading Screen Update Added a loading screen which goes to 90% and then waits for the CrazyGames SDK. Removed all NPM dependancies and replaced them with CDNs Added a squeeze in animation when closing Loading screen and Main Menu And much more! (NEXT UPDATE: Create worlds frm seeds with basic terrein 😭 i need help with this)
The Terrain Preparation Update This is a BIG UI update, and in the next update I’ll add scripting to most of the world menu UI, which has not yet been scripted. New Features: Play Button (shows after the loading screen is finished (in order to get the main menu audio to play)) Main menu music (from opengameart.org) World Menus UI World Creation UI Temporary Gradient Background (To be replaced by game screenshots) Scrollable Credits Fixes Fixed some spelling mistakes in the code
The LittleJS Update Yes, this doesn’t look like much, but it took 5 hours over the span of multiple days and a LOT of trial and error to get to this point! I had to learn so many things, like Promises, async and await, how to make new classes, and LittleJS. But why? Why go through so much trouble? That’s because I’ve realized that I would not, in my current state, be capable of making a full Minecraft clone using only the vanilla HTML Canvas. I chose littleJS because of the promise of fast and lean, and I had already tried it before but failed; I wanted to redeem myself. New Features The rendering part of the game is now done with LittleJS Popups now have minimum width and heights Create new world form now has placeholder text for those who are lazy to type stuff Fixes Renamed Ebony to Cedar because Ebony trees are not pine trees Removed the useless pausing system Removed all of the old rendering system (NEXT UPDATE: Create worlds from seeds 😭 i need help with this)
Progress report: I have been grinding this, and I haven’t posted a dev log in a while because I haven’t really finished anything, so this will be a progress report. Finished Features: New dirt, and grass textures The old textures suck, because in between blocks there would be like a small section where there is like no detail, so I added those details and recolored the grass bit of the grass texture because the old one was too “limy.” Added bedrock Self-explanatory; no interesting thing happened that I would want to yap about Updated Game rendering Last devlog, I ported my rendering side of the game to LittleJS, a browser game engine. Why? Because I realized that I wouldn’t have the time and effort to manually do advanced stuff like lighting and particles. Hence, I ported to LittleJS. Now, in the days after the port, I had to fix a lot of things and bugs. Originally, the game would render everything, even if it wasn’t on screen, so I fixed that. I made it so that if you couldn’t see the blocks in the camera, they wouldn’t be rendered. Unfinished Features: Flat Game Mode (90% Done): I decided that tinkering with sandbox mode first would be stupid, as I would still have to make players, inventory system, etc. I feel like I’ve finished everything, but there is something missing. The sky. I still need to make the sky. I don’t know if it should be an image or something else. Players (10% Done): All I have done for players is literally a goffy ahh skin (which I should make better) and a player variable. I think you would be able to piece together what I want for this. Custom skins (60% Done): I want to make custom skins. I have completed the UI, the security part of the server-side (aka my old broken ahh Chromebook) code, and a simple UI for it. All I need to make now is server-side code to store the custom skin and deliver it to the client.
Custom Skins! After a lot of time getting the back-end setup (with some help from ChatGPT, I’d have to admit), custom skins are here! (Granted… players aren’t here yet so you can’t really try them out lol.) New Features New page ( https://blxcode.github.io/FlatCraft/upload-skin/ ) Think of it like skindex but with a worse ui Searching for skins Skin Uploading Changes & Bug-Fixes Grass Retexture Dirt Retexture
Progress Update #2: Why, you may ask, do I do progress updates? It’s because only 10 hours MAX can be logged per dev log, and uhh… I think you get the picture. So, without further adieu, this is what I’ve been working on. Unfinished Features: Players (85% Complete) That’s a huge jump from the last time I’ve updated you on the progress on players. Now the thing is, physics is annoying. And I’m not old enough to study calculus at my high school. Which is a shame, as I really like the idea of calculating values based off of differentiating values. I’ve literally just been playing around with the physics at 3 am!??!? Wow! It’s literally 3:30 in the morning. I should go get some sleep. The jumping and crouching are a bit finicky, but I’ll fix them sometime later. Closing Remarks: First of all, a lot of the 10 hours in this progress update have been miscellaneous things like bug fixes or just general tweaks. I’ve also been realizing that this project is big. But the end of the tunnel is still nowhere in sight. Yet, if I can stop sitting around and start sprinting towards, uhh… any direction, there will be light at the end of the tunnel. I hope I can finish this project before school starts. I’ll have to grind like a lot, and especially at night because my siblings are quite brain-rotted, annoying, and loud.
Progress Update #3 I’m too stupid to do physics. I should have made everything with Box2D. I’m currently fiddling with side collisions, as all other collisions (I hope) are done. I’ve also finished jumping and falling physics. Also, I’ve spent another 8 hours, and I want every minute to be for my new 3d printer. Finished Features Jumping My Jumping physics thingy is like the poor and stupid man’s way to do it, but hey… at least it works. It kinda just has a jump multiplyer and it goes down every frame and every frame the player goes up something like 0.05 block units multiplied by the jump multiplier Falling Falling is basically the same as the jumping one. i added sky yes, its a sky :D only a gradient. ill add sun and moon soon prob hopefully idk if there will be night, idk if i can create a night in time. Unfinished Features Side collisions This is stupidlly harder cuz my blocks’ x center is at 0, not 0.5. this means that a block spans from like -0.5 to 0.5. My brain cant handle this… thing.
Players! Players are finally out. After what? 2 progress updates? Wow, that was harder than I imagined. Especially the physics. I had to think creatively and outside of the box for this. Also, this devlog continues from the last one. Just pretend that the progress updates like didn’t exist or just aren’t canon. Finished Features: Players: Player Physics Player Animations Changes: Slightly adjusted dirt texture Increased label elements’ font size Patched weird css border glitch Deleted unnecessary assets (like the custom cursor that only existed for like 5 minutes, 2 months ago) What’s Next (In order): Crouching, and not falling ✅ Drawing tools (hardest one, btw) ✅ Breaking blocks with tools and fists Custom Skins (it’s literally 90 % complete now, but my server is down due to some real life events so have to wait) ✅ Sandbox world Mobs if i have time ship ps. if you are wondering why the screen recording has some static noise, it’s because i have a small desktop fan running like really close, because it’s kinda hot indoors. I don’t know why it’s making tha t sound, it dosnt make that sound irl to be clear. I think it’s because i accidently turned on my mic and my mic is currently my crappy very quiet laptop mic
Bug Fix: I didn’t include the no falling if you are crouching in the last update so i just quickly added an if statement to include that feature.
Block Breaking and Particles! half of the time was spent fixing bugs uhh… ignore that youtube video… New Features: Shadow Particles when touching ground after falling, walking, and after breaking a block Block Breaking Changes & Fixes: Added more things to the block metadata object Fixed collisions not colliding
Drops Part 1 Drops! Though… you can’t pick them up yet… uhhh, and I’m nearing the 10-hour mark, so… yeah. I also completely rewrote the movement code and tweaked the values in collision detection, so that’s like half of the time. Also, it turns out I am not an engineer, as I rewrote my own drops code TWICE in the span of TWO HOURS because of chatgippity roasting me and me roasting myself, respectively. (Also, new dev log format, yay!) New Features Drops (partially) Drops were annoying to implement, partially because I’m a skill issue, and also because I had to learn new things like making classes and stuff like that. Changes & Bug Fixes Collision system revamp The old system was weird and also sometimes inconsistent, so I rewrote the movement system and tweaked the collision system. Overall, a bit of a smaller update if you ask me, and its ONE AND ONLY FEATURE wasn’t complete. Oh well… looks like we’re going to get the next dev log soon.
Drops Part 2 Last devlog, I finished the drop part of drops! This time, I finished the pickup part of drops, and the hold part, though I feel like I do need to tweak the values, I just don’t know by how much. New Features Pick up: The pickup part of drops is basically just an if statement that runs like every frame to see whether or not the player is near enough to a dropped item for them to pick it up. It’s quite simple. Hotbar: I feel like I finished the hotbar, not the inventory system yet, just the hotbar. I finished the “rendering” part, by that I mean like viewing the inventory object and rendering the stuff that is on the hotbar. Changes: Renamed the id of the Inventory div to the Hotbar Readded the FPS counter, and gave it an overhaul The lower arm animation actually plays now
Inventory Ok so i’ve basically just coded the inventory system. uhhh New Features Inventory System Ok so this is how it works: There is an object that has all the invetory data There is a function that renders it it works like that so u dont render the inventory every frame. that would cause SOO MUCH LAG Place blocks Uhhh… place blocks and it also checks if the block u placed collides with any blocks or players and if it is next to a block Changes & Bug Fixes Fixed some weird crouching behavior that I cant really explain cuz it’s like weird. Dont mind the fact that the game bugged out… it’s cuz i forgot to add metadata to the pine logs and rickroll block thingy
Custom Skins Settings Front End Uhhhh it’s in the title… nothing interesting. https://github.com/users/BlxCode/projects/5 New Features Custom Skins are now FULLY 100% Out! custom skins. How it works: A gallery with a bunch of skins and their ids a textbox for the skin ids reload Changes & Bug Fixes None lol
Lighting & Dropping stuff i’ve been slacking off recently, and I mean it. I’ve coded less, and played more games due to the uhhh looming school season starting again but like… i’ve still managed to make things like lighting, dropping stuff, and shuffeling stuff in ur inventory by using the number keys. Features Lighting At first, this was one of the reasons why I decided to switch to little js, but like their system is not designed for 2d minecraft use, so I had to improvise. The lighting system consists of two basic things. One is the ambient lighting, which basically fills the whole screen with light / filling the whole screen without light, and the second thing is like “light objects” by that, I mean like point lights, which are like round lightbulbs per say, and they emit light. Those would be used for stuff like torches. Q Dropping things with q didn’t exist in the 2 part drops update, cuz i was too lazy to implement that. But now, I added that. It’s simple really, it just creates a new droppped item every time u press q. and if u press q with control, then it drops everything in the hotbar slot hovered, and u can drop things in ur inven by hovering over it. Moving things around in ur inventory with the top number keys I added that cuz im just used to that in uhhh…. bloxd.io so yeah, i just added that. Attack anim press mouse button 0 to attack. currently just attack animation for now Changes & Bug fixes Random tick events for stuff like grass turning into dirt or vice versa *greijodkmgrfd idk, it was in my commits smth to do with promises
Tools Update!!!!111 3 more hard gh issues to go! yay it’s like 2:30 on a friday. not bad, but considering school is back, not good either. Honestly, i swear Idk if i can actually finish this before sep 20th, so if i can’t i’ll actually do 100 pushups. and it WILL be on a devlog. so uhh… yeh. idk why but you can see me do 100 pushups. defenatly not in a row tho my arms are actually twigs bro. ok enough yapping, let’s actually get into this. New Features: Tools!!111 tools. the final implementaiton was quite simple actually. I just added tools to the textures, and added them to the metadata, added a few bits of code for the speeding up of breaking blocks and boom! tools. Changes & Bugfixes: Compleated Metadata Drops now produce 80% less lag (by making sure that only 1 shadow per x coord can exist)
Saving worlds… I hope Honsetly, school has been removing litterally half of the day I would have used to do flatcraft, so… yeah. im also writing this at school cuz i needed to sleep. dont tell anyone lol New Features: Saving It’s quite simple actually. Just saving an object with some world data to local storage. Honestly, that’s it. Flower flower. very cool Terrain generation Terrain generation, no ore generation lol
Sprinting this will be my last ever devlog! New Features: FULL Random world generation: It works like this: Seeds: Seeds are not that important, though they do play a part for terrain generation. Terrain: The terrain is basically just a huge array with preset Y levels depending on the terrain type, ie: mountianus, hilly, flat. Ores: Ores are truly random. It dosn’t depend on the seed. Trees: Trees are also truly random Sprinting: Double press the key in the direction you want to go to sprint that’s it! plz rate it well
Fixed some issues regarding prod (wont get paied for this 😭) ALright, even though i just shipped, there were stuff that were broken, first of all i realized that if you have a expensive 4k 240 hz ahh monitor, the game would get very fast due to the fact that I didn’t introduce deltat time, so i introduced delta time. Bug fixes Fixed bug when you were very fast on a 60hz+ monitor Fixed glitch where the animation state changes between falling and breaking a block while breaking a block while falling
FIxed bug where jumping wasn’t scaled to your fps Simple really! it’s on the title Changes & Bug Fixes fixed bug where jumping wasn’t scaled to your fps that bug would have made high fps players not able to jump high, and low fps players to jump SUPER high
Ships:
FlatCraft Basic Info FlatCraft is an open source, MIT licensed 2d Minecraft inspired game. It uses LittleJS for the rendering, and vanilla HTML/CSS/JavaScript for the UI. All the rest was written by me. Challenges: One of the biggest challenge was world generation. The idea was to use simplex noise to make terrain, but there was one problem: It’s uncontrolability. I wanted real biomes, but that coudn’t happen because I didn’t know how to control simplex noise. Nor did I know how to make mountains. I solved it by realizing that this is just a silly 2d Minecraft game for a program designed to get teens to make something, not for teens to make some complex minecraft like game, so I decided to bite the bullet and to just make an array for each biome, and have that array contain the y level of the highest block, and use that array to make the terrain. It’s basically like [1,1,2,2,3,3]. Nothing complicated, and if you played this game long enough you’ll see that each biomes are litterally the same. Most Proud of: I’m actually most proud of the custom skins part of flatcraft. It’s really not that complex, but it took a mesruable amount of time to get it working. I had to learn node.js, finally had a use for a server! and used my old chromebook as my server. I made the precaution of adding a ratelimiter just in case someone tried to take it down or whatever, but yeah. That’s what I’m most proud of. What I learned: Making classes in js NodeJS LittleJS engine Stuff that didnt make it into the game: Game music Mobs Credits Art: Me, mostly me, My little brother Inspired by https://www.planetminecraft.com/texture-pack/digs-simple-pack-1-15-100-complete/ , and https://bloxd.io Programming: Me Libraries used: LittleJS...
|
1793004859.6862261
|
1793091259.6862261
|
|
29722
|
Pikne by @marksdude | Stardance
|
marksdude
|
0
|
115.02
|
0
|
[]
|
[{"post_id": 81292, "ts": "202 [{"post_id": 81292, "ts": "2026-10-20T17:46:43Z", "hours": 6.5956, "text": "I have finished version 0.1 of the firmware. It currently only has a simple menu to check some battery information. It relies on the ArduinoSMBus library for communicating with the BMS and the Adafruit SSD1306 and Adafruit GFX libraries for drawing on the OLED. I also made some wiring diagrams."}, {"post_id": 77053, "ts": "2026-10-05T14:31:05Z", "hours": 2.1569, "text": "Started work on the main firmware file. I will implement the more important stuff first, like the stuff needed for the power bank to function and most of the status displaying. Then, I will start work on the less important features, like more advanced safety (in case one of the BMS’s MOSFETs fail) and communication between the power bank and modules. I have currently made functions for reading the USB output current and for reading the battery charger’s status."}, {"post_id": 74074, "ts": "2026-09-26T16:57:15Z", "hours": 3.0439, "text": "I learned how to send data over UART to ESPHome. I will use this to send battery info from the power bank to the LED controller module, so it could be displayed in Home Assistant. How will it work? First the ATmega328P in the power bank will put all the values that will be sent into a single string. The string will look like this: bat:xx|current:xx|voltage:xx|usb_current:xx Then when the module receives it, ESPHome will run a lambda that splits the received string into separate strings for each value. They will then be converted into floats and sent to the corresponding sensor component. For testing, I used a XIAO ESP32-C3 to send dummy data to a revision 1 LED controller PCB. Next, I will work on module detection or the OLED interface for the power bank."}, {"post_id": 69799, "ts": "2026-09-17T20:11:47Z", "hours": 0.55, "text": "Took some pictures First I’m going to talk about funding. I’m currently waiting for funding. Hopefully I get it before Stardance ends. I requested funding for the power bank and the LED controller module, no flashlight module because I’m prioritizing getting the power bank working. It was also the most expensive module and would have required me to write even more firmware. Firmware development isn’t my strong suit. In the meantime I thought it would be a good idea to ask for permission to use my school’s 3D printers. Got the permission, printed the enclosure and took some pictures. Currently, it is basically just an empty enclosure, I put in the screws, OLED, pogo connector and the first revision non-working PCB to test how the parts would fit and so it would look better on the pictures. That’s all for now, thank you. I will be working on the firmware from now on."}, {"post_id": 66872, "ts": "2026-09-12T20:22:03Z", "hours": 8.9631, "text": "Been working on the BOM. It has been pretty boring. Every PCB has its own BOM and I have put the final price of every one of them into one main BOM so it will be easier to read. I also changed the inductor on the main power bank PCB to a one that fits the enclosure. I found one that has the needed current rating and is small enough so I didn’t have to change anything other than the inductor on the PCB."}, {"post_id": 60975, "ts": "2026-09-03T17:34:00Z", "hours": 1.1475, "text": "Not enough space yay!!! With a higher current inductor comes a bigger package which doesn’t fit. I have a few options now: Change the case Find a smaller connector that can handle the current use a different inductor that isn’t that tall Probably going to try to find a shorter inductor. I may be able to make the 5v regulator inductor smaller because I don’t think it needs a current rating that high and then maybe use the regained space for a wider and shorter inductor."}, {"post_id": 59573, "ts": "2026-09-01T13:56:19Z", "hours": 2.8336, "text": "Found an issue on the BMS board I found that I had connected the cell sense pins in the wrong order. I had connected them like this: B- to VC0, B+ to VC1 and cell 1 to VC2, but it should have been connected like this: B- to VC0, cell 1 to VC1 and B+ to VC2. I almost didn’t notice it because I didn’t check that part of it. I thought that I wouldn’t have made a mistake like that. This wasn’t the only issue with the sense connections the other was that I didn’t use kelvin connections for them. Without kelvin connections you will get less accurate readings because of voltage drop in the copper. I also improved it a little. I added cutouts for the current sensing resistor so I have separate pads for the sensing traces and the high current path. This should improve the current sensing accuracy which means I get a more accurate battery charge estimate. Then I added buttons for waking the IC up for programming and for shutting the output down so the battery can safely be removed. I moved the connector for the thermistors and the balance lead to the other side so the wires won’t have to run near a high current switching inductor which is on the main PCB. Thank you for reading!"}, {"post_id": 57572, "ts": "2026-08-29T19:15:51Z", "hours": 4.9053, "text": "Discovered some issues with the main PCB’s schematic when I was checking it before making the BOM First issue was that the inductor I chose for the battery charge IC (BQ25792) that also makes the 9, 12, 15 and 20V for USB PD had a current rating too little (guess that’s what happens if you design a PCB like this very inexperienced like I was 8 months ago) which would have limited it to around 30W output max, so this time I calculated the required rating myself (previously got the inductor from a reference design). Found that it should have been almost double the previous 7A for the 45W I initially aimed for, but if the IC can handle 60W then why not choose an inductor for 60W? So that’s what I did, the new inductor that has a rating of 15.8A should be able handle 60W. Second was that for some reason I tied the SDRV pin of the battery charge IC to the battery when instead it should have been tied to GND through a 1nf capacitor if not in use. I don’t know why I did it because the datasheet clearly says “Connect a 0402 / 50V / 1nF ceramic capacitor from SDRV to GND when the ship FET is not used.” This may have been the cause why the PCB didn’t work correctly when I made the first prototype of it around 2 months ago. I thought it was because of bad soldering, so I tried to resolder everything with a hot plate and burned bunch of my capacitors and probably some other components too. There were some other minor issues like me choosing footprints too small for some capacitors and not using the output current monitoring of the efuse. The efuse current monitoring isn’t really an issue but it is nice to see the exact output current on the display. I probably skipped it because I couldn’t understand how it worked back then. Thank you for reading!"}, {"post_id": 55106, "ts": "2026-08-26T15:45:34Z", "hours": 6.0947, "text": "Added logos to everything, fixed some alignment issues and added little holes for the module to go into to take stress away from the USB-C plug when dropped or twisted."}, {"post_id": 53222, "ts": "2026-08-23T17:43:03Z", "hours": 7.9406, "text": "Finished the flashlight module case! It will be CNCed out of aluminum, so it could act as a heatsink only the frame that holds the acrylic lens is 3D printed. I tried to fill up as much free space as possible with aluminum so the LEDs could run at max brightness for as long as possible. And… about the LiPo charger module I probably won’t make it I don’t think I have enough time since getting a grant and shipping of the PCBs will take a few weeks, so I may not have enough time to make firmware for everything so I’m skipping it for now."}, {"post_id": 49133, "ts": "2026-08-17T19:24:28Z", "hours": 3.1836, "text": "Started designing the case for the flashlight module. I had to move some stuff around on the driver PCB to make a cutout for the pogo connector. Also changed the connector for the LEDs from JST VH to JST XH for a smaller footprint."}, {"post_id": 47123, "ts": "2026-08-14T19:37:40Z", "hours": 4.6836, "text": "Finished the LED controller shell and made a logo I solved the pogo connector mounting problem by having the front of the upper part open and having the wall on the bottom part."}, {"post_id": 45372, "ts": "2026-08-11T19:45:09Z", "hours": 5.3339, "text": "I’ve been designing the shell for the LED controller module. I Currently have a problem with mounting the pogo connector. The issue is that the design I had in mind won’t work because I have no way of putting brass inserts into the screw holes so I have to find another way. Maybe I could have the top in 2 parts then I could put the brass inserts in."}, {"post_id": 44206, "ts": "2026-08-09T20:18:29Z", "hours": 3.9331, "text": "Finished the LED PCB for the flashlight module I couldn’t fit 40 LEDs like I said I would so there are 30 LEDs. It should still have close to 9000 lm max brightness (It will probably run only for a few seconds at max brightness before it will overheat). I’m just going to drive the LEDs little harder. I first wanted to have connectors for power and the thermistor but I found that JLCPCB only offers 1 layer aluminum core PCBs so I was limited to a 1 layer PCB and I couldn’t use THT connectors so instead I’m going to solder the wires straight to the board."}, {"post_id": 43450, "ts": "2026-08-08T18:21:27Z", "hours": 4.0211, "text": "Finished the LED driver board of the flashlight module! So that’s one of the PCBs done for the flashlight module will do the one that holds the LEDs next. I will be using about 40 of these LEDs so the max brightness will be around 9600 lm. I probably won’t be able to run it at max brightness for very long because it will (probably) hit thermal limits since the only cooling for it is the aluminum core PCB and maybe a CNC aluminum body."}, {"post_id": 42675, "ts": "2026-08-07T15:03:56Z", "hours": 3.1503, "text": "Started designing the flashlight module PCB! I finished the schematic for the driver board yesterday. It’s going to have 2 different PCBs one that does all the communication and driving of the LEDs and the other that is going to have all the LEDs on it. I think thermal management will be easier this way since the LEDs will get pretty hot. I also thought of a name for the project I’m going to name it Pikne which means lightning in estonian."}, {"post_id": 40833, "ts": "2026-08-04T16:44:28Z", "hours": 6.6417, "text": "Finished routing the PCB Now I just got to run it through drc and fix silkscreen. Then the LiPo charger module PCB should be finished."}, {"post_id": 39039, "ts": "2026-08-01T18:32:26Z", "hours": 4.9156, "text": "Finished the LiPo charger module schematic! I had some problems making the battery balancing circuitry because I didn’t know how to switch the balancing mosfets without frying the microcontroller. The problem was that the ground reference for the microcontroller and mosfets were different that basically means that for example the mosfet connected for balancing cell 3 of the battery will have its reference from cell 3 of the pack but the microcontroller will have its reference from the negative of the pack (cell 1) so for the mosfet its source will be at 0V (gnd), but for the microcontroller the mosfet’s source will be around 10.8V. That will mean if I try to turn on the mosfet with 3.3V from the microcontroller Vgs would equal -7.5V (3.3V - 10.8V) which means the mosfet will not turn on since for an N-channel mosfet Vgs has to be positive (atleast 2V for the one I used). First I wanted to use a P-channel mosfet to connect the positive side of the cell to the gate of the N-channel mosfet that would turn on the N-channel mosfet since Vgs would be around 3.6V (3.6V - 0V) but when the balancing mosfet will be off the P-channel mosfet’s gate will be pulled up to the cell voltage so for the mosfets its around 3.6V but for the microcontroller around 10.8v for cell 3 that will fry the microcontroller. Instead I used a octocoupler to connect the positive side of the cell to the N-channel mosfet. Like this I can turn the balancing mosfet on without having the high voltage on the pin of the microcontroller. That probably wasn’t a very good explanation. I’m not very good at explaining. Expected features of the module: Supports charging 1-4S LiPo and Li-Ion batteries Max charge current: 5-6A (1S), 4-4.5A (2S), 3A (3S), 2A (4S) If you actually read through all of this, thank you!"}, {"post_id": 35984, "ts": "2026-07-27T19:43:01Z", "hours": 2.7172, "text": "Finished the shell! This should mean that the hardware of the power bank is mostly finished I still have to test it and then also make firmware for it. Now I think I’m gonna start working more on the modules. I currently have these planned: A Led controller module that will integrate with Home Assistant and allow you to control led strips and stuff (I already have a PCB made for this one). A LiPo charger module that will allow you to charge up to 3s LiPos maybe even 4s A flashlight module (I don’t think I have to explain this) If you have any ideas on more modules I should make please comment them."}, {"post_id": 35430, "ts": "2026-07-26T20:40:28Z", "hours": 8.3822, "text": "Got done with the redesign of the front It took longer than I thought it would. Most of the time I spent fixing the stuff that broke after changing the shell size, but after 8h it’s done! Now I just gotta figure out the button placement again because the old place won’t work with the new design and do some finishing touches and then the shell should be ready. Also I didn’t need to redesign the BMS because the current design fit the new design no problem."}, {"post_id": 33690, "ts": "2026-07-23T20:18:58Z", "hours": 4.6111, "text": "I had almost finished the shell but I got an idea on how to make the power bank a little smaller (2 mm thinner and 4-10 mm shorter). So now I’m gonna redesign the BMS and hope that my idea will actually work without any clearance issues. And also I now have a github repo for the project so you can go take a look at the current PCB designs yourself."}, {"post_id": 32507, "ts": "2026-07-21T18:49:13Z", "hours": 7.6381, "text": "I finished the lower shell part! I ran into some issues with the button placement because I didn’t think about it when designing the main PCB. I placed the button too close to the edge of the PCB, leaving only about 3mm of space between the button and the wall of the shell, as shown in one of the pictures. Since I already have the PCB and I don’t want to order a new revision just to move the button, I will use a different button on the side of the power bank that I will solder to the original button pads with wires. It’s probably not the best solution, but it should work."}, {"post_id": 28833, "ts": "2026-07-15T10:39:10Z", "hours": 6.8114, "text": "So I had to resolder the main PCB because I ripped a pad off a IC while trying to reflow it. I learned the hard way that capacitors also don’t like being on a hot plate for too long. I ended up burning most of them. Now I have to wait for new capacitors before I can fully assemble the PCB."}, {"post_id": 22286, "ts": "2026-07-04T17:52:55Z", "hours": 4.7672, "text": "First devlog on my power bank. Just finished the battery holder in cad. Next will be the lower shell part."}]...
|
Title: Pikne by @marksdude | Stardance
Devlogs:
F Title: Pikne by @marksdude | Stardance
Devlogs:
First devlog on my power bank. Just finished the battery holder in cad. Next will be the lower shell part.
So I had to resolder the main PCB because I ripped a pad off a IC while trying to reflow it. I learned the hard way that capacitors also don’t like being on a hot plate for too long. I ended up burning most of them. Now I have to wait for new capacitors before I can fully assemble the PCB.
I finished the lower shell part! I ran into some issues with the button placement because I didn’t think about it when designing the main PCB. I placed the button too close to the edge of the PCB, leaving only about 3mm of space between the button and the wall of the shell, as shown in one of the pictures. Since I already have the PCB and I don’t want to order a new revision just to move the button, I will use a different button on the side of the power bank that I will solder to the original button pads with wires. It’s probably not the best solution, but it should work.
I had almost finished the shell but I got an idea on how to make the power bank a little smaller (2 mm thinner and 4-10 mm shorter). So now I’m gonna redesign the BMS and hope that my idea will actually work without any clearance issues. And also I now have a github repo for the project so you can go take a look at the current PCB designs yourself.
Got done with the redesign of the front It took longer than I thought it would. Most of the time I spent fixing the stuff that broke after changing the shell size, but after 8h it’s done! Now I just gotta figure out the button placement again because the old place won’t work with the new design and do some finishing touches and then the shell should be ready. Also I didn’t need to redesign the BMS because the current design fit the new design no problem.
Finished the shell! This should mean that the hardware of the power bank is mostly finished I still have to test it and then also make firmware for it. Now I think I’m gonna start working more on the modules. I currently have these planned: A Led controller module that will integrate with Home Assistant and allow you to control led strips and stuff (I already have a PCB made for this one). A LiPo charger module that will allow you to charge up to 3s LiPos maybe even 4s A flashlight module (I don’t think I have to explain this) If you have any ideas on more modules I should make please comment them.
Finished the LiPo charger module schematic! I had some problems making the battery balancing circuitry because I didn’t know how to switch the balancing mosfets without frying the microcontroller. The problem was that the ground reference for the microcontroller and mosfets were different that basically means that for example the mosfet connected for balancing cell 3 of the battery will have its reference from cell 3 of the pack but the microcontroller will have its reference from the negative of the pack (cell 1) so for the mosfet its source will be at 0V (gnd), but for the microcontroller the mosfet’s source will be around 10.8V. That will mean if I try to turn on the mosfet with 3.3V from the microcontroller Vgs would equal -7.5V (3.3V - 10.8V) which means the mosfet will not turn on since for an N-channel mosfet Vgs has to be positive (atleast 2V for the one I used). First I wanted to use a P-channel mosfet to connect the positive side of the cell to the gate of the N-channel mosfet that would turn on the N-channel mosfet since Vgs would be around 3.6V (3.6V - 0V) but when the balancing mosfet will be off the P-channel mosfet’s gate will be pulled up to the cell voltage so for the mosfets its around 3.6V but for the microcontroller around 10.8v for cell 3 that will fry the microcontroller. Instead I used a octocoupler to connect the positive side of the cell to the N-channel mosfet. Like this I can turn the balancing mosfet on without having the high voltage on the pin of the microcontroller. That probably wasn’t a very good explanation. I’m not very good at explaining. Expected features of the module: Supports charging 1-4S LiPo and Li-Ion batteries Max charge current: 5-6A (1S), 4-4.5A (2S), 3A (3S), 2A (4S) If you actually read through all of this, thank you!
Finished routing the PCB Now I just got to run it through drc and fix silkscreen. Then the LiPo charger module PCB should be finished.
Started designing the flashlight module PCB! I finished the schematic for the driver board yesterday. It’s going to have 2 different PCBs one that does all the communication and driving of the LEDs and the other that is going to have all the LEDs on it. I think thermal management will be easier this way since the LEDs will get pretty hot. I also thought of a name for the project I’m going to name it Pikne which means lightning in estonian.
Finished the LED driver board of the flashlight module! So that’s one of the PCBs done for the flashlight module will do the one that holds the LEDs next. I will be using about 40 of these LEDs so the max brightness will be around 9600 lm. I probably won’t be able to run it at max brightness for very long because it will (probably) hit thermal limits since the only cooling for it is the aluminum core PCB and maybe a CNC aluminum body.
Finished the LED PCB for the flashlight module I couldn’t fit 40 LEDs like I said I would so there are 30 LEDs. It should still have close to 9000 lm max brightness (It will probably run only for a few seconds at max brightness before it will overheat). I’m just going to drive the LEDs little harder. I first wanted to have connectors for power and the thermistor but I found that JLCPCB only offers 1 layer aluminum core PCBs so I was limited to a 1 layer PCB and I couldn’t use THT connectors so instead I’m going to solder the wires straight to the board.
I’ve been designing the shell for the LED controller module. I Currently have a problem with mounting the pogo connector. The issue is that the design I had in mind won’t work because I have no way of putting brass inserts into the screw holes so I have to find another way. Maybe I could have the top in 2 parts then I could put the brass inserts in.
Finished the LED controller shell and made a logo I solved the pogo connector mounting problem by having the front of the upper part open and having the wall on the bottom part.
Started designing the case for the flashlight module. I had to move some stuff around on the driver PCB to make a cutout for the pogo connector. Also changed the connector for the LEDs from JST VH to JST XH for a smaller footprint.
Finished the flashlight module case! It will be CNCed out of aluminum, so it could act as a heatsink only the frame that holds the acrylic lens is 3D printed. I tried to fill up as much free space as possible with aluminum so the LEDs could run at max brightness for as long as possible. And… about the LiPo charger module I probably won’t make it I don’t think I have enough time since getting a grant and shipping of the PCBs will take a few weeks, so I may not have enough time to make firmware for everything so I’m skipping it for now.
Added logos to everything, fixed some alignment issues and added little holes for the module to go into to take stress away from the USB-C plug when dropped or twisted.
Discovered some issues with the main PCB’s schematic when I was checking it before making the BOM First issue was that the inductor I chose for the battery charge IC (BQ25792) that also makes the 9, 12, 15 and 20V for USB PD had a current rating too little (guess that’s what happens if you design a PCB like this very inexperienced like I was 8 months ago) which would have limited it to around 30W output max, so this time I calculated the required rating myself (previously got the inductor from a reference design). Found that it should have been almost double the previous 7A for the 45W I initially aimed for, but if the IC can handle 60W then why not choose an inductor for 60W? So that’s what I did, the new inductor that has a rating of 15.8A should be able handle 60W. Second was that for some reason I tied the SDRV pin of the battery charge IC to the battery when instead it should have been tied to GND through a 1nf capacitor if not in use. I don’t know why I did it because the datasheet clearly says “Connect a 0402 / 50V / 1nF ceramic capacitor from SDRV to GND when the ship FET is not used.” This may have been the cause why the PCB didn’t work correctly when I made the first prototype of it around 2 months ago. I thought it was because of bad soldering, so I tried to resolder everything with a hot plate and burned bunch of my capacitors and probably some other components too. There were some other minor issues like me choosing footprints too small for some capacitors and not using the output current monitoring of the efuse. The efuse current monitoring isn’t really an issue but it is nice to see the exact output current on the display. I probably skipped it because I couldn’t understand how it worked back then. Thank you for reading!
Found an issue on the BMS board I found that I had connected the cell sense pins in the wrong order. I had connected them like this: B- to VC0, B+ to VC1 and cell 1 to VC2, but it should have been connected like this: B- to VC0, cell 1 to VC1 and B+ to VC2. I almost didn’t notice it because I didn’t check that part of it. I thought that I wouldn’t have made a mistake like that. This wasn’t the only issue with the sense connections the other was that I didn’t use kelvin connections for them. Without kelvin connections you will get less accurate readings because of voltage drop in the copper. I also improved it a little. I added cutouts for the current sensing resistor so I have separate pads for the sensing traces and the high current path. This should improve the current sensing accuracy which means I get a more accurate battery charge estimate. Then I added buttons for waking the IC up for programming and for shutting the output down so the battery can safely be removed. I moved the connector for the thermistors and the balance lead to the other side so the wires won’t have to run near a high current switching inductor which is on the main PCB. Thank you for reading!
Not enough space yay!!! With a higher current inductor comes a bigger package which doesn’t fit. I have a few options now: Change the case Find a smaller connector that can handle the current use a different inductor that isn’t that tall Probably going to try to find a shorter inductor. I may be able to make the 5v regulator inductor smaller because I don’t think it needs a current rating that high and then maybe use the regained space for a wider and shorter inductor.
Been working on the BOM. It has been pretty boring. Every PCB has its own BOM and I have put the final price of every one of them into one main BOM so it will be easier to read. I also changed the inductor on the main power bank PCB to a one that fits the enclosure. I found one that has the needed current rating and is small enough so I didn’t have to change anything other than the inductor on the PCB.
Took some pictures First I’m going to talk about funding. I’m currently waiting for funding. Hopefully I get it before Stardance ends. I requested funding for the power bank and the LED controller module, no flashlight module because I’m prioritizing getting the power bank working. It was also the most expensive module and would have required me to write even more firmware. Firmware development isn’t my strong suit. In the meantime I thought it would be a good idea to ask for permission to use my school’s 3D printers. Got the permission, printed the enclosure and took some pictures. Currently, it is basically just an empty enclosure, I put in the screws, OLED, pogo connector and the first revision non-working PCB to test how the parts would fit and so it would look better on the pictures. That’s all for now, thank you. I will be working on the firmware from now on.
I learned how to send data over UART to ESPHome. I will use this to send battery info from the power bank to the LED controller module, so it could be displayed in Home Assistant. How will it work? First the ATmega328P in the power bank will put all the values that will be sent into a single string. The string will look like this: bat:xx|current:xx|voltage:xx|usb_current:xx Then when the module receives it, ESPHome will run a lambda that splits the received string into separate strings for each value. They will then be converted into floats and sent to the corresponding sensor component. For testing, I used a XIAO ESP32-C3 to send dummy data to a revision 1 LED controller PCB. Next, I will work on module detection or the OLED interface for the power bank.
Started work on the main firmware file. I will implement the more important stuff first, like the stuff needed for the power bank to function and most of the status displaying. Then, I will start work on the less important features, like more advanced safety (in case one of the BMS’s MOSFETs fail) and communication between the power bank and modules. I have currently made functions for reading the USB output current and for reading the battery charger’s status.
I have finished version 0.1 of the firmware. It currently only has a simple menu to check some battery information. It relies on the ArduinoSMBus library for communicating with the BMS and the Adafruit SSD1306 and Adafruit GFX libraries for drawing on the OLED. I also made some wiring diagrams....
|
1792532864.413885
|
1793137664.413885
|
|
3460
|
Ascend - The Chosen One by @revankotapati | Starda Ascend - The Chosen One by @revankotapati | Stardance...
|
revankotapati
|
1
|
115.0
|
634
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-17T13:31:36Z", "hours": 115.0, "multiplier": 9.99, "payout": 634, "blessing": "neutral", "text": "This is a 3D FPS game that has a campaign and arcade mode. The player progresses through worlds and defeats enemies to win the campaign. A player’s stats are upgradable, and points to upgrade them are earned through finishing levels. There are 5 worlds and 10 levels each, with a boss at the 10th level. Once the final boss is defeated, the game ends with special aspects, which I do not want to ruin, and you can either continue the game or exit. I faced multiple challenges when making this game. I had to learn Godot and asset building for the first time. It was a long process, so I spent more time learning than coding. I feel that it turned out to be a decent game, but it was quite a large .exe file, and when zipped, it was 32MB. It runs very slowly on my computer, and that’s why I made this project. I built it so that I can get points and buy a new one.", "repo": "https://github.com/RevanK10/Ascend---The-Chosen-One", "demo": "https://revank.itch.io/ascend-the-chosen-one"}]...
|
[{"post_id": 30123, "ts": "202 [{"post_id": 30123, "ts": "2026-07-17T13:20:37Z", "hours": 3.2883, "text": "I finished the game, as far as I know. I fixed all the enemy spawning and their location off the ground. I added all enemy assets to the game and also added a piercing spear upgrade to the game, which allows the player to hit multiple enemies in a row with a single projectile. I also added the arcade mode to the game with minibosses and bosses every few waves."}, {"post_id": 24081, "ts": "2026-07-07T12:44:25Z", "hours": 7.0664, "text": "I fixed the enemy meshes, so they are on the ground instead of in the ground. I also was able to fix some of the spawning errors, with the player being launched into the sky at the start of the level. At this point, I am working on adding the base enemies to the game, which I am trying to find a way to do dynamically to ensure that the sheer number of enemy instances does not slow the game down. The size of the boss enemies is still an issue, however, but I will fix this soon. I feel like I am going down a rabbit hole. As I implement a feature, I find like 10 more that I could implement to make this game better."}, {"post_id": 20723, "ts": "2026-07-02T12:09:26Z", "hours": 6.2111, "text": "For this devlog, I have not achieved much other than adding a few more assets to the worlds. Right now, I am trying to figure out how to add the meshes for my enemies. I created a single base enemy scene, and the code is not supporting the addition of paths to the mesh objects. I also added cinematic cutscenes with the player and other characters. They look horrible right now, but once the meshes go in, they will look much better. The spear is the only mesh right now."}, {"post_id": 18706, "ts": "2026-06-29T21:50:54Z", "hours": 17.9656, "text": "Since the last post, I finished designing the worlds and added basic assets. For example, the 3rd world, which consists of human enemies, has an outpost, castle, tarps, and much more. Each world has its own theme, so it looks vastly different as the player goes through each world. Also, I forgot to record my 3d models, but I finished most of those as well. I only have 2-3 enemy models left. I coded the assets so they would only generate when the player accesses the specific world, so it takes up less space. I also improved the HUD, and added cutscenes throughout the game. Currently, the cutscenes are just text, but I plan to make them videos of the player interacting with the characters. I will also finish the rest of the 3d models and add NPCs that grant sidequests. However, the sidequests might be for another time. I predict that I am 80-85% done with the base game."}, {"post_id": 13760, "ts": "2026-06-22T15:38:49Z", "hours": 16.1503, "text": "I finished the basics of the new game’s implementation. The main menu UI is improved and the player movement and projectile throwing functionality looks better as well. Within the UI, I was able to ensure that the color changes as the user hovers and presses the buttons. The title design will be improved and I want to make the background more transparent and add a picture of the main character’s figure on the main menu. My next steps also include making a few levels and finish updating all of the UI. I have spent a lot of time fixing the errors I have run into and combing through Godot documentation."}, {"post_id": 10576, "ts": "2026-06-17T11:45:24Z", "hours": 39.7478, "text": "Update 3 This game was such a headache to make. I initially finished a working prototype of this game with an arcade mode where the enemies spawn based on AI, which the user can call through the API. However, I still had to add the textures and my designed 3d models. When I tried to put more importance on the UI for both the player’s side, like the location of the health bar, and the general UI, like the main menu screen, I found that any change crashed it. I spent hours reading the Godot documentation to understand the organization of the UI, but to no success. So, I switched gears and tried again, following an old tutorial from Godot 3, which I soon realized would not work. Therefore, I scrapped that and created another version that I hope will work. If this does not work, I would have to rely on my prototype and complete it. As my first game, it’s not leaving a good first impression of game development, which I have heard many good things about. Also, the prototype’s UI isn’t great, but it functions decently. The capsule in different colors acts as the enemies, but I have already attempted to design some low-poly 3d models."}, {"post_id": 4916, "ts": "2026-06-08T14:43:39Z", "hours": 17.5036, "text": "Update 2 Finished the world and arcade part of the game. After further consideration, I decided to add a story mode to the game and design more models. I also finished 2 out of 3 models for my enemies and add effects and scenes to the game screen. However, I will have to create a new project and start again with the world and characters to better organize my scenes and scripts in Godot. This is my first attempt at game development, so I am attempting to figure out how I can improve my code and organization quality while improving my game. Another feature that I have been able to add is the addition of special projectiles: 1. Projectiles that act as magnets and pull all enemies together 2. Projectiles that chain hit multiple enemies and stop them for a brief amount of time 3. Projectiles that explode and impact multiple enemies Below is an image of my code for my new project. I will continue to update on my journey."}, {"post_id": 1624, "ts": "2026-06-03T19:14:58Z", "hours": 7.155, "text": "Created the environment, enemies, character and the basic UI. My next task is to work on enhancing the UI and improving the physics of the game, especially movement."}]...
|
Title: Ascend - The Chosen One by @revankotapati | Title: Ascend - The Chosen One by @revankotapati | Stardance
Devlogs:
Created the environment, enemies, character and the basic UI. My next task is to work on enhancing the UI and improving the physics of the game, especially movement.
Update 2 Finished the world and arcade part of the game. After further consideration, I decided to add a story mode to the game and design more models. I also finished 2 out of 3 models for my enemies and add effects and scenes to the game screen. However, I will have to create a new project and start again with the world and characters to better organize my scenes and scripts in Godot. This is my first attempt at game development, so I am attempting to figure out how I can improve my code and organization quality while improving my game. Another feature that I have been able to add is the addition of special projectiles: 1. Projectiles that act as magnets and pull all enemies together 2. Projectiles that chain hit multiple enemies and stop them for a brief amount of time 3. Projectiles that explode and impact multiple enemies Below is an image of my code for my new project. I will continue to update on my journey.
Update 3 This game was such a headache to make. I initially finished a working prototype of this game with an arcade mode where the enemies spawn based on AI, which the user can call through the API. However, I still had to add the textures and my designed 3d models. When I tried to put more importance on the UI for both the player’s side, like the location of the health bar, and the general UI, like the main menu screen, I found that any change crashed it. I spent hours reading the Godot documentation to understand the organization of the UI, but to no success. So, I switched gears and tried again, following an old tutorial from Godot 3, which I soon realized would not work. Therefore, I scrapped that and created another version that I hope will work. If this does not work, I would have to rely on my prototype and complete it. As my first game, it’s not leaving a good first impression of game development, which I have heard many good things about. Also, the prototype’s UI isn’t great, but it functions decently. The capsule in different colors acts as the enemies, but I have already attempted to design some low-poly 3d models.
I finished the basics of the new game’s implementation. The main menu UI is improved and the player movement and projectile throwing functionality looks better as well. Within the UI, I was able to ensure that the color changes as the user hovers and presses the buttons. The title design will be improved and I want to make the background more transparent and add a picture of the main character’s figure on the main menu. My next steps also include making a few levels and finish updating all of the UI. I have spent a lot of time fixing the errors I have run into and combing through Godot documentation.
Since the last post, I finished designing the worlds and added basic assets. For example, the 3rd world, which consists of human enemies, has an outpost, castle, tarps, and much more. Each world has its own theme, so it looks vastly different as the player goes through each world. Also, I forgot to record my 3d models, but I finished most of those as well. I only have 2-3 enemy models left. I coded the assets so they would only generate when the player accesses the specific world, so it takes up less space. I also improved the HUD, and added cutscenes throughout the game. Currently, the cutscenes are just text, but I plan to make them videos of the player interacting with the characters. I will also finish the rest of the 3d models and add NPCs that grant sidequests. However, the sidequests might be for another time. I predict that I am 80-85% done with the base game.
For this devlog, I have not achieved much other than adding a few more assets to the worlds. Right now, I am trying to figure out how to add the meshes for my enemies. I created a single base enemy scene, and the code is not supporting the addition of paths to the mesh objects. I also added cinematic cutscenes with the player and other characters. They look horrible right now, but once the meshes go in, they will look much better. The spear is the only mesh right now.
I fixed the enemy meshes, so they are on the ground instead of in the ground. I also was able to fix some of the spawning errors, with the player being launched into the sky at the start of the level. At this point, I am working on adding the base enemies to the game, which I am trying to find a way to do dynamically to ensure that the sheer number of enemy instances does not slow the game down. The size of the boss enemies is still an issue, however, but I will fix this soon. I feel like I am going down a rabbit hole. As I implement a feature, I find like 10 more that I could implement to make this game better.
I finished the game, as far as I know. I fixed all the enemy spawning and their location off the ground. I added all enemy assets to the game and also added a piercing spear upgrade to the game, which allows the player to hit multiple enemies in a row with a single projectile. I also added the arcade mode to the game with minibosses and bosses every few waves.
Ships:
This is a 3D FPS game that has a campaign and arcade mode. The player progresses through worlds and defeats enemies to win the campaign. A player’s stats are upgradable, and points to upgrade them are earned through finishing levels. There are 5 worlds and 10 levels each, with a boss at the 10th level. Once the final boss is defeated, the game ends with special aspects, which I do not want to ruin, and you can either continue the game or exit. I faced multiple challenges when making this game. I had to learn Godot and asset building for the first time. It was a long process, so I spent more time learning than coding. I feel that it turned out to be a decent game, but it was quite a large .exe file, and when zipped, it was 32MB. It runs very slowly on my computer, and that’s why I made this project. I built it so that I can get points and buy a new one....
|
1793066052.5119205
|
1793152452.5119205
|
|
14699
|
Hollow - Game Dev by @magomango | Stardance
|
magomango
|
0
|
114.14
|
0
|
[]
|
[{"post_id": 80859, "ts": "202 [{"post_id": 80859, "ts": "2026-10-19T01:43:18Z", "hours": 12.4375, "text": "FAV ROOM + glow in the dark pumpkins?? ~ whats up so i got the enemy to work. thank god. PLUS I GOT MY FAVORITE-ST ROOM EVER MADE!! Implementation/fix for enemy Looping btw 2 rooms: wander code picked farthest random point, so movement was lwk sporadic and weird. So we switched to getting the first valid point randomly generated instead. Walked off into the void: bc the navigationmesh or where it can roam WAS PARTIALLY OUTSIDE. bruh. so just resized the NM Never saw me or chased: LMAO this was so funny. So apparently my body was like 115 WHOLE-STINKING units away from where the code thought I was.. so easy fix, but bruh. Lost me at corners when i sharp turned: chase_memory now is for keeping track of position even after losing sight. Also added the hit screen, which is like a little bit of blood, for funsies THE ROOM OMGGOGMG - this was so heavily inspired (not copied… cuz yk i got crates here) by that one bunker room in Stay Out of the House by PUPPETCOMBO (omg peakkk). it’s a maze in there. check out the 2nd image! Future PUZZLES. OMG (still) I have so many ideas and so little timeeee. PS: wanted to fit all images in one frame. (yea okay syre bvro)"}, {"post_id": 79448, "ts": "2026-10-14T01:05:09Z", "hours": 10.0569, "text": "GUMBALLS ~ whats up FINALLY finished decorating?? Okay, so I got the enemy to work - FOR LIKE 5 SECONDS - before i broke it again T-T. IDEK what I did bruh. Implementation So I baked a navigationmesh which is all the places the enemy can go (eg mostly where the player can go mostly) and then successfully (for a while at least) made it move randomly and chase the player when it crossed its line of view. It would even hit the player and make a bloody screen show up. BUT NOW IT DOESN’T WORK. HUhhh?? It doesn’t even move at all. So comes debugging: I integrated each step one by one instead of working on the code for like 5 hours and then testing it. Hopefully I can get this thing to work ugh. (My desc are lwk bad here but its because Im raging) Future PUZZLES. OMG I have so many ideas and so little timeeee. anyway, here’s this gumball machine which might be my favorite thing ever. toodles"}, {"post_id": 77150, "ts": "2026-10-05T19:44:07Z", "hours": 10.9308, "text": "WE GOT CABINETS ~ Happy Spooky-Season!! HORROR SEASON + whats up Player can finally open doors- nope not doors, those are harder to implement than cabinets. But then isn’t a door literally just a big cabinet? #showerthoughts Implementation Basically, interact ‘E’ asks whether the raycast, or the “imaginary line” shot out the player though the red dot in the center, hits the object. If the player is standing close enough and they press E, it turns the door 90 degrees about the side aixs. It took a bit to implement bc I kept MESSING UP what the raycast would collid with. Plus this cabinet is like A MILLION different pieces. it legit takes 10 seconds to scroll through everything. I mean ig bro. Future Do this to like all the other cabinets (T-T), fix enemy (idk why its glitching), implement puzzles. AND ADD HALLOWEEN EASTER EGGS! (or are they called Halloween Eggs bc its not rlly easter… #showerthoughtsagain… haha)"}, {"post_id": 72476, "ts": "2026-09-23T01:17:52Z", "hours": 10.0992, "text": "PLAYGROUND - and pick up I added this cool playground into the game, where you can actually go inside and even slide down the slide. Peak childhood nostalgia :) You can also now pick up items and drop them realistically, affected by gravity. I’m holding a hammer in this image! I think the game is coming along well. Slowly… AHhhh gotta pick up the pace."}, {"post_id": 71017, "ts": "2026-09-20T06:44:20Z", "hours": 8.9114, "text": "Still decorating… Sometimes the things you look the hardest for… Is just in plain sight… I also added in the enemy. Dw it won’t be a cubicle forever."}, {"post_id": 68393, "ts": "2026-09-15T01:40:40Z", "hours": 12.5781, "text": "** PARKOUR ** Still decorating. but im so proud of myself for making this little parkour. the ladder was so hard to get the player to actually get on T-T"}, {"post_id": 62367, "ts": "2026-09-05T18:10:53Z", "hours": 9.9689, "text": "Hallow Continued - MECHANICS ~ What’s been going on Still working on decorating. Aesthetics are important oookkk? Been working on mechanics, such as interacting. Since these models are from online, I have to resize everything and also make a function so they can be interacted with. How it works: basically you just have to be close enough to some object, then press ‘E’ to interact with the object, which then causes some change. For example, this cabinet opens, but I’m planning on adding different puzzles which isn’t as simple as opening a drawer. Issues: Since the hitbox (or CollisionShape3D in Godot) is over the whole cabinet, it opens all the drawers. I guess that makes it easier for the player lmao. But if I wanted to make it over each drawer, then I would’ve had to make smaller hitboxes and arranged them properly. I accidentally made this cabinet TOO TALL T-T. So I wonder how the player will get up there… (totally on purpose haha) It limits which models I could take from online. A lot of models are not separated into parts (eg drawer1 is attached permanently to drawer2), meaning they can’t actually open. I realized this half way thru scavenging. :( Also started on the enemy AI stuff, but it’s not that done yet. ~ Plan Continue decorating, making them interactable. I have also made a whole map of the layout and the fun puzzles I’m planning to put in. I would share it but spoilers… :) Credit for cabinet below: Bedside table: “Bedside table old” ( https://skfb.ly/owuAQ ) by Nollien is licensed under Creative Commons Attribution ( http://creativecommons.org/licenses/by/4.0/ ). SKETCHFAB is a peakkk website! pretty realistic looking things on here!"}, {"post_id": 54118, "ts": "2026-08-24T22:49:47Z", "hours": 6.8272, "text": "Hallow Continued - COUCHES ~ What’s been going on Really right now is one of the fun-ner parts: just adding in open-license 3D models from online and decorating the whole place (in- and ex-terior). And obviously crediting everything on this massive google doc. 👍 I was hoping it would be sorta fast, but tell me how it’s been a few hours already lol T-T ~ After this Make everything interact-able and bring in the props and tools you need to find to escape with. Some of these models don’t have an interior, so I’ll need to figure how to sideball that issue. And a gamedev’s worst nightmare: doors… 👀 Ohhh and also rearrange my whole filesystem and Scene panel. Uhhh which door is which again…. absolute monstrosity right now… Credit for sofa below: “trashy backyard sofa” ( https://skfb.ly/pHVBH ) by Schmoldt5000 is licensed under Creative Commons Attribution ( http://creativecommons.org/licenses/by/4.0/). SKETCHFAB is a peakkk website! pretty realistic looking things on here!"}, {"post_id": 47898, "ts": "2026-08-16T05:24:37Z", "hours": 19.6883, "text": "Devlog 2 - Layout Done It’s been a while since my last post, but I’ve finished the pretty giant layout. I think I want a couple of floors, but that might be ambitious. We’ll see. Right now it has over 10 rooms and an outside! The doors are a big large right now, but this is an orphanage and the player is a kid so maybe its ok. 😓 I also started brainstorming some puzzles. Next step: decorating the interior and exterior and adding in items."}, {"post_id": 27028, "ts": "2026-07-12T05:56:11Z", "hours": 12.6417, "text": "Devlog #1 - Hollow GAME Dev Hey everyone! This is my first time posting and first time ever doing anything Hack Club related. I’ve seen so many cool projects already, and it really inspired me to create something and ship it out. Lmao, skip all this rant and go to the bottom for the actual project to save time! I’m developing a GAME ! – A little about me and why I’m here : I LOVE horror! Especially horror games. However I’m more of a person who likes watching people play games and am too scared sometimes to play them myself. Things like the Resident Evil series, indie games (like by Puppet Combo), or even mobile games like Granny. So I thought why not make one myself since it’s summer and all. I’m familiar with programming but totally new to game dev, so this will be an interesting adventure. – What I’ve learned so far about the game dev process : There’s a LOT to learn and decide. Eg What gaming platform you wanna use (so many differences lmao) like unreal, unity, and godot Plot of your game (so MUCH stuff to consider here) General gameplay style (open exploration? cutscene hand holding gameplay?) How long you want your game to be (uhhh…) and so much more… 😓 I’ve tried making a GDD (game dev doc), and rn its still being refined as the vision comes together. —– MY GAME PREMISE —– Game name: Hollow Gist: The player is stuck in an Orphanage and strives for a way out + An investigator attempts to voyage to the Orphanage, but seeks shelter in somewhere unknown… (trying to go for the multiple enemy/story happening but its all connected…) **Inspo: **HEAVILY from Resident Evil 7 (the Baker’s House), the mobile game The Evil Nun, puppet combo games (like Stay Out of the House or Nun Massacre), random dreams I’ve had (lol) Platform: GODOT (highkey underrated) – Whats done so far a dark environment and a few bare rooms stamina bar that can be recharged flashlight movement controls 1/2 of door mechanics (so many memes about how game devs hate door physics hahaha.. yea me too) Js the first week, so player basic mechanics are in. – Future plans for posts Polish the environment and figuring out the enemy Finishing the GDD and posting clips of it Posting a short demo game on Itch.io Thanks for reading this post!"}]...
|
Title: Hollow - Game Dev by @magomango | Stardance Title: Hollow - Game Dev by @magomango | Stardance
Devlogs:
Devlog #1 - Hollow GAME Dev Hey everyone! This is my first time posting and first time ever doing anything Hack Club related. I’ve seen so many cool projects already, and it really inspired me to create something and ship it out. Lmao, skip all this rant and go to the bottom for the actual project to save time! I’m developing a GAME ! – A little about me and why I’m here : I LOVE horror! Especially horror games. However I’m more of a person who likes watching people play games and am too scared sometimes to play them myself. Things like the Resident Evil series, indie games (like by Puppet Combo), or even mobile games like Granny. So I thought why not make one myself since it’s summer and all. I’m familiar with programming but totally new to game dev, so this will be an interesting adventure. – What I’ve learned so far about the game dev process : There’s a LOT to learn and decide. Eg What gaming platform you wanna use (so many differences lmao) like unreal, unity, and godot Plot of your game (so MUCH stuff to consider here) General gameplay style (open exploration? cutscene hand holding gameplay?) How long you want your game to be (uhhh…) and so much more… 😓 I’ve tried making a GDD (game dev doc), and rn its still being refined as the vision comes together. —– MY GAME PREMISE —– Game name: Hollow Gist: The player is stuck in an Orphanage and strives for a way out + An investigator attempts to voyage to the Orphanage, but seeks shelter in somewhere unknown… (trying to go for the multiple enemy/story happening but its all connected…) **Inspo: **HEAVILY from Resident Evil 7 (the Baker’s House), the mobile game The Evil Nun, puppet combo games (like Stay Out of the House or Nun Massacre), random dreams I’ve had (lol) Platform: GODOT (highkey underrated) – Whats done so far a dark environment and a few bare rooms stamina bar that can be recharged flashlight movement controls 1/2 of door mechanics (so many memes about how game devs hate door physics hahaha.. yea me too) Js the first week, so player basic mechanics are in. – Future plans for posts Polish the environment and figuring out the enemy Finishing the GDD and posting clips of it Posting a short demo game on Itch.io Thanks for reading this post!
Devlog 2 - Layout Done It’s been a while since my last post, but I’ve finished the pretty giant layout. I think I want a couple of floors, but that might be ambitious. We’ll see. Right now it has over 10 rooms and an outside! The doors are a big large right now, but this is an orphanage and the player is a kid so maybe its ok. 😓 I also started brainstorming some puzzles. Next step: decorating the interior and exterior and adding in items.
Hallow Continued - COUCHES ~ What’s been going on Really right now is one of the fun-ner parts: just adding in open-license 3D models from online and decorating the whole place (in- and ex-terior). And obviously crediting everything on this massive google doc. 👍 I was hoping it would be sorta fast, but tell me how it’s been a few hours already lol T-T ~ After this Make everything interact-able and bring in the props and tools you need to find to escape with. Some of these models don’t have an interior, so I’ll need to figure how to sideball that issue. And a gamedev’s worst nightmare: doors… 👀 Ohhh and also rearrange my whole filesystem and Scene panel. Uhhh which door is which again…. absolute monstrosity right now… Credit for sofa below: “trashy backyard sofa” ( https://skfb.ly/pHVBH ) by Schmoldt5000 is licensed under Creative Commons Attribution ( http://creativecommons.org/licenses/by/4.0/). SKETCHFAB is a peakkk website! pretty realistic looking things on here!
Hallow Continued - MECHANICS ~ What’s been going on Still working on decorating. Aesthetics are important oookkk? Been working on mechanics, such as interacting. Since these models are from online, I have to resize everything and also make a function so they can be interacted with. How it works: basically you just have to be close enough to some object, then press ‘E’ to interact with the object, which then causes some change. For example, this cabinet opens, but I’m planning on adding different puzzles which isn’t as simple as opening a drawer. Issues: Since the hitbox (or CollisionShape3D in Godot) is over the whole cabinet, it opens all the drawers. I guess that makes it easier for the player lmao. But if I wanted to make it over each drawer, then I would’ve had to make smaller hitboxes and arranged them properly. I accidentally made this cabinet TOO TALL T-T. So I wonder how the player will get up there… (totally on purpose haha) It limits which models I could take from online. A lot of models are not separated into parts (eg drawer1 is attached permanently to drawer2), meaning they can’t actually open. I realized this half way thru scavenging. :( Also started on the enemy AI stuff, but it’s not that done yet. ~ Plan Continue decorating, making them interactable. I have also made a whole map of the layout and the fun puzzles I’m planning to put in. I would share it but spoilers… :) Credit for cabinet below: Bedside table: “Bedside table old” ( https://skfb.ly/owuAQ ) by Nollien is licensed under Creative Commons Attribution ( http://creativecommons.org/licenses/by/4.0/ ). SKETCHFAB is a peakkk website! pretty realistic looking things on here!
** PARKOUR ** Still decorating. but im so proud of myself for making this little parkour. the ladder was so hard to get the player to actually get on T-T
Still decorating… Sometimes the things you look the hardest for… Is just in plain sight… I also added in the enemy. Dw it won’t be a cubicle forever.
PLAYGROUND - and pick up I added this cool playground into the game, where you can actually go inside and even slide down the slide. Peak childhood nostalgia :) You can also now pick up items and drop them realistically, affected by gravity. I’m holding a hammer in this image! I think the game is coming along well. Slowly… AHhhh gotta pick up the pace.
WE GOT CABINETS ~ Happy Spooky-Season!! HORROR SEASON + whats up Player can finally open doors- nope not doors, those are harder to implement than cabinets. But then isn’t a door literally just a big cabinet? #showerthoughts Implementation Basically, interact ‘E’ asks whether the raycast, or the “imaginary line” shot out the player though the red dot in the center, hits the object. If the player is standing close enough and they press E, it turns the door 90 degrees about the side aixs. It took a bit to implement bc I kept MESSING UP what the raycast would collid with. Plus this cabinet is like A MILLION different pieces. it legit takes 10 seconds to scroll through everything. I mean ig bro. Future Do this to like all the other cabinets (T-T), fix enemy (idk why its glitching), implement puzzles. AND ADD HALLOWEEN EASTER EGGS! (or are they called Halloween Eggs bc its not rlly easter… #showerthoughtsagain… haha)
GUMBALLS ~ whats up FINALLY finished decorating?? Okay, so I got the enemy to work - FOR LIKE 5 SECONDS - before i broke it again T-T. IDEK what I did bruh. Implementation So I baked a navigationmesh which is all the places the enemy can go (eg mostly where the player can go mostly) and then successfully (for a while at least) made it move randomly and chase the player when it crossed its line of view. It would even hit the player and make a bloody screen show up. BUT NOW IT DOESN’T WORK. HUhhh?? It doesn’t even move at all. So comes debugging: I integrated each step one by one instead of working on the code for like 5 hours and then testing it. Hopefully I can get this thing to work ugh. (My desc are lwk bad here but its because Im raging) Future PUZZLES. OMG I have so many ideas and so little timeeee. anyway, here’s this gumball machine which might be my favorite thing ever. toodles
FAV ROOM + glow in the dark pumpkins?? ~ whats up so i got the enemy to work. thank god. PLUS I GOT MY FAVORITE-ST ROOM EVER MADE!! Implementation/fix for enemy Looping btw 2 rooms: wander code picked farthest random point, so movement was lwk sporadic and weird. So we switched to getting the first valid point randomly generated instead. Walked off into the void: bc the navigationmesh or where it can roam WAS PARTIALLY OUTSIDE. bruh. so just resized the NM Never saw me or chased: LMAO this was so funny. So apparently my body was like 115 WHOLE-STINKING units away from where the code thought I was.. so easy fix, but bruh. Lost me at corners when i sharp turned: chase_memory now is for keeping track of position even after losing sight. Also added the hit screen, which is like a little bit of blood, for funsies THE ROOM OMGGOGMG - this was so heavily inspired (not copied… cuz yk i got crates here) by that one bunker room in Stay Out of the House by PUPPETCOMBO (omg peakkk). it’s a maze in there. check out the 2nd image! Future PUZZLES. OMG (still) I have so many ideas and so little timeeee. PS: wanted to fit all images in one frame. (yea okay syre bvro)...
|
1792489985.5475626
|
1793094785.5475626
|
|
40871
|
FPS OS by @cooki | Stardance
|
cooki
|
0
|
113.91
|
0
|
[]
|
[{"post_id": 79484, "ts": "202 [{"post_id": 79484, "ts": "2026-10-14T08:01:07Z", "hours": 14.1244, "text": "Devlog 11: Notepad After my holiday break, I am back working on the project. The main feature added for this devlog is the Notepad app . Grab a note from the tray, click on it, then type. The notes convert Markdown into HTML. The HTML is sanitised so it can’t be used to run malicious scripts. Top Tip Try adding the FPS OS logo as a sticker by typing:  into any Notepad window. Bonus feature: More Physics It is now possible to add physics to the 3DUI windows (PC screen/notepad notes). Along with this change, it is much more fun to throw objects around. Objects now keep momentum when let go. Top Tip The 3DUI system used for the windows is kinda buggy. For best results face yourself towards the wall with the door on it and place the window in front of you. Bonus feature: More grabbing More objects are able to be picked up including the clock, shelf and rug. Some objects are still work in progress. Bug fixes Objects can now be thrown out the windows You can walk through the doorway after you delete the door Current bugs Right click doesn’t work on MacBooks (fixed!) The velocity from the player is being subtracted instead of added to dropped objects (fixed!) Moved PC windows can not be interacted with (fixed!) Coming soon… My current checklist is: [x] Computer [Window] [x] Notepad [Window] [ ] Clipboard [ ] Gun? (it is an FPS after all…) [ ] Settings [Window] [ ] Ship to WebOS 1"}, {"post_id": 73856, "ts": "2026-09-26T06:05:54Z", "hours": 11.7192, "text": "Devlog 10: Picking things up I have added the ability to pick up objects. This currently includes the pillow on the armchair (throwing coming soon) and the the PC screen. How it works Interactable objects show a circle around the crosshair when hovered and grabbable objects with have a progress bar fill up as you hold click. After the bar fills up you can drag and let go to drop. The rest of the sounds All of the sound effects have now been implemented. This includes walking, jumping, getting the passcode right/wrong, pulling the blinds, and more! Shaders I added some simple shaders with the postprocessing library. There is bloom, vignette and chromatic aberration. They aren’t overboard and don’t hurt the performance. Unfortunately, my laptop sometimes goes into throttled mode when I unplug it and makes it hard to measure the performance. Mobile fix You can now interact with objects on mobile. It’s tricky at the moment because of the UI layout which I will be fixing later. Today is (not) the day :( I am hoping to ship the project today. I had to pack for a trip so I couldn’t work on the project. Progress will be slower while on my trip but luckily the Stardance deadline has been extended. My current checklist is: Notepad Clipboard Settings"}, {"post_id": 73021, "ts": "2026-09-24T07:16:47Z", "hours": 11.5483, "text": "Devlog 9: User experience In this update, I wanted to improve the usability and feel of the OS. I did this by adding more signals, adding functionality to the virtual machine and including sound effects. The Virtual Machine (PC) Situated on the desk, the PC lets you access the web browser to boot a Web OS or (almost) any other website. Soon, you’ll be able to pick up the screen instance and hang (or throw) it wherever you want. The Bed You can put the OS to sleep by clicking on the bed. Clicking again wakes it up. The Clock There is an now an analog clock on the wall. It shows the real-life time, if you can read it. Sound I added some sound effects. By default, the OS is muted. The sound effects still need to be tweaked. The sound is supposed to be ambient and give more life to the otherwise static objects in the environment. The Hand Next time, I am adding adding the ability to pick up certain objects as well as the next app, Notepad. I will also be adding a settings panel. Then, I can finally ship this version to Web OS 1."}, {"post_id": 71643, "ts": "2026-09-21T06:42:33Z", "hours": 10.5822, "text": "Devlog 8: Objects and furnishings As promised last devlog, I have added a few objects from my checklist. Some are for OS functionality and some are just to fill in the space. The light Based off the light design from the hit YouTube ARG “Summon House”, I turned the plain square on the ceiling into a lamp that reacts to the switch by the door. For the best effect, try enabling dark mode. Dark mode? In the lighting department, I also added blinds to each of the windows. Clicking them pulls them up and down. Each one down subtracts from the global light level. A little context You can now interact with objects through the context menu (right click). For now there is only one option: Delete. If you delete something, you can’t get it back. This includes the floor. Things for later The recycling bin, blue paper tray, PC and wallpaper are currently being developed. For now, they aren’t fully functional Furniture For now, there is a rug, an armchair, a desk, a shelf and a poster. I will be adding more later. I will add the ability to sit in the chair and use the shelf. The deadline approaches I am hoping to ship this week after I add in notepad as my first app. For now, you can check out this update at cookistudios.com/fps-os ."}, {"post_id": 69430, "ts": "2026-09-17T01:17:20Z", "hours": 9.81, "text": "Devlog 7: Building the environment In this update, I added the room and skybox. I added windows by using a boolean modifier on the walls. I made the directional light from the sun lines up with the skybox. Wallpaper I made a 16:9 tiling wallpaper with the letters of FPS OS on it. Right now, it can be toggled on and off but later will be able to be set any imported image. Door optimisation I don’t know if it’s because of how websites work or something with my GPU driver but the FPS would drop to 60 when looking at the door/keypad. Just in case I removed the 3D depth with the symbols and replaced them with a texture. The door was also a physics object and I spent quite a bit of time getting it to work but never ended up fixing it. Instead, I kept the door as regular meshes. This allowed me to animate it from inside Blender. After seeing an Andymation video on YouTube, I got reminded of the animation principle of anticipation which I added to the door. Mobile buttons I also added the jump and crouch button for mobile. The crouch button is toggled while the jump button needs to be held. I need to change the CSS to make the jump button show the pressed state when using multiple fingers across the screen. I will come back to mobile support later as there are many issues, especially related to zooming. Next time on FPS OS: I have constructed a plan of where each object will be in the room. You’ll have to wait and see in the next devlog."}, {"post_id": 66234, "ts": "2026-09-11T22:51:43Z", "hours": 10.0431, "text": "Devlog 6: Life is an open door (!Video has sound!) The latest improvement to FPS OS is that you can now unlock the OS! This is accomplished by entering your passcode into the door (by default 0000). What took so long? In order to get the door to open (and close), I had a lot of trial and error. The way the USDC scene file is imported means that it has offsets of the meshes that require a specific tree of groups. In order to have physics objects in Jolt, the meshes need to be in world space. However, if the meshes are in world space they don’t have the offsets they need to move as a group around the origin points. I tried putting a reverse offset and putting physics objects in local space but nothing worked. Eventually, I decided to just have the base of the door in physics world space and then have the rest of the meshes in one local group that copies its rotation from the door. Changes Fixed the player rotation being confined to physics Changed note to say “c0000” and not “0000” in case it wasn’t clear you have to reset after a mistake Added noclip Allowed the game to move the player for cutscenes Added a function to rotate physics objects around a pivot point Added a function to add debug points to visualise why the pivot points are wrong Better mobile support coming soon Try it out at cookistudios.com/fps-os ."}, {"post_id": 62732, "ts": "2026-09-06T07:15:02Z", "hours": 11.52, "text": "Devlog 5: The intro cutscene After getting the player movement done, I decided it would be cool to add a Linux-style boot console as the content loads in the background. I also added in a title screen with some smooth animation. The main scene now places the player in front of the passcode input screen (I might decide to remove it until the user makes a password). Patched some bugs I finally fixed the shadow system. The player was clipping a tiny bit into the ground which left a circle of no shadow. I tried combating this by changing the shadow normalBias . This caused the shadows on detailed objects like the keypad to be broken. I tried fixing it again by moving the player mesh up. Then I found it still had the same issue on the door handle. I fixed it by setting the player mesh’s shadowSide to double sided. I also made the player slower when crouching. What’s next? I need to add functionality to the keypad and create the base room. For my first app, I will make a notepad that you can type into. I will also try adding a “virtual machine” that can run my friend @pinetree182 ’s Web OS tundra. Luckily, I found an official three.js example that can render iframes in a scene: link to example . I also need to add more buttons to mobile so the player can jump and crouch. As always, FPS OS is hosted at cookistudios.com/fps-os . Every time I make a commit, it updates. This means you can access content before I’ve made a devlog about it."}, {"post_id": 60706, "ts": "2026-09-03T08:15:20Z", "hours": 11.3656, "text": "Devlog 4: Movement complete I wanted to add in bhopping/air stafing movement to the project as I find it more fun to control than the generic character controller. I found this script which seemed good and I wanted to try and translate it to my Three.js setup. I tried multiple times to put in the code then rename parts and scrap it. Eventually I decided to just take the most bare bones parts I needed and make a better system. After a few tweaks, the movement, physics, and lighting systems are finally done. Next, I am adding a cool loading screen to the OS and then I’ll start modelling the new environment and objects. The latest version is available at cookistudios.com/fps-os . Here are the current keybinds: WASD/Touch Joystick - Move Mouse move/On-screen Swipe - Look around Space - Jump (hold to keep jumping) C - Crouch R - Toggle speedometer ` - Show colliders ~ - Show player collider (You can only move and look on mobile at the moment)"}, {"post_id": 46805, "ts": "2026-08-14T09:56:04Z", "hours": 11.8444, "text": "Devlog 3: Getting the ball rolling So, it’s been a couple of weeks since my last devlog. Last week, I spent time having a break from the project. However, that doesn’t mean there hasn’t been any updates this week! Player in motion As seen in the video above, you may have noticed that you can actually run around and do parkour now! The player physics uses a VirtualCharacter , equivalent to a CharacterBody3D in Godot. I had to set up gravity which was difficult as the built-in gravity from Jolt doesn’t work very well on non-simulated objects like the VirtualCharacter . Lighting improvements I removed baked lighting as it was increasing load time and didn’t look good combined with real-time. So I have switched to full real-time lighting. I added in cascading shadow maps (CSM) that is like LODs. This means that further away shadows have lower quality textures. (I tried to make it not noticeable though.) Bug catching Using Jolt in JavaScript means uses WebAssembly (WASM). WASM needs manual garbage collection for most objects you instantiate. I have patched all the possible memory leaks I could find in my physics code. Mobile support I have implemented the ability to actually control yourself and not run at 5 FPS on mobile. You can try it out, right now, at cookistudios.com/fps-os/ . P.S. I will be trying to write devlogs more often as development will be speeding up over time."}, {"post_id": 37495, "ts": "2026-07-30T09:00:32Z", "hours": 8.1308, "text": "Devlog 2: It’s all a simulation That’s right, I got physics working! Using the link I saved in the last devlog, I worked out how to use Jolt properly with Three.js. I also built a scene in Blender and set up lighting. Baking with Blender To create this simple test scene, I hopped into Blender and spawned in a few different objects. I didn’t want to make anything too fancy as I just wanted to test physics collisions. As I worked on it, I would export to a USD scene and import that into Three. I thought about how game engines normally do lighting and I remembered about baked lighting. It took a while but I made it so dynamic objects with mesh names starting with “D_” will have real-time shadows but static objects (like the floor and floating boxes) will have baked shadows. This means that shadows are much less expensive to render. Decentralisation A problem I had with my original code is that it was all in one spaghetti file. I split up the code into different files like input, lighting and physics. These are then called from the main file. This creates more organisation so when I add more features later it doesn’t become impossible to read. Taking action I set up input actions to be much easier to work with. A list of actions is set up as a key value pair. I save the keys that are pressed and remove them when released from a separate key value list. I then set it up to create CustomEvent s for each keybind. These are then used with EventListener s to send signals to the other parts of code to run. Deployment issues I also had a couple issues with my code that caused problems with the deployed site. The first was setting the base in the Vite config to “/FPS-OS/” and not “/fps-os/”. It meant you had to use capital letters in the URL to load the site. The other issue was that the objects were trying to get physics before Jolt had been initialised. It seemed to be a race condition that happened sometimes. Luckily it is fixed now. What’s next? Next, of course I need to get player movement working so you can actually walk and jump around. Then I need to follow the requirements of the WebOS 1 mission. It looks like all I need to do is add draggable windows. This OS isn’t exactly going to have windows though. At least not as they are normally. Also I need to add a welcome screen, “desktop” environment, app shop and toolbelt. And all of those require the main room components to be modelled and textured. New update released Go to cookistudios.com/fps-os/ to try out the latest features before I’ve even written devlogs on them. See you later!"}, {"post_id": 36303, "ts": "2026-07-28T09:57:37Z", "hours": 3.2203, "text": "Devlog 1: Setting the scene I started the project by initialising it from Vite using Bun (I would use Deno but Bun is just so fast). I imported Three.js to use for everything 3D and used the default cube scene from the documentation. I also added in the PointerLockControls to let you look around as the camera. Issues arised You can’t move yet because I tried adding different kinds of movement with all the different physics libraries but it kept causing the player to fall over or not move and then suddenly zip around. I think I’ve decided to use Jolt Physics (but not the built-in Three.js one!) as this site showcases some simple code to get physics working. Next steps I have come up with plans for the OS like how the text editor will be an actual notepad you have to pick up and how you’ll be able to build out the space with different floor tiles and furniture. I also want to add CS:GO/Momentum Mod style movement as an option just because I find it fun to bhop around everywhere. It also looks like Jolt has a built in class called CharacterVirtual that I hope is similar to CharacterBody3Ds in Godot. Once I have the movement set up I will start modelling some assets to add. I would also like to try using the new HTML-to-Canvas API but it is experimental so it’s not best to use it in a production build that anyone could be running on any device. See you soon! This project might take a while to start looking user-friendly but if you want to test it out any time, head on over to: cookistudios.com/FPS-OS"}]...
|
Title: FPS OS by @cooki | Stardance
Devlogs:
Devl Title: FPS OS by @cooki | Stardance
Devlogs:
Devlog 1: Setting the scene I started the project by initialising it from Vite using Bun (I would use Deno but Bun is just so fast). I imported Three.js to use for everything 3D and used the default cube scene from the documentation. I also added in the PointerLockControls to let you look around as the camera. Issues arised You can’t move yet because I tried adding different kinds of movement with all the different physics libraries but it kept causing the player to fall over or not move and then suddenly zip around. I think I’ve decided to use Jolt Physics (but not the built-in Three.js one!) as this site showcases some simple code to get physics working. Next steps I have come up with plans for the OS like how the text editor will be an actual notepad you have to pick up and how you’ll be able to build out the space with different floor tiles and furniture. I also want to add CS:GO/Momentum Mod style movement as an option just because I find it fun to bhop around everywhere. It also looks like Jolt has a built in class called CharacterVirtual that I hope is similar to CharacterBody3Ds in Godot. Once I have the movement set up I will start modelling some assets to add. I would also like to try using the new HTML-to-Canvas API but it is experimental so it’s not best to use it in a production build that anyone could be running on any device. See you soon! This project might take a while to start looking user-friendly but if you want to test it out any time, head on over to: cookistudios.com/FPS-OS
Devlog 2: It’s all a simulation That’s right, I got physics working! Using the link I saved in the last devlog, I worked out how to use Jolt properly with Three.js. I also built a scene in Blender and set up lighting. Baking with Blender To create this simple test scene, I hopped into Blender and spawned in a few different objects. I didn’t want to make anything too fancy as I just wanted to test physics collisions. As I worked on it, I would export to a USD scene and import that into Three. I thought about how game engines normally do lighting and I remembered about baked lighting. It took a while but I made it so dynamic objects with mesh names starting with “D_” will have real-time shadows but static objects (like the floor and floating boxes) will have baked shadows. This means that shadows are much less expensive to render. Decentralisation A problem I had with my original code is that it was all in one spaghetti file. I split up the code into different files like input, lighting and physics. These are then called from the main file. This creates more organisation so when I add more features later it doesn’t become impossible to read. Taking action I set up input actions to be much easier to work with. A list of actions is set up as a key value pair. I save the keys that are pressed and remove them when released from a separate key value list. I then set it up to create CustomEvent s for each keybind. These are then used with EventListener s to send signals to the other parts of code to run. Deployment issues I also had a couple issues with my code that caused problems with the deployed site. The first was setting the base in the Vite config to “/FPS-OS/” and not “/fps-os/”. It meant you had to use capital letters in the URL to load the site. The other issue was that the objects were trying to get physics before Jolt had been initialised. It seemed to be a race condition that happened sometimes. Luckily it is fixed now. What’s next? Next, of course I need to get player movement working so you can actually walk and jump around. Then I need to follow the requirements of the WebOS 1 mission. It looks like all I need to do is add draggable windows. This OS isn’t exactly going to have windows though. At least not as they are normally. Also I need to add a welcome screen, “desktop” environment, app shop and toolbelt. And all of those require the main room components to be modelled and textured. New update released Go to cookistudios.com/fps-os/ to try out the latest features before I’ve even written devlogs on them. See you later!
Devlog 3: Getting the ball rolling So, it’s been a couple of weeks since my last devlog. Last week, I spent time having a break from the project. However, that doesn’t mean there hasn’t been any updates this week! Player in motion As seen in the video above, you may have noticed that you can actually run around and do parkour now! The player physics uses a VirtualCharacter , equivalent to a CharacterBody3D in Godot. I had to set up gravity which was difficult as the built-in gravity from Jolt doesn’t work very well on non-simulated objects like the VirtualCharacter . Lighting improvements I removed baked lighting as it was increasing load time and didn’t look good combined with real-time. So I have switched to full real-time lighting. I added in cascading shadow maps (CSM) that is like LODs. This means that further away shadows have lower quality textures. (I tried to make it not noticeable though.) Bug catching Using Jolt in JavaScript means uses WebAssembly (WASM). WASM needs manual garbage collection for most objects you instantiate. I have patched all the possible memory leaks I could find in my physics code. Mobile support I have implemented the ability to actually control yourself and not run at 5 FPS on mobile. You can try it out, right now, at cookistudios.com/fps-os/ . P.S. I will be trying to write devlogs more often as development will be speeding up over time.
Devlog 4: Movement complete I wanted to add in bhopping/air stafing movement to the project as I find it more fun to control than the generic character controller. I found this script which seemed good and I wanted to try and translate it to my Three.js setup. I tried multiple times to put in the code then rename parts and scrap it. Eventually I decided to just take the most bare bones parts I needed and make a better system. After a few tweaks, the movement, physics, and lighting systems are finally done. Next, I am adding a cool loading screen to the OS and then I’ll start modelling the new environment and objects. The latest version is available at cookistudios.com/fps-os . Here are the current keybinds: WASD/Touch Joystick - Move Mouse move/On-screen Swipe - Look around Space - Jump (hold to keep jumping) C - Crouch R - Toggle speedometer ` - Show colliders ~ - Show player collider (You can only move and look on mobile at the moment)
Devlog 5: The intro cutscene After getting the player movement done, I decided it would be cool to add a Linux-style boot console as the content loads in the background. I also added in a title screen with some smooth animation. The main scene now places the player in front of the passcode input screen (I might decide to remove it until the user makes a password). Patched some bugs I finally fixed the shadow system. The player was clipping a tiny bit into the ground which left a circle of no shadow. I tried combating this by changing the shadow normalBias . This caused the shadows on detailed objects like the keypad to be broken. I tried fixing it again by moving the player mesh up. Then I found it still had the same issue on the door handle. I fixed it by setting the player mesh’s shadowSide to double sided. I also made the player slower when crouching. What’s next? I need to add functionality to the keypad and create the base room. For my first app, I will make a notepad that you can type into. I will also try adding a “virtual machine” that can run my friend @pinetree182 ’s Web OS tundra. Luckily, I found an official three.js example that can render iframes in a scene: link to example . I also need to add more buttons to mobile so the player can jump and crouch. As always, FPS OS is hosted at cookistudios.com/fps-os . Every time I make a commit, it updates. This means you can access content before I’ve made a devlog about it.
Devlog 6: Life is an open door (!Video has sound!) The latest improvement to FPS OS is that you can now unlock the OS! This is accomplished by entering your passcode into the door (by default 0000). What took so long? In order to get the door to open (and close), I had a lot of trial and error. The way the USDC scene file is imported means that it has offsets of the meshes that require a specific tree of groups. In order to have physics objects in Jolt, the meshes need to be in world space. However, if the meshes are in world space they don’t have the offsets they need to move as a group around the origin points. I tried putting a reverse offset and putting physics objects in local space but nothing worked. Eventually, I decided to just have the base of the door in physics world space and then have the rest of the meshes in one local group that copies its rotation from the door. Changes Fixed the player rotation being confined to physics Changed note to say “c0000” and not “0000” in case it wasn’t clear you have to reset after a mistake Added noclip Allowed the game to move the player for cutscenes Added a function to rotate physics objects around a pivot point Added a function to add debug points to visualise why the pivot points are wrong Better mobile support coming soon Try it out at cookistudios.com/fps-os .
Devlog 7: Building the environment In this update, I added the room and skybox. I added windows by using a boolean modifier on the walls. I made the directional light from the sun lines up with the skybox. Wallpaper I made a 16:9 tiling wallpaper with the letters of FPS OS on it. Right now, it can be toggled on and off but later will be able to be set any imported image. Door optimisation I don’t know if it’s because of how websites work or something with my GPU driver but the FPS would drop to 60 when looking at the door/keypad. Just in case I removed the 3D depth with the symbols and replaced them with a texture. The door was also a physics object and I spent quite a bit of time getting it to work but never ended up fixing it. Instead, I kept the door as regular meshes. This allowed me to animate it from inside Blender. After seeing an Andymation video on YouTube, I got reminded of the animation principle of anticipation which I added to the door. Mobile buttons I also added the jump and crouch button for mobile. The crouch button is toggled while the jump button needs to be held. I need to change the CSS to make the jump button show the pressed state when using multiple fingers across the screen. I will come back to mobile support later as there are many issues, especially related to zooming. Next time on FPS OS: I have constructed a plan of where each object will be in the room. You’ll have to wait and see in the next devlog.
Devlog 8: Objects and furnishings As promised last devlog, I have added a few objects from my checklist. Some are for OS functionality and some are just to fill in the space. The light Based off the light design from the hit YouTube ARG “Summon House”, I turned the plain square on the ceiling into a lamp that reacts to the switch by the door. For the best effect, try enabling dark mode. Dark mode? In the lighting department, I also added blinds to each of the windows. Clicking them pulls them up and down. Each one down subtracts from the global light level. A little context You can now interact with objects through the context menu (right click). For now there is only one option: Delete. If you delete something, you can’t get it back. This includes the floor. Things for later The recycling bin, blue paper tray, PC and wallpaper are currently being developed. For now, they aren’t fully functional Furniture For now, there is a rug, an armchair, a desk, a shelf and a poster. I will be adding more later. I will add the ability to sit in the chair and use the shelf. The deadline approaches I am hoping to ship this week after I add in notepad as my first app. For now, you can check out this update at cookistudios.com/fps-os .
Devlog 9: User experience In this update, I wanted to improve the usability and feel of the OS. I did this by adding more signals, adding functionality to the virtual machine and including sound effects. The Virtual Machine (PC) Situated on the desk, the PC lets you access the web browser to boot a Web OS or (almost) any other website. Soon, you’ll be able to pick up the screen instance and hang (or throw) it wherever you want. The Bed You can put the OS to sleep by clicking on the bed. Clicking again wakes it up. The Clock There is an now an analog clock on the wall. It shows the real-life time, if you can read it. Sound I added some sound effects. By default, the OS is muted. The sound effects still need to be tweaked. The sound is supposed to be ambient and give more life to the otherwise static objects in the environment. The Hand Next time, I am adding adding the ability to pick up certain objects as well as the next app, Notepad. I will also be adding a settings panel. Then, I can finally ship this version to Web OS 1.
Devlog 10: Picking things up I have added the ability to pick up objects. This currently includes the pillow on the armchair (throwing coming soon) and the the PC screen. How it works Interactable objects show a circle around the crosshair when hovered and grabbable objects with have a progress bar fill up as you hold click. After the bar fills up you can drag and let go to drop. The rest of the sounds All of the sound effects have now been implemented. This includes walking, jumping, getting the passcode right/wrong, pulling the blinds, and more! Shaders I added some simple shaders with the postprocessing library. There is bloom, vignette and chromatic aberration. They aren’t overboard and don’t hurt the performance. Unfortunately, my laptop sometimes goes into throttled mode when I unplug it and makes it hard to measure the performance. Mobile fix You can now interact with objects on mobile. It’s tricky at the moment because of the UI layout which I will be fixing later. Today is (not) the day :( I am hoping to ship the project today. I had to pack for a trip so I couldn’t work on the project. Progress will be slower while on my trip but luckily the Stardance deadline has been extended. My current checklist is: Notepad Clipboard Settings
Devlog 11: Notepad After my holiday break, I am back working on the project. The main feature added for this devlog is the Notepad app . Grab a note from the tray, click on it, then type. The notes convert Markdown into HTML. The HTML is sanitised so it can’t be used to run malicious scripts. Top Tip Try adding the FPS OS logo as a sticker by typing:  into any Notepad window. Bonus feature: More Physics It is now possible to add physics to the 3DUI windows (PC screen/notepad notes). Along with this change, it is much more fun to throw objects around. Objects now keep momentum when let go. Top Tip The 3DUI system used for the windows is kinda buggy. For best results face yourself towards the wall with the door on it and place the window in front of you. Bonus feature: More grabbing More objects are able to be picked up including the clock, shelf and rug. Some objects are still work in progress. Bug fixes Objects can now be thrown out the windows You can walk through the doorway after you delete the door Current bugs Right click doesn’t work on MacBooks (fixed!) The velocity from the player is being subtracted instead of added to dropped objects (fixed!) Moved PC windows can not be interacted with (fixed!) Coming soon… My current checklist is: [x] Computer [Window] [x] Notepad [Window] [ ] Clipboard [ ] Gun? (it is an FPS after all…) [ ] Settings [Window] [ ] Ship to WebOS 1...
|
1792781359.0674555
|
1793386159.0674555
|
|
6233
|
Ctrlpad by @brainlesslukas | Stardance
|
brainlesslukas
|
1
|
113.51
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T02:50:42Z", "hours": 97.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello everyone! I built an Elgato Stream Deck alternative called Ctrlpad. Ctrlpad runs actions when you press its button. For example, opening applications like Discord really fast. It can genuinely improve your workflow. At the beginning I had trouble getting the Ctrlpad to communicate with my computer, but then I learned about BLE. I also coded a desktop app to configure the layout, colors, icons, actions and more. The ecosystem is only available on Linux for now, since I wanted to focus on the important things first. The project is split into three separate repositories: the Firmware (the code flashed onto the ESP), the Desktop Application (the interface used to configure actions like opening apps or changing the volume), and the Daemon (a background service that runs continuously on your computer to execute those actions).", "repo": "https://github.com/CtrlPad/firmware", "demo": ""}]...
|
[{"post_id": 82289, "ts": "202 [{"post_id": 82289, "ts": "2026-10-24T14:13:56Z", "hours": 6.5797, "text": "Devlog #21 The last days I added some important updates to the Ctrlpad website: Major refactoring: Cleaned and reorganized parts Responsive design, full mobile and Tablet support The website is now better structured for future additions :)"}, {"post_id": 74628, "ts": "2026-09-27T20:09:54Z", "hours": 6.8083, "text": "Devlog #20 Today i created this fancy feature page on the website :)."}, {"post_id": 71859, "ts": "2026-09-21T17:43:40Z", "hours": 3.1214, "text": "Devlog #19 I’m back after my first week of school after the holidays :) The newest update is that I implemented rendering for the icons you select in the desktop software. The mechanism behind it wasn’t easy, but here’s my final implementation: Each button’s icon arrives over BLE as a base64-encoded bitmap in the JSON config. renderIcon() decodes it and hands it off to changeIcon(), which builds an lv_image_dsc_t and assigns it via lv_image_set_src() to that button’s LVGL image widget or blanks it out if no icon string was provided. I also fixed some things in the Desktop software :) The next step, is making the config persistent on the ESP"}, {"post_id": 59956, "ts": "2026-09-02T01:01:38Z", "hours": 2.4636, "text": "Devlog #18 Today I applied the features I built last week: editing button colors. One big problem was that I had used a button matrix, and it’s almost impossible to change the background color of just one button in a matrix. So I did some refactoring. I moved from a matrix to six normal, standalone buttons. After that, I wrote the functions to apply the config. In the pictures you can now see how it’s possible to change the button color you select in the app. (Please ignore my dusty, messy desk xD)"}, {"post_id": 59284, "ts": "2026-09-01T00:04:06Z", "hours": 3.7492, "text": "Devlog # 17 Today I made it possible to send the button background color and the icon SVG to the BLE config. I also built a little preview (left corner). The next step is to display the SVG icon and the background color on the CtrlPad."}, {"post_id": 57712, "ts": "2026-08-29T23:27:07Z", "hours": 7.4522, "text": "Devlog #16 I wasn’t really motivated to code this last week. But I did build something for the desktop software! I created a color and icon selector. The icons are fetched from Simple Icons. It’s only the UI for now. The feature for the ctrlPad firmware is coming in the next version(s) :) Stay tuned!"}, {"post_id": 52374, "ts": "2026-08-22T14:17:41Z", "hours": 5.5839, "text": "Devlog #15 I was on vacation for the last two weeks, so I didn’t get much done. But I’m back now. Since then I’ve been working on the hardware side: I 3D printed a case for the CYD, and it now sits perfectly on my desk. For now it’s a model from MakerWorld. I’d like to design my own later, but I haven’t had the time yet. I’m also working on a few fixes for the daemon. Unfortunately, I noticed that the problem with the path is still there. :("}, {"post_id": 45411, "ts": "2026-08-11T20:47:02Z", "hours": 2.315, "text": "Devlog #14 Today was a warm one, but I still managed to sit down at my PC :) I ended up writing some docs, mostly because I couldn’t decide what else to work on. Added installation instructions for the packages I released over the last few days. Nix and Snap. I couldn’t add the AUR one yet, since the AUR is still down and I haven’t been able to finish that release :( Wrote the README for Ctrlpad’s web project. It covers how to set up the web app and gives an overview of what the repo contains."}, {"post_id": 44701, "ts": "2026-08-10T17:19:22Z", "hours": 4.3517, "text": "Devlog #13 Originally, I wanted to release both packages (daemon & desktop app) on the AUR, but it’s still down. So instead I released the desktop app on Nix with a flake. Now both packages are on Nix(-OS). I also released the desktop app on Snap."}, {"post_id": 41974, "ts": "2026-08-06T14:44:36Z", "hours": 2.2144, "text": "#Devlog #12 The last two days I worked on releasing the daemon for Nix(-OS) users. It’s now available as a flake, so they can pull it in directly."}, {"post_id": 40655, "ts": "2026-08-04T10:36:17Z", "hours": 4.1378, "text": "Devlog #11 Last night I wanted to start publishing my ctrlpad-daemon library on the AUR, but it was down. So I released it on the Snap(craft) package manager instead. It took a while, but now it’s online! https://snapcraft.io/ctrlpad-daemon"}, {"post_id": 40080, "ts": "2026-08-03T13:44:48Z", "hours": 11.7772, "text": "Devlog #10 The last three days were pretty frustrating. In the last devlog I mentioned building a website with Next.js. But I soon realized a hero section wasn’t enough. I also needed documentation. So I set out to embed Markdown (Nextra). It was tedious work, and it took me over five hours to get it running (the /docs route just refused to render for the longest time). With that working, I started writing some basic docs. A few minutes in, a question hit me: “How is the user actually going to flash the board themselves?” For that I turned to ESP Web Tools, a neat library that lets you flash an ESP directly from the browser. I ran into plenty of problems, but the biggest one was my own browser. It worked fine on my second PC, yet failed on my main one. The reason? An outdated Chromium version. I spent six-plus hours tracking that down. But it’s all working now and everyone can flash the board with my firmware! Amazing"}, {"post_id": 35902, "ts": "2026-07-27T17:08:35Z", "hours": 6.8169, "text": "Devlog #9 Things have been busy with school over the last two weeks, but I managed to make some solid progress on CtrlPad: Website Launched: Built the landing page using Next.js and published it live at ctrlpad.xyz Hosting: Configured my local home server to host the site directly. CI/CD Pipeline: Set up an automated CI/CD pipeline so future commits deploy automatically. Source Code: The website repository is open source on GitHub . Stay tuned!"}, {"post_id": 21048, "ts": "2026-07-02T20:29:04Z", "hours": 8.6403, "text": "Devlog #8 Over the past day, I built the CtrlPad daemon using Golang. This background service listens for commands sent from the CtrlPad via BLE (Bluetooth Low Energy). In the example below, you can see the daemon logs in action as it successfully receives and executes commands for “Spotify” and “Proton VPN”. To make things even smoother, I also wrote a dedicated installation script for the daemon to streamline the setup process."}, {"post_id": 15883, "ts": "2026-06-25T20:13:12Z", "hours": 1.1181, "text": "Devlog #7 Today, I ventured into Inkscape to design an icon. I usually dread the intricacies of SVG creation, but, to my surprise, everything came together quite smoothly. With the design finalized, I generated the necessary icon variations and implemented them into the Tauri project. The icon is designed to be a clean, minimalist recreation of the CtrlPad."}, {"post_id": 15320, "ts": "2026-06-24T21:44:20Z", "hours": 7.8344, "text": "Devlog #6 In the last day, I was really busy and didn’t have much time to code, but I managed to accomplish some amazing things: CI/CD Pipeline: Created a pipeline to build the application automatically Tooling Integration: Added git-cliff for automated changelogs, alongside Prettier, ESLint, and commitlint for code quality Bug Fixes: Successfully found and resolved several existing bugs I also implemented real configuration uploads to the ctrlPad instead of using an example JSON string"}, {"post_id": 10903, "ts": "2026-06-17T21:22:54Z", "hours": 10.435, "text": "Devlog #5 This update was all about tackling the tough stuff. First, I had to figure out how to scan and display every installed application on your system, a feature that turned out to be incredibly tricky to implement. After that, I spent a lot of time wrestling with the drag-and-drop system for the ctrlPad actions. It took a while, but it was worth it. To wrap things up, I also built a solid README to guide you through the development setup and other project essentials."}, {"post_id": 6485, "ts": "2026-06-10T22:07:05Z", "hours": 7.2067, "text": "Devlog #4 Today was a refactoring day! I updated the entire desktop UI and made everything cleaner. I also made it possible to connect to Bluetooth devices and send an example layout configuration to them."}, {"post_id": 5176, "ts": "2026-06-08T21:19:28Z", "hours": 4.3003, "text": "Devlog #3 These past few days were intense, packed with non-stop coding. Listing every single detail would take forever, so let’s skip straight to the highlights! Right now, the main focus is building the ctrlPad Desktop App. The central hub for configuring button layouts, custom actions, and more. The biggest decision? Tauri vs. Electron. The winner: Tauri. Because let’s be honest: Rust is king. Here is the quick breakdown of what went down: Firmware Repo: Added a brand-new, foolproof “Development Setup” section to the README.md. App Architecture: Kicked off the Tauri application and integrated TanStack Router for seamless navigation. UI/UX: Designed the very first frontend layout, complete with a sleek sidebar and the core button layout on the dashboard. The foundation is laid. Stay tuned!"}, {"post_id": 3059, "ts": "2026-06-05T23:01:18Z", "hours": 0.8392, "text": "Devlog #2 In this devlog the following things were done: Created the README.md and added some basic information Added the compilation database for PlatformIO Formatted all files with a code formatter (clangd) Applied the “camelCase” naming convention instead of “snake_case”"}, {"post_id": 2769, "ts": "2026-06-05T15:45:09Z", "hours": 5.5439, "text": "Devlog #1 I started making my own DIY Stream Deck! It runs on an ESP32 (CYD) and I named it ctrlPad. It features six buttons, each of which can be dynamically customized with different programs, actions, and macros. Just like the official Elgato software, the layout will be configured using an external desktop application. To keep it completely wireless, the configuration is sent via Bluetooth (BLE). Soon I build a custom driver then handles executing the programs or triggering actions (like muting the microphone). Thanks to all the customization options, every single ctrlPad will be completely unique!"}]...
|
Title: Ctrlpad by @brainlesslukas | Stardance
Dev Title: Ctrlpad by @brainlesslukas | Stardance
Devlogs:
Devlog #1 I started making my own DIY Stream Deck! It runs on an ESP32 (CYD) and I named it ctrlPad. It features six buttons, each of which can be dynamically customized with different programs, actions, and macros. Just like the official Elgato software, the layout will be configured using an external desktop application. To keep it completely wireless, the configuration is sent via Bluetooth (BLE). Soon I build a custom driver then handles executing the programs or triggering actions (like muting the microphone). Thanks to all the customization options, every single ctrlPad will be completely unique!
Devlog #2 In this devlog the following things were done: Created the README.md and added some basic information Added the compilation database for PlatformIO Formatted all files with a code formatter (clangd) Applied the “camelCase” naming convention instead of “snake_case”
Devlog #3 These past few days were intense, packed with non-stop coding. Listing every single detail would take forever, so let’s skip straight to the highlights! Right now, the main focus is building the ctrlPad Desktop App. The central hub for configuring button layouts, custom actions, and more. The biggest decision? Tauri vs. Electron. The winner: Tauri. Because let’s be honest: Rust is king. Here is the quick breakdown of what went down: Firmware Repo: Added a brand-new, foolproof “Development Setup” section to the README.md. App Architecture: Kicked off the Tauri application and integrated TanStack Router for seamless navigation. UI/UX: Designed the very first frontend layout, complete with a sleek sidebar and the core button layout on the dashboard. The foundation is laid. Stay tuned!
Devlog #4 Today was a refactoring day! I updated the entire desktop UI and made everything cleaner. I also made it possible to connect to Bluetooth devices and send an example layout configuration to them.
Devlog #5 This update was all about tackling the tough stuff. First, I had to figure out how to scan and display every installed application on your system, a feature that turned out to be incredibly tricky to implement. After that, I spent a lot of time wrestling with the drag-and-drop system for the ctrlPad actions. It took a while, but it was worth it. To wrap things up, I also built a solid README to guide you through the development setup and other project essentials.
Devlog #6 In the last day, I was really busy and didn’t have much time to code, but I managed to accomplish some amazing things: CI/CD Pipeline: Created a pipeline to build the application automatically Tooling Integration: Added git-cliff for automated changelogs, alongside Prettier, ESLint, and commitlint for code quality Bug Fixes: Successfully found and resolved several existing bugs I also implemented real configuration uploads to the ctrlPad instead of using an example JSON string
Devlog #7 Today, I ventured into Inkscape to design an icon. I usually dread the intricacies of SVG creation, but, to my surprise, everything came together quite smoothly. With the design finalized, I generated the necessary icon variations and implemented them into the Tauri project. The icon is designed to be a clean, minimalist recreation of the CtrlPad.
Devlog #8 Over the past day, I built the CtrlPad daemon using Golang. This background service listens for commands sent from the CtrlPad via BLE (Bluetooth Low Energy). In the example below, you can see the daemon logs in action as it successfully receives and executes commands for “Spotify” and “Proton VPN”. To make things even smoother, I also wrote a dedicated installation script for the daemon to streamline the setup process.
Devlog #9 Things have been busy with school over the last two weeks, but I managed to make some solid progress on CtrlPad: Website Launched: Built the landing page using Next.js and published it live at ctrlpad.xyz Hosting: Configured my local home server to host the site directly. CI/CD Pipeline: Set up an automated CI/CD pipeline so future commits deploy automatically. Source Code: The website repository is open source on GitHub . Stay tuned!
Devlog #10 The last three days were pretty frustrating. In the last devlog I mentioned building a website with Next.js. But I soon realized a hero section wasn’t enough. I also needed documentation. So I set out to embed Markdown (Nextra). It was tedious work, and it took me over five hours to get it running (the /docs route just refused to render for the longest time). With that working, I started writing some basic docs. A few minutes in, a question hit me: “How is the user actually going to flash the board themselves?” For that I turned to ESP Web Tools, a neat library that lets you flash an ESP directly from the browser. I ran into plenty of problems, but the biggest one was my own browser. It worked fine on my second PC, yet failed on my main one. The reason? An outdated Chromium version. I spent six-plus hours tracking that down. But it’s all working now and everyone can flash the board with my firmware! Amazing
Devlog #11 Last night I wanted to start publishing my ctrlpad-daemon library on the AUR, but it was down. So I released it on the Snap(craft) package manager instead. It took a while, but now it’s online! https://snapcraft.io/ctrlpad-daemon
#Devlog #12 The last two days I worked on releasing the daemon for Nix(-OS) users. It’s now available as a flake, so they can pull it in directly.
Devlog #13 Originally, I wanted to release both packages (daemon & desktop app) on the AUR, but it’s still down. So instead I released the desktop app on Nix with a flake. Now both packages are on Nix(-OS). I also released the desktop app on Snap.
Devlog #14 Today was a warm one, but I still managed to sit down at my PC :) I ended up writing some docs, mostly because I couldn’t decide what else to work on. Added installation instructions for the packages I released over the last few days. Nix and Snap. I couldn’t add the AUR one yet, since the AUR is still down and I haven’t been able to finish that release :( Wrote the README for Ctrlpad’s web project. It covers how to set up the web app and gives an overview of what the repo contains.
Devlog #15 I was on vacation for the last two weeks, so I didn’t get much done. But I’m back now. Since then I’ve been working on the hardware side: I 3D printed a case for the CYD, and it now sits perfectly on my desk. For now it’s a model from MakerWorld. I’d like to design my own later, but I haven’t had the time yet. I’m also working on a few fixes for the daemon. Unfortunately, I noticed that the problem with the path is still there. :(
Devlog #16 I wasn’t really motivated to code this last week. But I did build something for the desktop software! I created a color and icon selector. The icons are fetched from Simple Icons. It’s only the UI for now. The feature for the ctrlPad firmware is coming in the next version(s) :) Stay tuned!
Devlog # 17 Today I made it possible to send the button background color and the icon SVG to the BLE config. I also built a little preview (left corner). The next step is to display the SVG icon and the background color on the CtrlPad.
Devlog #18 Today I applied the features I built last week: editing button colors. One big problem was that I had used a button matrix, and it’s almost impossible to change the background color of just one button in a matrix. So I did some refactoring. I moved from a matrix to six normal, standalone buttons. After that, I wrote the functions to apply the config. In the pictures you can now see how it’s possible to change the button color you select in the app. (Please ignore my dusty, messy desk xD)
Devlog #19 I’m back after my first week of school after the holidays :) The newest update is that I implemented rendering for the icons you select in the desktop software. The mechanism behind it wasn’t easy, but here’s my final implementation: Each button’s icon arrives over BLE as a base64-encoded bitmap in the JSON config. renderIcon() decodes it and hands it off to changeIcon(), which builds an lv_image_dsc_t and assigns it via lv_image_set_src() to that button’s LVGL image widget or blanks it out if no icon string was provided. I also fixed some things in the Desktop software :) The next step, is making the config persistent on the ESP
Devlog #20 Today i created this fancy feature page on the website :).
Devlog #21 The last days I added some important updates to the Ctrlpad website: Major refactoring: Cleaned and reorganized parts Responsive design, full mobile and Tablet support The website is now better structured for future additions :)
Ships:
Hello everyone! I built an Elgato Stream Deck alternative called Ctrlpad. Ctrlpad runs actions when you press its button. For example, opening applications like Discord really fast. It can genuinely improve your workflow. At the beginning I had trouble getting the Ctrlpad to communicate with my computer, but then I learned about BLE. I also coded a desktop app to configure the layout, colors, icons, actions and more. The ecosystem is only available on Linux for now, since I wanted to focus on the important things first. The project is split into three separate repositories: the Firmware (the code flashed onto the ESP), the Desktop Application (the interface used to configure actions like opening apps or changing the volume), and the Daemon (a background service that runs continuously on your computer to execute those actions)....
|
1793004732.3934894
|
1793091132.3934894
|
|
7422
|
Weird looking f1 car by @leg1231 | Stardance
|
leg1231
|
0
|
113.42
|
0
|
[]
|
[{"post_id": 80777, "ts": "202 [{"post_id": 80777, "ts": "2026-10-18T19:11:39Z", "hours": 16.7047, "text": "IT FINALLY WORKS!!!! still have alot to do but it can move and steer on its own."}, {"post_id": 74742, "ts": "2026-09-28T03:32:28Z", "hours": 10.2919, "text": "Its starting to look Cool!!!! you can now see why i called it wierd looking f1 car, half the engine area is just a motor"}, {"post_id": 72962, "ts": "2026-09-24T03:40:43Z", "hours": 9.1639, "text": "It only looks a little sus. next thing to do is finish the body and work on wiring. I was about to do the first full test then realized the battery was dead. ILL BE BACK"}, {"post_id": 70401, "ts": "2026-09-19T03:29:14Z", "hours": 8.9811, "text": "I replaced the 3d printed axles with steel rods, then remade the main chassy to be more sturdy, then the front stearring broke. so much fun : |"}, {"post_id": 59979, "ts": "2026-09-02T02:03:37Z", "hours": 8.6339, "text": "This is the full size of it. i ran the motors and the rear axel limitedly snapped. It couldn’t handle the torque :("}, {"post_id": 52740, "ts": "2026-08-23T02:11:12Z", "hours": 9.2153, "text": "Fully assembled front stearing. V1"}, {"post_id": 47193, "ts": "2026-08-14T22:34:32Z", "hours": 7.8606, "text": "hopefully done with the steering and front wheel base"}, {"post_id": 45155, "ts": "2026-08-11T13:48:51Z", "hours": 5.0683, "text": "Working on the front stearing struts and part of the body( this is half, ill mirror it once I like how it is working)"}, {"post_id": 33204, "ts": "2026-07-22T22:06:48Z", "hours": 8.1108, "text": "Started working on front steering. Each wheel will steer individually so that i can test both postive ackermen and reverse ackermen stearing"}, {"post_id": 30489, "ts": "2026-07-18T03:16:27Z", "hours": 10.4411, "text": "from a cad file to physical"}, {"post_id": 17314, "ts": "2026-06-28T01:15:18Z", "hours": 18.9447, "text": "drive train of car, all 3d printed"}]...
|
Title: Weird looking f1 car by @leg1231 | Stardanc Title: Weird looking f1 car by @leg1231 | Stardance
Devlogs:
drive train of car, all 3d printed
from a cad file to physical
Started working on front steering. Each wheel will steer individually so that i can test both postive ackermen and reverse ackermen stearing
Working on the front stearing struts and part of the body( this is half, ill mirror it once I like how it is working)
hopefully done with the steering and front wheel base
Fully assembled front stearing. V1
This is the full size of it. i ran the motors and the rear axel limitedly snapped. It couldn’t handle the torque :(
I replaced the 3d printed axles with steel rods, then remade the main chassy to be more sturdy, then the front stearring broke. so much fun : |
It only looks a little sus. next thing to do is finish the body and work on wiring. I was about to do the first full test then realized the battery was dead. ILL BE BACK
Its starting to look Cool!!!! you can now see why i called it wierd looking f1 car, half the engine area is just a motor
IT FINALLY WORKS!!!! still have alot to do but it can move and steer on its own....
|
1792558215.3520005
|
1793163015.3520005
|
|
32595
|
LifeSphere by @ice__fizz | Stardance
|
ice__fizz
|
0
|
113.0
|
0
|
[]
|
[{"post_id": 25860, "ts": "202 [{"post_id": 25860, "ts": "2026-07-10T10:42:46Z", "hours": 113.0, "text": "hi guys, i made a cool thing so this is devlog 1 new here but uhh yea so this is a cool project- rn i finished the main thing that allows it to really work and communicate- the app made it in flutter, i like it tbh. firebase also in this- it does medicine reminder creation, automation for home appliances, check ur health and etc"}]...
|
Title: LifeSphere by @ice__fizz | Stardance
Devlo Title: LifeSphere by @ice__fizz | Stardance
Devlogs:
hi guys, i made a cool thing so this is devlog 1 new here but uhh yea so this is a cool project- rn i finished the main thing that allows it to really work and communicate- the app made it in flutter, i like it tbh. firebase also in this- it does medicine reminder creation, automation for home appliances, check ur health and etc...
|
1792929296.2697332
|
1793793296.2697332
|
|
48715
|
list by @flyingfish | Stardance
|
flyingfish
|
1
|
112.62
|
787
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-02T03:02:48Z", "hours": 106.0, "multiplier": 7.45, "payout": 787, "blessing": "neutral", "text": "i have used a lot of different lists apps but all of them are so coprate and suck so i made my own i have never used sql before so it was a learning experience i also have never used any time library before but this was fun there is a lot of features i want able to add becouse of time and scope reasons so the code is built in a way that it can updated really easly", "repo": "https://github.com/dinotiger01/list", "demo": "https://github.com/dinotiger01/list/releases/tag/idktag_or_smth"}]...
|
[{"post_id": 68433, "ts": "202 [{"post_id": 68433, "ts": "2026-09-15T03:39:48Z", "hours": 6.6206, "text": "windows works now i had like 20 commits before all of this"}, {"post_id": 59962, "ts": "2026-09-02T01:16:48Z", "hours": 9.9725, "text": "i finished all the git action things and all of the last minute changes ie small bug fixes i am now reddy to ship"}, {"post_id": 58674, "ts": "2026-08-31T05:48:43Z", "hours": 5.9939, "text": "tons of styleing updates i have spent the past 6 hurs strait styling and validating inputs however it is finally done i just need to do the git hub things and add compatability how ever thats tomarow s problem"}, {"post_id": 58463, "ts": "2026-08-30T21:42:23Z", "hours": 7.7864, "text": "ahhhhhh i did like ui things i am going insane"}, {"post_id": 57864, "ts": "2026-08-30T05:35:55Z", "hours": 5.1236, "text": "this is my third devlog today 10hr logg to day btw :teird: a fileter bredet edit deleate and add new people"}, {"post_id": 57703, "ts": "2026-08-29T23:00:01Z", "hours": 4.9544, "text": "jank i have made the ability to add and remove types i will refine later ngl edit: like 10 minits after i posted this i got the code to work where the type updates all the list that already exist"}, {"post_id": 57430, "ts": "2026-08-29T16:03:12Z", "hours": 6.0314, "text": "filter the audio on the video is like really bad my main mic stopped working so i taped a web cam to my face :idk_man: core filtering the filrering works by when a task isbeing loaded to the page it will go to a function that will check if it can be used the filter function will check baised of 4 variables stored in the c++ then the qml sends new variables over then i also spent like hours on this but i made it so it wont check any filter if nothing is selected filter by name this is a simple it will just send a string over then check is filter string is contained in the task name filter by person this uses a vector of intigers it will loop through both then if if there is a the same intiger in booth it will show btw peple are stored by index filter by type the type is stored as a vector of strings it does te same and loops through the filter strings and if the task type is equal it will allow the task filter by date this was defenetly the most dificalt one and it is stored av a vector<time_t> there are 2 text boxes the first one is a lower limit the seconed is an uper limit if eather is blank it will not check it if the second one has a date it will only show dates on or before that onee if the second one has a date it will only show tasks after that date if both have dates it will check in betewwn them"}, {"post_id": 56777, "ts": "2026-08-28T17:51:02Z", "hours": 5.8836, "text": "really quick little devlog i just added the abiltiy to edit tasks it works by opening the place wheree you create task then sets all the value manualy it was like supper hard to make it so you can edit a task then create a task then go back to editing becouse if a variable was not assined by acident it would all crash"}, {"post_id": 56195, "ts": "2026-08-27T20:49:57Z", "hours": 8.5181, "text": "recuring there is a lot (btw i already wrote all of this and acidently deleated it ) reacuring check types on load when the code realoads it will go through and check if any items need to be updated i made it so if it finds a task that needs to be updated it will reafrech and start over so a task can be updated multible times if needed on mark off this will only check one task when you mark off a task this will aslo by pass the alow multi alow multi * this will make it so when a task is duplicated it will either set the old task to 0 or just deleate it * this is marked in the code as the higher of 2 numbers while checking rec type rec types normal this is a type that will not recure and is the only one able to be fully deleated this is marked by a 0 in the code this will be skipped by both reacuring types by due date this to to make a task the will eather run every day or every other day this types has a second variabe called delay witch changes how often the task will show up ie dalay =1 means every day, delay =2 means every other day this is marked as 1 or 2 in the code on the on load check this will check if (due date + delay) < current date if it is it will duplicate the task to due date + delay on mark off for this task will just duplicate teh task to due date + delay on compleate this is used for task that just need to be done betwenn compleations this is marked as 3 in the code becouse it canot have multibles this also have a number called delay this is skiped by the on load check on mark off this task will just duplicate it self to current date + delay on week day this is for tasks that need to be compleated on specifice week days this task has a number that is between 0-127 insted of a delay because it can be converted in to a 7 digit binary string that means reapeate on dayes with 1 and not on 0 this is marked as 4 or 5 on load it will task the due date then search for the next valid date and then will check if the date is before the current date if it is before it will duplicate its self there on mark off works the same just it doent check if the date is before current on month day this is for tasks thatneed to happen on a month by month basses this stores a number from 1-28 witch is the date that it will apere on the month this is marked in the code as 6 or 7 this work in a very simmilar way to the on week day it will take the due date then add one untill it finds a valid date and if it is onload it will check if the current date ia after the new date in the futre i might make it so that if you put 0 in the date it will just run the last day of the month perminat delete each tsk has a button to open the edit menu and you can deteate a task from the edit menu witch will skip all duplicating"}, {"post_id": 54860, "ts": "2026-08-26T01:42:57Z", "hours": 5.1708, "text": "ui- validation i spent like littery 5 hours on ui and validation ui reccuring if you set to reacuring it opens the drop dwon to select what type rec on due select i allow multible select number rec on comp select number rec on week day select i allow multible select week day rec on month day select i allow multible select number validation i havent actually finish the validation fully nut you can not have a blank pryority you can not have a blank list type you can not have ’ or ; in notes or name you can not have a blank name you can not have a invalid date format"}, {"post_id": 54528, "ts": "2026-08-25T15:35:37Z", "hours": 10.2064, "text": "i just be doing stuff ngl i just kinda locked in and forgot to dev log pryoritys you can now set pryoritys the pryoritys are created dynamicly bassed on a sql data base each priority can be collapsed and expanded they will have a number i just havent got to it yet bugges i ran in to a really anoying bug where i had to add the tasks dynamicly inside the pryoritys that are also scaled dynamicly delleate it is simple when a task is closed it doesn’t show up and is droped from the db bugges this delete was causeing like 1000 runtime errors because the tasks are considered separate qml so i cant link to anything out the task and it was like making new backed files and it was dumb date ctime is like really complicated if you have no clue what you are doing i made it so that the task show how many days away the task is due bugges i think i ran it to all the buggees with ctime the most memorable one is when the ctime would just return random times for som reason dynamic tasks i made the notes section scale with the height of the notes in side of it i also added the full date the the task is due in the notes"}, {"post_id": 53189, "ts": "2026-08-23T17:01:43Z", "hours": 9.2897, "text": "i really hope this dont break last dev log so the last devlog like crashed my entire computer or something and now i cant edit it to change the mesasge to i am going to wright all of it here i added an sql data base the data base simply pulls all of the tasks from the .db fle then converts them in to tjhe structs i menaced before then it loads them to the qml page sql sql mage nooooo sence i might just be stuppid but this took like 6 hr aklone to figgure out how to wright to a db file current devlog initializer qml really dont like to run before the c++ howver i needed to just the function that loads all the task affter the qml loads becouse the qml needs to tell the c++ where the tasks need to be so after a long time reaserching and trying things i found that qt has a way to do what i needed and now the code can run the script at the right time add task i made a way to add a task basicly you click a + button then you select al the things you want then it send those to the c++ witch sends them to the sql then it oulls the sql and realoded all the task you might be wondering why doo all of that when it would be easier to just add the task in the qml and to that i say yeah you probly right idk what i am doing"}, {"post_id": 51777, "ts": "2026-08-21T16:48:07Z", "hours": 8.7489, "text": "sql"}, {"post_id": 50050, "ts": "2026-08-19T02:41:09Z", "hours": 8.9317, "text": "we be doing a logic drop down these menus were a pain in the ass there was a bug where the top pixel of the menu was viable contently and it took genuinely 2 hours to fix logic i created a struct that has all the data needed for a task i then took the code for a qml task added it as a widgit or somthing idk what is called then the c++ reads thriugh a list of all the struct task and adds them to the page"}, {"post_id": 48613, "ts": "2026-08-17T02:32:59Z", "hours": 9.1361, "text": "we be doing some ui this is a list i am making for my family to track chores and stuff tab bar on the left this is going to be the place where you can select what page you want to be on so like if you wan to edit what people you have or stuff top filter this is so you can filter the tasks so you can only focus one one you need to do main veiw the tasks each hold * taks name * all the people assined to the task * thwe type * date * notes pryoritys the task list will have a bunch of pryoritys that can open expand and colapes for easier viewing the total will just show how many tasks there are in total timer we have a system where every one has to do 2hr of work each day so i figuerd i would just add that here"}]...
|
Title: list by @flyingfish | Stardance
Devlogs:
w Title: list by @flyingfish | Stardance
Devlogs:
we be doing some ui this is a list i am making for my family to track chores and stuff tab bar on the left this is going to be the place where you can select what page you want to be on so like if you wan to edit what people you have or stuff top filter this is so you can filter the tasks so you can only focus one one you need to do main veiw the tasks each hold * taks name * all the people assined to the task * thwe type * date * notes pryoritys the task list will have a bunch of pryoritys that can open expand and colapes for easier viewing the total will just show how many tasks there are in total timer we have a system where every one has to do 2hr of work each day so i figuerd i would just add that here
we be doing a logic drop down these menus were a pain in the ass there was a bug where the top pixel of the menu was viable contently and it took genuinely 2 hours to fix logic i created a struct that has all the data needed for a task i then took the code for a qml task added it as a widgit or somthing idk what is called then the c++ reads thriugh a list of all the struct task and adds them to the page
sql
i really hope this dont break last dev log so the last devlog like crashed my entire computer or something and now i cant edit it to change the mesasge to i am going to wright all of it here i added an sql data base the data base simply pulls all of the tasks from the .db fle then converts them in to tjhe structs i menaced before then it loads them to the qml page sql sql mage nooooo sence i might just be stuppid but this took like 6 hr aklone to figgure out how to wright to a db file current devlog initializer qml really dont like to run before the c++ howver i needed to just the function that loads all the task affter the qml loads becouse the qml needs to tell the c++ where the tasks need to be so after a long time reaserching and trying things i found that qt has a way to do what i needed and now the code can run the script at the right time add task i made a way to add a task basicly you click a + button then you select al the things you want then it send those to the c++ witch sends them to the sql then it oulls the sql and realoded all the task you might be wondering why doo all of that when it would be easier to just add the task in the qml and to that i say yeah you probly right idk what i am doing
i just be doing stuff ngl i just kinda locked in and forgot to dev log pryoritys you can now set pryoritys the pryoritys are created dynamicly bassed on a sql data base each priority can be collapsed and expanded they will have a number i just havent got to it yet bugges i ran in to a really anoying bug where i had to add the tasks dynamicly inside the pryoritys that are also scaled dynamicly delleate it is simple when a task is closed it doesn’t show up and is droped from the db bugges this delete was causeing like 1000 runtime errors because the tasks are considered separate qml so i cant link to anything out the task and it was like making new backed files and it was dumb date ctime is like really complicated if you have no clue what you are doing i made it so that the task show how many days away the task is due bugges i think i ran it to all the buggees with ctime the most memorable one is when the ctime would just return random times for som reason dynamic tasks i made the notes section scale with the height of the notes in side of it i also added the full date the the task is due in the notes
ui- validation i spent like littery 5 hours on ui and validation ui reccuring if you set to reacuring it opens the drop dwon to select what type rec on due select i allow multible select number rec on comp select number rec on week day select i allow multible select week day rec on month day select i allow multible select number validation i havent actually finish the validation fully nut you can not have a blank pryority you can not have a blank list type you can not have ’ or ; in notes or name you can not have a blank name you can not have a invalid date format
recuring there is a lot (btw i already wrote all of this and acidently deleated it ) reacuring check types on load when the code realoads it will go through and check if any items need to be updated i made it so if it finds a task that needs to be updated it will reafrech and start over so a task can be updated multible times if needed on mark off this will only check one task when you mark off a task this will aslo by pass the alow multi alow multi * this will make it so when a task is duplicated it will either set the old task to 0 or just deleate it * this is marked in the code as the higher of 2 numbers while checking rec type rec types normal this is a type that will not recure and is the only one able to be fully deleated this is marked by a 0 in the code this will be skipped by both reacuring types by due date this to to make a task the will eather run every day or every other day this types has a second variabe called delay witch changes how often the task will show up ie dalay =1 means every day, delay =2 means every other day this is marked as 1 or 2 in the code on the on load check this will check if (due date + delay) < current date if it is it will duplicate the task to due date + delay on mark off for this task will just duplicate teh task to due date + delay on compleate this is used for task that just need to be done betwenn compleations this is marked as 3 in the code becouse it canot have multibles this also have a number called delay this is skiped by the on load check on mark off this task will just duplicate it self to current date + delay on week day this is for tasks that need to be compleated on specifice week days this task has a number that is between 0-127 insted of a delay because it can be converted in to a 7 digit binary string that means reapeate on dayes with 1 and not on 0 this is marked as 4 or 5 on load it will task the due date then search for the next valid date and then will check if the date is before the current date if it is before it will duplicate its self there on mark off works the same just it doent check if the date is before current on month day this is for tasks thatneed to happen on a month by month basses this stores a number from 1-28 witch is the date that it will apere on the month this is marked in the code as 6 or 7 this work in a very simmilar way to the on week day it will take the due date then add one untill it finds a valid date and if it is onload it will check if the current date ia after the new date in the futre i might make it so that if you put 0 in the date it will just run the last day of the month perminat delete each tsk has a button to open the edit menu and you can deteate a task from the edit menu witch will skip all duplicating
really quick little devlog i just added the abiltiy to edit tasks it works by opening the place wheree you create task then sets all the value manualy it was like supper hard to make it so you can edit a task then create a task then go back to editing becouse if a variable was not assined by acident it would all crash
filter the audio on the video is like really bad my main mic stopped working so i taped a web cam to my face :idk_man: core filtering the filrering works by when a task isbeing loaded to the page it will go to a function that will check if it can be used the filter function will check baised of 4 variables stored in the c++ then the qml sends new variables over then i also spent like hours on this but i made it so it wont check any filter if nothing is selected filter by name this is a simple it will just send a string over then check is filter string is contained in the task name filter by person this uses a vector of intigers it will loop through both then if if there is a the same intiger in booth it will show btw peple are stored by index filter by type the type is stored as a vector of strings it does te same and loops through the filter strings and if the task type is equal it will allow the task filter by date this was defenetly the most dificalt one and it is stored av a vector<time_t> there are 2 text boxes the first one is a lower limit the seconed is an uper limit if eather is blank it will not check it if the second one has a date it will only show dates on or before that onee if the second one has a date it will only show tasks after that date if both have dates it will check in betewwn them
jank i have made the ability to add and remove types i will refine later ngl edit: like 10 minits after i posted this i got the code to work where the type updates all the list that already exist
this is my third devlog today 10hr logg to day btw :teird: a fileter bredet edit deleate and add new people
ahhhhhh i did like ui things i am going insane
tons of styleing updates i have spent the past 6 hurs strait styling and validating inputs however it is finally done i just need to do the git hub things and add compatability how ever thats tomarow s problem
i finished all the git action things and all of the last minute changes ie small bug fixes i am now reddy to ship
windows works now i had like 20 commits before all of this
Ships:
i have used a lot of different lists apps but all of them are so coprate and suck so i made my own i have never used sql before so it was a learning experience i also have never used any time library before but this was fun there is a lot of features i want able to add becouse of time and scope reasons so the code is built in a way that it can updated really easly...
|
1792997795.383756
|
1793084195.383756
|
|
10554
|
MCServerKit by @nathanielramirez | Stardance
|
nathanielramirez
|
0
|
112.0
|
0
|
[]
|
[{"post_id": 25049, "ts": "202 [{"post_id": 25049, "ts": "2026-07-09T00:24:24Z", "hours": 30.0, "text": "Devlog 4 I have finished porting the library to Rust using Rust FFI, so it won’t need to be done manually. I’ve set it up so you can install it through Cargo: cargo add mcserverkit And you can use it like this: main.rs fn main () { let err = mcserverkit :: install ( \"1.21.1\" ); if err != None { println! ( \"Error installing 1.21.1:\" ); } let err = mcserverkit :: create ( \"MyServer\" , true ); if err != None { println! ( \"Error creating MyServer:\" ); } let err = mcserverkit :: start ( \"MyServer\" , \"4G\" ); if err != None { println! ( \"Error starting MyServer:\" ); } } Also, I’ve added ARM architecture support for Linux and I updated the library to Go 1.26.4 so instead of passing 1s and 0s to the eula parameter you can pass true or false for C and C++."}, {"post_id": 17349, "ts": "2026-06-28T03:04:39Z", "hours": 5.0, "text": "devlog 3 When I began binding my Go library to Rust today, I had realized something I’ve been doing wrong not just in my Rust bindings but in my C bindings. They both work by calling go build which is fine but not everyone has Go installed on their computer, so it works on mine but not others. use std :: process :: Command ; fn main () { println! ( \"Hello World!\" ); // https://stackoverflow.com/questions/43292357/how-can-one-detect-the-os-type-using-rust // https://doc.rust-lang.org/std/process/struct.Command.html let _output = if cfg! ( target_os = \"windows\" ) { Command :: new ( \"go\" ) .args ([ \"build\" , \"-buildmode=c-shared\" , \"-o\" , \"mcserverkit.dll\" , \"./bindings/c\" , ]); } else if cfg! ( target_os = \"linux\" ) { Command :: new ( \"go\" ) .args ([ \"build\" , \"-buildmode=c-shared\" , \"-o\" , \"mcserverkit.so\" , \"./bindings/c\" , ]); } else if cfg! ( target_os = \"macos\" ) { Command :: new ( \"go\" ) .args ([ \"build\" , \"-buildmode=c-shared\" , \"-o\" , \"mcserverkit.dylib\" , \"./bindings/c\" , ]); } else { println! ( \"Operating system not supported\" ); return ; }; } the plan Instead of requiring every person to have Go installed, I created a GitHub action that compiles the library for every platform whenever a new release is published. It generates .dll , .so , .dylib and header files and uploads to release assets. but it’s only half the process, I still have to rewrite my Rust and C bindings so they download the precompiled assets from the latest GitHub release instead of compiling them locally. This should actually make the entire logic faster because it won’t need to download the source and run go build every time when it can skip straight to the prebuilt assets, which removes the compiling step entirely!!!"}, {"post_id": 16707, "ts": "2026-06-27T04:37:18Z", "hours": 45.0, "text": "devlog 2 In my last post, i said that i wanted to port my Minecraft server library to C. currently i’ve released v0.1.9 which adds C/C++ support with Go bindings. and i spent a LONG time debugging and creating a CMakeLists.txt allowing developers to easily just… (yes that easy) cmake_minimum_required ( VERSION 3.16 ) project ( example LANGUAGES C ) include ( FetchContent ) FetchContent_Declare ( mcserverkit GIT_REPOSITORY https://github.com/mcserverkit/core GIT_TAG v0.1.9 ) FetchContent_MakeAvailable ( mcserverkit ) add_executable ( example main.c ) target_link_libraries ( example PRIVATE mcserverkit ) which allows you to do this! #include \"mcserverkit.h\" int main () { Install ( \"1.21.1\" ); Create ( \"MyServer\" , 1 ); Start ( \"MyServer\" , \"4G\" ); } and to bundle as an executable run this in your terminal: cmake -S . -B build -DCMAKE_BUILD_TYPE = Release cmake --build build -j sorry this update took so long… app progress Also, I know I’ve just added support for C and C++ but now I NEED to add an adapter for Rust because I switched to Tauri instead of Webview and Tauri uses Rust for the backend instead of C++ and that’s most likely going to be a part of the next log. Here’s a picture of the app so far, i was inspired by Minecraft’s website ui and wanted it to feel more connected to the official game, it already works cross platform but none of the backend is connected yet because i have to make bindings for Rust."}, {"post_id": 7340, "ts": "2026-06-12T07:32:53Z", "hours": 32.0, "text": "running local minecraft servers is annoying! nobody likes paying for cloud hosting, so i spent the past 8 days programming a local cli for creating and managing minecraft servers because using .jar files directly is overcomplicated. i decided to make the core an open source and reusable Go library and i am planning to port it to C in the future. i just finished the first stable version of mcserverkit’s core and cli and wrote a shell script for macos and linux users to easily install the cli. as for windows, i haven’t yet but i have included steps to easily add the executable to PATH. what’s next? i am working on a GUI app using C and webview, i plan on adding port forwarding so you can run it on your computer locally and share them with your friends!"}]...
|
Title: MCServerKit by @nathanielramirez | Stardanc Title: MCServerKit by @nathanielramirez | Stardance
Devlogs:
running local minecraft servers is annoying! nobody likes paying for cloud hosting, so i spent the past 8 days programming a local cli for creating and managing minecraft servers because using .jar files directly is overcomplicated. i decided to make the core an open source and reusable Go library and i am planning to port it to C in the future. i just finished the first stable version of mcserverkit’s core and cli and wrote a shell script for macos and linux users to easily install the cli. as for windows, i haven’t yet but i have included steps to easily add the executable to PATH. what’s next? i am working on a GUI app using C and webview, i plan on adding port forwarding so you can run it on your computer locally and share them with your friends!
devlog 2 In my last post, i said that i wanted to port my Minecraft server library to C. currently i’ve released v0.1.9 which adds C/C++ support with Go bindings. and i spent a LONG time debugging and creating a CMakeLists.txt allowing developers to easily just… (yes that easy) cmake_minimum_required ( VERSION 3.16 ) project ( example LANGUAGES C ) include ( FetchContent ) FetchContent_Declare ( mcserverkit GIT_REPOSITORY https://github.com/mcserverkit/core GIT_TAG v0.1.9 ) FetchContent_MakeAvailable ( mcserverkit ) add_executable ( example main.c ) target_link_libraries ( example PRIVATE mcserverkit ) which allows you to do this! #include "mcserverkit.h" int main () { Install ( "1.21.1" ); Create ( "MyServer" , 1 ); Start ( "MyServer" , "4G" ); } and to bundle as an executable run this in your terminal: cmake -S . -B build -DCMAKE_BUILD_TYPE = Release cmake --build build -j sorry this update took so long… app progress Also, I know I’ve just added support for C and C++ but now I NEED to add an adapter for Rust because I switched to Tauri instead of Webview and Tauri uses Rust for the backend instead of C++ and that’s most likely going to be a part of the next log. Here’s a picture of the app so far, i was inspired by Minecraft’s website ui and wanted it to feel more connected to the official game, it already works cross platform but none of the backend is connected yet because i have to make bindings for Rust.
devlog 3 When I began binding my Go library to Rust today, I had realized something I’ve been doing wrong not just in my Rust bindings but in my C bindings. They both work by calling go build which is fine but not everyone has Go installed on their computer, so it works on mine but not others. use std :: process :: Command ; fn main () { println! ( "Hello World!" ); // https://stackoverflow.com/questions/43292357/how-can-one-detect-the-os-type-using-rust // https://doc.rust-lang.org/std/process/struct.Command.html let _output = if cfg! ( target_os = "windows" ) { Command :: new ( "go" ) .args ([ "build" , "-buildmode=c-shared" , "-o" , "mcserverkit.dll" , "./bindings/c" , ]); } else if cfg! ( target_os = "linux" ) { Command :: new ( "go" ) .args ([ "build" , "-buildmode=c-shared" , "-o" , "mcserverkit.so" , "./bindings/c" , ]); } else if cfg! ( target_os = "macos" ) { Command :: new ( "go" ) .args ([ "build" , "-buildmode=c-shared" , "-o" , "mcserverkit.dylib" , "./bindings/c" , ]); } else { println! ( "Operating system not supported" ); return ; }; } the plan Instead of requiring every person to have Go installed, I created a GitHub action that compiles the library for every platform whenever a new release is published. It generates .dll , .so , .dylib and header files and uploads to release assets. but it’s only half the process, I still have to rewrite my Rust and C bindings so they download the precompiled assets from the latest GitHub release instead of compiling them locally. This should actually make the entire logic faster because it won’t need to download the source and run go build every time when it can skip straight to the prebuilt assets, which removes the compiling step entirely!!!
Devlog 4 I have finished porting the library to Rust using Rust FFI, so it won’t need to be done manually. I’ve set it up so you can install it through Cargo: cargo add mcserverkit And you can use it like this: main.rs fn main () { let err = mcserverkit :: install ( "1.21.1" ); if err != None { println! ( "Error installing 1.21.1:" ); } let err = mcserverkit :: create ( "MyServer" , true ); if err != None { println! ( "Error creating MyServer:" ); } let err = mcserverkit :: start ( "MyServer" , "4G" ); if err != None { println! ( "Error starting MyServer:" ); } } Also, I’ve added ARM architecture support for Linux and I updated the library to Go 1.26.4 so instead of passing 1s and 0s to the eula parameter you can pass true or false for C and C++....
|
1792885962.7708764
|
1793749962.7708764
|
|
51772
|
Parallel Plate DriveTrain by @precon | Stardance
|
precon
|
0
|
111.8
|
0
|
[]
|
[{"post_id": 80566, "ts": "202 [{"post_id": 80566, "ts": "2026-10-18T05:22:32Z", "hours": 12.5961, "text": "I had to redesign so much of the turret after testing, i changed the compression from 4 to 3 back to 4mm, and then im now running it 1:1 with the motor. I think this will create a pretty big torque on the bearing stack but we’ll see how it holds up. I also found a new way to constrain the outer bearings which works really well"}, {"post_id": 79696, "ts": "2026-10-15T03:00:33Z", "hours": 10.4431, "text": "even more cad, did electronics so almost done"}, {"post_id": 78639, "ts": "2026-10-11T04:46:50Z", "hours": 17.0306, "text": "did a lot of work to link things together and ensure functionality and reliability"}, {"post_id": 77933, "ts": "2026-10-08T20:42:57Z", "hours": 10.3814, "text": "I worked on the turret more and optimized+printed the index"}, {"post_id": 77482, "ts": "2026-10-07T05:28:11Z", "hours": 12.2506, "text": "I think ive finalized the index design, i updated all the driver components for it, and the geometry is okay. I also got started on the turret hood design"}, {"post_id": 76648, "ts": "2026-10-04T08:00:34Z", "hours": 9.7214, "text": "Had to do lots of redesigns because Fusion apparently hates me. When I update a really big subassembly, I can’t move it back in the timeline far enough so all the features before that update get broken from the projections and the dimensions and stuff. I’ve had to restart twice now. I’ve gotten much better at creating big subassemblies so that it’s much easier to assemble it big piece by piece, but it is still taking a lot of effort. I’m probably going to pull an all-nighter to finish this up and hopefully have a semi-working model before the morning."}, {"post_id": 76054, "ts": "2026-10-02T06:44:41Z", "hours": 4.5253, "text": "worked more on finishing the drivetrain and assembling major sub assemblies"}, {"post_id": 74359, "ts": "2026-09-27T07:27:52Z", "hours": 12.0167, "text": "Worked on master sketch and attaching turret"}, {"post_id": 73900, "ts": "2026-09-26T09:07:19Z", "hours": 5.6, "text": "Finished most of the pollen turret assembly and got it on the robot a bit."}, {"post_id": 73809, "ts": "2026-09-26T02:04:55Z", "hours": 8.9833, "text": "Worked a lot on the turret part, created bearing stacks based off a reference, and started on the shooter. It’s really hard to get the compression and spacings right because there’s a lot of dead zone in the turret bearing stack and the shooter wheel also takes up a lot of space. I also want to try out different things, which will take a bit of time to model."}, {"post_id": 68776, "ts": "2026-09-15T18:51:34Z", "hours": 8.25, "text": "I have finally finished the first version of the drivetrain. Right now it has a 1:4 gear reduction, connected to a 1:3 belt reduction on a 5800rpm motor for a 483 rpm final rpm on a 104mm wheel. The entire setup is on dead axles, with heavily reinforced side plates. I also ensured to optimize space as much as possible which meant organizing both gear trains and the motors in order to maximize space."}]...
|
Title: Parallel Plate DriveTrain by @precon | Star Title: Parallel Plate DriveTrain by @precon | Stardance
Devlogs:
I have finally finished the first version of the drivetrain. Right now it has a 1:4 gear reduction, connected to a 1:3 belt reduction on a 5800rpm motor for a 483 rpm final rpm on a 104mm wheel. The entire setup is on dead axles, with heavily reinforced side plates. I also ensured to optimize space as much as possible which meant organizing both gear trains and the motors in order to maximize space.
Worked a lot on the turret part, created bearing stacks based off a reference, and started on the shooter. It’s really hard to get the compression and spacings right because there’s a lot of dead zone in the turret bearing stack and the shooter wheel also takes up a lot of space. I also want to try out different things, which will take a bit of time to model.
Finished most of the pollen turret assembly and got it on the robot a bit.
Worked on master sketch and attaching turret
worked more on finishing the drivetrain and assembling major sub assemblies
Had to do lots of redesigns because Fusion apparently hates me. When I update a really big subassembly, I can’t move it back in the timeline far enough so all the features before that update get broken from the projections and the dimensions and stuff. I’ve had to restart twice now. I’ve gotten much better at creating big subassemblies so that it’s much easier to assemble it big piece by piece, but it is still taking a lot of effort. I’m probably going to pull an all-nighter to finish this up and hopefully have a semi-working model before the morning.
I think ive finalized the index design, i updated all the driver components for it, and the geometry is okay. I also got started on the turret hood design
I worked on the turret more and optimized+printed the index
did a lot of work to link things together and ensure functionality and reliability
even more cad, did electronics so almost done
I had to redesign so much of the turret after testing, i changed the compression from 4 to 3 back to 4mm, and then im now running it 1:1 with the motor. I think this will create a pretty big torque on the bearing stack but we’ll see how it holds up. I also found a new way to constrain the outer bearings which works really well...
|
1792684241.1733289
|
1793289041.1733289
|
|
2910
|
3d game engine by @rajaryan1492007 | Stardance
|
rajaryan1492007
|
3
|
110.5
|
1561
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T19:17:52Z", "hours": 14.0, "multiplier": 16.69, "payout": 232, "blessing": "neutral", "text": "i just finally done all thing like stable etc . and search of all libs etc so can really work making really good engine i add milestone etc . u can still test project tho but it will just artitacture doc change and some sync bug fix . other then that i add milestone so i can work on that now but i 19 now today so my hackclub will get end so i just ship to info that . devlog is end but i will continue to work on this engine bcuz it been like year since i st working on it already so anyway . and anything u wanna know u can check my project issues and roadmap", "repo": "https://github.com/rajaryan2007/UNHUMAN", "demo": "https://github.com/rajaryan2007/UNHUMAN/releases/tag/test"}, {"ship_num": 2, "ts": "2026-08-26T21:35:30Z", "hours": 71.0, "multiplier": 14.89, "payout": 1056, "blessing": "neutral", "text": "-> I built the Unhuman Engine (UHE) a high-performance, custom 3D game engine written entirely from scratch in C++. It features a custom Vulkan rendering pipeline, Jolt Physics integration, and a 3D spatial audio system using miniaudio. Alongside the engine, I built a fully playable “Aim Lab” style 3D shooter game to showcase its capabilities, complete with skeletal animations, recoil mechanics, and a robust entity component system (ECS). -> Building a Vulkan renderer from the ground up is notoriously difficult due to how explicit the API is. Getting the Vulkan swapchains, descriptors, and framebuffers perfectly synchronized was a massive hurdle. Beyond rendering, building the virtual file system (VFS) to correctly resolve asset paths across different platforms (Linux native and Windows via Wine) required a lot of trial and error, as did managing multithreaded memory cleanup for the audio subsystem to prevent Because of the custom Vulkan architecture and strict C++ optimizations, the game hits 900+ FPS in release builds, even on integrated graphics! the custom pixel-perfect 3D entity picking system we built using Vulkan framebuffers (instead of relying on standard physics raycasting). Finally, the engine architecture is scalable enough that it’s not just for games—it’s designed to handle heavy robotics and autonomous vehicle simulations in the engine . -> The engine supports both Linux and Windows to play the game, just run the UHEGAME executable inside the bin folder. Important: Make sure the assets folder (which contains the 3D models and audio files) is sitting right next to the executable in the same directory, otherwise the game will fall back to a safe mode. Controls: Use your mouse to aim, Left Click to shoot the targets, and press ‘R’ to reload the animated 3D pistol also i write it too big bcuz last time many people said they don’t understand what i did . about running it u can run it in windows and linux both see window build and linux build there to work able excutable file one is uhegame.exe and uhe_editor.exe one is game and other is editor https://github.com/rajaryan2007/UNHUMAN/releases/tag/alpha i will improve the game as time goes i just st with vulkan and other if u have any problem u can ask here https://github.com/rajaryan2007/UNHUMAN/issues if still don’t understand don’t rate down read or search or just read devlog and understand instead of low rating thankyou :)", "repo": "https://github.com/rajaryan2007/UNHUMAN", "demo": "https://github.com/rajaryan2007/UNHUMAN/releases/tag/test"}, {"ship_num": 3, "ts": "2026-06-09T19:02:56Z", "hours": 21.0, "multiplier": 14.37, "payout": 273, "blessing": "neutral", "text": "This project has been a daily labor of love for over a year. Over the last 4 to 5 months, I completely rewrote the entire rendering backend, moving away from a legacy OpenGL state machine to an explicit Vulkan pipeline. Along the way, I completely redesigned the Rendering Hardware Interface (RHI) to align with modern graphics architectures. Welcome to UNHUMAN! You are completely free to clone and compile this engine, but please read this first: ->The 50/50 Rule: This is a custom, explicitly defined Vulkan engine currently tailored to a Ryzen/Vega Windows environment. Because Vulkan does not hide driver-level differences (NVIDIA vs. AMD vs. Intel), there is roughly a 50/50 chance it will compile flawlessly or completely explode on your specific GPU setup. ->The Easy Way Out: If you attempt to build the project and hit Vulkan validation errors, device-lost crashes, or strict compilation failures, please do not waste your time trying to debug my RHI! * Visual Verification: If the build fails on your hardware, simply watch the YouTube Walkthrough Video linked below. It contains the full visual proof of the engine running, rendering, and functioning on the native development machine. link -> https://youtu.be/CHDIU61auYo", "repo": "https://github.com/rajaryan2007/UNHUMAN", "demo": "https://github.com/rajaryan2007/UNHUMAN/releases/tag/test"}]...
|
[{"post_id": 70209, "ts": "202 [{"post_id": 70209, "ts": "2026-09-18T18:21:31Z", "hours": 4.5, "text": "reading source code of o3de and make my engine barrier better"}, {"post_id": 67555, "ts": "2026-09-13T18:10:01Z", "hours": 1.8844, "text": "just make milestone bar for realase"}, {"post_id": 66844, "ts": "2026-09-12T19:21:25Z", "hours": 2.6544, "text": "make better job system"}, {"post_id": 62020, "ts": "2026-09-05T07:13:01Z", "hours": 4.5067, "text": "add multithreading and better sync"}, {"post_id": 59175, "ts": "2026-08-31T20:15:59Z", "hours": 4.8814, "text": "added text rendering"}, {"post_id": 54512, "ts": "2026-08-25T15:19:38Z", "hours": 2.1939, "text": "added audio and animation"}, {"post_id": 52892, "ts": "2026-08-23T08:38:37Z", "hours": 1.9892, "text": "St making game in my game engine"}, {"post_id": 51531, "ts": "2026-08-21T09:17:58Z", "hours": 3.6897, "text": "added a ci/cd test For engine with lavapipe"}, {"post_id": 45963, "ts": "2026-08-12T19:45:40Z", "hours": 8.6658, "text": "Add descriptor Set fallback and Contribution guidelines"}, {"post_id": 39452, "ts": "2026-08-02T12:29:11Z", "hours": 8.3283, "text": "implemented many fallback feature no less crash add fallback of dynamic_rendering other are pending"}, {"post_id": 30001, "ts": "2026-07-17T07:25:22Z", "hours": 9.0811, "text": "all setup done just have to write fallback now :)"}, {"post_id": 25765, "ts": "2026-07-10T06:41:34Z", "hours": 3.7094, "text": "implementing old renderpass and Framebuffer and other thing to run old hardware"}, {"post_id": 23311, "ts": "2026-07-06T05:53:37Z", "hours": 3.5711, "text": "add more file more function just fallback for Vulkan Engine so it can run in more device"}, {"post_id": 22767, "ts": "2026-07-05T10:54:14Z", "hours": 3.7322, "text": "add support for extension check in Vulkan"}, {"post_id": 21133, "ts": "2026-07-02T22:43:28Z", "hours": 0.9317, "text": "so from now not developing any feature in Game engine for some weeks and Adding fallback to 1.1 to 1.4 vulkan bcuz lot of problem andriod don’t support 1.3 mostly and many gpu like intel have bug in bindless so just adding other to fallback bcuz other are also not good nvidia and amd also have some problem add buildbot that will test like github don’t support gpu to test most probably i will test in software cpu and build system so user can compile and run thing without having any problem so at last only problem left is gpu vendor specific that i will cover through blender o3de engine that how engine can run in most gpus i give better doc or reference next time to show it but it very hard and take month to search so that it"}, {"post_id": 20716, "ts": "2026-07-02T11:47:34Z", "hours": 1.1572, "text": "while working on my engine i take refernce from blender also contributed in blender one issues even got merged other are pending"}, {"post_id": 17338, "ts": "2026-06-28T02:42:07Z", "hours": 7.2022, "text": "jolt physics implementation in vulkan engine and some other bug fix"}, {"post_id": 11434, "ts": "2026-06-18T18:19:47Z", "hours": 1.8758, "text": "PBR light implementation done in my engine"}, {"post_id": 11050, "ts": "2026-06-18T02:35:35Z", "hours": 1.8658, "text": "reimplemented tracy profiler for my engine and working in PBR"}, {"post_id": 10211, "ts": "2026-06-16T20:38:31Z", "hours": 2.0136, "text": "one of the hardest bug to solve i did it now there no texture overlap"}, {"post_id": 9830, "ts": "2026-06-16T08:46:40Z", "hours": 4.2797, "text": "linux and window both support for vulkan engine tested in wine"}, {"post_id": 8004, "ts": "2026-06-13T11:03:28Z", "hours": 6.6514, "text": "model loading done in my engine"}, {"post_id": 5794, "ts": "2026-06-09T18:32:13Z", "hours": 0.28, "text": "update everything now moving toward 3d work and cleanup"}, {"post_id": 5693, "ts": "2026-06-09T16:07:36Z", "hours": 1.7525, "text": "finally port complete in vulkan with RHI and Linux support"}, {"post_id": 5390, "ts": "2026-06-09T04:27:45Z", "hours": 10.2675, "text": "finally rhi and wrapper test is done in vulkan"}, {"post_id": 3458, "ts": "2026-06-06T12:22:17Z", "hours": 8.22, "text": "almost write backend vulkan may i can see something in screen next week after 3 month 😵💫"}, {"post_id": 1715, "ts": "2026-06-03T21:36:09Z", "hours": 0.5761, "text": "rewriting my game engine backend in vulkan and adding support for linux"}]...
|
Title: 3d game engine by @rajaryan1492007 | Starda Title: 3d game engine by @rajaryan1492007 | Stardance
Devlogs:
rewriting my game engine backend in vulkan and adding support for linux
almost write backend vulkan may i can see something in screen next week after 3 month 😵💫
finally rhi and wrapper test is done in vulkan
finally port complete in vulkan with RHI and Linux support
update everything now moving toward 3d work and cleanup
model loading done in my engine
linux and window both support for vulkan engine tested in wine
one of the hardest bug to solve i did it now there no texture overlap
reimplemented tracy profiler for my engine and working in PBR
PBR light implementation done in my engine
jolt physics implementation in vulkan engine and some other bug fix
while working on my engine i take refernce from blender also contributed in blender one issues even got merged other are pending
so from now not developing any feature in Game engine for some weeks and Adding fallback to 1.1 to 1.4 vulkan bcuz lot of problem andriod don’t support 1.3 mostly and many gpu like intel have bug in bindless so just adding other to fallback bcuz other are also not good nvidia and amd also have some problem add buildbot that will test like github don’t support gpu to test most probably i will test in software cpu and build system so user can compile and run thing without having any problem so at last only problem left is gpu vendor specific that i will cover through blender o3de engine that how engine can run in most gpus i give better doc or reference next time to show it but it very hard and take month to search so that it
add support for extension check in Vulkan
add more file more function just fallback for Vulkan Engine so it can run in more device
implementing old renderpass and Framebuffer and other thing to run old hardware
all setup done just have to write fallback now :)
implemented many fallback feature no less crash add fallback of dynamic_rendering other are pending
Add descriptor Set fallback and Contribution guidelines
added a ci/cd test For engine with lavapipe
St making game in my game engine
added audio and animation
added text rendering
add multithreading and better sync
make better job system
just make milestone bar for realase
reading source code of o3de and make my engine barrier better
Ships:
This project has been a daily labor of love for over a year. Over the last 4 to 5 months, I completely rewrote the entire rendering backend, moving away from a legacy OpenGL state machine to an explicit Vulkan pipeline. Along the way, I completely redesigned the Rendering Hardware Interface (RHI) to align with modern graphics architectures. Welcome to UNHUMAN! You are completely free to clone and compile this engine, but please read this first: ->The 50/50 Rule: This is a custom, explicitly defined Vulkan engine currently tailored to a Ryzen/Vega Windows environment. Because Vulkan does not hide driver-level differences (NVIDIA vs. AMD vs. Intel), there is roughly a 50/50 chance it will compile flawlessly or completely explode on your specific GPU setup. ->The Easy Way Out: If you attempt to build the project and hit Vulkan validation errors, device-lost crashes, or strict compilation failures, please do not waste your time trying to debug my RHI! * Visual Verification: If the build fails on your hardware, simply watch the YouTube Walkthrough Video linked below. It contains the full visual proof of the engine running, rendering, and functioning on the native development machine. link -> https://youtu.be/CHDIU61auYo
-> I built the Unhuman Engine (UHE) a high-performance, custom 3D game engine written entirely from scratch in C++. It features a custom Vulkan rendering pipeline, Jolt Physics integration, and a 3D spatial audio system using miniaudio. Alongside the engine, I built a fully playable “Aim Lab” style 3D shooter game to showcase its capabilities, complete with skeletal animations, recoil mechanics, and a robust entity component system (ECS). -> Building a Vulkan renderer from the ground up is notoriously difficult due to how explicit the API is. Getting the Vulkan swapchains, descriptors, and framebuffers perfectly synchronized was a massive hurdle. Beyond rendering, building the virtual file system (VFS) to correctly resolve asset paths across different platforms (Linux native and Windows via Wine) required a lot of trial and error, as did managing multithreaded memory cleanup for the audio subsystem to prevent Because of the custom Vulkan architecture and strict C++ optimizations, the game hits 900+ FPS in release builds, even on integrated graphics! the custom pixel-perfect 3D entity picking system we built using Vulkan framebuffers (instead of relying on standard physics raycasting). Finally, the engine architecture is scalable enough that it’s not just for games—it’s designed to handle heavy robotics and autonomous vehicle simulations in the engine . -> The engine supports both Linux and Windows to play the game, just run the UHEGAME executable inside the bin folder. Important: Make sure the assets folder (which contains the 3D models and audio files) is sitting right next to the executable in the same directory, otherwise the game will fall back to a safe mode. Controls: Use your mouse to aim, Left Click to shoot the targets, and press ‘R’ to reload the animated 3D pistol also i write it too big bcuz last time many people said they don’t understand what i did . about running it u can run it in windows and linux both see window build and linux build there to work able excutable file one is uhegame.exe and uhe_editor.exe one is game and other is editor https://github.com/rajaryan2007/UNHUMAN/releases/tag/alpha i will improve the game as time goes i just st with vulkan and other if u have any problem u can ask here https://github.com/rajaryan2007/UNHUMAN/issues if still don’t understand don’t rate down read or search or just read devlog and understand instead of low rating thankyou :)
i just finally done all thing like stable etc . and search of all libs etc so can really work making really good engine i add milestone etc . u can still test project tho but it will just artitacture doc change and some sync bug fix . other then that i add milestone so i can work on that now but i 19 now today so my hackclub will get end so i just ship to info that . devlog is end but i will continue to work on this engine bcuz it been like year since i st working on it already so anyway . and anything u wanna know u can check my project issues and roadmap...
|
1792986732.2223449
|
1793073132.2223449
|
|
21797
|
Kursal by @koschi | Stardance
|
koschi
|
1
|
110.0
|
1954
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T15:56:24Z", "hours": 110.0, "multiplier": 17.9, "payout": 1954, "blessing": "neutral", "text": "Hey, I made an introduction video for my friend’s project Kursal, a decentralized messaging app with end-to-end post-quantum encryption. 100% of the visuals were made by myself in Blender, and the sound editing in DaVinci Resolve. No AI were used in the making process of this video. The goal of the video was to showcase the project to the world, and giving it a bit more visibility, even though I honestly just wanted to do it for fun ngl :) Btw they are a few references throughout the video. For exemple the first scene was directly inspired by the movie Tron Legacy’s intro lmao.", "repo": "https://github.com/KursalChat/assets", "demo": "https://www.youtube.com/watch?v=Jhyxh1NrVjo"}]...
|
[{"post_id": 61103, "ts": "202 [{"post_id": 61103, "ts": "2026-09-03T20:32:43Z", "hours": 7.3403, "text": "Well I realized that Stardance doesn’t allow for soundtracks so the video stays muted and you can’t hear the sound effects and everything, which kinda sucks. But anyway I finished the project, the sound editing and added the credit scene at the end for all the sound effects, the musics, the Macbook 3d model and the SVG icons. However the video is 200 MB so that won’t fit in a github description… nor in here. So I’ll have to compress it heavily which will affect the video quality."}, {"post_id": 46828, "ts": "2026-08-14T10:59:01Z", "hours": 3.3008, "text": "Okay sorry for the delay, I had some issues with lapse as it seemed to have somewhat disconnected from my hackatime so it wouldn’t let me select a project to link the lapses to. But I just found out I can just type the name of this project, and even though it says it will create a new folder for that project, it still links to the actual Kursal file. But anyway, enough with that, I started reworking the audio for the 1st scene of the video, this time using royalty free music and sound effect (sadly we had to replace the nintendo switch sound effect to avoid any possible lawsuit lol) and of course all of the artists will be credited at the end of the video. Now I just have to find out what to do for the next scene…"}, {"post_id": 43407, "ts": "2026-08-08T17:05:37Z", "hours": 3.8506, "text": "FINALLY !!! The animation is done, I just finished linking the last two parts with a clean animation and now we just have to render everything and edit it in adobe or Da Vinci with some sound effects and everything and that’s it. Well that makes it seem like it’ll be a fast and easy process but I’m pretty sure it’d be the complete opposite idk why…"}, {"post_id": 42834, "ts": "2026-08-07T19:34:25Z", "hours": 3.9378, "text": "I fixed that last part and started animating the final scene of the whole video, there isn’t much to say about it as there also isn’t much to show, but I will have to include the credits after that, once the video is completely done, including the sound design and everything. Btw I still need to make a proper transition between this and the previous shot, but I’ll do that tomorrow I think."}, {"post_id": 42280, "ts": "2026-08-06T22:16:16Z", "hours": 4.9142, "text": "ok so about that tutorial, well it turned out to be for after effects, not blender, so that sucks. But anyway, I still tried doing it myself, it doesn’t look as good but it’s fine. Don’t worry about the timings, that part was kinda rushed ngl, this is just a proof of concept after all."}, {"post_id": 41506, "ts": "2026-08-05T19:12:05Z", "hours": 11.215, "text": "Managed to show off Kursal’s many color themes. At first I tried using curves and array modifiers to make the laptops move along a bezier curve but sadly because of the way the Macbook’s 3d model has been made, that was pretty hard and even then it was too hard to coordinate its movement with the Kursal screens they were suppose to show, so I had to scrap that idea. Instead, I just duplicated them over 5 layers twice and extended them on the side while the camera zoomed out. Now you might think the camera movement is a bit weird and stuff but don’t worry we’ve got an idea in mind with sound effects, nw. Finally this is just half of the work, as those were only the Dark mode color palets, so I’ll have to do the same with white mode and somehow make a cool animation with a switch that goes from night no day ,or the opposite I don’t really know yet but I remember having seen a tutorial for that in my youtube recommendations a while ago so we’ll see."}, {"post_id": 40414, "ts": "2026-08-03T21:56:11Z", "hours": 4.6669, "text": "fixed the camera movement for that last part and added a few things to make the scene look less empty. And I re-rendered previous scenes to put them all together in order to get an idea of what the whole things looked like. I had to fix some minor stuff like transitions and glitched animations. However I noticed that the last part is way too fast and you can’t read the text so I’ll have to fix that next."}, {"post_id": 39670, "ts": "2026-08-02T19:59:44Z", "hours": 5.5339, "text": "Okay so I remade that last part to get rid of some of some of the animations glitches, it might not be as nice as I envisioned but it is definitely cleaner than my first attempt. Though I think I might have a few tweaks to do concerning the animation’s speed. But that’s it for now."}, {"post_id": 39075, "ts": "2026-08-01T19:21:28Z", "hours": 8.0881, "text": "I hate Blender, I just spent 8 hours straight without break fixing shit Blender messed up, and it’s still not done yet. For some reason it doesn’t want to see the laptop as a single object made up of different pieces, but rather a random arrangement of stuff which cannot move together as one, so rotating it means that half of the components will spin in one direction while the second half will spin in the other. Furthermore for some reason some parts have a habit of straight up vanishing towards outer space, which really doesn’t help with the process. But anyway I still manage to animate the first 3 seconds as I envisioned and the rest is, well… to optimize in the future… But one good news at least is that we’re getting very close to the end. Oh actually no I forgot we still have video editing and sound design to do after that."}, {"post_id": 38339, "ts": "2026-07-31T17:47:50Z", "hours": 5.9503, "text": "Just finished animating a transition between part 2 and part 3, got to play with blender’s geometry nodes a bit but I did need a quick tutorial for that last part ngl"}, {"post_id": 37749, "ts": "2026-07-30T17:40:01Z", "hours": 5.3486, "text": "After some thinking I finally figured out what I’m going to do next, hopefully what will be the last part of the video. For now I replaced the chat instances with actual ones and not just exact copies, and animated the central server to die out once everyone connects together through a decentralized network."}, {"post_id": 36470, "ts": "2026-07-28T16:35:58Z", "hours": 5.8214, "text": "Finally done with the decentralized network animation, which might be the hardest part in the whole introduction video. The connections are a bit weird since a majority of those animations play at the exact same time at the end but I just have to move the keyframes accordingly to what I want so I guess that’s an easy fix no worries."}, {"post_id": 35859, "ts": "2026-07-27T15:57:08Z", "hours": 2.8839, "text": "probably gonna stop here for today so here’s the latest result, good enough for me but probably need a few tweaks either way."}, {"post_id": 35756, "ts": "2026-07-27T12:15:23Z", "hours": 2.1503, "text": "just spent two and a half hours trying to make a single object glowy because every tutorial out there was outdated or made everything glowy even the 2 windows. Why is Blender so complicated I swear."}, {"post_id": 35411, "ts": "2026-07-26T19:53:52Z", "hours": 10.0172, "text": "daaaaamn that was atrocious but here’s the chatting demo section finally fully animated (for now at least…). Special thanks to that indian guy on youtube for the text’s typewriting animation tutorial lmao. Oh btw sorry but I was too lazy to render a proper gooq quality video this is 720p using low render setting, and I just noticed I forgot to get rid of the bar at the beginning but eh whatever who here cares anyway…"}, {"post_id": 24666, "ts": "2026-07-08T12:22:45Z", "hours": 4.3403, "text": "Finally after 6 hours of rendering, we’ve got it. Yeah we brainstormed a bit more and finally found ideas for what we would do next in the video, so we’re doing a demo of 2 instances connecting to each other. Not finished tho, we still need them actually making contact and sending messages, and sound editing it all together, and then scene 2 will be finished."}, {"post_id": 22361, "ts": "2026-07-04T19:55:31Z", "hours": 2.0503, "text": "Rendered all actual scenes I made in Blender together, and put some sound effects in (a bit randomly ngl) using Da Vinci Resolve (if my dumb ahh can’t do video editiong at least I can try sound design… I think). On that point there are some adjustments to make on the sound effects as we do NOT wish to get a cease and desist from Nintendo before the project even gets published in the first place…"}, {"post_id": 20979, "ts": "2026-07-02T18:33:39Z", "hours": 2.2333, "text": "Because of my sheer incompetence in using Da Vinci Resolve, I decided I might be better off sticking with Blender, so I remade that last part in 3d, no sounds yet, but at least that took like half the time I needed to do the same in da vinci resolve. Gotta say, I’m still not happy with how it turned out rn, but I’ll fix it later nw."}, {"post_id": 19974, "ts": "2026-07-01T13:21:22Z", "hours": 7.3172, "text": "Started doing some stuff in Da Vinci Resolve like adding Texts and sounds, has a few Fusion issues to fix which was a nightmare but for now I have a proof of concept if you will, it’s nowhere near clean enough rn but it’s like a draft."}, {"post_id": 13315, "ts": "2026-06-21T20:07:17Z", "hours": 9.4397, "text": "Sketched out the Kursal introduction video script (kinda) and animated the v1 of the first part using Blender 2D animation tool, even though it’s supposed to be used by 2D artists to animate their drawings, but somehow it still works quite well so whatever ig."}]...
|
Title: Kursal by @koschi | Stardance
Devlogs:
Ske Title: Kursal by @koschi | Stardance
Devlogs:
Sketched out the Kursal introduction video script (kinda) and animated the v1 of the first part using Blender 2D animation tool, even though it’s supposed to be used by 2D artists to animate their drawings, but somehow it still works quite well so whatever ig.
Started doing some stuff in Da Vinci Resolve like adding Texts and sounds, has a few Fusion issues to fix which was a nightmare but for now I have a proof of concept if you will, it’s nowhere near clean enough rn but it’s like a draft.
Because of my sheer incompetence in using Da Vinci Resolve, I decided I might be better off sticking with Blender, so I remade that last part in 3d, no sounds yet, but at least that took like half the time I needed to do the same in da vinci resolve. Gotta say, I’m still not happy with how it turned out rn, but I’ll fix it later nw.
Rendered all actual scenes I made in Blender together, and put some sound effects in (a bit randomly ngl) using Da Vinci Resolve (if my dumb ahh can’t do video editiong at least I can try sound design… I think). On that point there are some adjustments to make on the sound effects as we do NOT wish to get a cease and desist from Nintendo before the project even gets published in the first place…
Finally after 6 hours of rendering, we’ve got it. Yeah we brainstormed a bit more and finally found ideas for what we would do next in the video, so we’re doing a demo of 2 instances connecting to each other. Not finished tho, we still need them actually making contact and sending messages, and sound editing it all together, and then scene 2 will be finished.
daaaaamn that was atrocious but here’s the chatting demo section finally fully animated (for now at least…). Special thanks to that indian guy on youtube for the text’s typewriting animation tutorial lmao. Oh btw sorry but I was too lazy to render a proper gooq quality video this is 720p using low render setting, and I just noticed I forgot to get rid of the bar at the beginning but eh whatever who here cares anyway…
just spent two and a half hours trying to make a single object glowy because every tutorial out there was outdated or made everything glowy even the 2 windows. Why is Blender so complicated I swear.
probably gonna stop here for today so here’s the latest result, good enough for me but probably need a few tweaks either way.
Finally done with the decentralized network animation, which might be the hardest part in the whole introduction video. The connections are a bit weird since a majority of those animations play at the exact same time at the end but I just have to move the keyframes accordingly to what I want so I guess that’s an easy fix no worries.
After some thinking I finally figured out what I’m going to do next, hopefully what will be the last part of the video. For now I replaced the chat instances with actual ones and not just exact copies, and animated the central server to die out once everyone connects together through a decentralized network.
Just finished animating a transition between part 2 and part 3, got to play with blender’s geometry nodes a bit but I did need a quick tutorial for that last part ngl
I hate Blender, I just spent 8 hours straight without break fixing shit Blender messed up, and it’s still not done yet. For some reason it doesn’t want to see the laptop as a single object made up of different pieces, but rather a random arrangement of stuff which cannot move together as one, so rotating it means that half of the components will spin in one direction while the second half will spin in the other. Furthermore for some reason some parts have a habit of straight up vanishing towards outer space, which really doesn’t help with the process. But anyway I still manage to animate the first 3 seconds as I envisioned and the rest is, well… to optimize in the future… But one good news at least is that we’re getting very close to the end. Oh actually no I forgot we still have video editing and sound design to do after that.
Okay so I remade that last part to get rid of some of some of the animations glitches, it might not be as nice as I envisioned but it is definitely cleaner than my first attempt. Though I think I might have a few tweaks to do concerning the animation’s speed. But that’s it for now.
fixed the camera movement for that last part and added a few things to make the scene look less empty. And I re-rendered previous scenes to put them all together in order to get an idea of what the whole things looked like. I had to fix some minor stuff like transitions and glitched animations. However I noticed that the last part is way too fast and you can’t read the text so I’ll have to fix that next.
Managed to show off Kursal’s many color themes. At first I tried using curves and array modifiers to make the laptops move along a bezier curve but sadly because of the way the Macbook’s 3d model has been made, that was pretty hard and even then it was too hard to coordinate its movement with the Kursal screens they were suppose to show, so I had to scrap that idea. Instead, I just duplicated them over 5 layers twice and extended them on the side while the camera zoomed out. Now you might think the camera movement is a bit weird and stuff but don’t worry we’ve got an idea in mind with sound effects, nw. Finally this is just half of the work, as those were only the Dark mode color palets, so I’ll have to do the same with white mode and somehow make a cool animation with a switch that goes from night no day ,or the opposite I don’t really know yet but I remember having seen a tutorial for that in my youtube recommendations a while ago so we’ll see.
ok so about that tutorial, well it turned out to be for after effects, not blender, so that sucks. But anyway, I still tried doing it myself, it doesn’t look as good but it’s fine. Don’t worry about the timings, that part was kinda rushed ngl, this is just a proof of concept after all.
I fixed that last part and started animating the final scene of the whole video, there isn’t much to say about it as there also isn’t much to show, but I will have to include the credits after that, once the video is completely done, including the sound design and everything. Btw I still need to make a proper transition between this and the previous shot, but I’ll do that tomorrow I think.
FINALLY !!! The animation is done, I just finished linking the last two parts with a clean animation and now we just have to render everything and edit it in adobe or Da Vinci with some sound effects and everything and that’s it. Well that makes it seem like it’ll be a fast and easy process but I’m pretty sure it’d be the complete opposite idk why…
Okay sorry for the delay, I had some issues with lapse as it seemed to have somewhat disconnected from my hackatime so it wouldn’t let me select a project to link the lapses to. But I just found out I can just type the name of this project, and even though it says it will create a new folder for that project, it still links to the actual Kursal file. But anyway, enough with that, I started reworking the audio for the 1st scene of the video, this time using royalty free music and sound effect (sadly we had to replace the nintendo switch sound effect to avoid any possible lawsuit lol) and of course all of the artists will be credited at the end of the video. Now I just have to find out what to do for the next scene…
Well I realized that Stardance doesn’t allow for soundtracks so the video stays muted and you can’t hear the sound effects and everything, which kinda sucks. But anyway I finished the project, the sound editing and added the credit scene at the end for all the sound effects, the musics, the Macbook 3d model and the SVG icons. However the video is 200 MB so that won’t fit in a github description… nor in here. So I’ll have to compress it heavily which will affect the video quality.
Ships:
Hey, I made an introduction video for my friend’s project Kursal, a decentralized messaging app with end-to-end post-quantum encryption. 100% of the visuals were made by myself in Blender, and the sound editing in DaVinci Resolve. No AI were used in the making process of this video. The goal of the video was to showcase the project to the world, and giving it a bit more visibility, even though I honestly just wanted to do it for fun ngl :) Btw they are a few references throughout the video. For exemple the first scene was directly inspired by the movie Tron Legacy’s intro lmao....
|
1792994119.106929
|
1793080519.106929
|
|
9756
|
tinystudio by @ratmuds | Stardance
|
ratmuds
|
1
|
109.8
|
2123
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-14T02:08:29Z", "hours": 108.0, "multiplier": 19.71, "payout": 2123, "blessing": "neutral", "text": "I made a game engine that I tried to make the UI look nice and feel accessible. I wanted to design it around what I liked about other game engines like Roblox Studio and Godot, and try and make it as easy as possible to make prototypes of games quickly. The decision to not let any 3D imports was intentional to keep the engine style of more retro, as you can see by the rendering style. Instead, you can fuse and subtract shapes together with CSG. The flow editor state machines fully work, and was inspired by Playmaker. The scripting system is a little bit janky sometimes but it somewhat works. The scripting system has a basic scheduler and profiler similar to Roblox’s Luau scheduler but without the complexity of CPU budget. The engine uses a custom ECS that uses Svelte Runes to provide reactivity to the engine sidebars and editor. There is also a basic UI system, and physics. There are three demo projects to try out too.", "repo": "https://github.com/ratmuds/tinystudio", "demo": "https://tinystudio.ratmud.studio/"}]...
|
[{"post_id": 69622, "ts": "202 [{"post_id": 69622, "ts": "2026-09-17T13:08:36Z", "hours": 1.7972, "text": "Redid UI styling to feel more blocky I rewrote the UI to look less bubbly I guess, now it looks more like lego and stuff and more space for work instead of tons of padding"}, {"post_id": 67806, "ts": "2026-09-14T01:58:45Z", "hours": 5.0589, "text": "Finalized Project I added a projects manager and generally just cleaned up the repository. Then created three basic demos, like a basic moon landing game, a very basic parkour game, and a physics sandbox. And finished the README"}, {"post_id": 48210, "ts": "2026-08-16T14:44:47Z", "hours": 4.7264, "text": "Scope Leaking Bug Fixed, Mouse Input, Scripting Improvements, ECS & Events Scripting Improvements and Fixes, Cameras There was an issue where I used a single variable to hold the last used scope before and forgot to change it to support multiple scripts. That is fixed now and scopes aren’t mixed weirdly anymore. There is now mouse functions and events Events can be called like part.physics:on(\"touched\") instead of part:on(\"Physics.touched\") for clarity Cameras are added, game wide function to change active camera, and camera system that updates the camera things bidirectionally supporting multiple camera types."}, {"post_id": 46256, "ts": "2026-08-13T11:31:38Z", "hours": 5.1194, "text": "Script Scheduling Engine Revamp The entire scripting engine has been redone. It was a lot of cascading changes again, with now each “Scope” having it’s own scheduler. A “scope” is a single logic component that gets attached to entities. How it works now The scheduler handles the Lua engine stuff. It wraps the main script around into a coroutine automatically now, and extracts the coroutine into a thread. It then creates a scheduler job object, pending into the queue. The scheduler then gets stepped, and initializes the jobs into the main queue and steps them. By stepping them, it resumes the coroutine until the script either ends or manually pauses the coroutine itself (usually done with a predefined “wait” function). I think this is very similar to how Roblox handles it’s script scheduler, although Roblox’s is of course much more complicated. Handling the events and callbacks was much more difficult though. Each of those ALSO need it’s own thread to run to access coroutine related functions and to access data (otherwise very weird errors will happen, like calling code over a boundary or something). This all gets added as a scheduler job, and that allows us to record telemetry data. Eventually, threads can be assigned a “budget”, where they can be stalled if they consume more than the allotted time or even do things like infinite loop detection, etc. There was just generally tedious work that was annoying."}, {"post_id": 45759, "ts": "2026-08-12T13:35:44Z", "hours": 5.3428, "text": "Added CSG Operations I added CSG operations, using the Manifold library. It makes it a bit simpler, making watertight meshes and giving back the geometry for me to make a custom mesh in ThreeJS. The reason it took so long was because I had to add cascading changes to a lot of the data structures to support this custom geometry. I also added a little loading thing at the bottom right for CSG operations. As of right now Union and Subtract are supported. Materials are not preserved as of right now, due to the simplistic way I’m handling materials but when I finish building out the materials system I basically just need to get the triangle references out of Manifold and relink them to the correct materials."}, {"post_id": 40725, "ts": "2026-08-04T13:16:47Z", "hours": 5.4036, "text": "Engine Events System & Starting Significant Scheduler Engine Revamp So I made the events system. It works by a class on the JavaScript (engine) layer, and is attached to all entities. There are a couple of functions: on: fires on event once: fires on event only once off: clears event callback clear: clears all callbacks Other entities are allowed to access another entitys events, being able to listen or even emit. A game architecture could work like having “manager” entities at the top level of the game which hold different events. For example, an “InventoryManager” entity could have an event for when an item is picked up, it itself can listen to it, as well as any other things that may find it useful. I’ve also cleaned up the code, and now there is a “game” reference. Eventually, it will have access to more things but as of right now you can access an “inputManager” which holds functions and events for user inputs. It works by attaching a metatable to it and exposing global hidden functions to call to my JavaScript engine code. But a huge problem showed up, the way I was running scripts. Before I thought just a simple coroutine running with a timeout for delays was just fine, but I was super wrong. If a callback from an event is fired and the function wants to do something, like call an external function or wait, it completely breaks. Why? I didn’t know and it took me a lot of time to find out. It’s because the callbacks aren’t a coroutine too. This is when I realized why something like Roblox has a full blown scheduler. So I’ve been planning and starting on the scheduler engine. It has to handle a lot of stuff, including managing when scripts run, including WHEN they want to run (next frame, in 3 seconds, etc) and track if they are causing issues by keeping track of their budget. Everything will need to be in a coroutine coordinated by the scheduler. Including callbacks from events too. It’s going to be pretty complicated I think, requiring a rewrite of the entire scripting system. I also just encountered a lot of bugs. And I fixed the errors from Wasmoon including the entire JS stacktrace for no reason too."}, {"post_id": 39522, "ts": "2026-08-02T15:10:03Z", "hours": 4.0047, "text": "Scripting System Affecting the Game Scripts now can change parts. There are getEntityById and getEntityByName functions now, and a bunch of metatables and stuff to get it working. Now you can query for an entity, and then modify it’s component data with metatables. For example to access or set the position of a part, you can do part.transform.position . The transform finds the transform component and position finds the data entry of position inside the component. This is all done on runtime, with component queries happening dynamically so no manual programming for new components is required. This may affect performance a little bit though. There is a custom Vector3 object now too. Error messages are also now a little less vague but still pretty confusing. I don’t know how to solve that."}, {"post_id": 38632, "ts": "2026-08-01T04:02:22Z", "hours": 6.7036, "text": "Logic & Scripting Prototype Working this was so difficult basically a TON of things needed to be changed for this to work. i had to rework the entire scripting system. i had to also think about how the system is going to work the system i landed on, basically is you can create nodes in the state machine editor, and attach scripts on those states. instead of scripts, im calling the whole package of state machine + scripts a “Logic”. i havent reflected the name everywhere else yet though, and that is probably going to take a really long time as its a major architectural shift that i didn’t plan for beforehand. i made custom nodes in the editor as you can see, a start, end and the script node. there is now a nice dropdown to select the script (a searchbar will be added later) and you can create new scripts. i fixed the code editor to actually load/save code properly. i had to redo how it saved data, so i could communicate the scripts, nodes, connections, etc all to the ScriptingSystem, which starts off at the “Start” node and steps the state once, going into the first node. This part of the code is an absolute MESS. i had a ton of bugs to fix, including state and Svelte firing state over and over again for some reason, Lua issues, dealing with coroutines, dealing with external functions which would change the state and exit the code, etc To add the script, there is now a “Add component” button which you can select the script and select the logic. The state machine handles direct to end, looping nodes, multiple handles, infinite loops going into other nodes, etc. At the end of the video, you can see that i created two states and the second state had two outputs, and the path is a 50/50 random decided by the Lua code to loop back into the first state or exit. Overall, this was really tiring and I’m glad it’s done. The amount of time thinking and debugging isn’t included in the time tracked so yeah :("}, {"post_id": 36862, "ts": "2026-07-29T06:06:34Z", "hours": 2.8403, "text": "Scripting System I added Svelte Flow and the Monaco editor Basically, I think that the system will work mainly off of state machines. Each state will have an attached script. The scripts can decide when to change states. For example, the scripting for a bee in a game could have states for wandering, eating, etc and the scripts handle only it’s own state which could make the code a little cleaner. I also tried making the script editor to look really good. I spent a bunch of time trying to add LSPs and intellisense/autocomplete and syntax and formatting but honestly I give up for now."}, {"post_id": 36780, "ts": "2026-07-29T01:39:01Z", "hours": 3.6069, "text": "Fixed Constraints Getting constraints working was super annoying. Basically, there is a problem where the engine is built around models, and you can spawn in multiple models. When models are spawned in, the parts inside are cloned including their IDs to not lose reference, but this comes with the huge issue as in the backend, the engine actually flattens this structure for more efficient processing of entities, meaning that there will be multiple entities sharing IDs, which is really bad. But creating new IDs is also a huge problem because when we reference it, the ID is not final and changes all the time on load. So instead it does <model_id>:<entity_id>, for targeting. The constraint creator lets you select two points (snapping will be added in the future) and it creates a constraint. This is later processed by the PhysicsSystem detecting the ConstraintComponent. Later there will be debug viewer for constraints. Anyway it was just a lot of annoying work."}, {"post_id": 36178, "ts": "2026-07-28T03:01:00Z", "hours": 1.4972, "text": "Opening Tabs Working There is now a flow for opening and creating tabs, now new tabs can be created and new models in the same way. Opening a tab that is already open just switches to it."}, {"post_id": 35581, "ts": "2026-07-27T03:36:46Z", "hours": 5.8286, "text": "Runtime working This took so long There was just so many things that just weren’t working well together. Especially the data loading code. I initially just made the code use and modify the gameData directly, meaning that if I stop and play again the game would not reset and would probably completely break. But cloning is so difficult. Since the gameData is pretty complicated with nested classes and data, simply JSON.stringify and parse, and even structuredClone didn’t work. I had to use a function to manually copy a lot of things which was really annoying. Another thing that was weird was that parts would only have physics if it was dictated by the parent model, which wasn’t what I wanted. Now there is a function to flatten models, since I want them to kind of just be fancy folders at the end of the day anyway. There was just generally a lot of rework to get everything working, with systems and components working now with a setup phase, and a general frame tick function for systems to process. I also had to add dirty flags to all ComponentDataEntries so other components actually notice changes by OTHER components which was so annoying :(("}, {"post_id": 32943, "ts": "2026-07-22T12:52:14Z", "hours": 3.2719, "text": "Model Thumbnails, Better Highlighting, Reactivity, Sidebar, etc The models now have a place to store a thumbnail, and on save, it autogenerates a new thumbnail. It creates a new ThreeJS scene in the background and adds all the entities to it. For now it only cares about the Transform component, so that’s why all the parts don’t have the correct colors. The face highlighting also is fixed to use ThreeJS’s Line2 so an adjustable line thickness can be used. The face edge highlights are now thicker and a lot easier to see. Reactivity is now fixed, so dragging an object in the editor updates the UI, and the other way around. In the video, you can also see the “–” when multiple objects were selected. It means they have unique values, but they can still be all updated. The system works by storing all seen components in a JS map, and then only filtering for components that appear in ALL of the selected parts. I might change that functionality later but it works for now. I also added the sidebar to the model workspace. I also did work on the ECS system and just engine code in general."}, {"post_id": 32397, "ts": "2026-07-21T15:37:04Z", "hours": 3.5475, "text": "Fixed ECS Data Storage and UI Displays ECS Data I got the UI to display the data for the ECS components. I had some weird bugs, also I messed up earlier on the code to store the data entries for the components (stores things like data type and stuff) and then now it displays on the sidebar. For now I temporarily disabled the code to handle multiple different objects that could have differing component values or different components altogether, because it was causing a bunch of problems cuz the code is not great :("}, {"post_id": 31028, "ts": "2026-07-19T02:40:47Z", "hours": 4.5597, "text": "Started Data and ECS Code I started working on the ECS system, and now the parts spawned are “entities” and they have “components” like a mesh, a transform, and a physics component. The components are queried and cached by the game engine and passed to the “systems” that actually do work with the component data of the entity. I also dealt with a stupid tab bug :((( And generally other engine code."}, {"post_id": 15172, "ts": "2026-06-24T17:28:53Z", "hours": 3.5117, "text": "Worked on Model tab and Working on Refactoring Backend & Renderer Component There’s now a model tab, also I made some more animations and things to make the app more fun to use. I’m also in the process of rebuilding the data types and completely redoing the reusable Renderer component since it was an absolute disaster before."}, {"post_id": 14600, "ts": "2026-06-23T19:23:32Z", "hours": 6.5047, "text": "Completely Revamped UI and Working On Refactoring Entire Engine I really tried making the UI look a lot nicer than the generic UI it was before, and I think it looks pretty nice. I might need to simplify some stuff, but I spent a long time trying to make the UI more welcoming and easy to use and for the UI to seem more playful in a way I guess, than the more mono font boring gray it was last time. I also have started on completely refactoring the engine. The previous data stores and data types were too limiting and I made some bad decisions early on so starting from scratch is kind of necessary"}, {"post_id": 11366, "ts": "2026-06-18T16:29:57Z", "hours": 1.5181, "text": "Added constraints, which took a while because the way I store objects just isn’t sustainable I’m going to redo the entire architechure of this app, mostly the backend because it’s just such a mess. I’ve been piling on features and the technical debt and poor early decisions are catching up to me and it’s making development slower so I’m going to start refactoring a lot of stuff. This should mean everything will be less buggy and make it faster for me to develop new features Now that I know how the app will be I can make smarter decisions"}, {"post_id": 10184, "ts": "2026-06-16T20:00:27Z", "hours": 4.2217, "text": "Reworked script system for better and easier scripting and added some basic part modification functions Basically, before you would need to type something like find(“stud”):setVelocity({10, 10, 10}) or something like that, but with metatables Metatables are kind of weird, but they basically let me return a special object from the find() function, and modify that object to override functions and add new ones. For example, you can override the metatable of custom Vector3 objects to handle addition, so you can do v1 + v2 instead of addVectors(v1, v2) and it’s a lot cleaner and straightforward. This means injecting a bunch of Lua code to set these metatables, and exposing global functions from JS to handle the metatable calls. I also added some event handling (very basic for now) but you can see in the video the part moving from me using WASD You can also see a ton of errors, and I’m trying to fix those right now. I really don’t know why they are here"}, {"post_id": 8431, "ts": "2026-06-14T00:48:37Z", "hours": 3.4253, "text": "Part sidebar shows parent/child relationships now (also had to change backend) I also got save data to serialize, but loading seems to break the other components that rely on the state I also added the cool little part add thing. I changed the font of the app too and stuff. I tried different search things but this one from shadcn-svelte seemed to work the best. I also picked the Lyra theme from shadcn-svelte"}, {"post_id": 8181, "ts": "2026-06-13T17:01:57Z", "hours": 6.7944, "text": "It’s been a while, I kind of forgot to log in the middle I reimplemented parts of the backend to support play testing and handling the state of the current game, keeping track of parts and bodies and scripts Added physics engine (Rapier), requiring keeping track of colliders and physics bodies. Right now only convex meshes for performance meaning concave colliders might be a little broken for now so I plan to add something like VHACD or a more modern alternative to split up complicated meshes into smaller convex and simplified colliders. Added Wasmoon (Lua interpreter) and CodeMirror 6 (code editor component) and some old language parser for Lua to be supported properly, this was also a challenge because Wasmoon just wants to run all the code in one go, so instead there has to be a coroutine setup where the code returns back out temporarily (with a custom wait function that utilized the coroutine function) where then my code ticks every frame to tick the code (while loop) again and also adds the delay if applicable The renderer also needed a few tweaks to get this to work properly Also something kind of weird was I couldn’t get the playTest state to update and propagate throughout the application (thats why the top bar button doesn’t work for now) and honestly I have no idea why and I spent a lot of time debugging it"}, {"post_id": 7159, "ts": "2026-06-11T23:12:48Z", "hours": 0.8367, "text": "Can now apply textures to objects with a new Texture Studio tab :) It’s still really buggy and doesn’t work on CSG objects. It also ignores the coplanar face detection I have right now for simplicity so it only works on ThreeJS primitive face groups as of right now."}, {"post_id": 6571, "ts": "2026-06-11T01:16:28Z", "hours": 2.0747, "text": "I added the framework of a UV atlas editor, and also the painting studio for the texture editor I’m working on the texture system. I’m still working on UVs. It’s honestly really complicated, I have no idea so far how to make it intuitive for users. Auto unwrapping it would not give easy to use results because most assets in this engine are going to be simple. Showing all the vertices on a single atlas also would be very overwhelming. I’m trying to figure something out. It could be determined on a face by face basis, but some faces could be super super weird due to imported meshes or weird CSG operations, which would lead to a mess of a UV unwrap I’m also going to make an editor to assemble the texture atlases by stitching together the individual smaller textures."}, {"post_id": 5862, "ts": "2026-06-09T20:15:37Z", "hours": 2.4597, "text": "Finally got the world studio to work properly, it was because I didn’t assign an ID to the spawned objects And I added the premade things in the scene also be added to the store"}, {"post_id": 5285, "ts": "2026-06-09T00:22:45Z", "hours": 1.6897, "text": "I finally got model saving to sort of work. This required revamping the backend stores to support multiple tabs, and updating the sidebar to actually use the correct tab state data."}, {"post_id": 5199, "ts": "2026-06-08T21:54:17Z", "hours": 0.5725, "text": "Moved 3D rendering code to be shared between both studios via creating a component that applies the shading and stuff and exposing the scene for the individual studios to add objects And added an isolation mode that allows the user to focus a single object or group of objects (whatever the user is selecting) and pressing i to toggle. Useful for like creating constraints and stuff more easily"}, {"post_id": 4853, "ts": "2026-06-08T11:54:31Z", "hours": 0.6908, "text": "Transform controls (now can switch to rotate and scale) And basic undo/redo system that basically just takes the ThreeJS properties and saves it and reapplies it back on undo And delete"}, {"post_id": 4609, "ts": "2026-06-07T23:55:10Z", "hours": 1.5267, "text": "Face selection (took so long) and with face selection I added constraint creation system that just creates a constraint in the center of the faces selected I had to add another face renderer, and then also refactor the stores and how I stored data to get this to work and to keep track of faces selected and stuff which took a long time"}, {"post_id": 4556, "ts": "2026-06-07T22:02:26Z", "hours": 1.1836, "text": "The CSG works really well now. Union operations now maintain materials by keeping track of the mesh IDs and then reassigning the materials afterwards manually. Also some clean up and general improvement"}, {"post_id": 4504, "ts": "2026-06-07T20:51:13Z", "hours": 0.3275, "text": "I’ve fixed the face selection code to check the dot product of the faces to make sure they are actually coplanar. I also added some cleanup functions to perform after the CSG operations to clean up geometry to make it more usable"}, {"post_id": 4494, "ts": "2026-06-07T20:31:36Z", "hours": 1.1086, "text": "Face detection and highlighting working This was pretty complicated because 3D objects are made up of triangles, but the user probably does NOT want to select triangles, but the faces themselves. So basically, I got the face the raycast hit, and then looped through all the triangles of the mesh they are hovering and got the vertex indices and got their positions and turned that into a normal and compared it with the other faces and decided if the normals were close enough"}, {"post_id": 4361, "ts": "2026-06-07T17:35:23Z", "hours": 1.2006, "text": "Added retro shader that quantizes the colors to look more like a limited color space Fixed CSG errors and fixed gizmo disappearing over and over again Added another render pass and raycast to add outline to hovered objects"}, {"post_id": 4305, "ts": "2026-06-07T15:51:36Z", "hours": 0.5503, "text": "I switched the CSG library to Manifold3D and it’s better but the meshes are a bit weird. Hopefully I’ll figure it out later. Also for some reason selection of these meshes and their transform gizmos are really difficult and buggy so I have to fix that. Also I know that there are errors I’m going to fix that now"}, {"post_id": 4280, "ts": "2026-06-07T15:18:31Z", "hours": 1.0586, "text": "CSG is being very annoying. I’m using three-bvh-csg but it’s not really what I need I think. There’s some subtraction artifacts, and most importantly, materials are not preserved I think I’m going to switch to a different library because this one isn’t really working great for me but it is pretty nice and simple"}, {"post_id": 4244, "ts": "2026-06-07T14:14:51Z", "hours": 0.9067, "text": "Added multi part select. Trying to debug why CSG operations not working I honestly don’t know what’s wrong because I followed the example code from the library but it’s not working :("}, {"post_id": 4189, "ts": "2026-06-07T12:39:07Z", "hours": 0.9372, "text": "The sidebars are now synced, but I still need to make them sync correctly to the current tab. Right now they sync exclusively to the model studio. The raycasting & selection of parts work now and I fixed the tabs to not unload and reload on each tab switch which caused data sync issues and lag and instead all tabs stay loaded."}, {"post_id": 4157, "ts": "2026-06-07T11:23:44Z", "hours": 0.7944, "text": "I made the part selected have an outline and made the gizmo work, but currently I can’t select other parts for some reason and I’ve just been debugging that"}, {"post_id": 3649, "ts": "2026-06-06T17:48:15Z", "hours": 1.8894, "text": "I started work on the “World Studio” and “Model Studio” of this game engine/fantasy console. The model studio is where you create the models that you drag into the world studio. I’ve added a gizmo and a way to place the parts and also made a more stylized rendering thing to make it feel more retro in a way."}, {"post_id": 3482, "ts": "2026-06-06T13:13:24Z", "hours": 0.41, "text": "I started the project and installed SvelteKit and added ThreeJS"}]...
|
Title: tinystudio by @ratmuds | Stardance
Devlogs Title: tinystudio by @ratmuds | Stardance
Devlogs:
I started the project and installed SvelteKit and added ThreeJS
I started work on the “World Studio” and “Model Studio” of this game engine/fantasy console. The model studio is where you create the models that you drag into the world studio. I’ve added a gizmo and a way to place the parts and also made a more stylized rendering thing to make it feel more retro in a way.
I made the part selected have an outline and made the gizmo work, but currently I can’t select other parts for some reason and I’ve just been debugging that
The sidebars are now synced, but I still need to make them sync correctly to the current tab. Right now they sync exclusively to the model studio. The raycasting & selection of parts work now and I fixed the tabs to not unload and reload on each tab switch which caused data sync issues and lag and instead all tabs stay loaded.
Added multi part select. Trying to debug why CSG operations not working I honestly don’t know what’s wrong because I followed the example code from the library but it’s not working :(
CSG is being very annoying. I’m using three-bvh-csg but it’s not really what I need I think. There’s some subtraction artifacts, and most importantly, materials are not preserved I think I’m going to switch to a different library because this one isn’t really working great for me but it is pretty nice and simple
I switched the CSG library to Manifold3D and it’s better but the meshes are a bit weird. Hopefully I’ll figure it out later. Also for some reason selection of these meshes and their transform gizmos are really difficult and buggy so I have to fix that. Also I know that there are errors I’m going to fix that now
Added retro shader that quantizes the colors to look more like a limited color space Fixed CSG errors and fixed gizmo disappearing over and over again Added another render pass and raycast to add outline to hovered objects
Face detection and highlighting working This was pretty complicated because 3D objects are made up of triangles, but the user probably does NOT want to select triangles, but the faces themselves. So basically, I got the face the raycast hit, and then looped through all the triangles of the mesh they are hovering and got the vertex indices and got their positions and turned that into a normal and compared it with the other faces and decided if the normals were close enough
I’ve fixed the face selection code to check the dot product of the faces to make sure they are actually coplanar. I also added some cleanup functions to perform after the CSG operations to clean up geometry to make it more usable
The CSG works really well now. Union operations now maintain materials by keeping track of the mesh IDs and then reassigning the materials afterwards manually. Also some clean up and general improvement
Face selection (took so long) and with face selection I added constraint creation system that just creates a constraint in the center of the faces selected I had to add another face renderer, and then also refactor the stores and how I stored data to get this to work and to keep track of faces selected and stuff which took a long time
Transform controls (now can switch to rotate and scale) And basic undo/redo system that basically just takes the ThreeJS properties and saves it and reapplies it back on undo And delete
Moved 3D rendering code to be shared between both studios via creating a component that applies the shading and stuff and exposing the scene for the individual studios to add objects And added an isolation mode that allows the user to focus a single object or group of objects (whatever the user is selecting) and pressing i to toggle. Useful for like creating constraints and stuff more easily
I finally got model saving to sort of work. This required revamping the backend stores to support multiple tabs, and updating the sidebar to actually use the correct tab state data.
Finally got the world studio to work properly, it was because I didn’t assign an ID to the spawned objects And I added the premade things in the scene also be added to the store
I added the framework of a UV atlas editor, and also the painting studio for the texture editor I’m working on the texture system. I’m still working on UVs. It’s honestly really complicated, I have no idea so far how to make it intuitive for users. Auto unwrapping it would not give easy to use results because most assets in this engine are going to be simple. Showing all the vertices on a single atlas also would be very overwhelming. I’m trying to figure something out. It could be determined on a face by face basis, but some faces could be super super weird due to imported meshes or weird CSG operations, which would lead to a mess of a UV unwrap I’m also going to make an editor to assemble the texture atlases by stitching together the individual smaller textures.
Can now apply textures to objects with a new Texture Studio tab :) It’s still really buggy and doesn’t work on CSG objects. It also ignores the coplanar face detection I have right now for simplicity so it only works on ThreeJS primitive face groups as of right now.
It’s been a while, I kind of forgot to log in the middle I reimplemented parts of the backend to support play testing and handling the state of the current game, keeping track of parts and bodies and scripts Added physics engine (Rapier), requiring keeping track of colliders and physics bodies. Right now only convex meshes for performance meaning concave colliders might be a little broken for now so I plan to add something like VHACD or a more modern alternative to split up complicated meshes into smaller convex and simplified colliders. Added Wasmoon (Lua interpreter) and CodeMirror 6 (code editor component) and some old language parser for Lua to be supported properly, this was also a challenge because Wasmoon just wants to run all the code in one go, so instead there has to be a coroutine setup where the code returns back out temporarily (with a custom wait function that utilized the coroutine function) where then my code ticks every frame to tick the code (while loop) again and also adds the delay if applicable The renderer also needed a few tweaks to get this to work properly Also something kind of weird was I couldn’t get the playTest state to update and propagate throughout the application (thats why the top bar button doesn’t work for now) and honestly I have no idea why and I spent a lot of time debugging it
Part sidebar shows parent/child relationships now (also had to change backend) I also got save data to serialize, but loading seems to break the other components that rely on the state I also added the cool little part add thing. I changed the font of the app too and stuff. I tried different search things but this one from shadcn-svelte seemed to work the best. I also picked the Lyra theme from shadcn-svelte
Reworked script system for better and easier scripting and added some basic part modification functions Basically, before you would need to type something like find(“stud”):setVelocity({10, 10, 10}) or something like that, but with metatables Metatables are kind of weird, but they basically let me return a special object from the find() function, and modify that object to override functions and add new ones. For example, you can override the metatable of custom Vector3 objects to handle addition, so you can do v1 + v2 instead of addVectors(v1, v2) and it’s a lot cleaner and straightforward. This means injecting a bunch of Lua code to set these metatables, and exposing global functions from JS to handle the metatable calls. I also added some event handling (very basic for now) but you can see in the video the part moving from me using WASD You can also see a ton of errors, and I’m trying to fix those right now. I really don’t know why they are here
Added constraints, which took a while because the way I store objects just isn’t sustainable I’m going to redo the entire architechure of this app, mostly the backend because it’s just such a mess. I’ve been piling on features and the technical debt and poor early decisions are catching up to me and it’s making development slower so I’m going to start refactoring a lot of stuff. This should mean everything will be less buggy and make it faster for me to develop new features Now that I know how the app will be I can make smarter decisions
Completely Revamped UI and Working On Refactoring Entire Engine I really tried making the UI look a lot nicer than the generic UI it was before, and I think it looks pretty nice. I might need to simplify some stuff, but I spent a long time trying to make the UI more welcoming and easy to use and for the UI to seem more playful in a way I guess, than the more mono font boring gray it was last time. I also have started on completely refactoring the engine. The previous data stores and data types were too limiting and I made some bad decisions early on so starting from scratch is kind of necessary
Worked on Model tab and Working on Refactoring Backend & Renderer Component There’s now a model tab, also I made some more animations and things to make the app more fun to use. I’m also in the process of rebuilding the data types and completely redoing the reusable Renderer component since it was an absolute disaster before.
Started Data and ECS Code I started working on the ECS system, and now the parts spawned are “entities” and they have “components” like a mesh, a transform, and a physics component. The components are queried and cached by the game engine and passed to the “systems” that actually do work with the component data of the entity. I also dealt with a stupid tab bug :((( And generally other engine code.
Fixed ECS Data Storage and UI Displays ECS Data I got the UI to display the data for the ECS components. I had some weird bugs, also I messed up earlier on the code to store the data entries for the components (stores things like data type and stuff) and then now it displays on the sidebar. For now I temporarily disabled the code to handle multiple different objects that could have differing component values or different components altogether, because it was causing a bunch of problems cuz the code is not great :(
Model Thumbnails, Better Highlighting, Reactivity, Sidebar, etc The models now have a place to store a thumbnail, and on save, it autogenerates a new thumbnail. It creates a new ThreeJS scene in the background and adds all the entities to it. For now it only cares about the Transform component, so that’s why all the parts don’t have the correct colors. The face highlighting also is fixed to use ThreeJS’s Line2 so an adjustable line thickness can be used. The face edge highlights are now thicker and a lot easier to see. Reactivity is now fixed, so dragging an object in the editor updates the UI, and the other way around. In the video, you can also see the “–” when multiple objects were selected. It means they have unique values, but they can still be all updated. The system works by storing all seen components in a JS map, and then only filtering for components that appear in ALL of the selected parts. I might change that functionality later but it works for now. I also added the sidebar to the model workspace. I also did work on the ECS system and just engine code in general.
Runtime working This took so long There was just so many things that just weren’t working well together. Especially the data loading code. I initially just made the code use and modify the gameData directly, meaning that if I stop and play again the game would not reset and would probably completely break. But cloning is so difficult. Since the gameData is pretty complicated with nested classes and data, simply JSON.stringify and parse, and even structuredClone didn’t work. I had to use a function to manually copy a lot of things which was really annoying. Another thing that was weird was that parts would only have physics if it was dictated by the parent model, which wasn’t what I wanted. Now there is a function to flatten models, since I want them to kind of just be fancy folders at the end of the day anyway. There was just generally a lot of rework to get everything working, with systems and components working now with a setup phase, and a general frame tick function for systems to process. I also had to add dirty flags to all ComponentDataEntries so other components actually notice changes by OTHER components which was so annoying :((
Opening Tabs Working There is now a flow for opening and creating tabs, now new tabs can be created and new models in the same way. Opening a tab that is already open just switches to it.
Fixed Constraints Getting constraints working was super annoying. Basically, there is a problem where the engine is built around models, and you can spawn in multiple models. When models are spawned in, the parts inside are cloned including their IDs to not lose reference, but this comes with the huge issue as in the backend, the engine actually flattens this structure for more efficient processing of entities, meaning that there will be multiple entities sharing IDs, which is really bad. But creating new IDs is also a huge problem because when we reference it, the ID is not final and changes all the time on load. So instead it does <model_id>:<entity_id>, for targeting. The constraint creator lets you select two points (snapping will be added in the future) and it creates a constraint. This is later processed by the PhysicsSystem detecting the ConstraintComponent. Later there will be debug viewer for constraints. Anyway it was just a lot of annoying work.
Scripting System I added Svelte Flow and the Monaco editor Basically, I think that the system will work mainly off of state machines. Each state will have an attached script. The scripts can decide when to change states. For example, the scripting for a bee in a game could have states for wandering, eating, etc and the scripts handle only it’s own state which could make the code a little cleaner. I also tried making the script editor to look really good. I spent a bunch of time trying to add LSPs and intellisense/autocomplete and syntax and formatting but honestly I give up for now.
Logic & Scripting Prototype Working this was so difficult basically a TON of things needed to be changed for this to work. i had to rework the entire scripting system. i had to also think about how the system is going to work the system i landed on, basically is you can create nodes in the state machine editor, and attach scripts on those states. instead of scripts, im calling the whole package of state machine + scripts a “Logic”. i havent reflected the name everywhere else yet though, and that is probably going to take a really long time as its a major architectural shift that i didn’t plan for beforehand. i made custom nodes in the editor as you can see, a start, end and the script node. there is now a nice dropdown to select the script (a searchbar will be added later) and you can create new scripts. i fixed the code editor to actually load/save code properly. i had to redo how it saved data, so i could communicate the scripts, nodes, connections, etc all to the ScriptingSystem, which starts off at the “Start” node and steps the state once, going into the first node. This part of the code is an absolute MESS. i had a ton of bugs to fix, including state and Svelte firing state over and over again for some reason, Lua issues, dealing with coroutines, dealing with external functions which would change the state and exit the code, etc To add the script, there is now a “Add component” button which you can select the script and select the logic. The state machine handles direct to end, looping nodes, multiple handles, infinite loops going into other nodes, etc. At the end of the video, you can see that i created two states and the second state had two outputs, and the path is a 50/50 random decided by the Lua code to loop back into the first state or exit. Overall, this was really tiring and I’m glad it’s done. The amount of time thinking and debugging isn’t included in the time tracked so yeah :(
Scripting System Affecting the Game Scripts now can change parts. There are getEntityById and getEntityByName functions now, and a bunch of metatables and stuff to get it working. Now you can query for an entity, and then modify it’s component data with metatables. For example to access or set the position of a part, you can do part.transform.position . The transform finds the transform component and position finds the data entry of position inside the component. This is all done on runtime, with component queries happening dynamically so no manual programming for new components is required. This may affect performance a little bit though. There is a custom Vector3 object now too. Error messages are also now a little less vague but still pretty confusing. I don’t know how to solve that.
Engine Events System & Starting Significant Scheduler Engine Revamp So I made the events system. It works by a class on the JavaScript (engine) layer, and is attached to all entities. There are a couple of functions: on: fires on event once: fires on event only once off: clears event callback clear: clears all callbacks Other entities are allowed to access another entitys events, being able to listen or even emit. A game architecture could work like having “manager” entities at the top level of the game which hold different events. For example, an “InventoryManager” entity could have an event for when an item is picked up, it itself can listen to it, as well as any other things that may find it useful. I’ve also cleaned up the code, and now there is a “game” reference. Eventually, it will have access to more things but as of right now you can access an “inputManager” which holds functions and events for user inputs. It works by attaching a metatable to it and exposing global hidden functions to call to my JavaScript engine code. But a huge problem showed up, the way I was running scripts. Before I thought just a simple coroutine running with a timeout for delays was just fine, but I was super wrong. If a callback from an event is fired and the function wants to do something, like call an external function or wait, it completely breaks. Why? I didn’t know and it took me a lot of time to find out. It’s because the callbacks aren’t a coroutine too. This is when I realized why something like Roblox has a full blown scheduler. So I’ve been planning and starting on the scheduler engine. It has to handle a lot of stuff, including managing when scripts run, including WHEN they want to run (next frame, in 3 seconds, etc) and track if they are causing issues by keeping track of their budget. Everything will need to be in a coroutine coordinated by the scheduler. Including callbacks from events too. It’s going to be pretty complicated I think, requiring a rewrite of the entire scripting system. I also just encountered a lot of bugs. And I fixed the errors from Wasmoon including the entire JS stacktrace for no reason too.
Added CSG Operations I added CSG operations, using the Manifold library. It makes it a bit simpler, making watertight meshes and giving back the geometry for me to make a custom mesh in ThreeJS. The reason it took so long was because I had to add cascading changes to a lot of the data structures to support this custom geometry. I also added a little loading thing at the bottom right for CSG operations. As of right now Union and Subtract are supported. Materials are not preserved as of right now, due to the simplistic way I’m handling materials but when I finish building out the materials system I basically just need to get the triangle references out of Manifold and relink them to the correct materials.
Script Scheduling Engine Revamp The entire scripting engine has been redone. It was a lot of cascading changes again, with now each “Scope” having it’s own scheduler. A “scope” is a single logic component that gets attached to entities. How it works now The scheduler handles the Lua engine stuff. It wraps the main script around into a coroutine automatically now, and extracts the coroutine into a thread. It then creates a scheduler job object, pending into the queue. The scheduler then gets stepped, and initializes the jobs into the main queue and steps them. By stepping them, it resumes the coroutine until the script either ends or manually pauses the coroutine itself (usually done with a predefined “wait” function). I think this is very similar to how Roblox handles it’s script scheduler, although Roblox’s is of course much more complicated. Handling the events and callbacks was much more difficult though. Each of those ALSO need it’s own thread to run to access coroutine related functions and to access data (otherwise very weird errors will happen, like calling code over a boundary or something). This all gets added as a scheduler job, and that allows us to record telemetry data. Eventually, threads can be assigned a “budget”, where they can be stalled if they consume more than the allotted time or even do things like infinite loop detection, etc. There was just generally tedious work that was annoying.
Scope Leaking Bug Fixed, Mouse Input, Scripting Improvements, ECS & Events Scripting Improvements and Fixes, Cameras There was an issue where I used a single variable to hold the last used scope before and forgot to change it to support multiple scripts. That is fixed now and scopes aren’t mixed weirdly anymore. There is now mouse functions and events Events can be called like part.physics:on("touched") instead of part:on("Physics.touched") for clarity Cameras are added, game wide function to change active camera, and camera system that updates the camera things bidirectionally supporting multiple camera types.
Finalized Project I added a projects manager and generally just cleaned up the repository. Then created three basic demos, like a basic moon landing game, a very basic parkour game, and a physics sandbox. And finished the README
Redid UI styling to feel more blocky I rewrote the UI to look less bubbly I guess, now it looks more like lego and stuff and more space for work instead of tons of padding
Ships:
I made a game engine that I tried to make the UI look nice and feel accessible. I wanted to design it around what I liked about other game engines like Roblox Studio and Godot, and try and make it as easy as possible to make prototypes of games quickly. The decision to not let any 3D imports was intentional to keep the engine style of more retro, as you can see by the rendering style. Instead, you can fuse and subtract shapes together with CSG. The flow editor state machines fully work, and was inspired by Playmaker. The scripting system is a little bit janky sometimes but it somewhat works. The scripting system has a basic scheduler and profiler similar to Roblox’s Luau scheduler but without the complexity of CPU budget. The engine uses a custom ECS that uses Svelte Runes to provide reactivity to the engine sidebars and editor. There is also a basic UI system, and physics. There are three demo projects to try out too....
|
1793005014.9037464
|
1793091414.9037464
|
|
12064
|
BIT by @jaswanthsanjay | Stardance
|
jaswanthsanjay
|
0
|
109.6
|
0
|
[]
|
[{"post_id": 67181, "ts": "202 [{"post_id": 67181, "ts": "2026-09-13T07:43:23Z", "hours": 108.7961, "text": "I am working bit"}, {"post_id": 5493, "ts": "2026-06-09T09:25:43Z", "hours": 0.265, "text": "DevLog #2: On-Device Object Removal Mask Drawing UI Key Highlights from DevLog #2: State Management: Added drawing mask bitmap flows (maskImage), state clear handlers on resetting images/tools, and set the Hugging Face download endpoint URLs for all three vision models in ImageToolsViewModel.kt . Gesture-Drawing Canvas UI: Built the MaskDrawingSection in ImageToolsScreen.kt supporting real-time red transparent touch overlays, a brush size slider (10px to 100px), and quick actions to change the image or clear the mask. Mask Generation & Matching: Implemented background rendering that draws white strokes on a black canvas and scales it 1:1 to match the source image resolution for the LaMa inpainting engine. Build Verification: Successfully ran the Kotlin compiler task (BUILD SUCCESSFUL in 2m 17s)."}, {"post_id": 5482, "ts": "2026-06-09T09:05:32Z", "hours": 0.5389, "text": "Model Selection & Monitoring Real-time RAM Usage indicator Context: Power users need to know if loading a model will crash their device due to OOMs. Improvement: In HomeTopBar.kt , add a small, elegant badge next to the current model name showing the device’s current RAM consumption (e.g. [4.2 / 8.0 GB]), colored green, yellow, or red depending on memory pressure"}]...
|
Title: BIT by @jaswanthsanjay | Stardance
Devlogs Title: BIT by @jaswanthsanjay | Stardance
Devlogs:
Model Selection & Monitoring Real-time RAM Usage indicator Context: Power users need to know if loading a model will crash their device due to OOMs. Improvement: In HomeTopBar.kt , add a small, elegant badge next to the current model name showing the device’s current RAM consumption (e.g. [4.2 / 8.0 GB]), colored green, yellow, or red depending on memory pressure
DevLog #2: On-Device Object Removal Mask Drawing UI Key Highlights from DevLog #2: State Management: Added drawing mask bitmap flows (maskImage), state clear handlers on resetting images/tools, and set the Hugging Face download endpoint URLs for all three vision models in ImageToolsViewModel.kt . Gesture-Drawing Canvas UI: Built the MaskDrawingSection in ImageToolsScreen.kt supporting real-time red transparent touch overlays, a brush size slider (10px to 100px), and quick actions to change the image or clear the mask. Mask Generation & Matching: Implemented background rendering that draws white strokes on a black canvas and scales it 1:1 to match the source image resolution for the LaMa inpainting engine. Build Verification: Successfully ran the Kotlin compiler task (BUILD SUCCESSFUL in 2m 17s).
I am working bit...
|
1792504153.2391007
|
1793108953.2391007
|
|
45412
|
Telos by @kazenoko | Stardance
|
kazenoko
|
1
|
109.29
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-13T15:21:00Z", "hours": 38.0, "multiplier": 1.87, "payout": 0, "blessing": "neutral", "text": "This was supposed to be a weekend project to learn LLMs. It became independent research on scaling Masked Diffusion Language Models instead. I built the models, survived datatype/timestep nightmares, optimized MLX on Apple Silicon, achieved ~1.5–2× faster local training, and investigated how training tokens scale with model parameters. To test the models or look at the research, head on over to https://telos.research.wingit.tech/ (please don’t expect the models to be good - they are NOT. They’re small models that barely generate anything useful [clearly, shown by the screenshot] and the only useful thing about them is how much the correct answer probabilities improve with increase in parameters and tokens, do note that inference is also pretty slow.)", "repo": "https://github.com/kazenoko-git/telos", "demo": "https://telos.research.wingit.tech/"}]...
|
[{"post_id": 53242, "ts": "202 [{"post_id": 53242, "ts": "2026-08-23T18:03:46Z", "hours": 10.4914, "text": "Devlog 8: I at least have a bit more to give this time. First: let me just tell you HOW BAD MY TRAINING SITUATION IS. Thankfully, I did manage to get some compute. 25 credits on Lightning AI in fact, which is helpful. I used up about 2.35 now for a few tests. The other 1.35 was from my old credit balance from long back just before I was about to run out of Lightning AI credits. The fact is that the Lightning AI credits didn’t matter at all. My Mac’s still the better machine to train AI models on, for now. TPU v6e-1 does yield a 2.5x increase in training throughput over my M5 Pro, but that’s not an increase I’m expecting with it having 916 TFLOPS in BF16 quantization while my M5 Pro has like… 17 something TFLOPS. The reason is pretty simple though. My scale isn’t big enough. 25M parameter models can’t occupy enough of the two Matrix Multiply Units, resulting in it not utilizing the whole TPU. To add insult to injury, setting a higher microbatch size (like to 256) causes Out Of Memory errors. To even occupy those two MXUs fully, I’d need AT MINIMUM a 50M model. So the scale has to be bigger. (or well, the matmuls for the 25M and 50M) I had actually tested the v5e-8 on Kaggle. Safe to say it performed worse than my M5 Pro. 💀 Not because the TPU v5e-8 itself was… bad. It wasn’t. It’s the fact that there’s a massive communication overhead. The CPU becomes the bottleneck. Would a bigger model solve that too? MAYBE. Can’t say for sure, not saying for sure. So how long is training going to take? FOUR OR FIVE DAYS. what? 🥀 YES. Unfortunately, even if I run 2x T4’s to speed up my situation, at most it’ll take 3-4 days to train the required models. 25M 1:20 is actively running, and will take 11 more hours to complete. This is upscaling from 12.5M 1:20. 25M 1:25 is scheduled to run after the 25M 1:20, and that will take 14 more hours… After that, it’s the train-from-scratch models… which I’ll try to speed up by running on 2x T4, but I can’t guarantee any speed-ups. So what after this? 50M and 100M train runs. And these should actually be faster, in theory, than the 25M model runs. Watch me be wrong though. But IN THEORY, once again, 50M 1:10 itself is maybe a ~20 minute job on TPU v6e-1. Before I get on with the results of whatever models I’ve trained so far, I have an admission. I kinda didn’t explain what all the terms I’ve mentioned are… And if I did, they’re scattered everywhere. Well I’ll have to explain this next devlog anyway, I’m running out of my 4000 character limit 😭 Getting onto the evaluations… You may have noticed that I mentioned UNDLMs are less stable to train last devlog. Taking ONE look at the graph shows EXACTLY why. The Average Target Rank for the 12.5M UNDLM is going MENTAL. That is NOT a normal graph. Also, the fact I’ve mentioned in the previous devlog, still holds true. AR > MDLM > UNDLM. And another thing: I don’t think we’re getting an AR replacement any time soon. I doubt even at higher parameters, MDLM and UNDLM still won’t catch up to AR. Something that kinda deviates from previous preliminary reports… The CE, Average Target Rank and Top 5 Accuracy were somewhat consistent before. But those are different here. Even if CE for MDLMs drop, Average Target Rank actually stay consistent or increase, while Top 5 Accuracy actually increases. UNDLMs are bad enough that this isn’t something we need to worry about at all, yet. Well, regardless, that’s all I have for you today. Stay tuned. (by the way, updating the website soon with an actual preview of how AR, MDLM and UNDLMs generate text to make the website more functional. trust me - it looks cool.)"}, {"post_id": 52427, "ts": "2026-08-22T15:32:40Z", "hours": 11.5667, "text": "Devlog 7: I don’t have much to give you. This is the point where scaling becomes hard. Because of my own stupidity (I just invalidated my 25M model runs because I set the wrong LR) Compute (and the fact that I’m running thrice the amount of models I was running before for training) So. Where are we headed? TPUs. Once again. Please send me prayers so that some nice company gives me compute :) LightningAI and Cerebras have already ghosted me. Here’s the weird graph that doesn’t matter anymore (25M MDLM doesn’t matter. AR and UNDLM unaffected because they don’t sample t randomly per batch) Stay tuned?"}, {"post_id": 51823, "ts": "2026-08-21T17:50:38Z", "hours": 9.0942, "text": "Devlog 6: Probes. There’s actually not much here except more data points for me to work with. Not much changes either. Well, unless you’d like to know that I updated my Training Suites Python notebook with a few more lines (calling the function… more times for training more models) Well regardless, the images contain all the data both you and I need. What I could infer with this… little data. Few things for certain: My training code is at least 100% correct considering AR shows no improvement past the 1:20 mark. My formula from preliminary paper 1 also matches with whatever is going on with the MDLM. And UNDLM just sucks. That’s kinda expected, actually! Previous research papers prove that UNDLMs have noticeably less quality than MDLMs at the same scale. Model quality should be like this AR > MDLM > UNDLM And it’s showing here. Which is good. So at least no errors here, so far. Stay tuned. by the way, the website was JUST updated with new-but-not-the-newest-as-of-this-and-the-previous-devlog models, DON’T expect good code. If your expectations are low, put them in the negatives, if you could."}, {"post_id": 51011, "ts": "2026-08-20T14:32:04Z", "hours": 9.9144, "text": "Devlog 5: THREE Paradigms. There are now THREE different model architectures in one unified codebase. Masked Discrete Diffusion Uniform Noise Diffusion Autoregressive Why? We’re comparing them?.. I don’t care, what are the results? A lot. But I am unable to infer much from this except that: Autoregressive models scale really well. Masked Diffusion models are stable. Don’t know what the hell is going on with Uniform Noise DLMs. More data is required for me to make any comment. Anyways: the repo has been updated and now it’s easy for anyone to train an AR, MD or UND language model! Not that I recommend. Stay tuned. Next preliminary report, eh… not coming soon. Here’s graphs too btw."}, {"post_id": 49679, "ts": "2026-08-18T15:52:19Z", "hours": 13.8333, "text": "Devlog 4: Preliminary Report 2. Firstly, here is the preliminary report #2 itself. More model runs have occurred since the last devlog, namely: Telos Kappa (MD) 12.5M 1:30 Telos Kappa (MD) 25M 1:35 Telos Kappa (MD) 25M 1:40 Telos Kappa (MD) 25M 1:45 (ongoing) Telos Kappa (MD) 50M 1:45 And data brings confusing news. As seen by the graphs attached, target CE continues to drop for both 50M and 25M models while still increasing for 12.5M models. This would indicate that the 50M and 25M models are improving, but probes data says otherwise. It improves in some categories and actually gets worse in others. What do I mean by that? 25M 1:40 gets better in Literals, Operators, Keywords, and Imports, but gets worse in Identifier Recovery, Function Names, and Attribute Names. The same trend appeared across the suite, yielding these numbers as the sweet spots: 12.5M: 1:20 25M: 1:30 50M: 1:35 With performance divergences and collapses past those boundaries. The RoPE Retrofitting Pitfall Which leads me to a conclusion that I had mentioned in the previous devlog — namely, how I implemented RoPE. For the existing models that were trained with learned absolute positional embeddings, I performed a 150-step RoPE fine-tuning adaptation (~19M tokens, barely ~1% of their training duration). The idea in theory was simple: let the attention heads quickly adapt to relative rotary rotations, but in practice, this 150-step surgical hack actively damaged the models across the board : 50M 1:25: 7.19 -> 7.79 50M 1:35: 7.05 -> 7.72 25M 1:30: 6.90 -> 7.55 (lower is better) For a transformer with billions of tokens of uninterrupted convergence, abruptly rotating query and key vectors in attention circuits calibrated for absolute coordinate space is a violent geometric shock. 150 steps was not nearly enough time to re-align the attention geometry — it simply threw the models into a worse local basin. Native RoPE vs. The Parameter Capacity Ceiling On the flip side, models trained natively with RoPE from step 0 (like 25M 1:35 and 25M 1:40) told a very different story: Top-1 Accuracy: 7.92% (New record) Top-5 Accuracy: 17.82% (New record) Overall CE: 7.24 nats They set high-water marks for positional accuracy and syntactic prediction. So why did their average rank still increase on Function Names and Attribute Names? My conclusion: Because at 25M parameters, we slammed directly into a capacity allocation ceiling: In extreme over-training regimes, gradient descent aggressively prioritizes easy, position-predictable tokens (literals at rank #32, operators at rank #67) to greedily minimize loss. Because 25M parameters is a fixed representational budget, the network exhausts its capacity on structural syntax and starves the complex semantic heads needed for open-vocabulary naming (self.config vs self.logger at rank #3,954). The loss drops on paper, but the model becomes a syntactic pattern-matcher rather than a semantic code understander. The Inherent Ceiling of Masked Diffusion (MDLM) This brings us to the fundamental limitation of standard Masked Discrete Diffusion: the lack of self-correction. In an MDLM, once a token is unmasked during sampling, that decision is locked in permanently. If the model commits early to a structural template, it has no way to revise downstream semantic errors as the broader context comes into view. Next: Pivoting to Uniform Noise DLMs. Due to my absolute stupidity, retraining will have to occur for most MDLMs here. Expect results for those next week. But that is where MDLM research concludes (mostly) . We are moving onwards with Uniform Noise Diffusion Language Models after that, which introduces true iterative self-correction for code generation, which gives the model the ability to fix its own mistakes. Stay tuned."}, {"post_id": 47621, "ts": "2026-08-15T17:00:04Z", "hours": 5.6972, "text": "Devlog 3: annoyances. Somehow: I had forgotten to implement RoPE for MLX training . This wasn’t a MASSIVE issue because the research is based on MDLMs (Masked Diffusion Language Models) rather than AR (Autoregressive models) . Why? In AR models, RoPE is critical because the model must distinguish between position 1 and 500 to generate coherent left-to-right sequences. However, in MDLMs, the model predicts all masked tokens simultaneously. Positional ordering matters less just because the model learns what token fits in a masked slot based on bidirectional context, and not what comes next. But it didn’t mean I could still use the old models. The model can still learn what tokens are likely without RoPE, but it is weaker at understanding where in a function body it is. (e.g, is it the beginning of a function or the return statement) Thankfully, I did not have to retrain all models. I could fine-tune RoPE into existing checkpoints instead. The new CE vs Token Multiplier graph is attached to this devlog. Annoyingly, this meant my formulas have to change. Because clearly, the model quality has jumped to be better from 1:15 to 1:20 for a 12.5M model, and from 1:25 to >=1:30 model for a 25M model, which means I will need to train more 25M models at 1:35, 1:40, so on. Especially considering Target CE reduces THAT drastically. It takes exceptionally long to train models as we scale further and further. The 50M 1:45 model is 67% of the way done since the last devlog, and it had been running overnight. Research on this will be uploaded later on. Research on Uniform Noise DLMs will start even later in this case, and Continuous Space DLMs even further than that. I’ve done some amount of learning into both of those though, UNDLM architecture is pretty easy to implement on top of my MDLM architecture. One code block change. The primary benefit of UNDLMs is that they can correct their own responses. Continuous Space DLMs too, but the architecture has to be rewritten for CSDLMs. Not just that: it introduces a few issues. Rounding errors: final discrete -> token projection can cause errors Training complexity: Need to jointly optiise embeddings and score network Less mature tooling Well. Stay tuned."}, {"post_id": 46877, "ts": "2026-08-14T12:43:59Z", "hours": 10.6903, "text": "Research on Masked Diffusion Language Models continues. Not much has occurred, but three models have been trained which will count towards the final report. Telos Kappa (MD) 25M 1:30 Telos Kappa (MD) 50M 1:35 Telos Kappa (MD) 50M 1:40 And Telos Kappa (MD) 50M 1:45 training is underway at 33% completion . These are the model results accordingly. Telos Kappa (MD) 25M 1:30 Total Probes Evaluated: 101 Overall Average Target CE: 6.9008 Overall Average Rank: 409.1 Top-1 Accuracy: 0.00% (0/101) Top-5 Accuracy: 2.97% (3/101) Telos Kappa (MD) 50M 1:35 Total Probes Evaluated: 101 Overall Average Target CE: 7.0468 Overall Average Rank: 445.8 Top-1 Accuracy: 0.99% (1/101) Top-5 Accuracy: 4.95% (5/101) Telos Kappa (MD) 50M 1:40 Total Probes Evaluated: 101 Overall Average Target CE: 7.0563 Overall Average Rank 510.3 Top-1 Accuracy: 0.00% (0/101) Top-5 Accuracy 5.94% (6/101) Note that NONE of these are averages, they’re single-run probes. If you don’t exactly know what these numbers mean, just know that: Target CE (lower is better) Average Rank (lower is better) Top-1 Accuracy (higher is better) Top-5 Accuracy (higher is better) I will not be publishing the model files until the final report as well. If you had also noticed in this log, I had mentioned “Telos Kappa (MD)” rather than just “Telos Kappa” which is mentioned on the report and on the testing page, this is because this research will be continuing PAST Masked Diffusion models and into Uniform Noise Discrete Diffusion models and Continuous Space Diffusion models. If you want to know what Uniform Noise Discrete Diffusion and Continuous Space Diffusion models are, I would recommend going through papers by Justin Deschenaux, Sahoo et al. and Liu et al. References: https://arxiv.org/abs/2511.12114 https://arxiv.org/abs/2506.10892 https://arxiv.org/abs/2602.15014 https://arxiv.org/abs/2602.21185 https://arxiv.org/abs/2605.11125 Stay tuned for the future of my research! (btw, here’s a pic of how training looks like… or in other words how much my laptop is suffering)"}, {"post_id": 46359, "ts": "2026-08-13T15:10:14Z", "hours": 37.6539, "text": "This was meant to be a weekend project for me to learn basics of LLMs with… Instead I’ve managed to work on Diffusion Language Models and perform research on it considering there’s not much (or enough) knowledge on Diffusion Language Models to begin with (as far as I’ve seen). So here’s what I’ve done instead of being normal: Research on Scaling Masked Diffusion Language Models An absolute pain of a research project but maybe worth it. This is the testing page and research paper . Had to deal with nightmares like timestep distribution, datatype mismatch and running out of compute all the time and optimising for MLX, but guess I managed to (somewhat) answer the primary question I had for Masked Diffusion Language Models: How do tokens scale with parameters for MDLMs? The full answer, methodology, and evidence are in the report linked above. But if you’re lazy and just want the current empirical relationships, here they are (these are still preliminary and may change as the research continues) : R(N)=14.43⋅ln(N)−21.44 R(N)=6.83⋅√N−9.14 R(N)=2.39⋅N^(0.74) Where R(N) is the optimal token to parameter ratio for a model of N parameters (in millions) Somehow this was a weekend project. That ended up taking more than a week and probably take even more time than this for a full report."}]...
|
Title: Telos by @kazenoko | Stardance
Devlogs:
Th Title: Telos by @kazenoko | Stardance
Devlogs:
This was meant to be a weekend project for me to learn basics of LLMs with… Instead I’ve managed to work on Diffusion Language Models and perform research on it considering there’s not much (or enough) knowledge on Diffusion Language Models to begin with (as far as I’ve seen). So here’s what I’ve done instead of being normal: Research on Scaling Masked Diffusion Language Models An absolute pain of a research project but maybe worth it. This is the testing page and research paper . Had to deal with nightmares like timestep distribution, datatype mismatch and running out of compute all the time and optimising for MLX, but guess I managed to (somewhat) answer the primary question I had for Masked Diffusion Language Models: How do tokens scale with parameters for MDLMs? The full answer, methodology, and evidence are in the report linked above. But if you’re lazy and just want the current empirical relationships, here they are (these are still preliminary and may change as the research continues) : R(N)=14.43⋅ln(N)−21.44 R(N)=6.83⋅√N−9.14 R(N)=2.39⋅N^(0.74) Where R(N) is the optimal token to parameter ratio for a model of N parameters (in millions) Somehow this was a weekend project. That ended up taking more than a week and probably take even more time than this for a full report.
Research on Masked Diffusion Language Models continues. Not much has occurred, but three models have been trained which will count towards the final report. Telos Kappa (MD) 25M 1:30 Telos Kappa (MD) 50M 1:35 Telos Kappa (MD) 50M 1:40 And Telos Kappa (MD) 50M 1:45 training is underway at 33% completion . These are the model results accordingly. Telos Kappa (MD) 25M 1:30 Total Probes Evaluated: 101 Overall Average Target CE: 6.9008 Overall Average Rank: 409.1 Top-1 Accuracy: 0.00% (0/101) Top-5 Accuracy: 2.97% (3/101) Telos Kappa (MD) 50M 1:35 Total Probes Evaluated: 101 Overall Average Target CE: 7.0468 Overall Average Rank: 445.8 Top-1 Accuracy: 0.99% (1/101) Top-5 Accuracy: 4.95% (5/101) Telos Kappa (MD) 50M 1:40 Total Probes Evaluated: 101 Overall Average Target CE: 7.0563 Overall Average Rank 510.3 Top-1 Accuracy: 0.00% (0/101) Top-5 Accuracy 5.94% (6/101) Note that NONE of these are averages, they’re single-run probes. If you don’t exactly know what these numbers mean, just know that: Target CE (lower is better) Average Rank (lower is better) Top-1 Accuracy (higher is better) Top-5 Accuracy (higher is better) I will not be publishing the model files until the final report as well. If you had also noticed in this log, I had mentioned “Telos Kappa (MD)” rather than just “Telos Kappa” which is mentioned on the report and on the testing page, this is because this research will be continuing PAST Masked Diffusion models and into Uniform Noise Discrete Diffusion models and Continuous Space Diffusion models. If you want to know what Uniform Noise Discrete Diffusion and Continuous Space Diffusion models are, I would recommend going through papers by Justin Deschenaux, Sahoo et al. and Liu et al. References: https://arxiv.org/abs/2511.12114 https://arxiv.org/abs/2506.10892 https://arxiv.org/abs/2602.15014 https://arxiv.org/abs/2602.21185 https://arxiv.org/abs/2605.11125 Stay tuned for the future of my research! (btw, here’s a pic of how training looks like… or in other words how much my laptop is suffering)
Devlog 3: annoyances. Somehow: I had forgotten to implement RoPE for MLX training . This wasn’t a MASSIVE issue because the research is based on MDLMs (Masked Diffusion Language Models) rather than AR (Autoregressive models) . Why? In AR models, RoPE is critical because the model must distinguish between position 1 and 500 to generate coherent left-to-right sequences. However, in MDLMs, the model predicts all masked tokens simultaneously. Positional ordering matters less just because the model learns what token fits in a masked slot based on bidirectional context, and not what comes next. But it didn’t mean I could still use the old models. The model can still learn what tokens are likely without RoPE, but it is weaker at understanding where in a function body it is. (e.g, is it the beginning of a function or the return statement) Thankfully, I did not have to retrain all models. I could fine-tune RoPE into existing checkpoints instead. The new CE vs Token Multiplier graph is attached to this devlog. Annoyingly, this meant my formulas have to change. Because clearly, the model quality has jumped to be better from 1:15 to 1:20 for a 12.5M model, and from 1:25 to >=1:30 model for a 25M model, which means I will need to train more 25M models at 1:35, 1:40, so on. Especially considering Target CE reduces THAT drastically. It takes exceptionally long to train models as we scale further and further. The 50M 1:45 model is 67% of the way done since the last devlog, and it had been running overnight. Research on this will be uploaded later on. Research on Uniform Noise DLMs will start even later in this case, and Continuous Space DLMs even further than that. I’ve done some amount of learning into both of those though, UNDLM architecture is pretty easy to implement on top of my MDLM architecture. One code block change. The primary benefit of UNDLMs is that they can correct their own responses. Continuous Space DLMs too, but the architecture has to be rewritten for CSDLMs. Not just that: it introduces a few issues. Rounding errors: final discrete -> token projection can cause errors Training complexity: Need to jointly optiise embeddings and score network Less mature tooling Well. Stay tuned.
Devlog 4: Preliminary Report 2. Firstly, here is the preliminary report #2 itself. More model runs have occurred since the last devlog, namely: Telos Kappa (MD) 12.5M 1:30 Telos Kappa (MD) 25M 1:35 Telos Kappa (MD) 25M 1:40 Telos Kappa (MD) 25M 1:45 (ongoing) Telos Kappa (MD) 50M 1:45 And data brings confusing news. As seen by the graphs attached, target CE continues to drop for both 50M and 25M models while still increasing for 12.5M models. This would indicate that the 50M and 25M models are improving, but probes data says otherwise. It improves in some categories and actually gets worse in others. What do I mean by that? 25M 1:40 gets better in Literals, Operators, Keywords, and Imports, but gets worse in Identifier Recovery, Function Names, and Attribute Names. The same trend appeared across the suite, yielding these numbers as the sweet spots: 12.5M: 1:20 25M: 1:30 50M: 1:35 With performance divergences and collapses past those boundaries. The RoPE Retrofitting Pitfall Which leads me to a conclusion that I had mentioned in the previous devlog — namely, how I implemented RoPE. For the existing models that were trained with learned absolute positional embeddings, I performed a 150-step RoPE fine-tuning adaptation (~19M tokens, barely ~1% of their training duration). The idea in theory was simple: let the attention heads quickly adapt to relative rotary rotations, but in practice, this 150-step surgical hack actively damaged the models across the board : 50M 1:25: 7.19 -> 7.79 50M 1:35: 7.05 -> 7.72 25M 1:30: 6.90 -> 7.55 (lower is better) For a transformer with billions of tokens of uninterrupted convergence, abruptly rotating query and key vectors in attention circuits calibrated for absolute coordinate space is a violent geometric shock. 150 steps was not nearly enough time to re-align the attention geometry — it simply threw the models into a worse local basin. Native RoPE vs. The Parameter Capacity Ceiling On the flip side, models trained natively with RoPE from step 0 (like 25M 1:35 and 25M 1:40) told a very different story: Top-1 Accuracy: 7.92% (New record) Top-5 Accuracy: 17.82% (New record) Overall CE: 7.24 nats They set high-water marks for positional accuracy and syntactic prediction. So why did their average rank still increase on Function Names and Attribute Names? My conclusion: Because at 25M parameters, we slammed directly into a capacity allocation ceiling: In extreme over-training regimes, gradient descent aggressively prioritizes easy, position-predictable tokens (literals at rank #32, operators at rank #67) to greedily minimize loss. Because 25M parameters is a fixed representational budget, the network exhausts its capacity on structural syntax and starves the complex semantic heads needed for open-vocabulary naming (self.config vs self.logger at rank #3,954). The loss drops on paper, but the model becomes a syntactic pattern-matcher rather than a semantic code understander. The Inherent Ceiling of Masked Diffusion (MDLM) This brings us to the fundamental limitation of standard Masked Discrete Diffusion: the lack of self-correction. In an MDLM, once a token is unmasked during sampling, that decision is locked in permanently. If the model commits early to a structural template, it has no way to revise downstream semantic errors as the broader context comes into view. Next: Pivoting to Uniform Noise DLMs. Due to my absolute stupidity, retraining will have to occur for most MDLMs here. Expect results for those next week. But that is where MDLM research concludes (mostly) . We are moving onwards with Uniform Noise Diffusion Language Models after that, which introduces true iterative self-correction for code generation, which gives the model the ability to fix its own mistakes. Stay tuned.
Devlog 5: THREE Paradigms. There are now THREE different model architectures in one unified codebase. Masked Discrete Diffusion Uniform Noise Diffusion Autoregressive Why? We’re comparing them?.. I don’t care, what are the results? A lot. But I am unable to infer much from this except that: Autoregressive models scale really well. Masked Diffusion models are stable. Don’t know what the hell is going on with Uniform Noise DLMs. More data is required for me to make any comment. Anyways: the repo has been updated and now it’s easy for anyone to train an AR, MD or UND language model! Not that I recommend. Stay tuned. Next preliminary report, eh… not coming soon. Here’s graphs too btw.
Devlog 6: Probes. There’s actually not much here except more data points for me to work with. Not much changes either. Well, unless you’d like to know that I updated my Training Suites Python notebook with a few more lines (calling the function… more times for training more models) Well regardless, the images contain all the data both you and I need. What I could infer with this… little data. Few things for certain: My training code is at least 100% correct considering AR shows no improvement past the 1:20 mark. My formula from preliminary paper 1 also matches with whatever is going on with the MDLM. And UNDLM just sucks. That’s kinda expected, actually! Previous research papers prove that UNDLMs have noticeably less quality than MDLMs at the same scale. Model quality should be like this AR > MDLM > UNDLM And it’s showing here. Which is good. So at least no errors here, so far. Stay tuned. by the way, the website was JUST updated with new-but-not-the-newest-as-of-this-and-the-previous-devlog models, DON’T expect good code. If your expectations are low, put them in the negatives, if you could.
Devlog 7: I don’t have much to give you. This is the point where scaling becomes hard. Because of my own stupidity (I just invalidated my 25M model runs because I set the wrong LR) Compute (and the fact that I’m running thrice the amount of models I was running before for training) So. Where are we headed? TPUs. Once again. Please send me prayers so that some nice company gives me compute :) LightningAI and Cerebras have already ghosted me. Here’s the weird graph that doesn’t matter anymore (25M MDLM doesn’t matter. AR and UNDLM unaffected because they don’t sample t randomly per batch) Stay tuned?
Devlog 8: I at least have a bit more to give this time. First: let me just tell you HOW BAD MY TRAINING SITUATION IS. Thankfully, I did manage to get some compute. 25 credits on Lightning AI in fact, which is helpful. I used up about 2.35 now for a few tests. The other 1.35 was from my old credit balance from long back just before I was about to run out of Lightning AI credits. The fact is that the Lightning AI credits didn’t matter at all. My Mac’s still the better machine to train AI models on, for now. TPU v6e-1 does yield a 2.5x increase in training throughput over my M5 Pro, but that’s not an increase I’m expecting with it having 916 TFLOPS in BF16 quantization while my M5 Pro has like… 17 something TFLOPS. The reason is pretty simple though. My scale isn’t big enough. 25M parameter models can’t occupy enough of the two Matrix Multiply Units, resulting in it not utilizing the whole TPU. To add insult to injury, setting a higher microbatch size (like to 256) causes Out Of Memory errors. To even occupy those two MXUs fully, I’d need AT MINIMUM a 50M model. So the scale has to be bigger. (or well, the matmuls for the 25M and 50M) I had actually tested the v5e-8 on Kaggle. Safe to say it performed worse than my M5 Pro. 💀 Not because the TPU v5e-8 itself was… bad. It wasn’t. It’s the fact that there’s a massive communication overhead. The CPU becomes the bottleneck. Would a bigger model solve that too? MAYBE. Can’t say for sure, not saying for sure. So how long is training going to take? FOUR OR FIVE DAYS. what? 🥀 YES. Unfortunately, even if I run 2x T4’s to speed up my situation, at most it’ll take 3-4 days to train the required models. 25M 1:20 is actively running, and will take 11 more hours to complete. This is upscaling from 12.5M 1:20. 25M 1:25 is scheduled to run after the 25M 1:20, and that will take 14 more hours… After that, it’s the train-from-scratch models… which I’ll try to speed up by running on 2x T4, but I can’t guarantee any speed-ups. So what after this? 50M and 100M train runs. And these should actually be faster, in theory, than the 25M model runs. Watch me be wrong though. But IN THEORY, once again, 50M 1:10 itself is maybe a ~20 minute job on TPU v6e-1. Before I get on with the results of whatever models I’ve trained so far, I have an admission. I kinda didn’t explain what all the terms I’ve mentioned are… And if I did, they’re scattered everywhere. Well I’ll have to explain this next devlog anyway, I’m running out of my 4000 character limit 😭 Getting onto the evaluations… You may have noticed that I mentioned UNDLMs are less stable to train last devlog. Taking ONE look at the graph shows EXACTLY why. The Average Target Rank for the 12.5M UNDLM is going MENTAL. That is NOT a normal graph. Also, the fact I’ve mentioned in the previous devlog, still holds true. AR > MDLM > UNDLM. And another thing: I don’t think we’re getting an AR replacement any time soon. I doubt even at higher parameters, MDLM and UNDLM still won’t catch up to AR. Something that kinda deviates from previous preliminary reports… The CE, Average Target Rank and Top 5 Accuracy were somewhat consistent before. But those are different here. Even if CE for MDLMs drop, Average Target Rank actually stay consistent or increase, while Top 5 Accuracy actually increases. UNDLMs are bad enough that this isn’t something we need to worry about at all, yet. Well, regardless, that’s all I have for you today. Stay tuned. (by the way, updating the website soon with an actual preview of how AR, MDLM and UNDLMs generate text to make the website more functional. trust me - it looks cool.)
Ships:
This was supposed to be a weekend project to learn LLMs. It became independent research on scaling Masked Diffusion Language Models instead. I built the models, survived datatype/timestep nightmares, optimized MLX on Apple Silicon, achieved ~1.5–2× faster local training, and investigated how training tokens scale with model parameters. To test the models or look at the research, head on over to https://telos.research.wingit.tech/ (please don’t expect the models to be good - they are NOT. They’re small models that barely generate anything useful [clearly, shown by the screenshot] and the only useful thing about them is how much the correct answer probabilities improve with increase in parameters and tokens, do note that inference is also pretty slow.)...
|
1792878787.1977553
|
1793742787.1977553
|
|
4018
|
Celestial Capitalist by @idi0cy | Stardance
|
idi0cy
|
1
|
109.0
|
2005
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T08:45:07Z", "hours": 109.0, "multiplier": 18.79, "payout": 2005, "blessing": "neutral", "text": "Celestial Capitalist is a simulation game where the player simultaneously builds and ascends the corporate ladder from the bottom of the street to the self-built throne at the top of the cosmos. Beg your way from homelessness, run a lemonade stand, scam grandmas on the internet, start a cult, play union-buster tower defence, and generally just have a grand stupid time while the world slowly bends to your will. Coding is mighty stupid, and I had a lot of trouble patching all of the many bugs. With all that out of the way, I hope you enjoy Celestial Capitalist!", "repo": "https://github.com/idi0cy/Celestial-Capitalist", "demo": "https://ratseerofrattesse.itch.io/celestial-capitalist"}]...
|
[{"post_id": 70009, "ts": "202 [{"post_id": 70009, "ts": "2026-09-18T08:29:54Z", "hours": 2.7947, "text": "Finished The first stage, and therefor the shipped version of Celestial Capitalist (all rights reserved) is completed! I just spent over four hours in a voice call with @Ratseer patching all the bugs and balancing all the minigames. Audio settings work, but only on the editor version. The only forum post we found with a possible answer just told us they fixed but don’t know how, so our questions were not answered. Minigames were balanced, the sort. Very, very stupid code was fixed (more than I remember writing). More importantly, they sell soy sauce by the buckets and they also have deluxe versions worth hundreds of dollars. This fact was found out after I realized we priced soy sauce at $45. All the items were subsequently revalued. Celestial Capitalist Finally (but not fully) developed by @Ratseer and @idi0cy . Thank you for your patience."}, {"post_id": 67502, "ts": "2026-09-13T16:58:21Z", "hours": 7.8861, "text": "Polishing and Suffering Celestial capitalist is nearing it’s completion, so over the past week or so I’ve just been polishing everything. Fixing bugs, balancing minigames, and small changes that make the game less buggy. My friend @Ratseer has been working on a couple of these mechanics, including revamping a goofy tutorial blob I wrote. Sound Effects A big change to note was the sound effects, and this is where the suffering comes in. I had to make a global script with a button signal that each button would send, which would cause a sound to play. After a big of debugging, I hooked up pressing a button to the signal, and it worked. Almost. The signal was sending, and it was telling the AudioStreamPlayer to play the sound, but for some reason it wasn’t. We testing using an input to play the sound, and that worked perfectly fine. I tried using another proxy function for no reason, and it didn’t work either. We even tried having both the input and the signal change the same variable to true, where the sound would play then it set to false again. This didn’t work. To this day, I’m not sure why nothing worked, and I’m not sure I’ll ever find out. But it was fine, since we eventually just made a new global script and for some reason everything worked totally normally after that. The image attached below depicts the setup we used for this coding conundrum. Celestial Capitalist Shrewdly developed by @Ratseer and @idi0cy ."}, {"post_id": 65218, "ts": "2026-09-10T06:08:55Z", "hours": 4.8753, "text": "Title Screen and a Heftier Quota I did a couple things, starting with an upgrade to the title screen system. Now, you can read a bit about your role in this game before you’re thrown into the deep end. I wrote up a quick explanation, but it might get changed in the future based on vibes. The other big change is that I added more quota requirements. Instead of just making 500 bucks, you gotta do some more work like sell items, or gain skill points. There are three right now, and I plan to keep it that way. Bug Fixes Since CC is about ready to ship any time now, we’re doing some final bug patches and implementations to the game. I fixed a counting error on the fake injury game mode, as well as a bad gameplay mechanic in the sell minigame that caused targets to spawn on top of each other. Celestial Capitalist Treacherously developed by @Ratseer and @idi0cy"}, {"post_id": 60923, "ts": "2026-09-03T16:11:15Z", "hours": 5.8194, "text": "Random Events It’s another day where I’ve actually done some coding work, and I completed the random events function of this game. Every 180 seconds a randomly selected random event occurs, and a popup shows up telling you what happened. Get robbed, find money on the floor, get robbed again, anything could happen. Each event has a different “weight” to it, which determines how likely it is to happen. In this recording, I changed the weight of losing an item to 2000, giving it a practically guaranteed chance of being picked. Event log will probably be removed, since it isn’t actually useful. Celestial Capitalist Legally developed by @Ratseer and @idi0cy ."}, {"post_id": 55575, "ts": "2026-08-27T14:47:16Z", "hours": 2.4314, "text": "Title Screen Functionality For the longest time, the title screen has been completely non-functional. That ends today, when I do some actually easy coding and give functionality* to all of the buttons I put onto the title screen. Start game initiates a loading popup before loading the next scene. Credits gives the same text each time, with the exception of the green highlighted text, which chooses a random adjective each time the credits button is pressed. The settings are a lie. Celestial Capitalist var wordBank = [\"debatably\", \"demonstrably\", \"woefully\"] var msg = str(wordBank[randi_range(0, len(wordBank) - 1]) + \" developed by @idi0cy and @Ratseer\" print(msg)"}, {"post_id": 44708, "ts": "2026-08-10T17:24:52Z", "hours": 3.9619, "text": "Skill Point System Completed I’m back, with more consistent developing time. The skills system has been completed, and its relatively simple which is actually a nice break. Typing minigame nearly killed me. You have certain attributes that you can divest your skill points into. A lot of these are the typical DnD stats, but some of them are different. Every three minutes you gain a skill point, which might be changed for balancing. Every time you complete a minigame from the get money section, you have the chance to get a skill point. Certain skills help with certain minigames, and the more you have the more positive modifiers you get for that minigame. This is all pretty intuitive. There are some parts not yet filled out, since I don’t know at all how the scavenge code works because my friend made that and not me. Celestial Capitalist Inconsistently developed by @idi0cy and @Ratseer ."}, {"post_id": 38635, "ts": "2026-08-01T04:08:07Z", "hours": 4.4667, "text": "Quota Function Completed I’ve been on just a bit of a hiatus. The steal function has been fully completed, with a strength minigame based off both aim training and also timing. Also, I have a functioning quota system. You have certain tasks to complete before moving on to the next “level”, which definitely won’t be programmed very soon at the exponentially decaying rate that I’m moving at. I’m going to start looking at returning to daily contribution, all for those ikea sharks. You can focus the progress bar on certain tasks to complete, such as the cash requirement which is the only one right now. It fills in automatically, and has a nice texture. See the video for how it works. Thank you for viewing celestial capitalist, its not abandoned quite yet. Debatably developed by @idi0cy and @Ratseer ."}, {"post_id": 25608, "ts": "2026-07-09T23:53:01Z", "hours": 9.0775, "text": "Steal Function In Progress Of course, there needs to be an option to rob people. Hence, stealing. I’ve programmed the stealth minigame into the stealing function of the game, and it works perfectly fine. The strength one, well not so much. Going to have to give a bit more of a wait on that one. Heavily inspired by Stardew Valley’s fishing minigame. I have to log these hours before I reach ten, because I just found out that stardance does NOT do overtime pay. Celestial Capitalist Greedily developed by @idi0cy and @Ratseer ."}, {"post_id": 18522, "ts": "2026-06-29T18:19:15Z", "hours": 12.1594, "text": "Con Minigame Completed It’s been nine days, and I’ve worked on one minigame for 12 hours. The typing based minigame for conning strangers is now complete! When you con someone, you choose how you want to con them, for example a fake business opportunity, magical exorcism, or maybe even an unwinnable game to bet money on. You then type out a randomly picked prompt that was premade, and you are scored on your speed and accuracy. This determines how likely you are to succeed. You can also decide how much stakes you want to give the con, so that’s something. When you get something wrong, it highlights what was supposed to be typed red, unless you got it wrong on a space, in which it puts in what character you typed in red highlight where you typed it.. I won’t lie, it’s a bit unpolished. There are some weird text wrapping bugs that are unpleasant to look at, but it should be fine for the most part. This kinda took way too long, but whatever. We take what we can get. Meanwhile, at the Legion of Doom… My associate who is also working on this project, @Ratseer has gotten strangers new sprites, names, and all that, along with a brand new scavenging system which I recommend you check out on all his devlogs. Formatting still sucks The preview function is great, thank you Stardance team. But still, now the ctrl Z shortcut is wonky, it’s harder to put in more line breaks when pressing the enter key, and also I tried uploading this earlier with the video and it said the video size was too large, and deleted the entire devlog, so now I’m writing this again. Features for thought. Celestial Capitalist Thank you for checking in with Celestial Capitalist, developed by @idi0cy and @Ratseer ."}, {"post_id": 12623, "ts": "2026-06-20T16:58:09Z", "hours": 7.315, "text": "I’m Bad at Coding Recently, I’ve been trying to code a typing minigame where you do a type test to increase your chances of success. This is for the con action of Celestial Capitalist, where you just scam people. A couple of revelations have been made while I’ve been working on this, the first of which is that I’m bad at coding. As you can hopefully observe in the game, it’s supposed to be structured after a typing test like monkeytype. Each time you get it right, it highlights white. When you get a word wrong, it highlights it red. When you get it wrong on a space, a new letter is appended where you got it wrong. The most basic elements of this are working, such as getting the text correct and getting the normal non-space error text working. You know what’s not working? The other parts. Each time I try to do the error after a space, it bugs out because the backspace option doesn’t go well with it. When a word only autowraps after it’s completed, such as when I type “because” in the video, it only goes to where it should be after it’s done, which looks ugly. The indexing is wrong, little things work, and you can all see it in the video. I think I’ve also made some of the most inefficient code ever designed. I’ll keep toiling away at the minigame, and then toil away some more to actually integrate it into the minigame. These bugs will drive me to insanity. Well Well Well Would you look at that? They added a preview section. Where you can preview all of your markdown formatting. Y’know when that could have been useful? I sure do wonder. Markdown formatting is now my enemy."}, {"post_id": 10459, "ts": "2026-06-17T05:58:21Z", "hours": 3.2919, "text": "Blackmail and a Broken Clavicle You can now fake an injury, and demand blackmail to keep quiet about it and not make a fuss. In the true spirit of Reigen Arataka, you can pretend your clavicle is broken too. All of you should watch mob psycho. The recording attached better be the right one. . I’m still doing the backslashes. I’ve given up. I might try new formatting another day, but I’m tired. . Alright, so the minigame for faking an injury is pretty simple, its an fnf like rhythm game that is so unbalanced it’s insane. You are deducted points for pushing any button, and are given points for if you hit a note. You will be able to tell if you hit a note because it will expand like a balloon and fade away like my employment opportunities. You are given more points if the note is closer to the filling the center cavity of the button. . The point of this is to reward actually hitting them on time, and not just spamming. Missing notes deducts points. Severity of injury being faked determines game difficulty. Minigame performance has certain weight on how successful you are in getting money. If you perform in a negative fashion, it’s over. After blackmailing a stranger (successful or not), they will never talk to you again (kinda). They are removed from your current roster of strangers, but they might come back when reroll happens since we only have so much stranger types so far. . This thing is so heinously unbalanced, it’s insane. All the values need to be tweaked, and I haven’t done enough playtesting to know if it is fair or not. I’m hoping tweaking the values will be easy, but it might be hard to polish. That’s for another day. . Update on friendship My friend is working on actually interesting randomized dialogue, so that should be something to look forward to. Check out Ratseer’s stuff."}, {"post_id": 9974, "ts": "2026-06-16T14:41:33Z", "hours": 4.9433, "text": "Nothing is working I’m trying out on making the fake injury option, and it is not working as intended. It’s supposed to have a rhythm based minigame, sort of like friday night funkin even though i’ve never played that before, but it clearly isn’t working. \\ All the icons are sideways, there are too much notes, and for the longest time none of them would scale correctly because I forgot to assign the new scale to the scale property. \\ Markdown, again Okay I think I got it this time. If I just leave the backslashes alone…"}, {"post_id": 8518, "ts": "2026-06-14T05:11:10Z", "hours": 3.1353, "text": "Beg The beg minigame has been completed, meaning you can now get on your knees and start praying for money. I also did some polishing work, but I have absolutely no recollection of that. Frontotemporal dementia is simply a wonder, isn’t it? \\ I’m also trying some new mark down. Let’s see if my paragraphs space properly. \\ When you beg to someone, you get “dialogue options”. The options are based off the three methods of persuasion, Ethos, Logos, and Pathos. Pathos is appealing to human emotions like empathy, logos is using logic, and ethos is using authority to prove an argument. Each stranger will have a different reception to the persuasion types, based off data values stored in the code. \\ You have 8 chances to beg. I think. I might have changed the value. Again, frontotemporal dementia. \\ Everything is ledger compatible. If you get less than 25 progress somehow, which I might change to make it more difficult, you are rejected and cannot approach the stranger again (until strangers refresh). The more you use one strategy of persuasion, the less effective it gets. I plan to make this effect more pronounced when balancing. \\ That’s it. Please let this markdown formatting succeed."}, {"post_id": 8155, "ts": "2026-06-13T16:27:06Z", "hours": 2.9306, "text": "Polishing 0 Couple of polishing points that I put into the game to freshen things up and solve all the bugs that haggling made. Items are removed from inventory after selling, strangers walk away after you fail a sell attempt with them, and I fixed an integer division error that led to fearmongering being physically impossible to complete when you select it as a minigame. While I was working on the sell items minigame, my friend Ratseer has been working on the ledger which tracks all the finances. I’m too lazy to link him, but you should check it out over at his profile, if he devlogged it. I’ll put a video of it working here, but that’s just because I don’t think I can post this without a media element."}, {"post_id": 7287, "ts": "2026-06-12T04:34:09Z", "hours": 8.3356, "text": "Sell me this pen I finished the minigame for selling/haggling your items away. My markdown formatting is going to downgrade because I’m honestly not that motivated this feature took way too long to program, and i’m not very energetic right now. A couple things. After you talk to the person, you select which item you want to sell, and then sell it. There are dialogue options, and the safer ones like recommend make the minigame easier but you make less progress towards convincing them each time you succeed in clicking the button, but the riskier options like fearmonger are high reward types. After that, you can give a highball or lowball offer on a scale. The game calculates your chances of succeeded by combining pure randomness, your progress towards convincing them, and how much you priced your item in comparison to it’s actual value. Ignore the system text that says “five tries remaining”, that is vestigial and I forgot to remove it after redoing the whole minigame design. I can’t believe I spent 8 hours on this, and it isn’t even polished. Cool New Art Yes, as you can see, my friend is an absolute lifesaver when it comes to me trying to not lose my soul to krita. Lots of great sprite art here that makes the game look much better. I’ll have to clarify some text elements to make them more legible but it should be fine for now. Circle of ignorance If knowledge was a circle of light in a dark 2D plane, ignorance would be the darkness. We only reveal how much of it we find ourselves in by seeing the circumference of our small circle of knowledge. The more knowledge we obtain, the more unknown we must face. I’ve become bluntly aware of my own little ignorance circle. I’ve only done one of the five actions, and it’s unpolished, and it took me 8 hours, and the money isn’t even tracked because the ledger hasn’t been programmed yet, and I can only feel the great abyss devouring my spirit slightly more by the day. Watch the attached video to see how it works. I know, it isn’t that visually appealing, and I’ll probably spam lerp functions again to make it look smoother, but IT IS WHAT IT IS."}, {"post_id": 5980, "ts": "2026-06-10T01:07:53Z", "hours": 3.3317, "text": "Action Screen and the Power of Friendship For actual game development, the main progress made was continuing to develop the action screen. After you approach a stranger, you can now see their sprite art in a zoomed in fashion, and click on some actions. As you can see in the video, after the first part where I flex my new sprite art, clicking on an action gives a description of what it will do, and clicking the take action button to confirm that has the terminal display some fun text before the mini-game starts. I don’t believe I ran into too much bugs while developing this, and I haven’t gotten to the actually much harder part, which are the actual mini-games. I solved that previously devlogged bug with like five lines of code it was so infuriatingly easy. New Sprites You may be asking, “idi0cy, I saw your water bottle sprites, and I find myself confounded as to how you have managed to improve so much in your art.” Your suspicions are correct. I’m not making that art, my friend Ratseer is, because I got them on the project. They probably won’t code a lot for now since they still need to decipher the horrendous logic I used in the making of this game. It is very strange knowing that there is likely nobody actually reading this except for said friend, and now the acknowledgement of said fact might have just made it more awkward."}, {"post_id": 5164, "ts": "2026-06-08T20:57:07Z", "hours": 0.8678, "text": "Crushed buble emoji. Knowledgeable thoughts cannot describe my disappointment."}, {"post_id": 4655, "ts": "2026-06-08T01:56:35Z", "hours": 4.9778, "text": "Social Interaction Studies show I am not fond of it, but I’m still programming all of that into my game. This is the beginning of the sell function, where you are able to sell off your goods to strangers on the street. Having it be named “Sell” is a bit misleading, since the general game mechanic is a bit more broad than that. When you approach a stranger, you will be able to initiate a sales pitch, beg, steal, fake an injury, and tons of more fun options for making money. I’m still thinking of what I want as minigames for all of those, as I’m not sure if there will be separate minigames for each one. Each action you perform will have differing chances of success depending on game performance and the person you approach. For example, shouting into a crowd that a kid just injured you and demanding payment from said kid will have a zero percent chance of success. As of now, it still needs polishing, and while I’ve gotten the big obvious bugs out of the way (nothing rendering, nothing rendering after I click another button and go back, nothing rendering once more), I’m sure more await me. Next devlog will likely be on polishing the UI for the sell window. Finally using that clock Depending on what time of day it is, you are likely to find more/less strangers. If it’s rush hour, more people will be on the street in comparison to at 1 AM. Sprite art strikes back Everything was fine when I was drawing water bottles or whatever, but people are too much. In the meantime, I’ve substituted the human appearance with a sprite that in no way alludes to my mental state at the time of drawing. As soon as my friend who can actually draw is freed from the shackles of crunching at the end of school, I am selling their soul to the sprite art directory. Don’t tell them I said that."}, {"post_id": 3826, "ts": "2026-06-06T21:42:03Z", "hours": 0.5472, "text": "Timer Created a time variable to count in game time of day, and a time button/counter for the player to tell what time it is. I plan to have different minigames operate with separate loot-tables or success chances depending on what time of day it is. Pretty short devlog, but I’ll have to integrate this time variable into a LOT of different features that I don’t completely look forward to. New and improved markdown superpowers I think I’ve figured it out. Hopefully I no longer fumble all my markdown. But then again I still have no way of telling."}, {"post_id": 3654, "ts": "2026-06-06T18:06:08Z", "hours": 4.9564, "text": "Inventory Inventory system that displays all the items you currently possess. Upon clicking on one of the items in your possession, information on the item such as quality, value, and item name will be displayed. More information is planned to be available to the player, however that has not been developed yet. Unfortunately, the item icons for the inventory do not have the same smooth lerp scaling that I was able to use for the buttons, as texture buttons do not have a proper scale function. I could theoretically group a texture button with a sprite2D node, however the gridbox I’m using to organize all the items is unlikely to cooperate. All the item’s values are spaced out automatically so they have room and aren’t too close together. Each item has different information, and it’s only bestowed to them each time the inventory opens, since that is when the icons are generated. This forced me to do some weird signal connection logic in the scripts, but it worked out. ##Sprite Art Sprite art is overrated, and I want to stop doing it. All my hours are being spent drawing water bottles and pencils in krita, just to never be logged. I offloaded one of the sprite arts to my friend because they were bored, and he produced the hamburger sprite. Note that the hamburger sprite icon does NOT have the same colour as all of the other icons, because said friend is unable to use the colour picker tool for whatever reason. ##New Markdown Superpowers I learned how you format these, and I’m hoping it ends up looking good upon posting. I don’t really have a way of telling as of writing, however. ##Way too ambitions Me and associates started actually being interested in developing the game. In the near future, I plan to involve my associates as collaborators for the project, since we have a lot more planned than I originally thought. “Union Buster Tower Defense” might be a game feature that we actually consider making."}, {"post_id": 2559, "ts": "2026-06-05T03:26:38Z", "hours": 4.4472, "text": "How in the world do people format these to look nice? Is it markdown? something . Can’t tell if that worked. Doesn’t show me in the writing box. Progress for the day includes creating the first “stage” or area of the game. It’s themed after a sidewalk, as you are currently broke and probably living on one. Central cavity will be able to display UI for certain mini-games/elements related to tasks such as buying or selling items. All the buttons have been reformatted, since they didn’t look that good the first time I made them. Clicking the buttons has more response now since it gets smaller upon button press. I wasted so much time re-doing pixel art."}, {"post_id": 1878, "ts": "2026-06-04T02:55:48Z", "hours": 2.3606, "text": "Hopefully, the video that I attached will display properly, though I have no indication of whether it will as of writing. Progress today includes finishing the title screen for the player to start the game. There are currently three buttons with un-programmed functionalities, including a “Start Game”, “Credits”, and “Settings” button. There is also a large title for the game, which took me a bit too much unlogged hours to create for what it’s worth. Each element “flies” onto the screen, title from the right, and buttons from the left. Movement is generated using lerp() for fluidity."}, {"post_id": 1630, "ts": "2026-06-03T19:18:55Z", "hours": 3.9267, "text": "Making a 2D based semi idle game. Like any generic game in the genre, it starts with a button, so I just made that so far. Each button has an icon that can display pixel art, and a textbox for text. The original plan was to have a border that could grow/shrink independently of the main body of the button, however it was hard to create a general button function I could use for various purposes, as it didn’t scale properly to ensure a constant padding throughout. Settled on this type of button, that expands slightly when hovering over it so you can more visibly see the purple background. Might have to make other types in the future, but it should be fine for now. Button uses lerp function to smoothly expand the background sprite through time. Images show the button normally, and the button when hovering over it with the cursor. Also made some title screen art that will definitely be changed."}]...
|
Title: Celestial Capitalist by @idi0cy | Stardance Title: Celestial Capitalist by @idi0cy | Stardance
Devlogs:
Making a 2D based semi idle game. Like any generic game in the genre, it starts with a button, so I just made that so far. Each button has an icon that can display pixel art, and a textbox for text. The original plan was to have a border that could grow/shrink independently of the main body of the button, however it was hard to create a general button function I could use for various purposes, as it didn’t scale properly to ensure a constant padding throughout. Settled on this type of button, that expands slightly when hovering over it so you can more visibly see the purple background. Might have to make other types in the future, but it should be fine for now. Button uses lerp function to smoothly expand the background sprite through time. Images show the button normally, and the button when hovering over it with the cursor. Also made some title screen art that will definitely be changed.
Hopefully, the video that I attached will display properly, though I have no indication of whether it will as of writing. Progress today includes finishing the title screen for the player to start the game. There are currently three buttons with un-programmed functionalities, including a “Start Game”, “Credits”, and “Settings” button. There is also a large title for the game, which took me a bit too much unlogged hours to create for what it’s worth. Each element “flies” onto the screen, title from the right, and buttons from the left. Movement is generated using lerp() for fluidity.
How in the world do people format these to look nice? Is it markdown? something . Can’t tell if that worked. Doesn’t show me in the writing box. Progress for the day includes creating the first “stage” or area of the game. It’s themed after a sidewalk, as you are currently broke and probably living on one. Central cavity will be able to display UI for certain mini-games/elements related to tasks such as buying or selling items. All the buttons have been reformatted, since they didn’t look that good the first time I made them. Clicking the buttons has more response now since it gets smaller upon button press. I wasted so much time re-doing pixel art.
Inventory Inventory system that displays all the items you currently possess. Upon clicking on one of the items in your possession, information on the item such as quality, value, and item name will be displayed. More information is planned to be available to the player, however that has not been developed yet. Unfortunately, the item icons for the inventory do not have the same smooth lerp scaling that I was able to use for the buttons, as texture buttons do not have a proper scale function. I could theoretically group a texture button with a sprite2D node, however the gridbox I’m using to organize all the items is unlikely to cooperate. All the item’s values are spaced out automatically so they have room and aren’t too close together. Each item has different information, and it’s only bestowed to them each time the inventory opens, since that is when the icons are generated. This forced me to do some weird signal connection logic in the scripts, but it worked out. ##Sprite Art Sprite art is overrated, and I want to stop doing it. All my hours are being spent drawing water bottles and pencils in krita, just to never be logged. I offloaded one of the sprite arts to my friend because they were bored, and he produced the hamburger sprite. Note that the hamburger sprite icon does NOT have the same colour as all of the other icons, because said friend is unable to use the colour picker tool for whatever reason. ##New Markdown Superpowers I learned how you format these, and I’m hoping it ends up looking good upon posting. I don’t really have a way of telling as of writing, however. ##Way too ambitions Me and associates started actually being interested in developing the game. In the near future, I plan to involve my associates as collaborators for the project, since we have a lot more planned than I originally thought. “Union Buster Tower Defense” might be a game feature that we actually consider making.
Timer Created a time variable to count in game time of day, and a time button/counter for the player to tell what time it is. I plan to have different minigames operate with separate loot-tables or success chances depending on what time of day it is. Pretty short devlog, but I’ll have to integrate this time variable into a LOT of different features that I don’t completely look forward to. New and improved markdown superpowers I think I’ve figured it out. Hopefully I no longer fumble all my markdown. But then again I still have no way of telling.
Social Interaction Studies show I am not fond of it, but I’m still programming all of that into my game. This is the beginning of the sell function, where you are able to sell off your goods to strangers on the street. Having it be named “Sell” is a bit misleading, since the general game mechanic is a bit more broad than that. When you approach a stranger, you will be able to initiate a sales pitch, beg, steal, fake an injury, and tons of more fun options for making money. I’m still thinking of what I want as minigames for all of those, as I’m not sure if there will be separate minigames for each one. Each action you perform will have differing chances of success depending on game performance and the person you approach. For example, shouting into a crowd that a kid just injured you and demanding payment from said kid will have a zero percent chance of success. As of now, it still needs polishing, and while I’ve gotten the big obvious bugs out of the way (nothing rendering, nothing rendering after I click another button and go back, nothing rendering once more), I’m sure more await me. Next devlog will likely be on polishing the UI for the sell window. Finally using that clock Depending on what time of day it is, you are likely to find more/less strangers. If it’s rush hour, more people will be on the street in comparison to at 1 AM. Sprite art strikes back Everything was fine when I was drawing water bottles or whatever, but people are too much. In the meantime, I’ve substituted the human appearance with a sprite that in no way alludes to my mental state at the time of drawing. As soon as my friend who can actually draw is freed from the shackles of crunching at the end of school, I am selling their soul to the sprite art directory. Don’t tell them I said that.
Crushed buble emoji. Knowledgeable thoughts cannot describe my disappointment.
Action Screen and the Power of Friendship For actual game development, the main progress made was continuing to develop the action screen. After you approach a stranger, you can now see their sprite art in a zoomed in fashion, and click on some actions. As you can see in the video, after the first part where I flex my new sprite art, clicking on an action gives a description of what it will do, and clicking the take action button to confirm that has the terminal display some fun text before the mini-game starts. I don’t believe I ran into too much bugs while developing this, and I haven’t gotten to the actually much harder part, which are the actual mini-games. I solved that previously devlogged bug with like five lines of code it was so infuriatingly easy. New Sprites You may be asking, “idi0cy, I saw your water bottle sprites, and I find myself confounded as to how you have managed to improve so much in your art.” Your suspicions are correct. I’m not making that art, my friend Ratseer is, because I got them on the project. They probably won’t code a lot for now since they still need to decipher the horrendous logic I used in the making of this game. It is very strange knowing that there is likely nobody actually reading this except for said friend, and now the acknowledgement of said fact might have just made it more awkward.
Sell me this pen I finished the minigame for selling/haggling your items away. My markdown formatting is going to downgrade because I’m honestly not that motivated this feature took way too long to program, and i’m not very energetic right now. A couple things. After you talk to the person, you select which item you want to sell, and then sell it. There are dialogue options, and the safer ones like recommend make the minigame easier but you make less progress towards convincing them each time you succeed in clicking the button, but the riskier options like fearmonger are high reward types. After that, you can give a highball or lowball offer on a scale. The game calculates your chances of succeeded by combining pure randomness, your progress towards convincing them, and how much you priced your item in comparison to it’s actual value. Ignore the system text that says “five tries remaining”, that is vestigial and I forgot to remove it after redoing the whole minigame design. I can’t believe I spent 8 hours on this, and it isn’t even polished. Cool New Art Yes, as you can see, my friend is an absolute lifesaver when it comes to me trying to not lose my soul to krita. Lots of great sprite art here that makes the game look much better. I’ll have to clarify some text elements to make them more legible but it should be fine for now. Circle of ignorance If knowledge was a circle of light in a dark 2D plane, ignorance would be the darkness. We only reveal how much of it we find ourselves in by seeing the circumference of our small circle of knowledge. The more knowledge we obtain, the more unknown we must face. I’ve become bluntly aware of my own little ignorance circle. I’ve only done one of the five actions, and it’s unpolished, and it took me 8 hours, and the money isn’t even tracked because the ledger hasn’t been programmed yet, and I can only feel the great abyss devouring my spirit slightly more by the day. Watch the attached video to see how it works. I know, it isn’t that visually appealing, and I’ll probably spam lerp functions again to make it look smoother, but IT IS WHAT IT IS.
Polishing 0 Couple of polishing points that I put into the game to freshen things up and solve all the bugs that haggling made. Items are removed from inventory after selling, strangers walk away after you fail a sell attempt with them, and I fixed an integer division error that led to fearmongering being physically impossible to complete when you select it as a minigame. While I was working on the sell items minigame, my friend Ratseer has been working on the ledger which tracks all the finances. I’m too lazy to link him, but you should check it out over at his profile, if he devlogged it. I’ll put a video of it working here, but that’s just because I don’t think I can post this without a media element.
Beg The beg minigame has been completed, meaning you can now get on your knees and start praying for money. I also did some polishing work, but I have absolutely no recollection of that. Frontotemporal dementia is simply a wonder, isn’t it? \ I’m also trying some new mark down. Let’s see if my paragraphs space properly. \ When you beg to someone, you get “dialogue options”. The options are based off the three methods of persuasion, Ethos, Logos, and Pathos. Pathos is appealing to human emotions like empathy, logos is using logic, and ethos is using authority to prove an argument. Each stranger will have a different reception to the persuasion types, based off data values stored in the code. \ You have 8 chances to beg. I think. I might have changed the value. Again, frontotemporal dementia. \ Everything is ledger compatible. If you get less than 25 progress somehow, which I might change to make it more difficult, you are rejected and cannot approach the stranger again (until strangers refresh). The more you use one strategy of persuasion, the less effective it gets. I plan to make this effect more pronounced when balancing. \ That’s it. Please let this markdown formatting succeed.
Nothing is working I’m trying out on making the fake injury option, and it is not working as intended. It’s supposed to have a rhythm based minigame, sort of like friday night funkin even though i’ve never played that before, but it clearly isn’t working. \ All the icons are sideways, there are too much notes, and for the longest time none of them would scale correctly because I forgot to assign the new scale to the scale property. \ Markdown, again Okay I think I got it this time. If I just leave the backslashes alone…
Blackmail and a Broken Clavicle You can now fake an injury, and demand blackmail to keep quiet about it and not make a fuss. In the true spirit of Reigen Arataka, you can pretend your clavicle is broken too. All of you should watch mob psycho. The recording attached better be the right one. . I’m still doing the backslashes. I’ve given up. I might try new formatting another day, but I’m tired. . Alright, so the minigame for faking an injury is pretty simple, its an fnf like rhythm game that is so unbalanced it’s insane. You are deducted points for pushing any button, and are given points for if you hit a note. You will be able to tell if you hit a note because it will expand like a balloon and fade away like my employment opportunities. You are given more points if the note is closer to the filling the center cavity of the button. . The point of this is to reward actually hitting them on time, and not just spamming. Missing notes deducts points. Severity of injury being faked determines game difficulty. Minigame performance has certain weight on how successful you are in getting money. If you perform in a negative fashion, it’s over. After blackmailing a stranger (successful or not), they will never talk to you again (kinda). They are removed from your current roster of strangers, but they might come back when reroll happens since we only have so much stranger types so far. . This thing is so heinously unbalanced, it’s insane. All the values need to be tweaked, and I haven’t done enough playtesting to know if it is fair or not. I’m hoping tweaking the values will be easy, but it might be hard to polish. That’s for another day. . Update on friendship My friend is working on actually interesting randomized dialogue, so that should be something to look forward to. Check out Ratseer’s stuff.
I’m Bad at Coding Recently, I’ve been trying to code a typing minigame where you do a type test to increase your chances of success. This is for the con action of Celestial Capitalist, where you just scam people. A couple of revelations have been made while I’ve been working on this, the first of which is that I’m bad at coding. As you can hopefully observe in the game, it’s supposed to be structured after a typing test like monkeytype. Each time you get it right, it highlights white. When you get a word wrong, it highlights it red. When you get it wrong on a space, a new letter is appended where you got it wrong. The most basic elements of this are working, such as getting the text correct and getting the normal non-space error text working. You know what’s not working? The other parts. Each time I try to do the error after a space, it bugs out because the backspace option doesn’t go well with it. When a word only autowraps after it’s completed, such as when I type “because” in the video, it only goes to where it should be after it’s done, which looks ugly. The indexing is wrong, little things work, and you can all see it in the video. I think I’ve also made some of the most inefficient code ever designed. I’ll keep toiling away at the minigame, and then toil away some more to actually integrate it into the minigame. These bugs will drive me to insanity. Well Well Well Would you look at that? They added a preview section. Where you can preview all of your markdown formatting. Y’know when that could have been useful? I sure do wonder. Markdown formatting is now my enemy.
Con Minigame Completed It’s been nine days, and I’ve worked on one minigame for 12 hours. The typing based minigame for conning strangers is now complete! When you con someone, you choose how you want to con them, for example a fake business opportunity, magical exorcism, or maybe even an unwinnable game to bet money on. You then type out a randomly picked prompt that was premade, and you are scored on your speed and accuracy. This determines how likely you are to succeed. You can also decide how much stakes you want to give the con, so that’s something. When you get something wrong, it highlights what was supposed to be typed red, unless you got it wrong on a space, in which it puts in what character you typed in red highlight where you typed it.. I won’t lie, it’s a bit unpolished. There are some weird text wrapping bugs that are unpleasant to look at, but it should be fine for the most part. This kinda took way too long, but whatever. We take what we can get. Meanwhile, at the Legion of Doom… My associate who is also working on this project, @Ratseer has gotten strangers new sprites, names, and all that, along with a brand new scavenging system which I recommend you check out on all his devlogs. Formatting still sucks The preview function is great, thank you Stardance team. But still, now the ctrl Z shortcut is wonky, it’s harder to put in more line breaks when pressing the enter key, and also I tried uploading this earlier with the video and it said the video size was too large, and deleted the entire devlog, so now I’m writing this again. Features for thought. Celestial Capitalist Thank you for checking in with Celestial Capitalist, developed by @idi0cy and @Ratseer .
Steal Function In Progress Of course, there needs to be an option to rob people. Hence, stealing. I’ve programmed the stealth minigame into the stealing function of the game, and it works perfectly fine. The strength one, well not so much. Going to have to give a bit more of a wait on that one. Heavily inspired by Stardew Valley’s fishing minigame. I have to log these hours before I reach ten, because I just found out that stardance does NOT do overtime pay. Celestial Capitalist Greedily developed by @idi0cy and @Ratseer .
Quota Function Completed I’ve been on just a bit of a hiatus. The steal function has been fully completed, with a strength minigame based off both aim training and also timing. Also, I have a functioning quota system. You have certain tasks to complete before moving on to the next “level”, which definitely won’t be programmed very soon at the exponentially decaying rate that I’m moving at. I’m going to start looking at returning to daily contribution, all for those ikea sharks. You can focus the progress bar on certain tasks to complete, such as the cash requirement which is the only one right now. It fills in automatically, and has a nice texture. See the video for how it works. Thank you for viewing celestial capitalist, its not abandoned quite yet. Debatably developed by @idi0cy and @Ratseer .
Skill Point System Completed I’m back, with more consistent developing time. The skills system has been completed, and its relatively simple which is actually a nice break. Typing minigame nearly killed me. You have certain attributes that you can divest your skill points into. A lot of these are the typical DnD stats, but some of them are different. Every three minutes you gain a skill point, which might be changed for balancing. Every time you complete a minigame from the get money section, you have the chance to get a skill point. Certain skills help with certain minigames, and the more you have the more positive modifiers you get for that minigame. This is all pretty intuitive. There are some parts not yet filled out, since I don’t know at all how the scavenge code works because my friend made that and not me. Celestial Capitalist Inconsistently developed by @idi0cy and @Ratseer .
Title Screen Functionality For the longest time, the title screen has been completely non-functional. That ends today, when I do some actually easy coding and give functionality* to all of the buttons I put onto the title screen. Start game initiates a loading popup before loading the next scene. Credits gives the same text each time, with the exception of the green highlighted text, which chooses a random adjective each time the credits button is pressed. The settings are a lie. Celestial Capitalist var wordBank = ["debatably", "demonstrably", "woefully"] var msg = str(wordBank[randi_range(0, len(wordBank) - 1]) + " developed by @idi0cy and @Ratseer" print(msg)
Random Events It’s another day where I’ve actually done some coding work, and I completed the random events function of this game. Every 180 seconds a randomly selected random event occurs, and a popup shows up telling you what happened. Get robbed, find money on the floor, get robbed again, anything could happen. Each event has a different “weight” to it, which determines how likely it is to happen. In this recording, I changed the weight of losing an item to 2000, giving it a practically guaranteed chance of being picked. Event log will probably be removed, since it isn’t actually useful. Celestial Capitalist Legally developed by @Ratseer and @idi0cy .
Title Screen and a Heftier Quota I did a couple things, starting with an upgrade to the title screen system. Now, you can read a bit about your role in this game before you’re thrown into the deep end. I wrote up a quick explanation, but it might get changed in the future based on vibes. The other big change is that I added more quota requirements. Instead of just making 500 bucks, you gotta do some more work like sell items, or gain skill points. There are three right now, and I plan to keep it that way. Bug Fixes Since CC is about ready to ship any time now, we’re doing some final bug patches and implementations to the game. I fixed a counting error on the fake injury game mode, as well as a bad gameplay mechanic in the sell minigame that caused targets to spawn on top of each other. Celestial Capitalist Treacherously developed by @Ratseer and @idi0cy
Polishing and Suffering Celestial capitalist is nearing it’s completion, so over the past week or so I’ve just been polishing everything. Fixing bugs, balancing minigames, and small changes that make the game less buggy. My friend @Ratseer has been working on a couple of these mechanics, including revamping a goofy tutorial blob I wrote. Sound Effects A big change to note was the sound effects, and this is where the suffering comes in. I had to make a global script with a button signal that each button would send, which would cause a sound to play. After a big of debugging, I hooked up pressing a button to the signal, and it worked. Almost. The signal was sending, and it was telling the AudioStreamPlayer to play the sound, but for some reason it wasn’t. We testing using an input to play the sound, and that worked perfectly fine. I tried using another proxy function for no reason, and it didn’t work either. We even tried having both the input and the signal change the same variable to true, where the sound would play then it set to false again. This didn’t work. To this day, I’m not sure why nothing worked, and I’m not sure I’ll ever find out. But it was fine, since we eventually just made a new global script and for some reason everything worked totally normally after that. The image attached below depicts the setup we used for this coding conundrum. Celestial Capitalist Shrewdly developed by @Ratseer and @idi0cy .
Finished The first stage, and therefor the shipped version of Celestial Capitalist (all rights reserved) is completed! I just spent over four hours in a voice call with @Ratseer patching all the bugs and balancing all the minigames. Audio settings work, but only on the editor version. The only forum post we found with a possible answer just told us they fixed but don’t know how, so our questions were not answered. Minigames were balanced, the sort. Very, very stupid code was fixed (more than I remember writing). More importantly, they sell soy sauce by the buckets and they also have deluxe versions worth hundreds of dollars. This fact was found out after I realized we priced soy sauce at $45. All the items were subsequently revalued. Celestial Capitalist Finally (but not fully) developed by @Ratseer and @idi0cy . Thank you for your patience.
Ships:
Celestial Capitalist is a simulation game where the player simultaneously builds and ascends the corporate ladder from the bottom of the street to the self-built throne at the top of the cosmos. Beg your way from homelessness, run a lemonade stand, scam grandmas on the internet, start a cult, play union-buster tower defence, and generally just have a grand stupid time while the world slowly bends to your will. Coding is mighty stupid, and I had a lot of trouble patching all of the many bugs. With all that out of the way, I hope you enjoy Celestial Capitalist!...
|
1793004977.0964324
|
1793091377.0964324
|
|
8348
|
MineJS by @vaito | Stardance
|
vaito
|
2
|
109.0
|
1486
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T04:02:17Z", "hours": 49.0, "multiplier": 10.9, "payout": 536, "blessing": "neutral", "text": "There is a lot of changes since the last ship (I have made more 15 release since it). To sum up: Multi version support :D 26.3 is partially supported because there is some issue with decoding packets Container is here (but you can’t interact with it yet, just viewing) You can chat now I have implemented online account protocol but there is an issue prevent me from testing it so it is considered as unstable for now. There is some small changed in protocol Fix some bugs in physics engine", "repo": "https://github.com/VaitoSoi/minejs/", "demo": "https://www.npmjs.com/package/@vaitosoi/minejs"}, {"ship_num": 2, "ts": "2026-07-16T12:50:01Z", "hours": 60.0, "multiplier": 15.92, "payout": 950, "blessing": "neutral", "text": "This is a Minecraft client package, allow you to create Minecraft bot and joining server. This ship provide some basic functionality of Minecraft bot, including: Walking around Getting blocks Also, this ship include the low-level client for talking directly to the server.", "repo": "https://github.com/VaitoSoi/minejs/", "demo": "https://www.npmjs.com/package/@vaitosoi/minejs"}]...
|
[{"post_id": 80874, "ts": "202 [{"post_id": 80874, "ts": "2026-10-19T03:56:17Z", "hours": 2.7606, "text": "I’m not doing much these day beside fixing bugs because I’m quite busy with uni homework and I’m quite bored now I post this devlog to submit all of my hours before Stardance end"}, {"post_id": 74028, "ts": "2026-09-26T15:37:46Z", "hours": 1.4769, "text": "The container is finally opened, turn out there is a bug in my code which tell the server the wrong location of the chest ;-; P/s: Thank you Claude for helping me find this issue"}, {"post_id": 73148, "ts": "2026-09-24T14:14:32Z", "hours": 5.7178, "text": "I have implemented the Use item on packet for interacting with block, but seem like there was something wrong with it because it is expected to return an open screen packet but nothing returned. Beside that, I have implemented the tablist. Now you can see the header and footer Also, I’m preparing for supporting version 26.3. I’m wondering whether should I make a new ship. P/s: Rust rewrite when >:)"}, {"post_id": 65383, "ts": "2026-09-10T14:17:17Z", "hours": 1.8811, "text": "I added container But it is just clientbound Add container and block interaction soon"}, {"post_id": 64194, "ts": "2026-09-08T12:52:05Z", "hours": 5.9608, "text": "I have completed the reading slot part. I just know that a slot can hold that many data ;-; Btw, I’ll soon complete the container part, meaning that you can use chest now"}, {"post_id": 59464, "ts": "2026-09-01T10:24:05Z", "hours": 4.2389, "text": "The bot can chat now I have to reimplement the bitset to let this run btw"}, {"post_id": 53887, "ts": "2026-08-24T16:16:27Z", "hours": 3.5672, "text": "Hello again, I’m sorry for not update this project much since I’m working on the other. I just found out that the Mojang just revoke my app approval without any notification ;-; Btw, I fixed the bug that ignore the chunk packet and update the README about the current situation ;-;"}, {"post_id": 44586, "ts": "2026-08-10T13:25:50Z", "hours": 8.7567, "text": "Hello again, sorry for a almost-9-hour devlogs I’m just making the auth part for joining premium server and the thing is not going well for now ;-; I have registered the app for accessing Minecraft API but by some magic, I’m still blocked I’m also making the feature for verifying message signature"}, {"post_id": 40068, "ts": "2026-08-03T13:15:54Z", "hours": 6.7083, "text": "I do so much work that I forgot what to summarize here So before, everything is placed in TCPClient, which is fine for hard-coded packets. But now, I’m making the dynamic packet translating for multiple version supports. And while making it, it need reference from TCPClient, then TCPClient need to a reference of it and so on… So I have split the functionality into corresponding space. So now, each of class has its own responsibility: TCPClient for throwing and receiving packets through TCP connection VersionCodec for translating packets Dispatcher for handling packet SharedState for holding states So that is the whole update. Hope youre enjoy your day, also this project :D"}, {"post_id": 37686, "ts": "2026-07-30T16:10:51Z", "hours": 8.1078, "text": "Sorry for another 8-hour devlog ;-; Now MineJS support 26.2 I’m working on a system for mapping version and packet so MineJS can support multiple version at the same time, instead of one atm (because the packet ID is hard-coded). I also make another tool for scrapping Minecraft Wiki for packet structure (disclaimer: This is not an automate running so it will not spam the Wiki, please don’t ban me ;-;). Thats it, have a great day"}, {"post_id": 29459, "ts": "2026-07-16T12:40:35Z", "hours": 5.4361, "text": "Oh, I spent 5h for setting up documents? That’s crazy :D Btw, I have setup an auto document page using TypeDoc. I also setup Github Action for automating publish package and build document page."}, {"post_id": 28434, "ts": "2026-07-14T17:52:04Z", "hours": 5.855, "text": "NOW MY BOT CAN WALK ON STAIR I think it is ready to be publish ONE MORE TIME, I’m very sorry for not logging this painful process much, please please please forgive me"}, {"post_id": 27246, "ts": "2026-07-12T17:09:55Z", "hours": 2.0628, "text": "MY BOT CAN WALK NOW 🎉"}, {"post_id": 26816, "ts": "2026-07-11T20:33:54Z", "hours": 8.795, "text": "Hello, sorry for forget logging regularly In the last whole week, my only job is looking at Minecraft code, ask Claude what the beep beep is that, arguing with myself do I have to do this and then continue Btw I managed to write the trimmed Minecraft physics engine and ready to test it out Unfortunately, my code isn’t reading the Registry well so maybe tomorrow :D P/s: If you still read this, have a good day and please vote for me ;-;"}, {"post_id": 22246, "ts": "2026-07-04T16:43:26Z", "hours": 0.6108, "text": "I’m getting through clipping function, which is mandatory to calculate the damage from falling"}, {"post_id": 21570, "ts": "2026-07-03T16:24:49Z", "hours": 1.2514, "text": "Finally done the collide function ;-;"}, {"post_id": 20886, "ts": "2026-07-02T16:42:55Z", "hours": 1.2506, "text": "I have implemented the base collide function and ready for the entity collide :D"}, {"post_id": 19423, "ts": "2026-06-30T19:00:04Z", "hours": 2.0781, "text": "I added VoxelShape and some math related to it. Now I can reconstruct the collision the shape of the block and, hopefully, mobs. Thats mean I’m ready to let my client be able to move, I hope so"}, {"post_id": 18504, "ts": "2026-06-29T17:51:18Z", "hours": 6.9461, "text": "Now I’m implementing the “move” method for the client, which invokes physics things, which is very very difficult for me That why I’m not updating regularly ;-; (I’m sorry)"}, {"post_id": 16401, "ts": "2026-06-26T18:01:32Z", "hours": 4.4861, "text": "I’m making auth system and this takes me so much timeeeeeeeeeee Btw, I’m waiting for Mojang to approve my Azure app so I can test the auth API"}, {"post_id": 15114, "ts": "2026-06-24T15:35:22Z", "hours": 1.1408, "text": "I’m working on parsing player chat message now"}, {"post_id": 14337, "ts": "2026-06-23T13:07:17Z", "hours": 4.6081, "text": "This whole week is filled with debugging and small updates so here is the summary: Now the Client can handle Chunk datas, including blocks, biomes and block entites I also add more packet handling, events and decoder function. I’m moving to high-level client and the first function is move. Todo list: Inspect how Minecraft code handle movement and collision. Implement it :D"}, {"post_id": 9222, "ts": "2026-06-15T14:30:17Z", "hours": 3.2814, "text": "I’m on my way to reading chunk data. I have burnt all of my Github Copilot monthly credit only to realize that Copilot inserted a redundant read that collapse all reading latter :_D"}, {"post_id": 8565, "ts": "2026-06-14T07:26:57Z", "hours": 1.1917, "text": "It is finally working 🎉"}, {"post_id": 8530, "ts": "2026-06-14T06:05:46Z", "hours": 1.9508, "text": "I have handled all required packet so this should be theoretically playable. I also do some refactoring for a cleaner codebase :D"}, {"post_id": 8158, "ts": "2026-06-13T16:34:15Z", "hours": 2.3169, "text": "I forgot to make the devlogs so here is all of the updates: I’m heading towards making the main client All decoder and encoder have been merged to a single file for simpler file structure I’m making the encrypting things"}, {"post_id": 4223, "ts": "2026-06-07T13:37:37Z", "hours": 0.7256, "text": "The SNBT decoder is kinda work for now :D I’m moving to encoder (or should I >:D)"}, {"post_id": 3586, "ts": "2026-06-06T16:15:08Z", "hours": 1.8761, "text": "I’m working on SNBT decoder, which is way more trickier than NBT ;-; I’m just done the basic part and planning for nested object."}, {"post_id": 2804, "ts": "2026-06-05T16:59:44Z", "hours": 3.8261, "text": "I have made a NBT decoder and encoder. You can see it encode and decode in the terminal :D"}]...
|
Title: MineJS by @vaito | Stardance
Devlogs:
I ha Title: MineJS by @vaito | Stardance
Devlogs:
I have made a NBT decoder and encoder. You can see it encode and decode in the terminal :D
I’m working on SNBT decoder, which is way more trickier than NBT ;-; I’m just done the basic part and planning for nested object.
The SNBT decoder is kinda work for now :D I’m moving to encoder (or should I >:D)
I forgot to make the devlogs so here is all of the updates: I’m heading towards making the main client All decoder and encoder have been merged to a single file for simpler file structure I’m making the encrypting things
I have handled all required packet so this should be theoretically playable. I also do some refactoring for a cleaner codebase :D
It is finally working 🎉
I’m on my way to reading chunk data. I have burnt all of my Github Copilot monthly credit only to realize that Copilot inserted a redundant read that collapse all reading latter :_D
This whole week is filled with debugging and small updates so here is the summary: Now the Client can handle Chunk datas, including blocks, biomes and block entites I also add more packet handling, events and decoder function. I’m moving to high-level client and the first function is move. Todo list: Inspect how Minecraft code handle movement and collision. Implement it :D
I’m working on parsing player chat message now
I’m making auth system and this takes me so much timeeeeeeeeeee Btw, I’m waiting for Mojang to approve my Azure app so I can test the auth API
Now I’m implementing the “move” method for the client, which invokes physics things, which is very very difficult for me That why I’m not updating regularly ;-; (I’m sorry)
I added VoxelShape and some math related to it. Now I can reconstruct the collision the shape of the block and, hopefully, mobs. Thats mean I’m ready to let my client be able to move, I hope so
I have implemented the base collide function and ready for the entity collide :D
Finally done the collide function ;-;
I’m getting through clipping function, which is mandatory to calculate the damage from falling
Hello, sorry for forget logging regularly In the last whole week, my only job is looking at Minecraft code, ask Claude what the beep beep is that, arguing with myself do I have to do this and then continue Btw I managed to write the trimmed Minecraft physics engine and ready to test it out Unfortunately, my code isn’t reading the Registry well so maybe tomorrow :D P/s: If you still read this, have a good day and please vote for me ;-;
MY BOT CAN WALK NOW 🎉
NOW MY BOT CAN WALK ON STAIR I think it is ready to be publish ONE MORE TIME, I’m very sorry for not logging this painful process much, please please please forgive me
Oh, I spent 5h for setting up documents? That’s crazy :D Btw, I have setup an auto document page using TypeDoc. I also setup Github Action for automating publish package and build document page.
Sorry for another 8-hour devlog ;-; Now MineJS support 26.2 I’m working on a system for mapping version and packet so MineJS can support multiple version at the same time, instead of one atm (because the packet ID is hard-coded). I also make another tool for scrapping Minecraft Wiki for packet structure (disclaimer: This is not an automate running so it will not spam the Wiki, please don’t ban me ;-;). Thats it, have a great day
I do so much work that I forgot what to summarize here So before, everything is placed in TCPClient, which is fine for hard-coded packets. But now, I’m making the dynamic packet translating for multiple version supports. And while making it, it need reference from TCPClient, then TCPClient need to a reference of it and so on… So I have split the functionality into corresponding space. So now, each of class has its own responsibility: TCPClient for throwing and receiving packets through TCP connection VersionCodec for translating packets Dispatcher for handling packet SharedState for holding states So that is the whole update. Hope youre enjoy your day, also this project :D
Hello again, sorry for a almost-9-hour devlogs I’m just making the auth part for joining premium server and the thing is not going well for now ;-; I have registered the app for accessing Minecraft API but by some magic, I’m still blocked I’m also making the feature for verifying message signature
Hello again, I’m sorry for not update this project much since I’m working on the other. I just found out that the Mojang just revoke my app approval without any notification ;-; Btw, I fixed the bug that ignore the chunk packet and update the README about the current situation ;-;
The bot can chat now I have to reimplement the bitset to let this run btw
I have completed the reading slot part. I just know that a slot can hold that many data ;-; Btw, I’ll soon complete the container part, meaning that you can use chest now
I added container But it is just clientbound Add container and block interaction soon
I have implemented the Use item on packet for interacting with block, but seem like there was something wrong with it because it is expected to return an open screen packet but nothing returned. Beside that, I have implemented the tablist. Now you can see the header and footer Also, I’m preparing for supporting version 26.3. I’m wondering whether should I make a new ship. P/s: Rust rewrite when >:)
The container is finally opened, turn out there is a bug in my code which tell the server the wrong location of the chest ;-; P/s: Thank you Claude for helping me find this issue
I’m not doing much these day beside fixing bugs because I’m quite busy with uni homework and I’m quite bored now I post this devlog to submit all of my hours before Stardance end
Ships:
This is a Minecraft client package, allow you to create Minecraft bot and joining server. This ship provide some basic functionality of Minecraft bot, including: Walking around Getting blocks Also, this ship include the low-level client for talking directly to the server.
There is a lot of changes since the last ship (I have made more 15 release since it). To sum up: Multi version support :D 26.3 is partially supported because there is some issue with decoding packets Container is here (but you can’t interact with it yet, just viewing) You can chat now I have implemented online account protocol but there is an issue prevent me from testing it so it is considered as unstable for now. There is some small changed in protocol Fix some bugs in physics engine...
|
1793091018.5216951
|
1793177418.5216951
|
|
39315
|
City of the forgotten by @Ling | Stardance
|
Ling
|
1
|
108.94
|
305
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:17:44Z", "hours": 22.0, "multiplier": 13.63, "payout": 305, "blessing": "neutral", "text": "I made a Raylib Noir Adventue and point and click game My bigest Challenge Was by Far learning Raylib and code logic for collision", "repo": "https://github.com/Miyamoto-web/City-Of-the-Forgoten-Beta-", "demo": "https://miyamoto-web.itch.io/city-of-the-forgotten"}]...
|
[{"post_id": 82267, "ts": "202 [{"post_id": 82267, "ts": "2026-10-24T12:47:00Z", "hours": 8.4553, "text": "Dev Log 2.1 I made a lot of new Models for the Ofice cenario Incluinding a Arquive a Ofice Chair a Sofa"}, {"post_id": 80704, "ts": "2026-10-18T15:52:08Z", "hours": 7.6203, "text": "Dev Log 2.0 I debugged the hud by replacing the Rich text label for a label I also made the hud reactable to your actions -## Also I fixed a bug in one of the main buttons of the main screen"}, {"post_id": 79674, "ts": "2026-10-15T01:10:40Z", "hours": 3.5631, "text": "Dev Log 1.9 Making cinematic cameras with collision shapes Fixing Ui text bugs Working on the visuals"}, {"post_id": 78746, "ts": "2026-10-11T14:15:16Z", "hours": 11.7417, "text": "Dev Log 1.8 Working Hud for the objectives Made by Creating global bool variables to mark if the objective is done Functional Terminal password puzle I used If states and == to Know if the player writed the wrong or the right password Also I added a system to make each objective that goes to the ui go to right tab"}, {"post_id": 76772, "ts": "2026-10-04T15:11:59Z", "hours": 14.4964, "text": "Dev Log 1.7 Button to exit the menu Finished move and intereact system I made the mechanic using nav agent and area 3d Stored Position when you change scenes I used Global Variant to make this system which saves the Player global position when you go to the menu and loads when you go bak to the game extends Node var player: CharacterBody3D var player_global: Vector3 var good_pos : bool func _ready() -> void: good_pos = false"}, {"post_id": 75274, "ts": "2026-09-29T16:46:44Z", "hours": 6.7075, "text": "Dev Log 1.6 -New and Better Point and Click -Ui visuals done"}, {"post_id": 72438, "ts": "2026-09-22T23:10:36Z", "hours": 10.0053, "text": "Dev Log 1.5 -New Ui and Hud -Trying to program the Hud -New Main Menu (again i realy need to get more creative for the game’s art)"}, {"post_id": 70389, "ts": "2026-09-19T02:57:56Z", "hours": 6.3439, "text": "New Dev log 1.4 -Making UI -Making Case Menu -Trying to learn UI desing"}, {"post_id": 69930, "ts": "2026-09-18T02:41:46Z", "hours": 3.5856, "text": "New Changes! -Making UI (Notes Case and Lore) -More Polished Point and Click Mechanic"}, {"post_id": 68405, "ts": "2026-09-15T02:08:07Z", "hours": 2.0369, "text": "Devlog 1.2 -New Script Point and Click Moviment -I used Rays, get.position and Lots of Variables -I realy need to configurate a decent Camera"}, {"post_id": 67714, "ts": "2026-09-13T22:21:53Z", "hours": 8.7006, "text": "New version on godot -Script for the moviment -Custom Made 3d Model (Made by me) -Third Person Camera -Version Text -A Prototipe Menu Ps: If you want to see the developement of the 3d model go to my other Project Modeling Assetsd for City of the Forgotten (My Project)"}, {"post_id": 66716, "ts": "2026-09-12T16:35:08Z", "hours": 1.2506, "text": "New Readme"}, {"post_id": 64214, "ts": "2026-09-08T13:37:08Z", "hours": 2.4339, "text": "I realy tried to make the web version work propely but i couldn’t make all the features in the game work in the web version i am realy sorry (next version will be on godot raylib is to messy)"}, {"post_id": 53131, "ts": "2026-08-23T15:42:23Z", "hours": 0.4392, "text": "Final touch in the code"}, {"post_id": 48419, "ts": "2026-08-16T19:11:00Z", "hours": 8.6686, "text": "New models desk and terminal new texture for the ground and walls and hitboxs for the desk and walls"}, {"post_id": 42118, "ts": "2026-08-06T18:09:37Z", "hours": 5.5647, "text": "More modeling and fuctional hack mini game"}, {"post_id": 37375, "ts": "2026-07-30T01:24:44Z", "hours": 1.2122, "text": "Working itens!"}, {"post_id": 36762, "ts": "2026-07-29T01:01:24Z", "hours": 0.2667, "text": "more coding"}, {"post_id": 36105, "ts": "2026-07-27T23:53:07Z", "hours": 2.0636, "text": "working inventory system"}, {"post_id": 34847, "ts": "2026-07-25T21:35:54Z", "hours": 1.2464, "text": "Working Persona style menu"}, {"post_id": 34763, "ts": "2026-07-25T19:04:13Z", "hours": 1.2956, "text": "working point and click system!"}, {"post_id": 34633, "ts": "2026-07-25T15:00:59Z", "hours": 0.5706, "text": "working controls and music!"}, {"post_id": 34376, "ts": "2026-07-25T01:17:02Z", "hours": 0.4106, "text": "3d model in the game"}, {"post_id": 34276, "ts": "2026-07-24T20:55:19Z", "hours": 0.6428, "text": "working text"}]...
|
Title: City of the forgotten by @Ling | Stardance
Title: City of the forgotten by @Ling | Stardance
Devlogs:
working text
3d model in the game
working controls and music!
working point and click system!
Working Persona style menu
working inventory system
more coding
Working itens!
More modeling and fuctional hack mini game
New models desk and terminal new texture for the ground and walls and hitboxs for the desk and walls
Final touch in the code
I realy tried to make the web version work propely but i couldn’t make all the features in the game work in the web version i am realy sorry (next version will be on godot raylib is to messy)
New Readme
New version on godot -Script for the moviment -Custom Made 3d Model (Made by me) -Third Person Camera -Version Text -A Prototipe Menu Ps: If you want to see the developement of the 3d model go to my other Project Modeling Assetsd for City of the Forgotten (My Project)
Devlog 1.2 -New Script Point and Click Moviment -I used Rays, get.position and Lots of Variables -I realy need to configurate a decent Camera
New Changes! -Making UI (Notes Case and Lore) -More Polished Point and Click Mechanic
New Dev log 1.4 -Making UI -Making Case Menu -Trying to learn UI desing
Dev Log 1.5 -New Ui and Hud -Trying to program the Hud -New Main Menu (again i realy need to get more creative for the game’s art)
Dev Log 1.6 -New and Better Point and Click -Ui visuals done
Dev Log 1.7 Button to exit the menu Finished move and intereact system I made the mechanic using nav agent and area 3d Stored Position when you change scenes I used Global Variant to make this system which saves the Player global position when you go to the menu and loads when you go bak to the game extends Node var player: CharacterBody3D var player_global: Vector3 var good_pos : bool func _ready() -> void: good_pos = false
Dev Log 1.8 Working Hud for the objectives Made by Creating global bool variables to mark if the objective is done Functional Terminal password puzle I used If states and == to Know if the player writed the wrong or the right password Also I added a system to make each objective that goes to the ui go to right tab
Dev Log 1.9 Making cinematic cameras with collision shapes Fixing Ui text bugs Working on the visuals
Dev Log 2.0 I debugged the hud by replacing the Rich text label for a label I also made the hud reactable to your actions -## Also I fixed a bug in one of the main buttons of the main screen
Dev Log 2.1 I made a lot of new Models for the Ofice cenario Incluinding a Arquive a Ofice Chair a Sofa
Ships:
I made a Raylib Noir Adventue and point and click game My bigest Challenge Was by Far learning Raylib and code logic for collision...
|
1793062491.7476377
|
1793148891.7476377
|
|
34756
|
Anixweb by @imnottimaq | Stardance
|
imnottimaq
|
1
|
108.14
|
1395
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-14T23:49:54Z", "hours": 83.0, "multiplier": 16.81, "payout": 1395, "blessing": "neutral", "text": "Hi! I want to present my project called Anixweb. Anixweb is an open-source web client for Anixart, a mobile app popular in the Russian-speaking community. I created it because I have been using Anixart on my phone for about five years, and I have always wanted to use it on my PC. I also wanted to learn JavaScript, TypeScript, and React by building a real project. It has many of the features you would expect: watchlists, favorites, and watch history; a huge selection of anime with Russian dubs or subtitles; search and advanced filters; user profiles, friends, comments, and ratings; notifications about new releases and episodes; and much more! In addition to recreating the core functionality of the official app, I also developed two features of my own: Watch Together and Upscale. Watch Together allows you to synchronize video playback with other people. It supports both public and private rooms. You can discover and join public rooms through the room browser, while private rooms can be joined using a room code or an invitation link. Episode selection, pauses, seeking, playback position, and playback speed are synchronized through a WebSocket server. Room owners can also allow other participants to control playback and select episodes. Upscale is an optional feature that uses WebGPU and Anime4K shaders to improve the viewing experience by sharpening the image and reducing blur in real time. All processing happens locally on your device, without manually re-encoding or uploading the video. I used: React and React Router; TypeScript; Vite; HLS.js for video playback; WebSockets for room synchronization; Anime4K-WebGPU for real-time image enhancement; CSS Modules for styling. One of the hardest parts was managing the video player lifecycle: switching streams, recovering from HLS errors, preserving playback progress, and keeping multiple users synchronized without creating feedback loops. I spent more than 90 hours working on this project. Along the way, I learned a lot about accessibility, video streaming, WebGPU pipelines, API integration, localization, and managing and structuring a medium-sized React application. This is an independent project and is not affiliated with the SwiftSoft Team in any way.", "repo": "https://github.com/imnottimaq/anixweb", "demo": "https://imnottimaq.github.io/anixweb/"}]...
|
[{"post_id": 80987, "ts": "202 [{"post_id": 80987, "ts": "2026-10-19T14:56:50Z", "hours": 7.1439, "text": "i havent looked into original app for a while, a month ago there was a huge update which added a lot of things first one is feed, implemented it initially but it requires reputation level 3 just to be able to post, which is kinda lame but it serves as antibot i guess improve watch together (better layout, controls and permissions) now you can move around categories in home and favorites to change order, on right click you can select default one and also there is new category in api called donghua, also implemented fixed bug that prevented you from login if you already had invalid token in cookie now you can properly download episodes as mp4 instead on hls fragments, but the speeds are kinda bad (0.5 - 1.5 mbps), will look into it bunch of minor changes: broader test coverage improved import/export of lists fullscreen photo viewer fixed recommendations if no description provided, it now says “no description provided” instead of blank space"}, {"post_id": 79651, "ts": "2026-10-14T22:11:57Z", "hours": 11.3022, "text": "forgot about devlogs, hour lost basically new settings auto fullscreen on episode start custom menu on right click cloud settings which are linked to anixart account and are saved on worker import/export of mal or shikimori lists new theme settings compact mode auto pause on focus loss download episodes(hls fragments for now only, proper mp4 planned for next devlog) chat in watch together (text, voice messages, reactions) prolly there is something else i have done but i cant remember, but this is the most important changes i kinda lied about maintenance only state xd"}, {"post_id": 77952, "ts": "2026-10-08T22:55:52Z", "hours": 6.6942, "text": "revamped watch together feature (for now only initial v2 release, needs more testing) also as a part of v2 server i unified proxies and room server into one worker, dont think this will affect something, but i just didnt like the idea of keeping proxy separately as it is like 200-300 lines fixed a lot of player bugs, in particular: if you switch to another episode, resume prompt is now not skipped when you change quality, player sometimes could lose progress upscaler implementation is now much stable and reliable initial test coverage, aiming for atleast 70% coverage for the next devlog, for now 90% for core logic and 15-20% across all codebase from now on, i probably wont add new features to the project, focusing on bugfixes and layout changes etc"}, {"post_id": 45968, "ts": "2026-08-12T19:50:30Z", "hours": 3.4922, "text": "friends management screen ability to change notifications per release fixed notifications setting, apparently they were broken now you can rate release editable player keybinds updated dependencies because react router had 2 vulnerabilities small changes here and there project is almost ready to ship, will ship today or tomorrow idk"}, {"post_id": 44777, "ts": "2026-08-10T19:39:13Z", "hours": 7.7881, "text": "collections screen, ability to save/create/comment collection asked claude to unify design, looks really better now and very well rounded fixed some linter error but not all(i dont know how to fix syncronous setState) some internal stuff that allowed me to reduce code size a bit removed swiper dependency(gallery i used in release screen) new buttons in overview but they are not fully functional yet reworked comments section a bit and also there is +1 hour for room server for watch together (fully vibecoded btw)"}, {"post_id": 40331, "ts": "2026-08-03T19:29:42Z", "hours": 1.9294, "text": "did a overview screen, looks cool im getting close to ship (80-85% i would say), mostly some polishing is left and the most major feature i havent implemented yet is collections, but for now ill focus more on polishing things instead"}, {"post_id": 40053, "ts": "2026-08-03T12:34:55Z", "hours": 0.5283, "text": "franchise screen"}, {"post_id": 39783, "ts": "2026-08-02T23:41:32Z", "hours": 2.2006, "text": "changed all names to anixweb to avoid having issues with the devs of original app in the future made account edit screen where you can change for now nickname, avatar, socials and some settings related to who can send you friend requests etc. friend requests is also a thing i implemented, but honestly i dont know why it even exists. it doesnt have any functionallity like chat or something, it just exists maybe ill implement like inviting your friend to the watch together room but idk about that one, my current worker will not be enough probably if site will be used by more than 100 people at the time also added proxy for images as an option cuz for me their images storage is not reachable via standard link, and with proxy it works good and also added like roles(which is not super important, did it just for the parity with the api), but like only 0.5% users of this app have any role roles is essentially like groups for example some dubbers team"}, {"post_id": 39178, "ts": "2026-08-01T23:31:26Z", "hours": 4.9144, "text": "god it took me like whole day to do it notifications screen itself wasnt hard to do, but settings was. it wasnt documented at all so i had to pull up mitmproxy + android emulator and find out and that alone took me 2 hours (not counted in the total time) also wanted to make notifications via web push api, but it isnt possible unfortunately overhaul of api client, now its a bit more unified lazy loading of components so it takes less time to load if you open website first time upgraded node on actions small improvements here and there"}, {"post_id": 38374, "ts": "2026-07-31T18:34:22Z", "hours": 2.495, "text": "after 3 and a half hours im finally done fixed account screen implemented “watch together feature” which is beta for now as it is a buggy mess as of writing this devlog and i actually found one more bug as i am writing this, ill fix it later i promise next time will implement ability to search on english as a toggle in settings through shikimori api (kinda like myanimelist but russian) this will probably make search slower but it will work"}, {"post_id": 38180, "ts": "2026-07-31T13:26:35Z", "hours": 2.0006, "text": "added this section that api sometimes returns fixed a few bugs with player: player doesnt show controls while fullscreen if webgpu is not available in your browser quality upgrade option will now gray out controls now disappear after sometime if server returns broken hls stream, it will try to gracefully recover now also changed things around in login/register/forgot password: token is now moved to cookies instead of localstorage as its more secure(but its still not very secure because api requires to send token as a query parameter and token doesnt change between devices until password reset) cleaned up some logging to console as its not really necessary now favorites page now shows popup for user to login to access this page oh and also settings button and also asked ai to implement translation, this will be removed probably after i ship project, as this site is not meant to be used by non-russian speakers"}, {"post_id": 37921, "ts": "2026-07-30T22:32:47Z", "hours": 2.9978, "text": "anime4k upscale works, but on chromium-based browsers only(firefox has bug that doesnt let it work) settings screen fully functional started working on translation to english, honestly at first i tried to look at browser translation feature, but it was horrible, so i decided to make it will be hard to implement to properly but i think 3-4 hours and i’ll be done"}, {"post_id": 37555, "ts": "2026-07-30T11:24:59Z", "hours": 3.7247, "text": "search is now a thing and it works fine redesigned cards on home screen and you can select between horizontal and vertical card (for now only through changing localstorage xd) some improvements here and there like a little bit better design of release screen next up i will probably finally do player settings and implement anime4k maybe"}, {"post_id": 36603, "ts": "2026-07-28T20:24:18Z", "hours": 0.9431, "text": "i finally understood that i suck at design and asked ai to design it. now it looks amazing. next i will ask it to look at release screen cause i like the layout of it but design is half good half sucks"}, {"post_id": 36109, "ts": "2026-07-28T00:06:39Z", "hours": 2.8711, "text": "draft for account page, for now copied design from mobile app, tomorrow will propery design, and now im going to sleep good night"}, {"post_id": 36004, "ts": "2026-07-27T20:24:53Z", "hours": 2.6617, "text": "okay found a way to make it work edited cors proxy to also include route with anixart user agent this could be bannable, but at most they will ban proxy ip on the api and that is not crucial, cors proxy will work just fine voting, posting a comment/reply, editing comment, deleting it was implemented"}, {"post_id": 35515, "ts": "2026-07-27T00:16:28Z", "hours": 1.9069, "text": "from now on i’ll try to make devlogs more often tried to make replies to comments but hit the wall: api does not allow adding comments/replies without anixart user agent. same goes with voting on comments (like/dislike kinda like reddit system) so i spend 2 hours just to discover that it will not work"}, {"post_id": 35200, "ts": "2026-07-26T13:56:38Z", "hours": 5.2744, "text": "ok i finally deployed it to github pages and also pushed source code to github also added favorites screen where you can see your history, favorites and each list (watched, planned, watching etc) added popup when you open site first time that its not official and im not responsible for your account oh and also tabs on home screen to see latest, ongoing, announced etc probably will add settings screen next time and also finish player"}, {"post_id": 34109, "ts": "2026-07-24T16:22:08Z", "hours": 6.7553, "text": "player 80 percent ready(settings is the only thing that does not work) refactored code a bit, mostly tried to reduce eslint errors/warnings started rewriting modal logic(repeating same logic on every new modal => separate model template component from which other modals will inherit from) and also rewriting modals to use that also, the project is nowhere near mvp, so probably no github pages deploy until that (30 percent rn i would say i spent too much time perfecting release page im dumb)"}, {"post_id": 32658, "ts": "2026-07-21T23:06:39Z", "hours": 7.9831, "text": "okay, its time to make a devlog proper dub/source select modal (eyeball shows that you already watched that episode and in the future i plan to implement time where you stopped but first i need to make proper player) began defining settings proper login screen and ability to create account/recover password (to be honest i thought it was impossible to make but after some reverse engineering via mitmproxy and android 7 emulator i found out that api reference that i was using is either outdated or not properly documented) ability to view comment replies and started working full comment section tried to implement voting on comments but its impossible unfortunately, api checks for allowed user agent and i cant change that moved things around internally, now project structure is more refined i think by the time i have to do next devlog i’ll deploy this site via github actions/github pages so i dont have to pay for hosting(application is fully client-side anyway)"}, {"post_id": 31486, "ts": "2026-07-19T21:56:15Z", "hours": 8.7089, "text": "release page almost ready, final touches left also spent too much time on dealing with cors error (kodik, one of the main players, was throwing cors error, so i asked codex to create simple cors proxy and deployed it to vercel, but kodik still sent broken data, turns out it was because of us ip adress, i moved proxy to cloudflare workers and now it parses fine) used linkparser from thedesconnet/anixartjs (this stuff is too wacky for me to deal with it myself) random anime button on header proper player is still wip (1% ready xd) will ask codex to do it cuz i dont even know where to start from also spent too much time to design this page but now it looks amazing hope to make proper player by the next devlog but this whole thing is new to me so im not sure"}, {"post_id": 29843, "ts": "2026-07-17T00:02:39Z", "hours": 8.4994, "text": "god that took a while, but you can finally watch something using this site, also login works now but no new account registration"}, {"post_id": 28527, "ts": "2026-07-14T20:47:13Z", "hours": 3.0678, "text": "As of now, webpage looks like this: Now you can open release and as of now it will show poster, play button, favorite button and dropdown where you are supposed to select whether you watch it right now, plan to watch it, or dropped it(there is more im too lazy to describe them all) Next up i will implement ability to watch episodes and log into your account (maybe sign in too im not sure)"}, {"post_id": 28016, "ts": "2026-07-14T00:26:24Z", "hours": 2.2583, "text": "Today i finally started working on it, threw together something basic as im new to react/js"}]...
|
Title: Anixweb by @imnottimaq | Stardance
Devlogs Title: Anixweb by @imnottimaq | Stardance
Devlogs:
Today i finally started working on it, threw together something basic as im new to react/js
As of now, webpage looks like this: Now you can open release and as of now it will show poster, play button, favorite button and dropdown where you are supposed to select whether you watch it right now, plan to watch it, or dropped it(there is more im too lazy to describe them all) Next up i will implement ability to watch episodes and log into your account (maybe sign in too im not sure)
god that took a while, but you can finally watch something using this site, also login works now but no new account registration
release page almost ready, final touches left also spent too much time on dealing with cors error (kodik, one of the main players, was throwing cors error, so i asked codex to create simple cors proxy and deployed it to vercel, but kodik still sent broken data, turns out it was because of us ip adress, i moved proxy to cloudflare workers and now it parses fine) used linkparser from thedesconnet/anixartjs (this stuff is too wacky for me to deal with it myself) random anime button on header proper player is still wip (1% ready xd) will ask codex to do it cuz i dont even know where to start from also spent too much time to design this page but now it looks amazing hope to make proper player by the next devlog but this whole thing is new to me so im not sure
okay, its time to make a devlog proper dub/source select modal (eyeball shows that you already watched that episode and in the future i plan to implement time where you stopped but first i need to make proper player) began defining settings proper login screen and ability to create account/recover password (to be honest i thought it was impossible to make but after some reverse engineering via mitmproxy and android 7 emulator i found out that api reference that i was using is either outdated or not properly documented) ability to view comment replies and started working full comment section tried to implement voting on comments but its impossible unfortunately, api checks for allowed user agent and i cant change that moved things around internally, now project structure is more refined i think by the time i have to do next devlog i’ll deploy this site via github actions/github pages so i dont have to pay for hosting(application is fully client-side anyway)
player 80 percent ready(settings is the only thing that does not work) refactored code a bit, mostly tried to reduce eslint errors/warnings started rewriting modal logic(repeating same logic on every new modal => separate model template component from which other modals will inherit from) and also rewriting modals to use that also, the project is nowhere near mvp, so probably no github pages deploy until that (30 percent rn i would say i spent too much time perfecting release page im dumb)
ok i finally deployed it to github pages and also pushed source code to github also added favorites screen where you can see your history, favorites and each list (watched, planned, watching etc) added popup when you open site first time that its not official and im not responsible for your account oh and also tabs on home screen to see latest, ongoing, announced etc probably will add settings screen next time and also finish player
from now on i’ll try to make devlogs more often tried to make replies to comments but hit the wall: api does not allow adding comments/replies without anixart user agent. same goes with voting on comments (like/dislike kinda like reddit system) so i spend 2 hours just to discover that it will not work
okay found a way to make it work edited cors proxy to also include route with anixart user agent this could be bannable, but at most they will ban proxy ip on the api and that is not crucial, cors proxy will work just fine voting, posting a comment/reply, editing comment, deleting it was implemented
draft for account page, for now copied design from mobile app, tomorrow will propery design, and now im going to sleep good night
i finally understood that i suck at design and asked ai to design it. now it looks amazing. next i will ask it to look at release screen cause i like the layout of it but design is half good half sucks
search is now a thing and it works fine redesigned cards on home screen and you can select between horizontal and vertical card (for now only through changing localstorage xd) some improvements here and there like a little bit better design of release screen next up i will probably finally do player settings and implement anime4k maybe
anime4k upscale works, but on chromium-based browsers only(firefox has bug that doesnt let it work) settings screen fully functional started working on translation to english, honestly at first i tried to look at browser translation feature, but it was horrible, so i decided to make it will be hard to implement to properly but i think 3-4 hours and i’ll be done
added this section that api sometimes returns fixed a few bugs with player: player doesnt show controls while fullscreen if webgpu is not available in your browser quality upgrade option will now gray out controls now disappear after sometime if server returns broken hls stream, it will try to gracefully recover now also changed things around in login/register/forgot password: token is now moved to cookies instead of localstorage as its more secure(but its still not very secure because api requires to send token as a query parameter and token doesnt change between devices until password reset) cleaned up some logging to console as its not really necessary now favorites page now shows popup for user to login to access this page oh and also settings button and also asked ai to implement translation, this will be removed probably after i ship project, as this site is not meant to be used by non-russian speakers
after 3 and a half hours im finally done fixed account screen implemented “watch together feature” which is beta for now as it is a buggy mess as of writing this devlog and i actually found one more bug as i am writing this, ill fix it later i promise next time will implement ability to search on english as a toggle in settings through shikimori api (kinda like myanimelist but russian) this will probably make search slower but it will work
god it took me like whole day to do it notifications screen itself wasnt hard to do, but settings was. it wasnt documented at all so i had to pull up mitmproxy + android emulator and find out and that alone took me 2 hours (not counted in the total time) also wanted to make notifications via web push api, but it isnt possible unfortunately overhaul of api client, now its a bit more unified lazy loading of components so it takes less time to load if you open website first time upgraded node on actions small improvements here and there
changed all names to anixweb to avoid having issues with the devs of original app in the future made account edit screen where you can change for now nickname, avatar, socials and some settings related to who can send you friend requests etc. friend requests is also a thing i implemented, but honestly i dont know why it even exists. it doesnt have any functionallity like chat or something, it just exists maybe ill implement like inviting your friend to the watch together room but idk about that one, my current worker will not be enough probably if site will be used by more than 100 people at the time also added proxy for images as an option cuz for me their images storage is not reachable via standard link, and with proxy it works good and also added like roles(which is not super important, did it just for the parity with the api), but like only 0.5% users of this app have any role roles is essentially like groups for example some dubbers team
franchise screen
did a overview screen, looks cool im getting close to ship (80-85% i would say), mostly some polishing is left and the most major feature i havent implemented yet is collections, but for now ill focus more on polishing things instead
collections screen, ability to save/create/comment collection asked claude to unify design, looks really better now and very well rounded fixed some linter error but not all(i dont know how to fix syncronous setState) some internal stuff that allowed me to reduce code size a bit removed swiper dependency(gallery i used in release screen) new buttons in overview but they are not fully functional yet reworked comments section a bit and also there is +1 hour for room server for watch together (fully vibecoded btw)
friends management screen ability to change notifications per release fixed notifications setting, apparently they were broken now you can rate release editable player keybinds updated dependencies because react router had 2 vulnerabilities small changes here and there project is almost ready to ship, will ship today or tomorrow idk
revamped watch together feature (for now only initial v2 release, needs more testing) also as a part of v2 server i unified proxies and room server into one worker, dont think this will affect something, but i just didnt like the idea of keeping proxy separately as it is like 200-300 lines fixed a lot of player bugs, in particular: if you switch to another episode, resume prompt is now not skipped when you change quality, player sometimes could lose progress upscaler implementation is now much stable and reliable initial test coverage, aiming for atleast 70% coverage for the next devlog, for now 90% for core logic and 15-20% across all codebase from now on, i probably wont add new features to the project, focusing on bugfixes and layout changes etc
forgot about devlogs, hour lost basically new settings auto fullscreen on episode start custom menu on right click cloud settings which are linked to anixart account and are saved on worker import/export of mal or shikimori lists new theme settings compact mode auto pause on focus loss download episodes(hls fragments for now only, proper mp4 planned for next devlog) chat in watch together (text, voice messages, reactions) prolly there is something else i have done but i cant remember, but this is the most important changes i kinda lied about maintenance only state xd
i havent looked into original app for a while, a month ago there was a huge update which added a lot of things first one is feed, implemented it initially but it requires reputation level 3 just to be able to post, which is kinda lame but it serves as antibot i guess improve watch together (better layout, controls and permissions) now you can move around categories in home and favorites to change order, on right click you can select default one and also there is new category in api called donghua, also implemented fixed bug that prevented you from login if you already had invalid token in cookie now you can properly download episodes as mp4 instead on hls fragments, but the speeds are kinda bad (0.5 - 1.5 mbps), will look into it bunch of minor changes: broader test coverage improved import/export of lists fullscreen photo viewer fixed recommendations if no description provided, it now says “no description provided” instead of blank space
Ships:
Hi! I want to present my project called Anixweb. Anixweb is an open-source web client for Anixart, a mobile app popular in the Russian-speaking community. I created it because I have been using Anixart on my phone for about five years, and I have always wanted to use it on my PC. I also wanted to learn JavaScript, TypeScript, and React by building a real project. It has many of the features you would expect: watchlists, favorites, and watch history; a huge selection of anime with Russian dubs or subtitles; search and advanced filters; user profiles, friends, comments, and ratings; notifications about new releases and episodes; and much more! In addition to recreating the core functionality of the official app, I also developed two features of my own: Watch Together and Upscale. Watch Together allows you to synchronize video playback with other people. It supports both public and private rooms. You can discover and join public rooms through the room browser, while private rooms can be joined using a room code or an invitation link. Episode selection, pauses, seeking, playback position, and playback speed are synchronized through a WebSocket server. Room owners can also allow other participants to control playback and select episodes. Upscale is an optional feature that uses WebGPU and Anime4K shaders to improve the viewing experience by sharpening the image and reducing blur in real time. All processing happens locally on your device, without manually re-encoding or uploading the video. I used: React and React Router; TypeScript; Vite; HLS.js for video playback; WebSockets for room synchronization; Anime4K-WebGPU for real-time image enhancement; CSS Modules for styling. One of the hardest parts was managing the video player lifecycle: switching streams, recovering from HLS errors, preserving playback progress, and keeping multiple users synchronized without creating feedback loops. I spent more than 90 hours working on this project. Along the way, I learned a lot about accessibility, video streaming, WebGPU pipelines, API integration, localization, and managing and structuring a medium-sized React application. This is an independent project and is not affiliated with the SwiftSoft Team in any way....
|
1792993755.3180041
|
1793080155.3180041
|
|
22423
|
Blueprint by @swum | Stardance
|
swum
|
0
|
107.56
|
0
|
[]
|
[{"post_id": 47795, "ts": "202 [{"post_id": 47795, "ts": "2026-08-15T23:50:38Z", "hours": 74.2214, "text": "Blueprint Beta almost ready to launch soon! After a while, I’m finally almost ready to beta launch for blueprint. I haven’t posted a devlog in a very long time, but I’ve made a bunch of improvements and changes! Nearly all the features work pretty well now. I’m really proud of how our knowledge graph turned out. We were able to make it a good balance between flexibility and actual intelligence. Since this is my first devlog in a while, I won’t go over everything I added, but in future devlogs, I will talk about progress. Feel free to comment anything you would want to see in a productivity app! Part of this is supposed to be somewhat of an all-in-one productivty app, and feature requests/feedback would be greatly appreciated!"}, {"post_id": 19821, "ts": "2026-07-01T06:30:26Z", "hours": 5.6625, "text": "Updated the main page (intelligence page) Basically the intelligence page is split into three different pages: The AI chat, the workspace, and the knowledge graph. You can switch between each other by clicking on the buttons on the right, or by scrolling up and down. This took me a while to come up with and took a lot of iterations. I also updated the agent instructions, so now it should be much more flexible instead of thinking everything in this app is a engineering project. I wanted to use this for personal productivity, but I feel as if it is so much easier to work towards something that benefits tech projects. I’ll try my best to make this as flexible as possible."}, {"post_id": 19182, "ts": "2026-06-30T13:28:09Z", "hours": 27.6747, "text": "Completed the working MVP"}]...
|
Title: Blueprint by @swum | Stardance
Devlogs:
Co Title: Blueprint by @swum | Stardance
Devlogs:
Completed the working MVP
Updated the main page (intelligence page) Basically the intelligence page is split into three different pages: The AI chat, the workspace, and the knowledge graph. You can switch between each other by clicking on the buttons on the right, or by scrolling up and down. This took me a while to come up with and took a lot of iterations. I also updated the agent instructions, so now it should be much more flexible instead of thinking everything in this app is a engineering project. I wanted to use this for personal productivity, but I feel as if it is so much easier to work towards something that benefits tech projects. I’ll try my best to make this as flexible as possible.
Blueprint Beta almost ready to launch soon! After a while, I’m finally almost ready to beta launch for blueprint. I haven’t posted a devlog in a very long time, but I’ve made a bunch of improvements and changes! Nearly all the features work pretty well now. I’m really proud of how our knowledge graph turned out. We were able to make it a good balance between flexibility and actual intelligence. Since this is my first devlog in a while, I won’t go over everything I added, but in future devlogs, I will talk about progress. Feel free to comment anything you would want to see in a productivity app! Part of this is supposed to be somewhat of an all-in-one productivty app, and feature requests/feedback would be greatly appreciated!...
|
1792507704.3077967
|
1793112504.3077967
|
|
27442
|
StorageStandby by @james-lian | Stardance
|
james-lian
|
0
|
107.48
|
0
|
[]
|
[{"post_id": 80904, "ts": "202 [{"post_id": 80904, "ts": "2026-10-19T06:34:50Z", "hours": 10.0353, "text": "Devlog #14: sync.tsx page, Cloud Assignments, QoL features UI/UX implementation is a slow but steady WIP. Add directory tree dialog A QoL feature that, when the user clicks a folder in folders.tsx, displays the folder’s subdirectories and shows which paths are affected by the IgnoreRules prop. sync.tsx page The layout of the sync.tsx page is mostly finished! It contains three tables: Current jobs (displays what is being currently uploaded) Pending cloud assignments (new remote locations assigned by the user for a folder, or “removal” assignments issued by the user to remove a folder from a specific remote location) Upcoming sync queue (table that displays the modifications and updates that will be applied to folders that already have existing remote locations) PendingChanges display dialog A table that shows the user the list of edits made to the folder or the folder’s subdirectories, in order. It displays the tracked information from the FileSystemWatcher API. SyncFrequency input dialog An input dialog that allows the user to set how frequently they want a folder to be synced. Includes Daily, Weekly, Monthly, and an “Inactive” option."}, {"post_id": 79761, "ts": "2026-10-15T09:23:14Z", "hours": 8.1225, "text": "Devlog #13: UI/UX Implementation (WIP) With the backend functionality (mostly) complete, I’ve been working on implementing a smooth and easy-to-use user interface. Added system tray icon I added a system tray icon to allow the user to easily relaunch the UI while the backend continuously runs in the background. Cloud-folder assignment combobox + two-stage assignment system Instead of one-shotting everything, there’s now a two-stage system to cloud assignment. When a user adds a cloud to a folder, it first is added to UserAssignedClouds. During the next synchronization, the service will: check UserAssignedClouds upload the folder to the remote locations in those clouds move the clouds from UserAssignedClouds to AssignedClouds (this way, we know where the folder currently exists at) Add an IgnoreRules editor for WatchedFolders I had previously coded an ignore rules popup with a visual and raw rules editor, and I implemented it today specifically for WatchedFolders. The user can now set ignore rule globs (according to VS Code glob rules: https://code.visualstudio.com/docs/editor/glob-patterns ) to give themselves more control over what the service syncs and what it doesn’t. Miscellaneous UI improvements + functionalities completed folders.tsx page added web hook listener in WebView2 to natively open File Explorer for folders redid the styling for the sync.tsx page (still a WIP) Fix Dropbox/OneDrive OAuth triggers and revocations There were previously issues with the Dropbox (wrong redirectURI) and OneDrive (wrong OAuth consumer link) flows that I fixed after some testing. Everything regarding different accounts should work 100%!"}, {"post_id": 79374, "ts": "2026-10-13T18:24:46Z", "hours": 10.21, "text": "Devlog #12: Architectural Cleanup Dropbox and OneDrive providers are complete I reused the same overall logic for the Google Drive provider to write code for the Dropbox and OneDrive providers. I’m using the .NET REST APIs for both to handle file chunking and uploads automatically. Implement PKCE for all provider OAuth2 flows for better security To enhance the security of the OAuth2 process from a local desktop app like mine, I’ve implemented the PKCE security extension for all providers, to prevent authorization code interception and injection. Resolve Architectural Drift Over the development of this app, I’ve been continually implementing new ideas and removing what hasn’t worked. Eventually, it got to a point where I had thousands of lines of redundant or mismatched code for the sync engine, redundant features laying in my scripts that were no longer planned or used, and many redundant properties for the database schemas as well. Overall I was losing track of my original vision and goals, and development was becoming increasingly slow and stressful. To help me get out of this development rut, I turned to AI. Specifically, here was a portion of my prompt to Github Copilot: Please do the following: 1. Analyze my code to figure out the current architecture 2. Identify: a) areas of weakness b) inconsistencies c) what doesn't work, dead code, etc. 3. Ask me necessary questions needed to clear up any design (or for us to figure out the system architecture together) Finally, only help me fix any issues in the code once we have a clear idea of everything (and I give you the go ahead). Over the next day, I went over each of the identified errors or weaknesses one-by-one with the AI. It helped me pinpoint exactly the areas of my code that needed work, and I used it to successfully reintegrated the code with my original vision. Note: I use ‘cloud’ to refer to a provider-account pair. For example, a Google Drive provider with a specific email is one cloud. A different cloud would be the same provider but a different email, or a different provider altogether. Here’s a breakdown of what I did: Remove architectural drift, abandoned code, and unused features (e.g. GlobalIgnoreRules, automatic destination selection, FileSyncRecord and FolderSyncRecord) Implement a new-cloud bootstrap (when the user uploads stuff to a new cloud, perform a bootstrap operation to create all existing files and folders) Implement destructive cloud removal for when the user removes a cloud assignment Add pre-sync validation (reject missing local roots, reject invalid assignments) Make Watcher queuing reliable (detect unmonitored changes, etc.)"}, {"post_id": 71733, "ts": "2026-09-21T12:36:01Z", "hours": 10.1264, "text": "Devlog #11: Cloud Provider File Actions 2 (WIP) Google Drive Cloud Provider Actions Complete Since the last devlog, I’ve successfully completed the logic required to sync files and folders to Google Drive accounts using the Google Drive .NET REST API. Using the .NET REST API involves first building a drive client service object, through which you’ll use to interact with the REST API for actions like uploading files or deleting them. The logic is written to keep an exact carbon copy of the local version of any watched folders on the cloud. It does so by storing a queue of all of the changes a user makes to a folder and its children, and automatically ignores any conflicting changes from FileSystemWatcher that could be simplified (e.g. if a user changes an item before deleting it, we can just delete it instead of first updating the changed file AND THEN deleting it). As the REST API does not support uploading multiple items or entire folders, every file is uploaded one-by-one via a stream. All cloud items are tracked not by their cloud IDs, but rather through their hierarchical relationship with the overarching folder parent (WatchedFolder). Google OAuth2 Flows Since the drive client service is created via access tokens (which expire), there’s a very real possibility of our cached access token expiring in the middle of an operation. Thus, I decided to use the Google OAuth2 Flows library to automatically refresh the access token when it expires. Microsoft Graph and Dropbox File APIs (WIP) The Microsoft Graph and Dropbox File Action APIs should follow mostly the same high-level structure as before, with minor changes made to accommodate differences in how each of the APIs work. Microsoft OAuth2 access token expiry handling With the Microsoft API, I instead implemented a custom class TokenManagerAccessTokenProvider which inherits from IAccessTokenprovider, before passing this into building the GraphServiceClient."}, {"post_id": 65732, "ts": "2026-09-11T02:23:47Z", "hours": 8.4417, "text": "Devlog #10: Cloud Provider File Actions (WIP) Currently working on the cloud provider services API of my backend, making file actions such as uploading files from the local filesystem to a cloud provider (Google Drive, OneDrive, Dropbox) possible. Cloud Provider Services (WIP) I recently just implemented the OAuth process for Microsoft Entra/Graph in order to access the Microsoft OneDrive API, which differs quite significantly from the Google Cloud OAuth process for Google Drive API, despite the fact that both services use the OAuth2.0 protocol. For one, Google uses centralized endpoints and the unified Cloud dashboard to manage desktop apps that require access to Google user information. Microsoft uses their identity platform (Microsoft Entra UID) with endpoints that can be multi- or single-tenant. The actual scopes where the REST APIs for Microsoft OneDrive and other services resides in Microsoft Graph. Implemented Glob Processing + Ignore Rules for FileSystemWatcher In my application, the user can implement ignore rules for specific folders, allowing the application to prevent any matching files or folders from being monitored and uploaded to the cloud. The specific glob rules I referenced come from the VS Code docs: https://code.visualstudio.com/docs/editor/glob-patterns Essentially, I have a collection of methods that parse the glob and turn it into a regex, which I can confirm is a match with a specific path through Regex.IsMatch()."}, {"post_id": 64456, "ts": "2026-09-08T21:06:25Z", "hours": 8.4975, "text": "Devlog #9: FileSystem Events I’ve been spending some time reworking and polishing the logic and database schemas that allows the OS to monitor changes made to WatchedFolders through the FileSystemWatcher class. Handling FileSystem Events Here’s the current rundown of how my program monitors for filesystem events (e.g. file created, deleted, renamed, moved, or changed) filesystem event -> record the change in a database queue -> return When a scheduled backup runs, the program reads the queue and the associated changes made to each file/folder, and then updates the corresponding item in the cloud. scheduled backup -> read queued changes -> check whether the file still exists -> wait/retry if it is locked -> upload the latest version -> remove the queue item/mark as complete I’ve also made edits to the OnFileRenamedEvent() to differentiate between renames and moves, which both use the “Renamed” event. PendingSyncItem This will be a SQLite table that stores pending sync actions upon being handled by the event handler. The PendingSyncItem works in a simple way for both files and folders. It tracks five types of boolean events props in terms of cascading importance. Multiple event props can be true. Deleted - the most important event prop. If this prop is true, all other event props are skipped (as they matter not if the file was deleted). A deleted API request will be sent to the corresponding REST API. Moved - creates the file if the file did not previously exist. References the string OriginalLocalPath. Renamed - sends a rename API request. Changed - finds the existing file in the cloud and updates the file. Created - creates a new file. If a file was Created, Deleted, and then Created, two PendingSyncItems will be created. The first one will be overlooked as the Deleted prop is true."}, {"post_id": 58424, "ts": "2026-08-30T20:39:10Z", "hours": 9.1125, "text": "Devlog #8 Database schemas + API planning I’ve mostly been working on database schemas and models since the last devlog, and I’ve created APIs to allow the frontend to access this information from the database as well. A lot of systems design work has been going on in the background. As I’m still a beginner to such concepts, a lot of rewriting code has also been going on in the background! To be honest, progress has slowed since I’ve been splitting myself between working on the frontend and backend. I often find myself getting a bit stuck or lost in what’s happening. I think I’ll work on completely finishing one thing before moving onto the next for the next devlog. Below are snippets of what I’ve been working on, including API methods for the frontend, the API endpoints for the backend, and some peeks at some of the changes I’ve made to existing models/new models that I’ve created. FileSystemWatcher I’ll be using the built-in C# FileSystemWatcher in order to track which files and folders the user has made changes to. The alternative is polling for these changes on-demand (e.g. checking the folder’s “Last-Modified” date). However, the problem with such an approach is that Windows does not automatically update a folder’s “Last Modified” date exactly when a file inside that folder is changed. Thus, to confirm whether any changes actually occurred to a folder or not, the program would have to poll ALL subdirectories and files, which could be performance-intensive. On the other hand, FileSystemWatcher is an abstraction over OS-level kernel APIs. The kernel itself registers a listener on an attached folder when FileSystemWatcher is used. Thus it is very efficient and much more accurate than polling a folder’s properties."}, {"post_id": 52774, "ts": "2026-08-23T03:44:40Z", "hours": 9.5183, "text": "Devlog #7 API errors fixed - OAuth now works 100% In my specific architecture, API calls from frontend to backend work like so: fetch() call from Vite frontend --> intercepted by WPF WebService2 middleware shell --> forwards down NamedPipe --> received by Kestrel (cross-platform web server) on the ASP.NET Core C# backend. For the longest time, I just couldn’t get API calls from the frontend to reach the backend. I would always end up with a TypeError: failed to fetch() , which, as I found out, could mean a lot of things. Initially, I thought it was a CORS issue with the backend. I added builder.Services.AddCors() to allow cross-origin requests, and also adjusted the content-headers included with the fetch() request on the frontend, but I still experienced the same issue. Eventually, I discovered that it was a CORS issue with the MIDDLEWARE. It turns out after the WPF WebView2 shell forwards the fetch() request down the NamedPipe and retrieves a response from the backend, it actually creates a new web request to return it to the frontend with createWebResourceRequest(). This new response DOESN’T COPY the CORS headers from the backend, meaning the Access-Control-Allow-Origin header was missing from the response despite the backend returning a 200 OK status code. This blocks the frontend from reading the response, and a generic TypeError: Failed to fetch is thrown. Since the desktop app is essentially a proxy/interceptor - it’s creating its own HTTP response, so it needs to handle CORS headers itself. I was also missing an OPTIONS preflight responder on the backend, so I added that in as well. Listener callback dynamic port access When OAuth is requested from the frontend to the backend, the backend adds a listener to the provider’s OAuth function call. This way, say when the user completes Google’s OAuth process, Google redirects to our listener url, and we can display a Success page to the user. I had a minor logic error in my listener callback implementation where the same port was always used, even if it was unavailable. For this reason, if the user were to leave the OAuth page and retry the OAuth process, they would encounter an error if the listener was still not cleaned up. I implemented a dynamic port searcher to automatically serve the user a port that was free and unused. Implementing EF Core Backend System and FileSystem schemas I’m currently planning to implement the core of the backend functionality, which is to monitor file changes occuring to “watched” folders and upload them asynchronously and autonomously to providers the user has signed into. A great way I’ve found to map out future app functionality is to map out schemas for anything that needs to be stored locally. Currently, I’m working on schemas for SystemSettings , SyncEvents , and FileSystemWatcherWorker . Below is a short overview of the current basic features of the app, including OAuth account management + a notification/error-logging system."}, {"post_id": 49724, "ts": "2026-08-18T17:09:33Z", "hours": 9.7303, "text": "Devlog #6 These past days I’ve been focused on cleaning up the auth code and setting up frontend-backend communication. IScopeFactory - Singletons and Scoped Objects .NET (modern C#) features native dependency injection, where abstractions can be mapped directly to a class, in order to allow that class to receive its required objects from an external source in a more efficient and cleaner manner. In ASP.NET Core C#, you can register classes as a couple of different types of services to be injected into other classes. I mainly use singletons and scoped objects. Singletons, like their name suggests, are long-lived classes, of which a single instance exists throughout the application’s lifecycle. By contrast, scoped objects are created once per client request before being destroyed. The problem is that when you use dependency injection, you cannot inject a shorter-lifespan class into a longer-lifespan class (e.g. a scoped into a singleton). This necessitates the use of IServiceScopeFactory to automatically manage the lifetimes of these child classes. Thread-Safe Singletons By default, the System.Collections.Generic library in C# is NOT threadsafe. That means that, if multiple scoped objects or singletons access the same Dictionary, that could throw an error. Thus, I switched them out for ConcurrentDictionaries throughout my app. Multi-Account Functionality Integration I further integrated functionality that allows my app to store MULTIPLE accounts per provider (e.g. 3 OneDrive accounts, 4 Google Drive accounts). This required refactoring the CloudToken object to include a new AccountId prop, retrieving that prop from the OAuth2.0 protocol, and rewriting some logic in TokenManager to include AccountId validity checks. RevokeOAuthSync I added a method to revoke OAuth by terminating the refresh and access tokens using the revoke OAuth2.0 endpoint. Frontend-Backend Communication With the basics of the auth protocol API and TokenManager API setup, I’ve begun attempting to facilitate API calls between the React Vite frontend and the ASP.NET Core C# backend. It’s still a WIP, but things are moving! I also added some additional UI to allow the user to select and manage their accounts on different providers."}, {"post_id": 44606, "ts": "2026-08-10T14:23:16Z", "hours": 9.9117, "text": "Devlog #5 I’m currently on vacation, but I’m trying to stay productive by working on some software projects. OAuth2.0 Token Management + EF Core SQLite Setup + HTTPClient/DPAPI The past few days, I’ve been working on setting up some basic OAuth functionality for Google and Google Drive. I thought it would be very simple at first, but perhaps since I’m new to C# and on vacation, it took me a bit to get used to the C#/ASP.NET features and development patterns, such as dependency injection. Additionally, there’s plenty more to using OAuth 2.0 that I was not aware of at first. Step 1) involved acquiring ClientId and Clientsecret values from the Google Dev Console page. These were stored in User Secrets in Visual Studio along with the project. For desktop clients, clients use the provider’s OAuth API link to apply for a long-lived Refresh Token . This Refresh Token, once encrypted and stored securely, is used to continuously request for short-lived Access Tokens, which is what is actually used for Google’s API services, like the Google Drive API. Encryption was setup using the .NET data protection API, DPAPI. I created two classes: a GoogleDriveProvider to manage Google-specific OAuth setup and Drive API calls, and a generic TokenManager that handles the refresh-access token exchange for all OAuth-related providers, including ones I will add in the future such as OneDrive and Dropbox. For the HTTPClients used to make the web requests, I decided to add an HTTPClient to GoogleDriveProvider using builder.Services.AddHttpClient(). Finally, all pertinent information to the app is stored within an SQLite database using EF Core. Refresh Tokens are stored within an object called CloudTokens. I have the basic functionality for the OAuth setup, so my next steps will just be to test it out and debug for any errors. Below are some snapshots from the code I wrote."}, {"post_id": 22395, "ts": "2026-07-04T21:13:39Z", "hours": 0.7128, "text": "Devlog #4 WPF WebView2 Setup Succeeded in porting (?) the Vite frontend to Wpf WebView2! I’m just happy it works now. There was an issue with the Configuration Manager/build setup, where WebView2 turned out to be incompatible with the Any CPU build, and so I had to convert the solution to an x64 platform build, which works out since that’s what I intended to do in the first place. For now, the source of the WebView2 WPF frame is just a localhost url. When prod version comes out, I’ll be bundling a folder containing the Vite frontend along with the app, which will then become the new source."}, {"post_id": 22311, "ts": "2026-07-04T18:25:04Z", "hours": 5.5144, "text": "Devlog #3 React Vite UI work I’ve finished the skeleton and main UI features of my frontend Vite app (unfortunately took longer than expected). Nothing actually works cause it’s just a frontend for now. I added… A dashboard page (for quickly viewing information about cloud providers and storage quotas) A folders & files page (for “staging” folders and files for autonomous backups in the background) A sync page (for pausing/starting sync) A timeline page (for viewing sync events and chronology) A link services page (for linking accounts from different cloud providers) An about page No functionality actually exists yet as it’s just for planning. I’ll be implementing the backend next and the WebView2 functionality, before establishing communication between the frontend and backend via Windows pipes."}, {"post_id": 19314, "ts": "2026-06-30T16:16:14Z", "hours": 3.2725, "text": "Devlog #2 React Vite + WebView2 + ASP.NET Core C# transition I’m in the middle of transitioning from a Winforms + Windows Service backend architecture to a decoupled C# ASP.NET Web Service + React Vite frontend with WebView2. WebView2 allows developers to embed web content (HTML/CSS/JS) directly into native Windows apps. I considered using Electron, but WebView2 is widely seen as more performant as it uses the Chromium runtime already built into Windows, as opposed to Electron which bundles a SEPARATE instance of Chromium and Node.js into every app, resulting in a large footprint. I’ve redone the UI in Vite and setup the basic ASP.NET endpoints using pipes. The next steps would be to finalize a good-looking UI and create the WPF project that would host the WebView capabilities."}, {"post_id": 18774, "ts": "2026-06-29T23:48:42Z", "hours": 4.2747, "text": "Devlog #1 Basic Winforms UI Setup a basic UI in Winforms, which took longer than I thought. Unforunately, at the time I started this project, I didn’t know about the possibilities of a ASP.NET + React setup. I wanted to avoid Electron due to the heavy resource consumption, but since the possibility of using WebView2 exists for me now, I might transition to that soon. I just don’t mesh very well with Winforms…"}]...
|
Title: StorageStandby by @james-lian | Stardance
Title: StorageStandby by @james-lian | Stardance
Devlogs:
Devlog #1 Basic Winforms UI Setup a basic UI in Winforms, which took longer than I thought. Unforunately, at the time I started this project, I didn’t know about the possibilities of a ASP.NET + React setup. I wanted to avoid Electron due to the heavy resource consumption, but since the possibility of using WebView2 exists for me now, I might transition to that soon. I just don’t mesh very well with Winforms…
Devlog #2 React Vite + WebView2 + ASP.NET Core C# transition I’m in the middle of transitioning from a Winforms + Windows Service backend architecture to a decoupled C# ASP.NET Web Service + React Vite frontend with WebView2. WebView2 allows developers to embed web content (HTML/CSS/JS) directly into native Windows apps. I considered using Electron, but WebView2 is widely seen as more performant as it uses the Chromium runtime already built into Windows, as opposed to Electron which bundles a SEPARATE instance of Chromium and Node.js into every app, resulting in a large footprint. I’ve redone the UI in Vite and setup the basic ASP.NET endpoints using pipes. The next steps would be to finalize a good-looking UI and create the WPF project that would host the WebView capabilities.
Devlog #3 React Vite UI work I’ve finished the skeleton and main UI features of my frontend Vite app (unfortunately took longer than expected). Nothing actually works cause it’s just a frontend for now. I added… A dashboard page (for quickly viewing information about cloud providers and storage quotas) A folders & files page (for “staging” folders and files for autonomous backups in the background) A sync page (for pausing/starting sync) A timeline page (for viewing sync events and chronology) A link services page (for linking accounts from different cloud providers) An about page No functionality actually exists yet as it’s just for planning. I’ll be implementing the backend next and the WebView2 functionality, before establishing communication between the frontend and backend via Windows pipes.
Devlog #4 WPF WebView2 Setup Succeeded in porting (?) the Vite frontend to Wpf WebView2! I’m just happy it works now. There was an issue with the Configuration Manager/build setup, where WebView2 turned out to be incompatible with the Any CPU build, and so I had to convert the solution to an x64 platform build, which works out since that’s what I intended to do in the first place. For now, the source of the WebView2 WPF frame is just a localhost url. When prod version comes out, I’ll be bundling a folder containing the Vite frontend along with the app, which will then become the new source.
Devlog #5 I’m currently on vacation, but I’m trying to stay productive by working on some software projects. OAuth2.0 Token Management + EF Core SQLite Setup + HTTPClient/DPAPI The past few days, I’ve been working on setting up some basic OAuth functionality for Google and Google Drive. I thought it would be very simple at first, but perhaps since I’m new to C# and on vacation, it took me a bit to get used to the C#/ASP.NET features and development patterns, such as dependency injection. Additionally, there’s plenty more to using OAuth 2.0 that I was not aware of at first. Step 1) involved acquiring ClientId and Clientsecret values from the Google Dev Console page. These were stored in User Secrets in Visual Studio along with the project. For desktop clients, clients use the provider’s OAuth API link to apply for a long-lived Refresh Token . This Refresh Token, once encrypted and stored securely, is used to continuously request for short-lived Access Tokens, which is what is actually used for Google’s API services, like the Google Drive API. Encryption was setup using the .NET data protection API, DPAPI. I created two classes: a GoogleDriveProvider to manage Google-specific OAuth setup and Drive API calls, and a generic TokenManager that handles the refresh-access token exchange for all OAuth-related providers, including ones I will add in the future such as OneDrive and Dropbox. For the HTTPClients used to make the web requests, I decided to add an HTTPClient to GoogleDriveProvider using builder.Services.AddHttpClient(). Finally, all pertinent information to the app is stored within an SQLite database using EF Core. Refresh Tokens are stored within an object called CloudTokens. I have the basic functionality for the OAuth setup, so my next steps will just be to test it out and debug for any errors. Below are some snapshots from the code I wrote.
Devlog #6 These past days I’ve been focused on cleaning up the auth code and setting up frontend-backend communication. IScopeFactory - Singletons and Scoped Objects .NET (modern C#) features native dependency injection, where abstractions can be mapped directly to a class, in order to allow that class to receive its required objects from an external source in a more efficient and cleaner manner. In ASP.NET Core C#, you can register classes as a couple of different types of services to be injected into other classes. I mainly use singletons and scoped objects. Singletons, like their name suggests, are long-lived classes, of which a single instance exists throughout the application’s lifecycle. By contrast, scoped objects are created once per client request before being destroyed. The problem is that when you use dependency injection, you cannot inject a shorter-lifespan class into a longer-lifespan class (e.g. a scoped into a singleton). This necessitates the use of IServiceScopeFactory to automatically manage the lifetimes of these child classes. Thread-Safe Singletons By default, the System.Collections.Generic library in C# is NOT threadsafe. That means that, if multiple scoped objects or singletons access the same Dictionary, that could throw an error. Thus, I switched them out for ConcurrentDictionaries throughout my app. Multi-Account Functionality Integration I further integrated functionality that allows my app to store MULTIPLE accounts per provider (e.g. 3 OneDrive accounts, 4 Google Drive accounts). This required refactoring the CloudToken object to include a new AccountId prop, retrieving that prop from the OAuth2.0 protocol, and rewriting some logic in TokenManager to include AccountId validity checks. RevokeOAuthSync I added a method to revoke OAuth by terminating the refresh and access tokens using the revoke OAuth2.0 endpoint. Frontend-Backend Communication With the basics of the auth protocol API and TokenManager API setup, I’ve begun attempting to facilitate API calls between the React Vite frontend and the ASP.NET Core C# backend. It’s still a WIP, but things are moving! I also added some additional UI to allow the user to select and manage their accounts on different providers.
Devlog #7 API errors fixed - OAuth now works 100% In my specific architecture, API calls from frontend to backend work like so: fetch() call from Vite frontend --> intercepted by WPF WebService2 middleware shell --> forwards down NamedPipe --> received by Kestrel (cross-platform web server) on the ASP.NET Core C# backend. For the longest time, I just couldn’t get API calls from the frontend to reach the backend. I would always end up with a TypeError: failed to fetch() , which, as I found out, could mean a lot of things. Initially, I thought it was a CORS issue with the backend. I added builder.Services.AddCors() to allow cross-origin requests, and also adjusted the content-headers included with the fetch() request on the frontend, but I still experienced the same issue. Eventually, I discovered that it was a CORS issue with the MIDDLEWARE. It turns out after the WPF WebView2 shell forwards the fetch() request down the NamedPipe and retrieves a response from the backend, it actually creates a new web request to return it to the frontend with createWebResourceRequest(). This new response DOESN’T COPY the CORS headers from the backend, meaning the Access-Control-Allow-Origin header was missing from the response despite the backend returning a 200 OK status code. This blocks the frontend from reading the response, and a generic TypeError: Failed to fetch is thrown. Since the desktop app is essentially a proxy/interceptor - it’s creating its own HTTP response, so it needs to handle CORS headers itself. I was also missing an OPTIONS preflight responder on the backend, so I added that in as well. Listener callback dynamic port access When OAuth is requested from the frontend to the backend, the backend adds a listener to the provider’s OAuth function call. This way, say when the user completes Google’s OAuth process, Google redirects to our listener url, and we can display a Success page to the user. I had a minor logic error in my listener callback implementation where the same port was always used, even if it was unavailable. For this reason, if the user were to leave the OAuth page and retry the OAuth process, they would encounter an error if the listener was still not cleaned up. I implemented a dynamic port searcher to automatically serve the user a port that was free and unused. Implementing EF Core Backend System and FileSystem schemas I’m currently planning to implement the core of the backend functionality, which is to monitor file changes occuring to “watched” folders and upload them asynchronously and autonomously to providers the user has signed into. A great way I’ve found to map out future app functionality is to map out schemas for anything that needs to be stored locally. Currently, I’m working on schemas for SystemSettings , SyncEvents , and FileSystemWatcherWorker . Below is a short overview of the current basic features of the app, including OAuth account management + a notification/error-logging system.
Devlog #8 Database schemas + API planning I’ve mostly been working on database schemas and models since the last devlog, and I’ve created APIs to allow the frontend to access this information from the database as well. A lot of systems design work has been going on in the background. As I’m still a beginner to such concepts, a lot of rewriting code has also been going on in the background! To be honest, progress has slowed since I’ve been splitting myself between working on the frontend and backend. I often find myself getting a bit stuck or lost in what’s happening. I think I’ll work on completely finishing one thing before moving onto the next for the next devlog. Below are snippets of what I’ve been working on, including API methods for the frontend, the API endpoints for the backend, and some peeks at some of the changes I’ve made to existing models/new models that I’ve created. FileSystemWatcher I’ll be using the built-in C# FileSystemWatcher in order to track which files and folders the user has made changes to. The alternative is polling for these changes on-demand (e.g. checking the folder’s “Last-Modified” date). However, the problem with such an approach is that Windows does not automatically update a folder’s “Last Modified” date exactly when a file inside that folder is changed. Thus, to confirm whether any changes actually occurred to a folder or not, the program would have to poll ALL subdirectories and files, which could be performance-intensive. On the other hand, FileSystemWatcher is an abstraction over OS-level kernel APIs. The kernel itself registers a listener on an attached folder when FileSystemWatcher is used. Thus it is very efficient and much more accurate than polling a folder’s properties.
Devlog #9: FileSystem Events I’ve been spending some time reworking and polishing the logic and database schemas that allows the OS to monitor changes made to WatchedFolders through the FileSystemWatcher class. Handling FileSystem Events Here’s the current rundown of how my program monitors for filesystem events (e.g. file created, deleted, renamed, moved, or changed) filesystem event -> record the change in a database queue -> return When a scheduled backup runs, the program reads the queue and the associated changes made to each file/folder, and then updates the corresponding item in the cloud. scheduled backup -> read queued changes -> check whether the file still exists -> wait/retry if it is locked -> upload the latest version -> remove the queue item/mark as complete I’ve also made edits to the OnFileRenamedEvent() to differentiate between renames and moves, which both use the “Renamed” event. PendingSyncItem This will be a SQLite table that stores pending sync actions upon being handled by the event handler. The PendingSyncItem works in a simple way for both files and folders. It tracks five types of boolean events props in terms of cascading importance. Multiple event props can be true. Deleted - the most important event prop. If this prop is true, all other event props are skipped (as they matter not if the file was deleted). A deleted API request will be sent to the corresponding REST API. Moved - creates the file if the file did not previously exist. References the string OriginalLocalPath. Renamed - sends a rename API request. Changed - finds the existing file in the cloud and updates the file. Created - creates a new file. If a file was Created, Deleted, and then Created, two PendingSyncItems will be created. The first one will be overlooked as the Deleted prop is true.
Devlog #10: Cloud Provider File Actions (WIP) Currently working on the cloud provider services API of my backend, making file actions such as uploading files from the local filesystem to a cloud provider (Google Drive, OneDrive, Dropbox) possible. Cloud Provider Services (WIP) I recently just implemented the OAuth process for Microsoft Entra/Graph in order to access the Microsoft OneDrive API, which differs quite significantly from the Google Cloud OAuth process for Google Drive API, despite the fact that both services use the OAuth2.0 protocol. For one, Google uses centralized endpoints and the unified Cloud dashboard to manage desktop apps that require access to Google user information. Microsoft uses their identity platform (Microsoft Entra UID) with endpoints that can be multi- or single-tenant. The actual scopes where the REST APIs for Microsoft OneDrive and other services resides in Microsoft Graph. Implemented Glob Processing + Ignore Rules for FileSystemWatcher In my application, the user can implement ignore rules for specific folders, allowing the application to prevent any matching files or folders from being monitored and uploaded to the cloud. The specific glob rules I referenced come from the VS Code docs: https://code.visualstudio.com/docs/editor/glob-patterns Essentially, I have a collection of methods that parse the glob and turn it into a regex, which I can confirm is a match with a specific path through Regex.IsMatch().
Devlog #11: Cloud Provider File Actions 2 (WIP) Google Drive Cloud Provider Actions Complete Since the last devlog, I’ve successfully completed the logic required to sync files and folders to Google Drive accounts using the Google Drive .NET REST API. Using the .NET REST API involves first building a drive client service object, through which you’ll use to interact with the REST API for actions like uploading files or deleting them. The logic is written to keep an exact carbon copy of the local version of any watched folders on the cloud. It does so by storing a queue of all of the changes a user makes to a folder and its children, and automatically ignores any conflicting changes from FileSystemWatcher that could be simplified (e.g. if a user changes an item before deleting it, we can just delete it instead of first updating the changed file AND THEN deleting it). As the REST API does not support uploading multiple items or entire folders, every file is uploaded one-by-one via a stream. All cloud items are tracked not by their cloud IDs, but rather through their hierarchical relationship with the overarching folder parent (WatchedFolder). Google OAuth2 Flows Since the drive client service is created via access tokens (which expire), there’s a very real possibility of our cached access token expiring in the middle of an operation. Thus, I decided to use the Google OAuth2 Flows library to automatically refresh the access token when it expires. Microsoft Graph and Dropbox File APIs (WIP) The Microsoft Graph and Dropbox File Action APIs should follow mostly the same high-level structure as before, with minor changes made to accommodate differences in how each of the APIs work. Microsoft OAuth2 access token expiry handling With the Microsoft API, I instead implemented a custom class TokenManagerAccessTokenProvider which inherits from IAccessTokenprovider, before passing this into building the GraphServiceClient.
Devlog #12: Architectural Cleanup Dropbox and OneDrive providers are complete I reused the same overall logic for the Google Drive provider to write code for the Dropbox and OneDrive providers. I’m using the .NET REST APIs for both to handle file chunking and uploads automatically. Implement PKCE for all provider OAuth2 flows for better security To enhance the security of the OAuth2 process from a local desktop app like mine, I’ve implemented the PKCE security extension for all providers, to prevent authorization code interception and injection. Resolve Architectural Drift Over the development of this app, I’ve been continually implementing new ideas and removing what hasn’t worked. Eventually, it got to a point where I had thousands of lines of redundant or mismatched code for the sync engine, redundant features laying in my scripts that were no longer planned or used, and many redundant properties for the database schemas as well. Overall I was losing track of my original vision and goals, and development was becoming increasingly slow and stressful. To help me get out of this development rut, I turned to AI. Specifically, here was a portion of my prompt to Github Copilot: Please do the following: 1. Analyze my code to figure out the current architecture 2. Identify: a) areas of weakness b) inconsistencies c) what doesn't work, dead code, etc. 3. Ask me necessary questions needed to clear up any design (or for us to figure out the system architecture together) Finally, only help me fix any issues in the code once we have a clear idea of everything (and I give you the go ahead). Over the next day, I went over each of the identified errors or weaknesses one-by-one with the AI. It helped me pinpoint exactly the areas of my code that needed work, and I used it to successfully reintegrated the code with my original vision. Note: I use ‘cloud’ to refer to a provider-account pair. For example, a Google Drive provider with a specific email is one cloud. A different cloud would be the same provider but a different email, or a different provider altogether. Here’s a breakdown of what I did: Remove architectural drift, abandoned code, and unused features (e.g. GlobalIgnoreRules, automatic destination selection, FileSyncRecord and FolderSyncRecord) Implement a new-cloud bootstrap (when the user uploads stuff to a new cloud, perform a bootstrap operation to create all existing files and folders) Implement destructive cloud removal for when the user removes a cloud assignment Add pre-sync validation (reject missing local roots, reject invalid assignments) Make Watcher queuing reliable (detect unmonitored changes, etc.)
Devlog #13: UI/UX Implementation (WIP) With the backend functionality (mostly) complete, I’ve been working on implementing a smooth and easy-to-use user interface. Added system tray icon I added a system tray icon to allow the user to easily relaunch the UI while the backend continuously runs in the background. Cloud-folder assignment combobox + two-stage assignment system Instead of one-shotting everything, there’s now a two-stage system to cloud assignment. When a user adds a cloud to a folder, it first is added to UserAssignedClouds. During the next synchronization, the service will: check UserAssignedClouds upload the folder to the remote locations in those clouds move the clouds from UserAssignedClouds to AssignedClouds (this way, we know where the folder currently exists at) Add an IgnoreRules editor for WatchedFolders I had previously coded an ignore rules popup with a visual and raw rules editor, and I implemented it today specifically for WatchedFolders. The user can now set ignore rule globs (according to VS Code glob rules: https://code.visualstudio.com/docs/editor/glob-patterns ) to give themselves more control over what the service syncs and what it doesn’t. Miscellaneous UI improvements + functionalities completed folders.tsx page added web hook listener in WebView2 to natively open File Explorer for folders redid the styling for the sync.tsx page (still a WIP) Fix Dropbox/OneDrive OAuth triggers and revocations There were previously issues with the Dropbox (wrong redirectURI) and OneDrive (wrong OAuth consumer link) flows that I fixed after some testing. Everything regarding different accounts should work 100%!
Devlog #14: sync.tsx page, Cloud Assignments, QoL features UI/UX implementation is a slow but steady WIP. Add directory tree dialog A QoL feature that, when the user clicks a folder in folders.tsx, displays the folder’s subdirectories and shows which paths are affected by the IgnoreRules prop. sync.tsx page The layout of the sync.tsx page is mostly finished! It contains three tables: Current jobs (displays what is being currently uploaded) Pending cloud assignments (new remote locations assigned by the user for a folder, or “removal” assignments issued by the user to remove a folder from a specific remote location) Upcoming sync queue (table that displays the modifications and updates that will be applied to folders that already have existing remote locations) PendingChanges display dialog A table that shows the user the list of edits made to the folder or the folder’s subdirectories, in order. It displays the tracked information from the FileSystemWatcher API. SyncFrequency input dialog An input dialog that allows the user to set how frequently they want a folder to be synced. Includes Daily, Weekly, Monthly, and an “Inactive” option....
|
1792688010.960317
|
1793292810.960317
|
|
32474
|
IELTS Only - Learning and Practice Platform by @Im IELTS Only - Learning and Practice Platform by @ImLuke | Stardance...
|
ImLuke
|
1
|
107.47
|
1502
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-06T04:44:27Z", "hours": 100.0, "multiplier": 16.43, "payout": 1502, "blessing": "neutral", "text": "Q: What did I make? - A: As you can see, learning IELTS nowaday is becoming much more expensive, making it harder for youngster, whose need that certification the most for their study career, to afford it. So I have made IELTS Only, the completely free IELTS learning & practicing platform that can help people to study IELTS easily. Q: What was challenging? - A: There were a lot of challenges that I faced when doing this project, such as coding, fixing bugs. But the hardest thing is the imitation of real IELTS interface, I need to research a lot on it. Q: What am I proud of? - A: I proud of myself because I have done something good for the social and learn a lot of value lesson. Q: What should people know so they can test my project? - A: You just simply click on the “Try project” button below, it will direct you to my website (It kinda lag… im dont have much money to buy a web hosting sr…)", "repo": "https://github.com/nploc1209/IELTSOnly", "demo": "https://ieltsonly.imluke.hackclub.app"}]...
|
[{"post_id": 58876, "ts": "202 [{"post_id": 58876, "ts": "2026-08-31T13:30:20Z", "hours": 7.4714, "text": "IELTS Only - Version 1.1.0 - Writing Updates Hi y’all, long time no see! So today, I have made a real writing interface, I tried to copy exactly what IELTS writing interface have,…"}, {"post_id": 41727, "ts": "2026-08-06T03:43:36Z", "hours": 1.5814, "text": "IELTS Only - Version 1.0.0 - Reading & Grammar release! For a long long long long longggggg time, I have finished the first two skill, which is Reading and Grammar, get ready for the first ship to the world"}, {"post_id": 40281, "ts": "2026-08-03T18:20:21Z", "hours": 5.2558, "text": "IELTS Only - Version 0.15.2 - Writing Update 0.15.1: I built the real Writing interface, it is easy because I just change some of element in real Reading interface which I struggle for a long time 0.15.2: I also built the writing creation page. It also easy compared to reading and grammar as you can see in the second picture."}, {"post_id": 38706, "ts": "2026-08-01T07:40:18Z", "hours": 8.8911, "text": "IELTS Only - Version 0.14.3 - Grammar Lesson Update So I’ve spent 8 hours making three major updates: 0.14.0: I upgraded the grammar interface from version 0.12.0 so now it becoming more clean and easy to interact with. 0.14.1: I built the grammar dashboard with widget as you can see in the third picture. It quite easy because it the same as reading dashboard so it don’t take much time. 0.14.2: I built the grammar question creation, this is the hardest one because i face a lot of error while doing it. And make database to save the work. 0.14.3: Fixing some minor bugs of grammar."}, {"post_id": 37662, "ts": "2026-07-30T15:36:19Z", "hours": 8.4631, "text": "IELTS Only - Version 0.13.0 - Optimization Update Recently, I have optimized the website by some of the useful trick I learned on Instagram like instead of showing the loading spin, we can use skeleton loading to make user think it will be more faster to load,…"}, {"post_id": 35219, "ts": "2026-07-26T14:41:44Z", "hours": 11.4536, "text": "IELTS Only - Version 0.12.0 - Grammar Practice Interface Update After hours and hours, Reading section still in progress but i kinda bored. So I have changed to build Grammar Interface instead. I really like the interface of Duolingo so I tried to build almost as same as its interface (don’t worry I will not copy 100%). It still in progress and I hope to finish it soon!"}, {"post_id": 33078, "ts": "2026-07-22T17:38:07Z", "hours": 12.9244, "text": "IELTS Only - Version 0.11.0 - Error Page Update Today I made the Error page so when ever someone run into an error, I can use the trace code to trace the error and easy for me to fix the web. (Jury will be the main website’s mascot too)"}, {"post_id": 30768, "ts": "2026-07-18T17:11:06Z", "hours": 14.0036, "text": "IELTS Only - Version 0.10.0 - Infrastructure Update This update is mostly happening behind the scenes, but it is a big one 🔧 IELTS Only’s infrastructure has been rebuilt to make the platform more stable, faster, and easier to scale. It still in progress, I will update soon! P/S: It took me like 1 hour to draw the painting below! Like if you love it ♥️"}, {"post_id": 29657, "ts": "2026-07-16T18:39:17Z", "hours": 4.1644, "text": "IELTS Only - Version 0.9.0 - Reading Dashboard Update The Reading dashboard just got a fresh new look ✨ Tests are now easier to browse with clearer passage filters, useful details at a glance, and quick filtering by progress, source, or question type. I also added custom pixel-art covers to give each passage a bit more personality. A few small details are still being polished, but the dashboard is now cleaner, faster, and much more fun to use."}, {"post_id": 29020, "ts": "2026-07-15T17:49:32Z", "hours": 7.8081, "text": "IELTS Only - Version 0.8.0 - Complete Real IELTS Interface Update Pheww, It took me quite a long time to copy the real IELTS Interface and made it work!"}, {"post_id": 28321, "ts": "2026-07-14T14:33:17Z", "hours": 4.5064, "text": "IELTS Only - Version 0.7.16 - The Editor Update I change from Quill into Tiptap for more features and more easy to use! Love it because I can easily modify text like Word/Google Docs instead of using Markdown which is quite hard for low-tech people P/S: Do you think ⭐️ STARDANCE should have an update like me:)?"}, {"post_id": 27179, "ts": "2026-07-12T14:42:06Z", "hours": 2.4275, "text": "IELTS Only - Version 0.7.15 - IELTS Reading Test Creation Portal Update I build the preview, so teacher/creater can be easily see what is going on!"}, {"post_id": 26757, "ts": "2026-07-11T18:44:29Z", "hours": 4.8289, "text": "IELTS Only - Version 0.7.14 - IELTS Reading Test Creation Portal Update This is the hardest part so far, I’m very struggling with this because I need to think what to design to make it simple, so for the low-tech people, they can still easily use it. 0.7.0: Changed the Single and Multiple Choice selection buttons from blue to IELTS Only red. 0.7.1: Added dropdown answer selection directly beside each heading in Matching Headings questions. 0.7.2: Made dropdown answer limits and important instructions bold and easier to notice. 0.7.3: Redesigned Sentence Completion with one flexible text editor instead of separate sentence inputs. 0.7.4: Added automatic blank detection using [] placeholders inside completion-question content. 0.7.5: Limited the answer fields to exactly match the number of [] blanks detected in the text. 0.7.6: Applied the same flexible text-and-placeholder system to Summary, Note, and other completion question types. 0.7.7: Removed unnecessary content containers from question types that do not require 0.7.8: formatted passage content. 0.7.9: Started designing an Excel-like editor for creating custom Table Completion layouts. 0.7.10: Started designing a visual flowchart builder for Flow-chart Completion questions. 0.7.11: Started designing a simple paint-style canvas for Diagram Labelling and Completion questions. 0.7.12: Reviewed the entire Reading Test Creation Portal to improve consistency, clarity, spacing, and usability. 0.7.13: Simplified labels, controls, and workflows so first-time and low-tech users can create questions more easily. 0.7.14: Reduced repetitive inputs and automated as many complicated setup steps as possible."}, {"post_id": 26452, "ts": "2026-07-11T08:06:31Z", "hours": 3.0911, "text": "IELTS Only - Version 0.6.3 - Real IELTS Reading Interface Update - 0.6.0: Build the exact interface of IELTS Reading test I researched on Google but cannot found any real IETLS Reading interface. Luckily, on YouTube, IDP has posted the instruction for doing Reading in computer-based system which including the real IELTS Reading interface in the video. So I build side-by-side with that. - 0.6.1: I made the hamburger icon work! Now user can change the theme or text size like official IELTS test. - 0.6.2: I made a small change in the lower board, user can watch time and adjust the volume that best fit to the user (I know Reading does not contain any sound but anyway in the actual IELTS it also included it) - 0.6.3: I researched on Google and found that IELTS does not allow to find (Crtl/Command + F) so I make the system listen to that key to prevent it perform find. Copy-paste still works!"}, {"post_id": 25827, "ts": "2026-07-10T09:32:36Z", "hours": 1.1781, "text": "IELTS Only - Version 0.5.0 - Reading Section Update I made the filter so user can easy to filter what lesson they want to do!"}, {"post_id": 25786, "ts": "2026-07-10T07:35:52Z", "hours": 3.4886, "text": "IELTS Only - Version 0.4.1 - Setting Updates 0.4.0: Personal Information Update I build the pages for user to change their information. Moreover, they can also delete their account. The system will delete all the data belong to the UUID of the user to erase all their data. 0.4.1: Statistic Update: I make the activity grid! The idea to make it from Codeforces, it really motivated to see the activity grid full of colors. And also and activity history so user can see what they have done."}, {"post_id": 25408, "ts": "2026-07-09T17:46:31Z", "hours": 3.1411, "text": "IELTS Only - Version 0.3.0 - Authentication Update The logic is very straightforward: The user enters their email. If that email already exists in the database, they will be asked to enter their password. The system then checks the password and logs them in. If the email does not exist yet, the user will be asked to enter their name and create a password. After that, they will be logged in. This is my idea for combining login and registration into one simple flow. I use Supabase to store the user database, ensuring security and transparency."}, {"post_id": 25188, "ts": "2026-07-09T08:09:06Z", "hours": 1.9067, "text": "IELTS Only - Version 0.2.0 - Dashboard Update I tried my best to make it as simple as possible. How I have these lovely people art when my drawing is bad! The solution is that I sketched it and then using Nano Banana Pro to enhance my drawing."}, {"post_id": 24545, "ts": "2026-07-08T05:20:36Z", "hours": 0.6847, "text": "IELTS Only - Version 0.1.0 - Brand Kit Update"}]...
|
Title: IELTS Only - Learning and Practice Platform Title: IELTS Only - Learning and Practice Platform by @ImLuke | Stardance
Devlogs:
IELTS Only - Version 0.1.0 - Brand Kit Update
IELTS Only - Version 0.2.0 - Dashboard Update I tried my best to make it as simple as possible. How I have these lovely people art when my drawing is bad! The solution is that I sketched it and then using Nano Banana Pro to enhance my drawing.
IELTS Only - Version 0.3.0 - Authentication Update The logic is very straightforward: The user enters their email. If that email already exists in the database, they will be asked to enter their password. The system then checks the password and logs them in. If the email does not exist yet, the user will be asked to enter their name and create a password. After that, they will be logged in. This is my idea for combining login and registration into one simple flow. I use Supabase to store the user database, ensuring security and transparency.
IELTS Only - Version 0.4.1 - Setting Updates 0.4.0: Personal Information Update I build the pages for user to change their information. Moreover, they can also delete their account. The system will delete all the data belong to the UUID of the user to erase all their data. 0.4.1: Statistic Update: I make the activity grid! The idea to make it from Codeforces, it really motivated to see the activity grid full of colors. And also and activity history so user can see what they have done.
IELTS Only - Version 0.5.0 - Reading Section Update I made the filter so user can easy to filter what lesson they want to do!
IELTS Only - Version 0.6.3 - Real IELTS Reading Interface Update - 0.6.0: Build the exact interface of IELTS Reading test I researched on Google but cannot found any real IETLS Reading interface. Luckily, on YouTube, IDP has posted the instruction for doing Reading in computer-based system which including the real IELTS Reading interface in the video. So I build side-by-side with that. - 0.6.1: I made the hamburger icon work! Now user can change the theme or text size like official IELTS test. - 0.6.2: I made a small change in the lower board, user can watch time and adjust the volume that best fit to the user (I know Reading does not contain any sound but anyway in the actual IELTS it also included it) - 0.6.3: I researched on Google and found that IELTS does not allow to find (Crtl/Command + F) so I make the system listen to that key to prevent it perform find. Copy-paste still works!
IELTS Only - Version 0.7.14 - IELTS Reading Test Creation Portal Update This is the hardest part so far, I’m very struggling with this because I need to think what to design to make it simple, so for the low-tech people, they can still easily use it. 0.7.0: Changed the Single and Multiple Choice selection buttons from blue to IELTS Only red. 0.7.1: Added dropdown answer selection directly beside each heading in Matching Headings questions. 0.7.2: Made dropdown answer limits and important instructions bold and easier to notice. 0.7.3: Redesigned Sentence Completion with one flexible text editor instead of separate sentence inputs. 0.7.4: Added automatic blank detection using [] placeholders inside completion-question content. 0.7.5: Limited the answer fields to exactly match the number of [] blanks detected in the text. 0.7.6: Applied the same flexible text-and-placeholder system to Summary, Note, and other completion question types. 0.7.7: Removed unnecessary content containers from question types that do not require 0.7.8: formatted passage content. 0.7.9: Started designing an Excel-like editor for creating custom Table Completion layouts. 0.7.10: Started designing a visual flowchart builder for Flow-chart Completion questions. 0.7.11: Started designing a simple paint-style canvas for Diagram Labelling and Completion questions. 0.7.12: Reviewed the entire Reading Test Creation Portal to improve consistency, clarity, spacing, and usability. 0.7.13: Simplified labels, controls, and workflows so first-time and low-tech users can create questions more easily. 0.7.14: Reduced repetitive inputs and automated as many complicated setup steps as possible.
IELTS Only - Version 0.7.15 - IELTS Reading Test Creation Portal Update I build the preview, so teacher/creater can be easily see what is going on!
IELTS Only - Version 0.7.16 - The Editor Update I change from Quill into Tiptap for more features and more easy to use! Love it because I can easily modify text like Word/Google Docs instead of using Markdown which is quite hard for low-tech people P/S: Do you think ⭐️ STARDANCE should have an update like me:)?
IELTS Only - Version 0.8.0 - Complete Real IELTS Interface Update Pheww, It took me quite a long time to copy the real IELTS Interface and made it work!
IELTS Only - Version 0.9.0 - Reading Dashboard Update The Reading dashboard just got a fresh new look ✨ Tests are now easier to browse with clearer passage filters, useful details at a glance, and quick filtering by progress, source, or question type. I also added custom pixel-art covers to give each passage a bit more personality. A few small details are still being polished, but the dashboard is now cleaner, faster, and much more fun to use.
IELTS Only - Version 0.10.0 - Infrastructure Update This update is mostly happening behind the scenes, but it is a big one 🔧 IELTS Only’s infrastructure has been rebuilt to make the platform more stable, faster, and easier to scale. It still in progress, I will update soon! P/S: It took me like 1 hour to draw the painting below! Like if you love it ♥️
IELTS Only - Version 0.11.0 - Error Page Update Today I made the Error page so when ever someone run into an error, I can use the trace code to trace the error and easy for me to fix the web. (Jury will be the main website’s mascot too)
IELTS Only - Version 0.12.0 - Grammar Practice Interface Update After hours and hours, Reading section still in progress but i kinda bored. So I have changed to build Grammar Interface instead. I really like the interface of Duolingo so I tried to build almost as same as its interface (don’t worry I will not copy 100%). It still in progress and I hope to finish it soon!
IELTS Only - Version 0.13.0 - Optimization Update Recently, I have optimized the website by some of the useful trick I learned on Instagram like instead of showing the loading spin, we can use skeleton loading to make user think it will be more faster to load,…
IELTS Only - Version 0.14.3 - Grammar Lesson Update So I’ve spent 8 hours making three major updates: 0.14.0: I upgraded the grammar interface from version 0.12.0 so now it becoming more clean and easy to interact with. 0.14.1: I built the grammar dashboard with widget as you can see in the third picture. It quite easy because it the same as reading dashboard so it don’t take much time. 0.14.2: I built the grammar question creation, this is the hardest one because i face a lot of error while doing it. And make database to save the work. 0.14.3: Fixing some minor bugs of grammar.
IELTS Only - Version 0.15.2 - Writing Update 0.15.1: I built the real Writing interface, it is easy because I just change some of element in real Reading interface which I struggle for a long time 0.15.2: I also built the writing creation page. It also easy compared to reading and grammar as you can see in the second picture.
IELTS Only - Version 1.0.0 - Reading & Grammar release! For a long long long long longggggg time, I have finished the first two skill, which is Reading and Grammar, get ready for the first ship to the world
IELTS Only - Version 1.1.0 - Writing Updates Hi y’all, long time no see! So today, I have made a real writing interface, I tried to copy exactly what IELTS writing interface have,…
Ships:
Q: What did I make? - A: As you can see, learning IELTS nowaday is becoming much more expensive, making it harder for youngster, whose need that certification the most for their study career, to afford it. So I have made IELTS Only, the completely free IELTS learning & practicing platform that can help people to study IELTS easily. Q: What was challenging? - A: There were a lot of challenges that I faced when doing this project, such as coding, fixing bugs. But the hardest thing is the imitation of real IELTS interface, I need to research a lot on it. Q: What am I proud of? - A: I proud of myself because I have done something good for the social and learn a lot of value lesson. Q: What should people know so they can test my project? - A: You just simply click on the “Try project” button below, it will direct you to my website (It kinda lag… im dont have much money to buy a web hosting sr…)...
|
1793087451.9487703
|
1793173851.9487703
|