|
24807
|
browserMCP by @stuff1ee | Stardance
|
stuff1ee
|
1
|
22.26
|
348
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T13:29:32Z", "hours": 21.0, "multiplier": 16.94, "payout": 348, "blessing": "neutral", "text": "browserMCP is a QoL browser management tool for MCP clients to manage your browser! It includes major QoL improvements such as: Group-related actions (grouping, ungrouping tabs, properties of groups) Tab-related actions (opening tabs, closing tabs) History actions (getting browser history max 24h, opt-in) This is strictly not an automation tool for page actions. I took so many hours because i had to port things from python to node.js etc..", "repo": "https://gitlab.com/mystuffyt/browserMCP", "demo": "https://gitlab.com/mystuffyt/browserMCP/-/releases"}]...
|
[{"post_id": 36560, "ts": "202 [{"post_id": 36560, "ts": "2026-07-28T19:12:22Z", "hours": 1.2569, "text": "Had a lot of commits and trouble w/ GitLab CI, also created GitLab pages for demo link! It’s just the README but it includes instructions on how to install the client + server quick install. I unironically took 1h for all of this, because i am very slow at things :("}, {"post_id": 21470, "ts": "2026-07-03T13:15:50Z", "hours": 1.9747, "text": "finally done! ive added uh getting active tab contents for the purpose of summarizing text or whatever"}, {"post_id": 18419, "ts": "2026-06-29T15:51:21Z", "hours": 4.2381, "text": "devlog 6 The MCP client has a BUNCH of new features. Opening tabs Closing tabs Unloading tabs Grouping tabs Changing color and name of groups History access (opt-in) Happy with how it’s turning out still. I think its time to fix more bugs now. if i figure out the situation on keeping websocket open w/ the service worker, i might make this work for firefox. Its been tough tho, so much bugs…"}, {"post_id": 16920, "ts": "2026-06-27T14:12:16Z", "hours": 5.0031, "text": "Devlog 5 Created a quick install python script! Right now it only supports adding the mcp to claude code and opencode, and it supports all macos, windows and linux! (someone test it on macos and windows for me pls..) As for the MCP, grouping a tab now returns the group ID normally, and now you can change title of group! Still dont know which customization features to add.. but ill figure it out hopefully (i took 4h 58m because i have never created an installation script, chrome extension or even a node.js server in general.. and i learned alot)"}, {"post_id": 15947, "ts": "2026-06-25T22:11:25Z", "hours": 1.4583, "text": "Devlog 4 finally!!!!!!!!!! The extension now handles closed connections, and reconnects… and the whole server is coded in node.js without python. Now that the app completely works, the only thing left for me is to add more customization and etc features. Right now there is: getting tabs and their titles, and grouping them.. If you want to, suggest any ideas."}, {"post_id": 15827, "ts": "2026-06-25T18:49:45Z", "hours": 2.445, "text": "Devlog 3 Finally finished the core MCP! Really fragile.. but it works. fsr some hours are marked as ai coding even though i did not vibecode the MCP at all :( (because i was testing the MCP using opencode) but the MCP works enough. The server is a bit fragile and will hope for a better server in the future."}, {"post_id": 15358, "ts": "2026-06-24T23:34:42Z", "hours": 1.9975, "text": "dev log 2…. ive recoded how the server works, and made the service worker in my extension keepalive. The project is starting to come together at least. Gonna work on the MCP finally next time."}, {"post_id": 15187, "ts": "2026-06-24T18:03:45Z", "hours": 3.4425, "text": "first devlog!! None of the MCP works yet, but i have gotten the communication between browser and websocket server to work. I might switch to node.js for the mcp server as i personally think it’s easier to handle websocket there. to be fair it is my first time creating a chrome extension and doing anything with websocket in general.."}]...
|
Title: browserMCP by @stuff1ee | Stardance
Devlog Title: browserMCP by @stuff1ee | Stardance
Devlogs:
first devlog!! None of the MCP works yet, but i have gotten the communication between browser and websocket server to work. I might switch to node.js for the mcp server as i personally think it’s easier to handle websocket there. to be fair it is my first time creating a chrome extension and doing anything with websocket in general..
dev log 2…. ive recoded how the server works, and made the service worker in my extension keepalive. The project is starting to come together at least. Gonna work on the MCP finally next time.
Devlog 3 Finally finished the core MCP! Really fragile.. but it works. fsr some hours are marked as ai coding even though i did not vibecode the MCP at all :( (because i was testing the MCP using opencode) but the MCP works enough. The server is a bit fragile and will hope for a better server in the future.
Devlog 4 finally!!!!!!!!!! The extension now handles closed connections, and reconnects… and the whole server is coded in node.js without python. Now that the app completely works, the only thing left for me is to add more customization and etc features. Right now there is: getting tabs and their titles, and grouping them.. If you want to, suggest any ideas.
Devlog 5 Created a quick install python script! Right now it only supports adding the mcp to claude code and opencode, and it supports all macos, windows and linux! (someone test it on macos and windows for me pls..) As for the MCP, grouping a tab now returns the group ID normally, and now you can change title of group! Still dont know which customization features to add.. but ill figure it out hopefully (i took 4h 58m because i have never created an installation script, chrome extension or even a node.js server in general.. and i learned alot)
devlog 6 The MCP client has a BUNCH of new features. Opening tabs Closing tabs Unloading tabs Grouping tabs Changing color and name of groups History access (opt-in) Happy with how it’s turning out still. I think its time to fix more bugs now. if i figure out the situation on keeping websocket open w/ the service worker, i might make this work for firefox. Its been tough tho, so much bugs…
finally done! ive added uh getting active tab contents for the purpose of summarizing text or whatever
Had a lot of commits and trouble w/ GitLab CI, also created GitLab pages for demo link! It’s just the README but it includes instructions on how to install the client + server quick install. I unironically took 1h for all of this, because i am very slow at things :(
Ships:
browserMCP is a QoL browser management tool for MCP clients to manage your browser! It includes major QoL improvements such as: Group-related actions (grouping, ungrouping tabs, properties of groups) Tab-related actions (opening tabs, closing tabs) History actions (getting browser history max 24h, opt-in) This is strictly not an automation tool for page actions. I took so many hours because i had to port things from python to node.js etc.....
|
1793710462.0027363
|
1793796862.0027363
|
|
57844
|
bruh! by @krk | Stardance
|
krk
|
0
|
1.54
|
0
|
[]
|
[{"post_id": 61424, "ts": "202 [{"post_id": 61424, "ts": "2026-09-04T10:20:13Z", "hours": 1.5369, "text": "i am working on the work"}]...
|
Title: bruh! by @krk | Stardance
Devlogs:
i am wo Title: bruh! by @krk | Stardance
Devlogs:
i am working on the work...
|
1793458319.4298122
|
1794063119.4298122
|
|
21719
|
bs-odin by @Ankush | Stardance
|
Ankush
|
0
|
132.0
|
0
|
[]
|
[{"post_id": 31805, "ts": "202 [{"post_id": 31805, "ts": "2026-07-20T14:10:21Z", "hours": 6.0, "text": "Preformance Checkup + Audio System Things I did: I stress tested my game to work with 512 & 1024 entities. Ran under 3ms and 5ms . The difference maker was the number of entities currently in the screen (rendering). Profiled all the “slow” parts Implemented sound system , for menu and game Recorded the sounds myself!! (both in-game and ui)! Performance I tried my best to find ways to increase speed in my game. Unfortunately, all the things that I thought were “slow” weren’t actually slow. Orui UI build was like under 50micro seconds . Orui Rendering was under 250micro seconds . Animation system ran under 50micro for all entities combined iirc So, for now, there has been done no performance improvements this devlog Sound System First I made the sound system simple, for the menu. It worked and I was happy. I made 6 different similar sounds for the hover and click actions, and I play one of them randomly when clicked. menu_hover_sounds : [ 6 ] rl . Sound loadMenuSounds :: proc () { for i in 0 ..< len ( menu_hover_sounds ) { path : = fmt . ctprintf ( \"res/audio/menu/menu_click_%d.wav\" , i + 1 ) menu_click_sounds [ i ] = rl . LoadSound ( path ) } } playMenuHoveredSound :: proc () { i : = rand . int_max ( len ( menu_hover_sounds )) rl . PlaySound ( menu_hover_sounds [ i ]) } When I went on to make the Player sounds, I noticed that I am unable to the same sound twice simultaneously. I needed that so that I can simulate multiple enemies and other stuff. So I googled a bit, found this raylib example. And implemented it. For both menu and entities. TOTAL_ALIASES :: 4 Sound :: struct { aliases : [ TOTAL_ALIASES ] rl . Sound , index : int , } loadSound :: proc ( path : cstring ) -> Sound { sound : Sound sound . aliases [ 0 ] = rl . LoadSound ( path ) for i in 1 ..< TOTAL_ALIASES { sound . aliases [ i ] = rl . LoadSoundAlias ( sound . aliases [ 0 ]) } sound . index = 0 return sound } playSound :: proc ( sound : ^ Sound ) { rl . PlaySound ( sound . aliases [ sound . index ]) sound . index = ( sound . index + 1 ) % TOTAL_ALIASES } playMenuClickedSound :: proc () { i : = rand . int_max ( len ( menu_click_sounds )) playSound ( & menu_click_sounds [ i ]) } I also stole borrowed this really great background music from raylib source."}, {"post_id": 30071, "ts": "2026-07-17T11:13:28Z", "hours": 5.0, "text": "Health System, Enemy Attack, 15 new Skin! Summary of Features added: Player/Enemy Attacks Health System (Damage/Heal) Health Bar shown 15 new Skins! Avatar Menu “Set” Selector Avatar Set Selector This took a lot of time than I would like. I first had to scourge through 100s of directories for each Skin (each skin has 3 “tiers”) and get the 0th “idle” animation sprite. The next part was pretty straight forward owing to the time I took to make the architecture great :3 Health Bar This wasn’t hard as per say. But it is mad slow. I realised it earlier but never mentioned it. orui library is slow. UI libraries aren’t meant to be this slow. Probably it is due to the rendering that makes it this much slower. How slow? My renderer could render 50 entities under 1ms, now it takes ~5ms to render 20 entities. Future Todos: Performance. I will track down where orui is slow. If it is in the logic part, we can’t do anything as I am not smart enough to fix logic so complex. But if it is related to rendering, we can work with that. Performance. It’s been a while since I diagnosed the slow parts in my code. I will deep dive into the code. Find out what is slow and try to fix them The next few days, I will work on to squeeze as much performance as I can from this game."}, {"post_id": 29321, "ts": "2026-07-16T05:20:06Z", "hours": 9.0, "text": "Enemy AI done + Tons more! Other things done this time around: Fix: WASM build fixes Feature: Added the back button in Avatar Menu (finally) Fix: The character scale and position in Main/Avatar Menu acted funny in extreme dimentions (when too small) Fix: Physics renderer didn’t render polygons with 4 vertices Feature: Added physics colliders for all enemies! Feature: Y-Sorting enabled Performance: Pushed Data Oriented Design for max performance Architecture: Moved the files around, where they make more sense Feature: Implemented Attacking Feature: Player & Enemy State machine Feature: Enemy AI (super basic tbh) Performance All of these changes were made keeping performance in mind. As of right now the state machines need work to make them even faster! Obstacles State machine logic is very mind numbing, I won’t want to do that…. a lot of edge case problems. A lot of problems I never thought existed. Y-Sorting was also in the harder side because I wanted a fast sort while also not needing to change the whole array of entities. I finally decided to use another array render_list of type []int this essentially sorts the id (or index in this case) of the entities by entity.pos.y . When rendering use the ids to render. This proved to be a more efficient way to do it, than sorting the entire array of entities. Future Todos Implement Enemy attacking Implement health system (with regenability?) Draw the health bar Implement death After these things are done. We I will think of further things like game win/game end amongst many others like game pause."}, {"post_id": 28209, "ts": "2026-07-14T11:03:33Z", "hours": 5.0, "text": "Dozens of small features implemented! Migrated the End screen UI to the new UI library Brought back the physics collider with water from previously deleted code. Removed a rouge sleep call in loading phase. (Which was put there for testing ) Instead of drawing rectangles in when playing. We now draw the characters! With randomly generated skins!! Migrated Playing and loading UI to the new library Code cleanup and refactored for better architecture Culling #bd56fa When adding Culling to player rendering, I got an optimisation of 5ms->2ms. Animation while playing The initial phase was very easy. What I did struggle with was flipping the image. First, I tried flipping the texture themselves. It did work but the offset of the bones were not in place. It was fine when going right, but when I turn left. It all turns bad, the 2nd video is a demonstration of that. It took a lot of tweaks and black magic to find out that I had to also flip the anchor position and angle too 😭 Now it is working as intented :)"}, {"post_id": 26655, "ts": "2026-07-11T16:23:47Z", "hours": 4.0, "text": "Player Customisation Screen!! RAAH, this is really done! TBH this was easier than expected. I had an idea of how this will work out, and implemented just that. The menu includes some smart and fancy mathematics too // gettin the index current_index : = ( int ( curr_type ) * num_tiers ) + int ( curr_tier ) // applying the changes, Lets say user pressed right arrow. new_index : = ( current_index + 1 ) % total_options setPartType ( group , anim . CharacterType ( new_index / num_tiers )) setPartTier ( group , anim . CharacterTier ( new_index % num_tiers )) I am really proud of the UI. Looks great. Honestly I was really lucky with the great reference images I found in the internet :) hosted here"}, {"post_id": 25955, "ts": "2026-07-10T14:06:12Z", "hours": 7.0, "text": "UI Overhaul - Done! So I changed the entire UI , game UI is tough, even more so when you have a lot of moving components. I never had ever use any library like orui so it was fun, but at the same time - confusing at times. Like for example: there are only 2 components for drawing ( container and label ). I mean there’s also element, but that is just an empty container. Also I’ve tried everything but you can’t just get hover information for the container element. I need some color suggestions for the buttons in options menu, they look kinda dull… All the colors are taken from pallets at coolors.co ! Icons!! So while at it, I wanted to add icons. This was hell. A very bad idea. Let me tell you why - orui doesn’t support icons by default, so you’ve got to load another font to draw the icons. Now, Raylib can’t draw icon fonts, until you specify all the individual codepoints…here’s the code required to load a font with 3 icons: icon_codepoints : = [?] rune { 0xe048 , // ICON_LUCIDE_ARROW_LEFT 0xe049 , // ICON_LUCIDE_ARROW_RIGHT 0xe14d , // ICON_LUCIDE_SAVE 0xe18e , // ICON_LUCIDE_TRASH_2 } icon_font = rl . LoadFontEx ( \"./res/fonts/lucide.ttf\" , 32 , & icon_codepoints [ 0 ], len ( icon_codepoints ), ) Animation Blending Made the animation transition buttery smooth!! Look at the video!!"}, {"post_id": 25292, "ts": "2026-07-09T14:18:18Z", "hours": 8.0, "text": "Implemented Animation blending + UI library changed I wanted the player to be rendered in the main_menu and in the avatar menu . But also wanted the animations to be looping randomly. When I implemented random looping I found out that, the animations wouldn’t behave properly due to snapping . So I implemented animation blending . It was not at all easy , had to implement another angle_lerp function specifically for blending angles. Character customisation Due to me working hard earlier, changing character sprites is a cakewalk. In the attatched video. The head sprite is of tier 2 while the rest is from tier 1 GUI I really wanted to like raygui, but it was really bad. A lot of maths required for very simple things! I didn’t like it at all. So in search of a new UI library I found this niche library orui ! This fits my needs perfectly: Immediate mode Super fast (Not what I was looking for but a plus) Uses raylib Doesn’t depend on me to do the maths Actually customisable You can see the updated GUI in the video, looks good right :) it also supports animations and transitions!"}, {"post_id": 24692, "ts": "2026-07-08T13:28:51Z", "hours": 11.0, "text": "Fully functional animation parser and engine! The entire thing started by me searching for assets to use for my game, then I found these super cute chibi characters that too FOR FREE!! I downloaded one of the free ones and saw that they use .scml file for animations. They do have pre-rendered png images in sequence too, but that is too easy, not fun and doesn’t look good! So, I planned to make a .scml parser, my own animation engine. And see how it goes. In the added video there’s the working part and the non-working part, which I found pretty funny. 1. Image loader First I made a image loader that dynamically loads all the sprites that are in use. Later I will add the abitily to drop the sprites from memory when not in use. 2. Mapping the data This was, tough. Very, very tough that I had originally anticipated. Making this parser included me staring at a file with 9k lines for hours. Trying to figure out what each elements do and how to use them interconnectedly. I first made a scml_data.odin where I one by one mapped all the required data to odin structs. 3. .scml parser I created a new file scml_parser.odin and in it I loaded the .scml file with Odin’s built in xml parser. The parsing took a big chunk of time too, as there are not good docs or examples available out here. But there was one single forum post that got me going and I never had any problems thereafter. I parse the file and save the values in my global private data variable defined in scml_data.odin . I read each elements and added all the necessary ones. I observed all the attributes, data and values very carefully earlier so I had an idea of some repetitive values that I could skip. I think almost 50% of the file was repetition, which ofc I didn’t save. 4. The engine Now that I had all the data with me in, the only thing I had to do was use that. With a given time t I have to find the timeline that it lands on and interpolate the time, linearly lerp the values and issue a draw command for the single sprite. I was unable to do two specific things and had to take help from AI: Lerping Angle: angle lerping is different as there can be a case where we have to learp from 350 to 10, normal lerp functions would just lerp it 350->200->10 instead of 350->360->10 Using the parent bones to calculate the final position of the child node. The particular function ai generated is here . Debugging After making the engine, we got to fix the engine. It had bugs, I debugged for a long time and then fixed them. Pretty stupid things like not pushing the timeline keys after initialising them, flipped y-axis, and angle clockwise order. Final thoughts Finally the thing is working now, I still have to polish it and make it play nicely with my entire game. There are other optimisation opportunities available but I’ll put that for later. I will now work on the avatar menu, so user can mix different things."}, {"post_id": 23439, "ts": "2026-07-06T12:29:30Z", "hours": 6.0, "text": "Nothing much this time. Added options menu Added physics collider to the player (finally, phew..) Notify mobile users to play in landscape mode. That’s about it. All of them were relatively easy. What I did try and haven’t pushed to upstream is a failed attempt to detect entry and exit from water bodies by the entities in an economical way."}, {"post_id": 22204, "ts": "2026-07-04T15:44:46Z", "hours": 6.0, "text": "Drops and drops together make an ocean. Did nothing major just some small stuff Added buttons (RayGUI) for navigation #7608e9 Added Loading Screen before match starts. #76c086 , #26ddc4 Made the game fully self-contained. The game executable requires no dlls, no other libraries or assets either. Everything is bundled together in a single executable! For this to work, I used #load(\"file_source\") function. It returns []u8 or in C terms *uint8_t . But this won’t work with the raygui style loader function rl.GuiLoadStyle() that requires the ‘filename’ and not the data. So for that reason. I read the source code of raygui an d implemented their function in Odin since they don’t expose the function to the user. That’s about it tho!"}, {"post_id": 20936, "ts": "2026-07-02T17:49:13Z", "hours": 8.0, "text": "From bare metals to web. A rough road. My game is now available to play in bs-odin.onkush.dev I built my application for the Web and it works. Probably the most dirty work I had to do in this project overall. I probably have read all available Odin / WASM templates. Setting the Sail I knew what WASM is, I once to compile one of my C++ games to WASM too, but seeing more than 500+ errors in the first try took a big toll on me and I didn’t bother. I don’t want this project to end up like that. I didn’t have to search much to find a template that builds Odin + raylib in WASM . So I started to implement ‘ Offline Mode ’ for my game. Didn’t take much time tbh, easy work. So I went to sleep and assigned WASM implementation to future me. Thunderstorm Next morning, I looked at how the {template]( https://github.com/karl-zylinski/odin-raylib-web/ ) works - really simple and straightforward. I copied their code with proper attribution ofc. After fixing some build bugs, I ran my build.sh and…It didn’t work. But nothing works the first time… Spoiler, it didn’t work in the 69th time either. Tsunami By evening, I was able to make it compile, I won’t get into the specifics but it had to do with multiple definition of functions within Odin core libraries. So, after it compiled. I had a huge sigh of relief, I ran it in my browser and bam! A fully dark screen! Wait…What? NOO I opened up the console… and Alas! Errors, not 500 errors, only one error Uncaught (in promise) InternalError: too much recursion I couldn’t find what caused this error, how to fix it, how to narrow it down. Lastly I gave up and went to sleep. After I woke up! I one by one tested each file and their dependency. Lastly I found the culprit…it was Box2D After I dug deeper I found the fix, but it was concerned with changing the source code of Odin…so virtually no one can compile my game to WASM but me… I’ll try to find a workaround for it, till then - if it works, it works. The arrival to the forbidden Island After a lot of hardwork, I got the fruits of my labour. This journey was not as much fun, but seeing my game run in my browser is so much worth it! I fixed few visual glitches and frame time capture fixes. And then I pushed it into my domain :)"}, {"post_id": 19190, "ts": "2026-06-30T13:37:42Z", "hours": 10.0, "text": "Implemented Physics, generated islands form the terrain + Server side Seed generation. Performance Performance is out of the window, the algorithm that generates the islands is O(n^3) !! This disgusts me, but I wasn’t even able to come up with this solution! AI made the entire function…unfortunately I was not able to come up with the solution by myself… I understand how the function works, but I don’t know how I could improve it anyway. The one upside to this is that, this function will only run once - during the game start. My beloved physics engine Box2D can easily handle all these complex islands with no problem at all! So that helps :) Time What took 10hrs? Most of the time was trying to generate the islands, another huge chunk of time was spent making the renderer for Box2D #510535 . IDK how, but the server side seed generation that I though would take less time took about 2hrs… #4bac51 My state of mind I am currently disappointed in myself, multiplayer is hard. Server side seed generation taking so much time destroyed my confidence. Not being able to generate the islands broke me… I am having doubts of being competent enough to complete this project. My current plan is to focus on single player - offline mode. I will handle multiplayer with server later. Currently I will focus on things that are fun and actually have meaning. First I’ll make it work fully in web, then I will do character…"}, {"post_id": 17458, "ts": "2026-06-28T07:42:10Z", "hours": 5.0, "text": "Frame Time so low, we’re drawing the future. Last devlog I said Raylib was slow. It is on me, I am dumb. I didn’t have to look more into it, DrawMesh did the exact thing I required! Currently, the frame renders in my laptop under 0.9ms instead of 3-4ms earlier and in this devlog I document the changes I made. Batch Rendering Earlier I iterated over all the vertices and rendered them. for v in vertices { rlgl . Color4ub ( v . color . r , v . color . g , v . color . b , v . color . a ) rlgl . Vertex2f ( v . pos . x , v . pos . y ) } That was very slow, when I profiled it I saw that just iterating over the vertices took about 1.4ms . Drawing took another 1.5ms . So I changed the vertices data: // old vertex :: struct { pos : rl . Vector2 , color : rl . Color , } vertices : [ dynamic ] vertex // new vertices_pos : [ dynamic ] rl . Vector3 vertices_col : [ dynamic ] rl . Color Then I generate a terrain_mesh using these arrays in this function. And use that to render everything at once! if mesh_initialised && terrain_mesh . vaoId != 0 { rl . DrawMesh ( terrain_mesh , default_material , default_transform ) } Results Went from 3-4ms to 0.5ms . But when we move we have to generate the vertices at each frame! So if we don’ t move it is 0.5ms but if we move it is 4.0+ms !!! Chunking Since our terrain doesn’t change, we can store the results in GPU memory and render them at will. But if we try to render a texture of size 5120x5120 , our gpu will suffer really bad. So we chunk. We divide the terrain in chunks, load them into gpu and show only the parts that are visible currently. Sounds easy. But for stupid ppl like me it is hard, took me a long while to fight the memory, logic and silly mistakes. But finally, it did work. Results It renders about 0.8ms avg and 1ms in high load, sometimes goes down to 0.6ms too! That too while moving!"}, {"post_id": 16739, "ts": "2026-06-27T06:14:54Z", "hours": 6.0, "text": "Reworked my entire Rendering and Windowing System… Raylib - The unfortunate switch I wanted to make a game accessible to many people. And the most accessible platform is Web. So I had to compile my application in WASM . While my previous renderer, SDL_Renderer was able to render in Web it was not meant to be used intensively, it doesn’t support shaders among many other flaws. So I looked for other rendering libraries to use for my game. bgfx - no bindings for Odin sokol - I never used it, I had to ask myself if the complexity it brings with it is worth it. Very sweet option otherwise. Vulkan - No WASM SDL_GPU - No WASM Raylib comes with it’s own downsides tho - It is slow, just changing to it added 2ms to my render time, it was 1ms with SDL Renderer. But it’s simplicity keeps me in awe. Right now I’ve decided to settle with my slower Raylib and focus on important stuff like offline mode , bots , characters ."}, {"post_id": 15624, "ts": "2026-06-25T12:36:30Z", "hours": 7.0, "text": "A massive overhaul of game architecture. Architecture I think it’s safe to say that this time I unscrambled the spaghetti code that I have been writing. These things are hard but very important for a project of this scale. Else, the developer burden piles up and motivation to complete the game is dead. #883172 . Performance I implemented a simple performance hack to my terrain generation. This fix gives almost 100% faster terrain generation and rendering! I’ve documented the fix in the comments of the code here . #f2a07a Camera Till now the camera didn’t follow the player, but now it does. The math again, wasn’t easy. I introduced another bug that I caught days later. #393da8 Others Added a feature to ping server at any moment #da64b7 Enforced naming convention Out of bounds array access fix"}, {"post_id": 14192, "ts": "2026-06-23T05:49:53Z", "hours": 3.0, "text": "Implemented Marching Squares! Brief intro to marching squares This is a technique commonly used in 2d terrain generation models. It converts the rigid ‘blocky’ tiling of squares to smth more organic by adding triangles to the mix. The end result is even more good looking when you add linear interpolation! The implementation Took everything from me. I feel exhausted and tired, I need sleep. The implementation took a lot of hand written logic, here and here . But idk how but the lookup table was perfect, and required no changes! Sure took some time to make it but the results speak for themselves I think. What was indeed the problem… this code in github _bl : = bl > threshold ? 0b0010 : 0 _br : = br > threshold ? 0b0001 : 0 The fix? _bl : = bl > threshold ? 0b0001 : 0 _br : = br > threshold ? 0b0010 : 0 I had these two swapped from what the standard says! Oh my gawd, this took forever to debug. Performance The current implementation is using Painter's Algorithm , this works but there is a heck ton of overdraw! I hate it and probably will try to find a fix to it soon!"}, {"post_id": 13224, "ts": "2026-06-21T17:36:10Z", "hours": 3.0, "text": "Made rendering more than 4000% faster ! Premature optimisation is the root… So initially my renderer drew all the cells, even when not in view. There were only 64x64 cells so it was no problem for my lappy at all! But when I increased it to 512x512 my laptop took huge load (45ms rendering time)! Currently after implementing a camera thingy it is now not an issue. The terrain is generated once and only the visible part (80x45 cells) is rendered in the screen! This change lead to render times go below 1ms again :) The maths behind camera thing was really logical error prone, and took a lot of time + I had a rough time working with dynamic arrays of Odin. Apparently you got to use raw_data(array) function to get the underlying data from the array. This is not documented anywhere neither did LSP find me this function when I did try to find it! Other stuff I also changed the colours of the terrain. Added background to the fps and frame_time texts"}, {"post_id": 12636, "ts": "2026-06-20T17:10:25Z", "hours": 5.0, "text": "Procedural Terrain Generation is working now! Maths I kinda learnt a lot of maths for Perlin and simplex noise generations! Watched a lot of tutorials to get an idea of how it is generally implemented to generate terrain. It is very easy when you don’t have to code the noise functions yourselves… Resources: 1 , 2 Opensource helping while at it I also added imgui as a dependency. When imgui was building I saw a two big libraries (the actual imgui and sdl3 repos) clone. They were more than 100mb each. I made some simple code changes build.py of the original repo which brought it down to 1-2mb each. I made an issue in the original bindings repo. Let’s hope it goes well. Rendering I changed the rendering technique of the tiles of the generated terrain twice. It was real hard work. This probably took most of the time. There were many errors in maths and logic during the making of terrain renderer."}, {"post_id": 11783, "ts": "2026-06-19T05:28:23Z", "hours": 18.0, "text": "Multiplayer setup done! Server and client work flawlessly! This devlog is bigger than my normal work, because I started this project not knowing about Stardance tldr; This is a 9 day blog of my game I am making from scratch using odin lang, sdl3 for window and rendering(will switch to vulkan later on), and ENet for networking. During the 18hrs and 9 days I made functional multiplayer, rendering, game states, input handling and profiling. I spent a lot my time in the architecture and infra, in the later days, I will focus on features itself. When done, I will improve architecture and performance I spent more than 2-3 hours writing and editing the devlog, but it became too long and stardance website didn’t allow me to post it here (stardance has a limit of 4k characters and my devlog was about 6k ). So I had to upload it in my own site here . I am so sorry for the inconveniences caused 🙏"}]...
|
Title: bs-odin by @Ankush | Stardance
Devlogs:
Mu Title: bs-odin by @Ankush | Stardance
Devlogs:
Multiplayer setup done! Server and client work flawlessly! This devlog is bigger than my normal work, because I started this project not knowing about Stardance tldr; This is a 9 day blog of my game I am making from scratch using odin lang, sdl3 for window and rendering(will switch to vulkan later on), and ENet for networking. During the 18hrs and 9 days I made functional multiplayer, rendering, game states, input handling and profiling. I spent a lot my time in the architecture and infra, in the later days, I will focus on features itself. When done, I will improve architecture and performance I spent more than 2-3 hours writing and editing the devlog, but it became too long and stardance website didn’t allow me to post it here (stardance has a limit of 4k characters and my devlog was about 6k ). So I had to upload it in my own site here . I am so sorry for the inconveniences caused 🙏
Procedural Terrain Generation is working now! Maths I kinda learnt a lot of maths for Perlin and simplex noise generations! Watched a lot of tutorials to get an idea of how it is generally implemented to generate terrain. It is very easy when you don’t have to code the noise functions yourselves… Resources: 1 , 2 Opensource helping while at it I also added imgui as a dependency. When imgui was building I saw a two big libraries (the actual imgui and sdl3 repos) clone. They were more than 100mb each. I made some simple code changes build.py of the original repo which brought it down to 1-2mb each. I made an issue in the original bindings repo. Let’s hope it goes well. Rendering I changed the rendering technique of the tiles of the generated terrain twice. It was real hard work. This probably took most of the time. There were many errors in maths and logic during the making of terrain renderer.
Made rendering more than 4000% faster ! Premature optimisation is the root… So initially my renderer drew all the cells, even when not in view. There were only 64x64 cells so it was no problem for my lappy at all! But when I increased it to 512x512 my laptop took huge load (45ms rendering time)! Currently after implementing a camera thingy it is now not an issue. The terrain is generated once and only the visible part (80x45 cells) is rendered in the screen! This change lead to render times go below 1ms again :) The maths behind camera thing was really logical error prone, and took a lot of time + I had a rough time working with dynamic arrays of Odin. Apparently you got to use raw_data(array) function to get the underlying data from the array. This is not documented anywhere neither did LSP find me this function when I did try to find it! Other stuff I also changed the colours of the terrain. Added background to the fps and frame_time texts
Implemented Marching Squares! Brief intro to marching squares This is a technique commonly used in 2d terrain generation models. It converts the rigid ‘blocky’ tiling of squares to smth more organic by adding triangles to the mix. The end result is even more good looking when you add linear interpolation! The implementation Took everything from me. I feel exhausted and tired, I need sleep. The implementation took a lot of hand written logic, here and here . But idk how but the lookup table was perfect, and required no changes! Sure took some time to make it but the results speak for themselves I think. What was indeed the problem… this code in github _bl : = bl > threshold ? 0b0010 : 0 _br : = br > threshold ? 0b0001 : 0 The fix? _bl : = bl > threshold ? 0b0001 : 0 _br : = br > threshold ? 0b0010 : 0 I had these two swapped from what the standard says! Oh my gawd, this took forever to debug. Performance The current implementation is using Painter's Algorithm , this works but there is a heck ton of overdraw! I hate it and probably will try to find a fix to it soon!
A massive overhaul of game architecture. Architecture I think it’s safe to say that this time I unscrambled the spaghetti code that I have been writing. These things are hard but very important for a project of this scale. Else, the developer burden piles up and motivation to complete the game is dead. #883172 . Performance I implemented a simple performance hack to my terrain generation. This fix gives almost 100% faster terrain generation and rendering! I’ve documented the fix in the comments of the code here . #f2a07a Camera Till now the camera didn’t follow the player, but now it does. The math again, wasn’t easy. I introduced another bug that I caught days later. #393da8 Others Added a feature to ping server at any moment #da64b7 Enforced naming convention Out of bounds array access fix
Reworked my entire Rendering and Windowing System… Raylib - The unfortunate switch I wanted to make a game accessible to many people. And the most accessible platform is Web. So I had to compile my application in WASM . While my previous renderer, SDL_Renderer was able to render in Web it was not meant to be used intensively, it doesn’t support shaders among many other flaws. So I looked for other rendering libraries to use for my game. bgfx - no bindings for Odin sokol - I never used it, I had to ask myself if the complexity it brings with it is worth it. Very sweet option otherwise. Vulkan - No WASM SDL_GPU - No WASM Raylib comes with it’s own downsides tho - It is slow, just changing to it added 2ms to my render time, it was 1ms with SDL Renderer. But it’s simplicity keeps me in awe. Right now I’ve decided to settle with my slower Raylib and focus on important stuff like offline mode , bots , characters .
Frame Time so low, we’re drawing the future. Last devlog I said Raylib was slow. It is on me, I am dumb. I didn’t have to look more into it, DrawMesh did the exact thing I required! Currently, the frame renders in my laptop under 0.9ms instead of 3-4ms earlier and in this devlog I document the changes I made. Batch Rendering Earlier I iterated over all the vertices and rendered them. for v in vertices { rlgl . Color4ub ( v . color . r , v . color . g , v . color . b , v . color . a ) rlgl . Vertex2f ( v . pos . x , v . pos . y ) } That was very slow, when I profiled it I saw that just iterating over the vertices took about 1.4ms . Drawing took another 1.5ms . So I changed the vertices data: // old vertex :: struct { pos : rl . Vector2 , color : rl . Color , } vertices : [ dynamic ] vertex // new vertices_pos : [ dynamic ] rl . Vector3 vertices_col : [ dynamic ] rl . Color Then I generate a terrain_mesh using these arrays in this function. And use that to render everything at once! if mesh_initialised && terrain_mesh . vaoId != 0 { rl . DrawMesh ( terrain_mesh , default_material , default_transform ) } Results Went from 3-4ms to 0.5ms . But when we move we have to generate the vertices at each frame! So if we don’ t move it is 0.5ms but if we move it is 4.0+ms !!! Chunking Since our terrain doesn’t change, we can store the results in GPU memory and render them at will. But if we try to render a texture of size 5120x5120 , our gpu will suffer really bad. So we chunk. We divide the terrain in chunks, load them into gpu and show only the parts that are visible currently. Sounds easy. But for stupid ppl like me it is hard, took me a long while to fight the memory, logic and silly mistakes. But finally, it did work. Results It renders about 0.8ms avg and 1ms in high load, sometimes goes down to 0.6ms too! That too while moving!
Implemented Physics, generated islands form the terrain + Server side Seed generation. Performance Performance is out of the window, the algorithm that generates the islands is O(n^3) !! This disgusts me, but I wasn’t even able to come up with this solution! AI made the entire function…unfortunately I was not able to come up with the solution by myself… I understand how the function works, but I don’t know how I could improve it anyway. The one upside to this is that, this function will only run once - during the game start. My beloved physics engine Box2D can easily handle all these complex islands with no problem at all! So that helps :) Time What took 10hrs? Most of the time was trying to generate the islands, another huge chunk of time was spent making the renderer for Box2D #510535 . IDK how, but the server side seed generation that I though would take less time took about 2hrs… #4bac51 My state of mind I am currently disappointed in myself, multiplayer is hard. Server side seed generation taking so much time destroyed my confidence. Not being able to generate the islands broke me… I am having doubts of being competent enough to complete this project. My current plan is to focus on single player - offline mode. I will handle multiplayer with server later. Currently I will focus on things that are fun and actually have meaning. First I’ll make it work fully in web, then I will do character…
From bare metals to web. A rough road. My game is now available to play in bs-odin.onkush.dev I built my application for the Web and it works. Probably the most dirty work I had to do in this project overall. I probably have read all available Odin / WASM templates. Setting the Sail I knew what WASM is, I once to compile one of my C++ games to WASM too, but seeing more than 500+ errors in the first try took a big toll on me and I didn’t bother. I don’t want this project to end up like that. I didn’t have to search much to find a template that builds Odin + raylib in WASM . So I started to implement ‘ Offline Mode ’ for my game. Didn’t take much time tbh, easy work. So I went to sleep and assigned WASM implementation to future me. Thunderstorm Next morning, I looked at how the {template]( https://github.com/karl-zylinski/odin-raylib-web/ ) works - really simple and straightforward. I copied their code with proper attribution ofc. After fixing some build bugs, I ran my build.sh and…It didn’t work. But nothing works the first time… Spoiler, it didn’t work in the 69th time either. Tsunami By evening, I was able to make it compile, I won’t get into the specifics but it had to do with multiple definition of functions within Odin core libraries. So, after it compiled. I had a huge sigh of relief, I ran it in my browser and bam! A fully dark screen! Wait…What? NOO I opened up the console… and Alas! Errors, not 500 errors, only one error Uncaught (in promise) InternalError: too much recursion I couldn’t find what caused this error, how to fix it, how to narrow it down. Lastly I gave up and went to sleep. After I woke up! I one by one tested each file and their dependency. Lastly I found the culprit…it was Box2D After I dug deeper I found the fix, but it was concerned with changing the source code of Odin…so virtually no one can compile my game to WASM but me… I’ll try to find a workaround for it, till then - if it works, it works. The arrival to the forbidden Island After a lot of hardwork, I got the fruits of my labour. This journey was not as much fun, but seeing my game run in my browser is so much worth it! I fixed few visual glitches and frame time capture fixes. And then I pushed it into my domain :)
Drops and drops together make an ocean. Did nothing major just some small stuff Added buttons (RayGUI) for navigation #7608e9 Added Loading Screen before match starts. #76c086 , #26ddc4 Made the game fully self-contained. The game executable requires no dlls, no other libraries or assets either. Everything is bundled together in a single executable! For this to work, I used #load("file_source") function. It returns []u8 or in C terms *uint8_t . But this won’t work with the raygui style loader function rl.GuiLoadStyle() that requires the ‘filename’ and not the data. So for that reason. I read the source code of raygui an d implemented their function in Odin since they don’t expose the function to the user. That’s about it tho!
Nothing much this time. Added options menu Added physics collider to the player (finally, phew..) Notify mobile users to play in landscape mode. That’s about it. All of them were relatively easy. What I did try and haven’t pushed to upstream is a failed attempt to detect entry and exit from water bodies by the entities in an economical way.
Fully functional animation parser and engine! The entire thing started by me searching for assets to use for my game, then I found these super cute chibi characters that too FOR FREE!! I downloaded one of the free ones and saw that they use .scml file for animations. They do have pre-rendered png images in sequence too, but that is too easy, not fun and doesn’t look good! So, I planned to make a .scml parser, my own animation engine. And see how it goes. In the added video there’s the working part and the non-working part, which I found pretty funny. 1. Image loader First I made a image loader that dynamically loads all the sprites that are in use. Later I will add the abitily to drop the sprites from memory when not in use. 2. Mapping the data This was, tough. Very, very tough that I had originally anticipated. Making this parser included me staring at a file with 9k lines for hours. Trying to figure out what each elements do and how to use them interconnectedly. I first made a scml_data.odin where I one by one mapped all the required data to odin structs. 3. .scml parser I created a new file scml_parser.odin and in it I loaded the .scml file with Odin’s built in xml parser. The parsing took a big chunk of time too, as there are not good docs or examples available out here. But there was one single forum post that got me going and I never had any problems thereafter. I parse the file and save the values in my global private data variable defined in scml_data.odin . I read each elements and added all the necessary ones. I observed all the attributes, data and values very carefully earlier so I had an idea of some repetitive values that I could skip. I think almost 50% of the file was repetition, which ofc I didn’t save. 4. The engine Now that I had all the data with me in, the only thing I had to do was use that. With a given time t I have to find the timeline that it lands on and interpolate the time, linearly lerp the values and issue a draw command for the single sprite. I was unable to do two specific things and had to take help from AI: Lerping Angle: angle lerping is different as there can be a case where we have to learp from 350 to 10, normal lerp functions would just lerp it 350->200->10 instead of 350->360->10 Using the parent bones to calculate the final position of the child node. The particular function ai generated is here . Debugging After making the engine, we got to fix the engine. It had bugs, I debugged for a long time and then fixed them. Pretty stupid things like not pushing the timeline keys after initialising them, flipped y-axis, and angle clockwise order. Final thoughts Finally the thing is working now, I still have to polish it and make it play nicely with my entire game. There are other optimisation opportunities available but I’ll put that for later. I will now work on the avatar menu, so user can mix different things.
Implemented Animation blending + UI library changed I wanted the player to be rendered in the main_menu and in the avatar menu . But also wanted the animations to be looping randomly. When I implemented random looping I found out that, the animations wouldn’t behave properly due to snapping . So I implemented animation blending . It was not at all easy , had to implement another angle_lerp function specifically for blending angles. Character customisation Due to me working hard earlier, changing character sprites is a cakewalk. In the attatched video. The head sprite is of tier 2 while the rest is from tier 1 GUI I really wanted to like raygui, but it was really bad. A lot of maths required for very simple things! I didn’t like it at all. So in search of a new UI library I found this niche library orui ! This fits my needs perfectly: Immediate mode Super fast (Not what I was looking for but a plus) Uses raylib Doesn’t depend on me to do the maths Actually customisable You can see the updated GUI in the video, looks good right :) it also supports animations and transitions!
UI Overhaul - Done! So I changed the entire UI , game UI is tough, even more so when you have a lot of moving components. I never had ever use any library like orui so it was fun, but at the same time - confusing at times. Like for example: there are only 2 components for drawing ( container and label ). I mean there’s also element, but that is just an empty container. Also I’ve tried everything but you can’t just get hover information for the container element. I need some color suggestions for the buttons in options menu, they look kinda dull… All the colors are taken from pallets at coolors.co ! Icons!! So while at it, I wanted to add icons. This was hell. A very bad idea. Let me tell you why - orui doesn’t support icons by default, so you’ve got to load another font to draw the icons. Now, Raylib can’t draw icon fonts, until you specify all the individual codepoints…here’s the code required to load a font with 3 icons: icon_codepoints : = [?] rune { 0xe048 , // ICON_LUCIDE_ARROW_LEFT 0xe049 , // ICON_LUCIDE_ARROW_RIGHT 0xe14d , // ICON_LUCIDE_SAVE 0xe18e , // ICON_LUCIDE_TRASH_2 } icon_font = rl . LoadFontEx ( "./res/fonts/lucide.ttf" , 32 , & icon_codepoints [ 0 ], len ( icon_codepoints ), ) Animation Blending Made the animation transition buttery smooth!! Look at the video!!
Player Customisation Screen!! RAAH, this is really done! TBH this was easier than expected. I had an idea of how this will work out, and implemented just that. The menu includes some smart and fancy mathematics too // gettin the index current_index : = ( int ( curr_type ) * num_tiers ) + int ( curr_tier ) // applying the changes, Lets say user pressed right arrow. new_index : = ( current_index + 1 ) % total_options setPartType ( group , anim . CharacterType ( new_index / num_tiers )) setPartTier ( group , anim . CharacterTier ( new_index % num_tiers )) I am really proud of the UI. Looks great. Honestly I was really lucky with the great reference images I found in the internet :) hosted here
Dozens of small features implemented! Migrated the End screen UI to the new UI library Brought back the physics collider with water from previously deleted code. Removed a rouge sleep call in loading phase. (Which was put there for testing ) Instead of drawing rectangles in when playing. We now draw the characters! With randomly generated skins!! Migrated Playing and loading UI to the new library Code cleanup and refactored for better architecture Culling #bd56fa When adding Culling to player rendering, I got an optimisation of 5ms->2ms. Animation while playing The initial phase was very easy. What I did struggle with was flipping the image. First, I tried flipping the texture themselves. It did work but the offset of the bones were not in place. It was fine when going right, but when I turn left. It all turns bad, the 2nd video is a demonstration of that. It took a lot of tweaks and black magic to find out that I had to also flip the anchor position and angle too 😭 Now it is working as intented :)
Enemy AI done + Tons more! Other things done this time around: Fix: WASM build fixes Feature: Added the back button in Avatar Menu (finally) Fix: The character scale and position in Main/Avatar Menu acted funny in extreme dimentions (when too small) Fix: Physics renderer didn’t render polygons with 4 vertices Feature: Added physics colliders for all enemies! Feature: Y-Sorting enabled Performance: Pushed Data Oriented Design for max performance Architecture: Moved the files around, where they make more sense Feature: Implemented Attacking Feature: Player & Enemy State machine Feature: Enemy AI (super basic tbh) Performance All of these changes were made keeping performance in mind. As of right now the state machines need work to make them even faster! Obstacles State machine logic is very mind numbing, I won’t want to do that…. a lot of edge case problems. A lot of problems I never thought existed. Y-Sorting was also in the harder side because I wanted a fast sort while also not needing to change the whole array of entities. I finally decided to use another array render_list of type []int this essentially sorts the id (or index in this case) of the entities by entity.pos.y . When rendering use the ids to render. This proved to be a more efficient way to do it, than sorting the entire array of entities. Future Todos Implement Enemy attacking Implement health system (with regenability?) Draw the health bar Implement death After these things are done. We I will think of further things like game win/game end amongst many others like game pause.
Health System, Enemy Attack, 15 new Skin! Summary of Features added: Player/Enemy Attacks Health System (Damage/Heal) Health Bar shown 15 new Skins! Avatar Menu “Set” Selector Avatar Set Selector This took a lot of time than I would like. I first had to scourge through 100s of directories for each Skin (each skin has 3 “tiers”) and get the 0th “idle” animation sprite. The next part was pretty straight forward owing to the time I took to make the architecture great :3 Health Bar This wasn’t hard as per say. But it is mad slow. I realised it earlier but never mentioned it. orui library is slow. UI libraries aren’t meant to be this slow. Probably it is due to the rendering that makes it this much slower. How slow? My renderer could render 50 entities under 1ms, now it takes ~5ms to render 20 entities. Future Todos: Performance. I will track down where orui is slow. If it is in the logic part, we can’t do anything as I am not smart enough to fix logic so complex. But if it is related to rendering, we can work with that. Performance. It’s been a while since I diagnosed the slow parts in my code. I will deep dive into the code. Find out what is slow and try to fix them The next few days, I will work on to squeeze as much performance as I can from this game.
Preformance Checkup + Audio System Things I did: I stress tested my game to work with 512 & 1024 entities. Ran under 3ms and 5ms . The difference maker was the number of entities currently in the screen (rendering). Profiled all the “slow” parts Implemented sound system , for menu and game Recorded the sounds myself!! (both in-game and ui)! Performance I tried my best to find ways to increase speed in my game. Unfortunately, all the things that I thought were “slow” weren’t actually slow. Orui UI build was like under 50micro seconds . Orui Rendering was under 250micro seconds . Animation system ran under 50micro for all entities combined iirc So, for now, there has been done no performance improvements this devlog Sound System First I made the sound system simple, for the menu. It worked and I was happy. I made 6 different similar sounds for the hover and click actions, and I play one of them randomly when clicked. menu_hover_sounds : [ 6 ] rl . Sound loadMenuSounds :: proc () { for i in 0 ..< len ( menu_hover_sounds ) { path : = fmt . ctprintf ( "res/audio/menu/menu_click_%d.wav" , i + 1 ) menu_click_sounds [ i ] = rl . LoadSound ( path ) } } playMenuHoveredSound :: proc () { i : = rand . int_max ( len ( menu_hover_sounds )) rl . PlaySound ( menu_hover_sounds [ i ]) } When I went on to make the Player sounds, I noticed that I am unable to the same sound twice simultaneously. I needed that so that I can simulate multiple enemies and other stuff. So I googled a bit, found this raylib example. And implemented it. For both menu and entities. TOTAL_ALIASES :: 4 Sound :: struct { aliases : [ TOTAL_ALIASES ] rl . Sound , index : int , } loadSound :: proc ( path : cstring ) -> Sound { sound : Sound sound . aliases [ 0 ] = rl . LoadSound ( path ) for i in 1 ..< TOTAL_ALIASES { sound . aliases [ i ] = rl . LoadSoundAlias ( sound . aliases [ 0 ]) } sound . index = 0 return sound } playSound :: proc ( sound : ^ Sound ) { rl . PlaySound ( sound . aliases [ sound . index ]) sound . index = ( sound . index + 1 ) % TOTAL_ALIASES } playMenuClickedSound :: proc () { i : = rand . int_max ( len ( menu_click_sounds )) playSound ( & menu_click_sounds [ i ]) } I also stole borrowed this really great background music from raylib source....
|
1792943262.175508
|
1793807262.175508
|
|
29585
|
bubblescript by @elliottm | Stardance
|
elliottm
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bubblescript by @elliottm | Stardance
|
1793339889.176483
|
1793944689.176483
|
|
57940
|
bubbly wubbly by @nesix | Stardance
|
nesix
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bubbly wubbly by @nesix | Stardance
|
1793616572.9753463
|
1794480572.9753463
|
|
57941
|
bubbly wubbly by @nesix | Stardance
|
nesix
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bubbly wubbly by @nesix | Stardance
|
1793616573.843403
|
1794480573.843403
|
|
72668
|
buddy by @meorilandau | Stardance
|
meorilandau
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: buddy by @meorilandau | Stardance
|
1793558842.5154147
|
1794163642.5154147
|
|
58351
|
buddy by @yosefabunassar3 | Stardance
|
yosefabunassar3
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: buddy by @yosefabunassar3 | Stardance
|
1793487182.6146333
|
1794091982.6146333
|
|
58594
|
buddybot by @shrr | Stardance
|
shrr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: buddybot by @shrr | Stardance
|
1793501314.718495
|
1794106114.718495
|
|
2441
|
budget-friendly, no compromises sim racing shifter budget-friendly, no compromises sim racing shifter by @andrei | Stardance...
|
andrei
|
0
|
10.42
|
0
|
[]
|
[{"post_id": 24820, "ts": "202 [{"post_id": 24820, "ts": "2026-07-08T17:06:50Z", "hours": 0.3256, "text": "spent a little bit more time doing lego instructions and cleaning the github page up :)"}, {"post_id": 18328, "ts": "2026-06-29T13:09:22Z", "hours": 0.7167, "text": "took 40 mins to make a parts page for the lego instructions but its fine yk :)"}, {"post_id": 18298, "ts": "2026-06-29T12:21:21Z", "hours": 0.2739, "text": "lost like an hour of time because idk how to use lookout lmao but its fine because i have finished writing the instructions to build the product and have also uploaded all the parts to thingiverse BUT have to wait 24hrs to publish to the public - so when that is done i will finally submit to get funding! in the meantime, might make some visual lego-like instructions to make it easier to visualise the assembly!"}, {"post_id": 18263, "ts": "2026-06-29T10:50:58Z", "hours": 0.4772, "text": "made a desk clamping system with parts to be 3d printed, will finish making the instructions for the demo link and then will submit for funding :)"}, {"post_id": 10617, "ts": "2026-06-17T13:45:43Z", "hours": 1.2936, "text": "im back from exams and the full shifter is finished! added the limit switches and slots for each of them to be glued down when i build it. the pcb has also arrived, now all i need is to buy the components (hopefully can get them hardware funded) and 3d print the rest of the components (hopefully can get that funded too cause i dont have a printer)"}, {"post_id": 1329, "ts": "2026-06-03T08:30:51Z", "hours": 0.9336, "text": "exported a 3d model of the pcb from kicad and added it into the cad model with mounting hardware and mounting holes. also created a shift knob that has an m10 internal thread so it can be screwed on to the threaded rod. will be slowing down a lot over the next week and a bit because i have a full week of exams - but will come back with more updates than ever afterwards!"}, {"post_id": 1010, "ts": "2026-06-02T20:02:51Z", "hours": 0.8567, "text": "main pcb designed and routed using an atmega32u4 and through-hole slots to wire each momentary switch to the board individually :) if anyone sees mistakes in my pcb - it would be greatly appreciated to point them out for me as it is my first time making one! update: the pcb has been ordered!"}, {"post_id": 865, "ts": "2026-06-02T16:07:12Z", "hours": 1.8844, "text": "finished every mechanical mechanism for the shifter! used a roller cam-on-center mechanism to simulate the tactility from a real h-pattern. added some colour to the 3d model as well. next up is the fun - but stressful part, electronics!"}, {"post_id": 785, "ts": "2026-06-02T13:28:26Z", "hours": 1.1267, "text": "looks like i finished the first revision of the centering mechanism, using springs on each side of the y-axis movement mechanism to be completely balanced in the middle of the 2nd and 3rd gear column. now, as the actual movement is finished - now i need to add a bit of tactile feedback - probably with cams or a dedent mechanism. :)"}, {"post_id": 753, "ts": "2026-06-02T11:58:22Z", "hours": 1.4883, "text": "finished designing all of the main mechanical parts and final rotational mechanism of the h-pattern shifter using axles and bearings. now time to model some centering springs and maybe research into a dedent system for a better mechanism feel!"}, {"post_id": 448, "ts": "2026-06-01T21:35:24Z", "hours": 1.0425, "text": "started and finished the designing for my first revision of the shifter shaft and shift plate :) most of the time spent here was in obsidian taking notes and designing with excalidraw, but i think that wakatime didnt pick up all the time on obsidian - but doesnt matter cause i spent a lot of time on onshape anyway!"}]...
|
Title: budget-friendly, no compromises sim racing Title: budget-friendly, no compromises sim racing shifter by @andrei | Stardance
Devlogs:
started and finished the designing for my first revision of the shifter shaft and shift plate :) most of the time spent here was in obsidian taking notes and designing with excalidraw, but i think that wakatime didnt pick up all the time on obsidian - but doesnt matter cause i spent a lot of time on onshape anyway!
finished designing all of the main mechanical parts and final rotational mechanism of the h-pattern shifter using axles and bearings. now time to model some centering springs and maybe research into a dedent system for a better mechanism feel!
looks like i finished the first revision of the centering mechanism, using springs on each side of the y-axis movement mechanism to be completely balanced in the middle of the 2nd and 3rd gear column. now, as the actual movement is finished - now i need to add a bit of tactile feedback - probably with cams or a dedent mechanism. :)
finished every mechanical mechanism for the shifter! used a roller cam-on-center mechanism to simulate the tactility from a real h-pattern. added some colour to the 3d model as well. next up is the fun - but stressful part, electronics!
main pcb designed and routed using an atmega32u4 and through-hole slots to wire each momentary switch to the board individually :) if anyone sees mistakes in my pcb - it would be greatly appreciated to point them out for me as it is my first time making one! update: the pcb has been ordered!
exported a 3d model of the pcb from kicad and added it into the cad model with mounting hardware and mounting holes. also created a shift knob that has an m10 internal thread so it can be screwed on to the threaded rod. will be slowing down a lot over the next week and a bit because i have a full week of exams - but will come back with more updates than ever afterwards!
im back from exams and the full shifter is finished! added the limit switches and slots for each of them to be glued down when i build it. the pcb has also arrived, now all i need is to buy the components (hopefully can get them hardware funded) and 3d print the rest of the components (hopefully can get that funded too cause i dont have a printer)
made a desk clamping system with parts to be 3d printed, will finish making the instructions for the demo link and then will submit for funding :)
lost like an hour of time because idk how to use lookout lmao but its fine because i have finished writing the instructions to build the product and have also uploaded all the parts to thingiverse BUT have to wait 24hrs to publish to the public - so when that is done i will finally submit to get funding! in the meantime, might make some visual lego-like instructions to make it easier to visualise the assembly!
took 40 mins to make a parts page for the lego instructions but its fine yk :)
spent a little bit more time doing lego instructions and cleaning the github page up :)...
|
1793505045.261688
|
1794109845.261688
|
|
62038
|
bug pad by @AyushKushwaha | Stardance
|
AyushKushwaha
|
0
|
8.89
|
0
|
[]
|
[{"post_id": 73603, "ts": "202 [{"post_id": 73603, "ts": "2026-09-25T13:46:52Z", "hours": 1.1047, "text": "devlog-9 Still working on cad only , many time I forgot to lapse yah , thanks to @Jacube1234 , he helped me a lot and also i learned so many thing from him."}, {"post_id": 71000, "ts": "2026-09-20T05:53:06Z", "hours": 0.8172, "text": "devlog-7 finally completed the cad and also added keycaps , literally it was hard for me but anyhow i took help form my friends nemo and jacube they helped me a lot . many time i forget to lapse my work"}, {"post_id": 69991, "ts": "2026-09-18T06:32:08Z", "hours": 1.585, "text": "devlog-6 I just got to know by @Jacube1234 my pcb was to big , so i redisgned it with guidence with jacube ."}, {"post_id": 69653, "ts": "2026-09-17T14:43:34Z", "hours": 1.6506, "text": "devlog-5 completed the gerber file and completed the simple cad design it is lil bit hard to use fusion for me , and tried watching tutorials and it is still hard for me . also my pc is lil bit lagging in fusion software."}, {"post_id": 69205, "ts": "2026-09-16T16:22:53Z", "hours": 1.2339, "text": "devlog-4 moved the type-c port outside the pcb and also correct the wiring and add all the 3d components . I can’t believe that this all was done by me . . . A special thanks to @Nemo_Donut who helped me a lot."}, {"post_id": 69098, "ts": "2026-09-16T11:25:00Z", "hours": 0.9006, "text": "devlog -3 resolved some important warnings and also learned to add images and text on pcb."}, {"post_id": 68585, "ts": "2026-09-15T11:01:17Z", "hours": 1.1172, "text": "devlog-2 done the structure and, also adjust all the component and wired it . I dont know weather it is correct or not."}, {"post_id": 68473, "ts": "2026-09-15T05:23:10Z", "hours": 0.4836, "text": "devlog-1 finally started hardware , this is my first hardware project , i don’t know any thing just watched a tutorial and asked @Nemo_Donut for help . and then started . I don’t even know weather it is correct or not."}]...
|
Title: bug pad by @AyushKushwaha | Stardance
Devl Title: bug pad by @AyushKushwaha | Stardance
Devlogs:
devlog-1 finally started hardware , this is my first hardware project , i don’t know any thing just watched a tutorial and asked @Nemo_Donut for help . and then started . I don’t even know weather it is correct or not.
devlog-2 done the structure and, also adjust all the component and wired it . I dont know weather it is correct or not.
devlog -3 resolved some important warnings and also learned to add images and text on pcb.
devlog-4 moved the type-c port outside the pcb and also correct the wiring and add all the 3d components . I can’t believe that this all was done by me . . . A special thanks to @Nemo_Donut who helped me a lot.
devlog-5 completed the gerber file and completed the simple cad design it is lil bit hard to use fusion for me , and tried watching tutorials and it is still hard for me . also my pc is lil bit lagging in fusion software.
devlog-6 I just got to know by @Jacube1234 my pcb was to big , so i redisgned it with guidence with jacube .
devlog-7 finally completed the cad and also added keycaps , literally it was hard for me but anyhow i took help form my friends nemo and jacube they helped me a lot . many time i forget to lapse my work
devlog-9 Still working on cad only , many time I forgot to lapse yah , thanks to @Jacube1234 , he helped me a lot and also i learned so many thing from him....
|
1793652705.3619375
|
1794257505.3619375
|
|
62039
|
bug pad by @AyushKushwaha | Stardance
|
AyushKushwaha
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bug pad by @AyushKushwaha | Stardance
|
1793652706.5745604
|
1794257506.5745604
|
|
35474
|
build a wifi jammer by @ali_hossain_muhit | Starda build a wifi jammer by @ali_hossain_muhit | Stardance...
|
ali_hossain_muhit
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: build a wifi jammer by @ali_hossain_muhit | Title: build a wifi jammer by @ali_hossain_muhit | Stardance...
|
1793559302.3615813
|
1794164102.3615813
|
|
49831
|
build your keyboard by @Ajith | Stardance
|
Ajith
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: build your keyboard by @Ajith | Stardance
|
1793307047.3648252
|
1793911847.3648252
|
|
15205
|
build your villain lair by @Neph | Stardance
|
Neph
|
0
|
0.83
|
0
|
[]
|
[{"post_id": 7156, "ts": "2026 [{"post_id": 7156, "ts": "2026-06-11T23:10:47Z", "hours": 0.8333, "text": "I worked a little on it before I added hackatime, but during the time I had hackatime on the project, I changed some code I had errors in and added the two starting rooms, along with adding a gold amount. I have a small ui to just test the code out, nothing permanent yet :D"}]...
|
Title: build your villain lair by @Neph | Stardanc Title: build your villain lair by @Neph | Stardance
Devlogs:
I worked a little on it before I added hackatime, but during the time I had hackatime on the project, I changed some code I had errors in and added the two starting rooms, along with adding a gold amount. I have a small ui to just test the code out, nothing permanent yet :D...
|
1793537690.6124697
|
1794142490.6124697
|
|
1201
|
buku manis 𐔌՞. .՞𐦯⋆. 𐙚 ˚ by @luftacen | Stardance
|
luftacen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: buku manis 𐔌՞. .՞𐦯⋆. 𐙚 ˚ by @luftacen | Sta Title: buku manis 𐔌՞. .՞𐦯⋆. 𐙚 ˚ by @luftacen | Stardance...
|
1793231381.7354543
|
1793836181.7354543
|
|
54300
|
bullseye by @kiyotakaayanokoji406 | Stardance
|
kiyotakaayanokoji406
|
0
|
0.27
|
0
|
[]
|
[{"post_id": 54600, "ts": "202 [{"post_id": 54600, "ts": "2026-08-25T17:00:06Z", "hours": 0.2667, "text": "I have just started writing a website"}]...
|
Title: bullseye by @kiyotakaayanokoji406 | Stardan Title: bullseye by @kiyotakaayanokoji406 | Stardance
Devlogs:
I have just started writing a website...
|
1793533994.9146543
|
1794138794.9146543
|
|
38831
|
bunniesin.love by @miniaturity | Stardance
|
miniaturity
|
1
|
43.8
|
636
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T19:04:59Z", "hours": 33.0, "multiplier": 19.13, "payout": 636, "blessing": "neutral", "text": "I made a web-based daily puzzle game inspired by enclose.horse, centered around reuniting two bunny lovers, whose hearts are tethered together! It was incredibly difficult creating my own tile rendering system, and I had to makeshift an auto-tile/rule-tile system for the editor, and to make creating levels easy. I also had to figure out how to animate the tiles, which is harder than it seems. Creating the editor was the hardest part; without a game engines help, I had to create a lot manually. I am definitely proud of what I made though, and now all I have to do is get more levels to put in! Make sure to check out the editor and tutorial while you test :) they’re the best parts.", "repo": "https://github.com/miniaturity/lovebunny", "demo": "https://bunniesin.love"}]...
|
[{"post_id": 59905, "ts": "202 [{"post_id": 59905, "ts": "2026-09-01T22:38:13Z", "hours": 4.9831, "text": "carrots, and an A* algorithm! carrot game mechanic! new entity type: carrots! they can be placed on top of existing tiles. carrots subtract 3 from your move count, when a bunny consumes a carrot! consume a carrot by moving a bunny on top of a carrot. optimized solving algorithm, accounting for carrots instead of the O(N^2 * 2^C * C) BFS solver, I made a O(N^2 * 2^C * (C + log N)) A* algorithm! to avoid doing a linear scan over the board for every carrot, i implemented a bigint bitmask and used brian kernighan’s bit trick to efficiently read carrots in O(1) time. although the BFS technically has a better worse case, A* uses a distance heuristic to prioritize paths that lead towards goals, avoiding dead paths. finally, ive implemented creating a web worker to solve the solution on a different thread, preventing the UI from freezing while the solver tries to solve the level. undo/redo in editor used stacks for undoing/redoing in editor, available through ctrl + z or cmd + z/ctrl + y or cmd + y"}, {"post_id": 58835, "ts": "2026-08-31T12:44:54Z", "hours": 5.8164, "text": "more QoL features and guidance!! date traversal you can now move between puzzles from previous dates. added undo feature you can now undo your last move, but only one undo at a time. added extra guidance through dialogue if you are a new user, it shows you where the editor and tutorial are (for clarity) added confirm submission you now have to confirm the submission of your solution, so you don’t accidently submit a bad solution. added solution history if you solved the puzzle, and decided to reset, you can now always go back to the best solution you previously had. editor QoL you now have to confirm your upload. also gives you the option to change the name/author directly in the modal."}, {"post_id": 56816, "ts": "2026-08-28T18:58:41Z", "hours": 7.1142, "text": "full editor and user uploading! upload levels directly to database; share w/ links You can now upload your levels to the database and easily share them! Anyone can play user-made levels if they have the link. Keep in mind, though, there are rate limits to uploading and you can get your IP restricted for the day. added author/level naming User-made levels can now be renamed using the editor, instead of direct file changing in an exported file. polished win modal Stylized the histogram and made it easy to understand the statistics. Also added a share feature that copies text to your clipboard."}, {"post_id": 39257, "ts": "2026-08-02T03:31:27Z", "hours": 2.5056, "text": "beta release!! connected cloudflare’s R2 bucket for daily levels I can now easily add daily levels by directly adding them to the database. You can only solve the daily level once per day, kept through a unique user ID stored in localStorage (which can be easily overridden, but I don’t really care.) connected import/export type to bucket for easy drop-in User-made levels can be export in a JSON format, and imported. mobile compatibility Added on-screen buttons for mobile users, since they don’t have a keyboard. sickass domain Purchased the bunniesin.love domain for $7! Totally worth it"}, {"post_id": 38165, "ts": "2026-07-31T12:53:21Z", "hours": 7.9661, "text": "bunny level editor! created a full level editor. You can now navigate to the level editor (top left button) and create a level! Control the board size, bunny locations, and every tile in the board. Export and import levels to save them. You can also see whether your puzzle is solvable or not, and how many moves it takes."}, {"post_id": 34433, "ts": "2026-07-25T04:19:37Z", "hours": 3.5133, "text": "tutorial guide dude :3 interactive tutorial levels There are now 3 total tutorial levels, with me guiding the user through all of them. Each level progressively gets harder, and teaches the user how to solve a puzzle. optimized for phone The board is now optimized for display on phones; controls are WIP. overhauled entity handling Entity infrastructure can now be easily extended for feature such as buttons or other items. However, the solver can’t use these features, so I’m holding off on implementing them."}, {"post_id": 33884, "ts": "2026-07-24T05:01:28Z", "hours": 3.5675, "text": "improved UI; added level creator page and more tiles. added an introduction modal for new players Players that have never visited the website before are now shown an intro modal. This can direct them to play without guides, or play the tutorial. level creator page Full implementation WIP, but I created an editor version of the game so that the user can click to paint tiles. It was pretty annoying to figure out how to detect mouse events and cast them to a tile, and mutate the board state. Also really difficult to add a grid and hover effects. moar tiles More tiles, more fun :3. Added variations of grass and walls. improved ui Now displays the day and level name, inside a carrot. Probably the most creative and original idea I’ve ever had. I’m really the best web designer that has ever lived."}, {"post_id": 33651, "ts": "2026-07-23T18:49:16Z", "hours": 8.6053, "text": "functional rule tile/tilemap system using canvas + game state machine tilemap system Created a full tilemap/tileset painting system from scratch. Uses HTML5 canvas to paint the tilemap, and a spritesheet for the textures. Pretty difficult to implement, but since I know how game engines work, I can infer on how to implement it in svelte, using state runes. game state machine The game now relies on a single instance of the state machine as a source of truth (class Game). Can be easily extended for future features."}]...
|
Title: bunniesin.love by @miniaturity | Stardance
Title: bunniesin.love by @miniaturity | Stardance
Devlogs:
functional rule tile/tilemap system using canvas + game state machine tilemap system Created a full tilemap/tileset painting system from scratch. Uses HTML5 canvas to paint the tilemap, and a spritesheet for the textures. Pretty difficult to implement, but since I know how game engines work, I can infer on how to implement it in svelte, using state runes. game state machine The game now relies on a single instance of the state machine as a source of truth (class Game). Can be easily extended for future features.
improved UI; added level creator page and more tiles. added an introduction modal for new players Players that have never visited the website before are now shown an intro modal. This can direct them to play without guides, or play the tutorial. level creator page Full implementation WIP, but I created an editor version of the game so that the user can click to paint tiles. It was pretty annoying to figure out how to detect mouse events and cast them to a tile, and mutate the board state. Also really difficult to add a grid and hover effects. moar tiles More tiles, more fun :3. Added variations of grass and walls. improved ui Now displays the day and level name, inside a carrot. Probably the most creative and original idea I’ve ever had. I’m really the best web designer that has ever lived.
tutorial guide dude :3 interactive tutorial levels There are now 3 total tutorial levels, with me guiding the user through all of them. Each level progressively gets harder, and teaches the user how to solve a puzzle. optimized for phone The board is now optimized for display on phones; controls are WIP. overhauled entity handling Entity infrastructure can now be easily extended for feature such as buttons or other items. However, the solver can’t use these features, so I’m holding off on implementing them.
bunny level editor! created a full level editor. You can now navigate to the level editor (top left button) and create a level! Control the board size, bunny locations, and every tile in the board. Export and import levels to save them. You can also see whether your puzzle is solvable or not, and how many moves it takes.
beta release!! connected cloudflare’s R2 bucket for daily levels I can now easily add daily levels by directly adding them to the database. You can only solve the daily level once per day, kept through a unique user ID stored in localStorage (which can be easily overridden, but I don’t really care.) connected import/export type to bucket for easy drop-in User-made levels can be export in a JSON format, and imported. mobile compatibility Added on-screen buttons for mobile users, since they don’t have a keyboard. sickass domain Purchased the bunniesin.love domain for $7! Totally worth it
full editor and user uploading! upload levels directly to database; share w/ links You can now upload your levels to the database and easily share them! Anyone can play user-made levels if they have the link. Keep in mind, though, there are rate limits to uploading and you can get your IP restricted for the day. added author/level naming User-made levels can now be renamed using the editor, instead of direct file changing in an exported file. polished win modal Stylized the histogram and made it easy to understand the statistics. Also added a share feature that copies text to your clipboard.
more QoL features and guidance!! date traversal you can now move between puzzles from previous dates. added undo feature you can now undo your last move, but only one undo at a time. added extra guidance through dialogue if you are a new user, it shows you where the editor and tutorial are (for clarity) added confirm submission you now have to confirm the submission of your solution, so you don’t accidently submit a bad solution. added solution history if you solved the puzzle, and decided to reset, you can now always go back to the best solution you previously had. editor QoL you now have to confirm your upload. also gives you the option to change the name/author directly in the modal.
carrots, and an A* algorithm! carrot game mechanic! new entity type: carrots! they can be placed on top of existing tiles. carrots subtract 3 from your move count, when a bunny consumes a carrot! consume a carrot by moving a bunny on top of a carrot. optimized solving algorithm, accounting for carrots instead of the O(N^2 * 2^C * C) BFS solver, I made a O(N^2 * 2^C * (C + log N)) A* algorithm! to avoid doing a linear scan over the board for every carrot, i implemented a bigint bitmask and used brian kernighan’s bit trick to efficiently read carrots in O(1) time. although the BFS technically has a better worse case, A* uses a distance heuristic to prioritize paths that lead towards goals, avoiding dead paths. finally, ive implemented creating a web worker to solve the solution on a different thread, preventing the UI from freezing while the solver tries to solve the level. undo/redo in editor used stacks for undoing/redoing in editor, available through ctrl + z or cmd + z/ctrl + y or cmd + y
Ships:
I made a web-based daily puzzle game inspired by enclose.horse, centered around reuniting two bunny lovers, whose hearts are tethered together! It was incredibly difficult creating my own tile rendering system, and I had to makeshift an auto-tile/rule-tile system for the editor, and to make creating levels easy. I also had to figure out how to animate the tiles, which is harder than it seems. Creating the editor was the hardest part; without a game engines help, I had to create a lot manually. I am definitely proud of what I made though, and now all I have to do is get more levels to put in! Make sure to check out the editor and tutorial while you test :) they’re the best parts....
|
1793825386.1577895
|
1793911786.1577895
|
|
47598
|
burden by @Voxi0 | Stardance
|
Voxi0
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: burden by @Voxi0 | Stardance
|
1793890548.417145
|
1794495348.417145
|
|
69240
|
burger timer by @g8mero | Stardance
|
g8mero
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: burger timer by @g8mero | Stardance
|
1793764068.8343718
|
1794368868.8343718
|
|
13004
|
bye by @Ajay22 | Stardance
|
Ajay22
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bye by @Ajay22 | Stardance
|
1792936391.1424332
|
1793800391.1424332
|
|
13007
|
bye by @Ajay22 | Stardance
|
Ajay22
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bye by @Ajay22 | Stardance
|
1793857724.7481005
|
1794721724.7481005
|
|
26397
|
bye by @Ajay22 | Stardance
|
Ajay22
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bye by @Ajay22 | Stardance
|
1792939793.7898097
|
1793803793.7898097
|
|
61325
|
bye by @hritik | Stardance
|
hritik
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: bye by @hritik | Stardance
|
1793648994.1610837
|
1794253794.1610837
|
|
60092
|
byeclicky by @thewildchip | Stardance
|
thewildchip
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: byeclicky by @thewildchip | Stardance
|
1793641656.80539
|
1794246456.80539
|
|
60093
|
byeclicky by @thewildchip | Stardance
|
thewildchip
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: byeclicky by @thewildchip | Stardance
|
1793641657.7082713
|
1794246457.7082713
|
|
69951
|
byscaine by @jckstnd | Stardance
|
jckstnd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: byscaine by @jckstnd | Stardance
|
1792957869.3246937
|
1793821869.3246937
|
|
1062
|
c by @AboEl5yr | Stardance
|
AboEl5yr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c by @AboEl5yr | Stardance
|
1793414873.5003304
|
1794019673.5003304
|
|
32334
|
c by @Cris | Stardance
|
Cris
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c by @Cris | Stardance
|
1792943337.1993055
|
1793807337.1993055
|
|
11109
|
c by @diaxx | Stardance
|
diaxx
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c by @diaxx | Stardance
|
1793199000.1460137
|
1793803800.1460137
|
|
109
|
c by @variidian | Stardance
|
variidian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c by @variidian | Stardance
|
1793389789.294559
|
1793994589.294559
|
|
6974
|
c00lRadio by @picelboi | Stardance
|
picelboi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c00lRadio by @picelboi | Stardance
|
1793638113.6308022
|
1794242913.6308022
|
|
68200
|
c8emu by @Grodzia91 | Stardance
|
Grodzia91
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c8emu by @Grodzia91 | Stardance
|
1793738971.8568673
|
1794343771.8568673
|
|
67238
|
cLOCK-IN by @uddinsyed604 | Stardance
|
uddinsyed604
|
0
|
7.93
|
0
|
[]
|
[{"post_id": 84950, "ts": "202 [{"post_id": 84950, "ts": "2026-10-30T16:25:39Z", "hours": 1.2094, "text": "DOCUMENTED THE PROJECT!!!"}, {"post_id": 84417, "ts": "2026-10-29T16:36:11Z", "hours": 4.0703, "text": "WORKED ON CAD DESIGNING AND FINALLY COMPLETED :)))"}, {"post_id": 83818, "ts": "2026-10-28T17:41:14Z", "hours": 0.8644, "text": "Done with routing of PCB Of cLOCK-IN That’s it I guess, for now :)"}, {"post_id": 83306, "ts": "2026-10-27T17:34:01Z", "hours": 1.7894, "text": "STARTED THIS PROJECT!! first, went through the blare guide and assigned and planned which components i shd use for this project. they are 4 keys, xiao-esp32-c3, buzzer, 2.25 tht screen and 4 holes. Second, went through the guide and took inspiration and then completed the schematic! Third, Placement of components in pcb (routing still needs to be done!) Fourth, Assigning 3d models to the footprint components! that’s IT! for now :)"}]...
|
Title: cLOCK-IN by @uddinsyed604 | Stardance
Devl Title: cLOCK-IN by @uddinsyed604 | Stardance
Devlogs:
STARTED THIS PROJECT!! first, went through the blare guide and assigned and planned which components i shd use for this project. they are 4 keys, xiao-esp32-c3, buzzer, 2.25 tht screen and 4 holes. Second, went through the guide and took inspiration and then completed the schematic! Third, Placement of components in pcb (routing still needs to be done!) Fourth, Assigning 3d models to the footprint components! that’s IT! for now :)
Done with routing of PCB Of cLOCK-IN That’s it I guess, for now :)
WORKED ON CAD DESIGNING AND FINALLY COMPLETED :)))
DOCUMENTED THE PROJECT!!!...
|
1793728529.8983314
|
1794333329.8983314
|
|
14000
|
caSTMio by @kitchencel | Stardance
|
kitchencel
|
0
|
4.23
|
0
|
[]
|
[{"post_id": 6865, "ts": "2026 [{"post_id": 6865, "ts": "2026-06-11T14:50:49Z", "hours": 2.1856, "text": "Devlog 2 Hello everyone! Welcome to my project, caSTMio. It’s a Casio W-59, but with an STM32. I’ve been working on the firmware more, and I am getting closer and closer to finishing the first prototype (outputs to console). I’m still working on the timer, but I think it’s almost there. I’ll then make the PCB, order the parts, and build the watch. Pic alt text: The method responsible for updating the display. Right now, it outputs to serial, but I’ll hook it up to my LCD once I get it working."}, {"post_id": 6256, "ts": "2026-06-10T14:48:21Z", "hours": 2.0458, "text": "Devlog 1 This is the start of caSTMio. It’s a Casio W-59, but with an STM32 in there that can do a bunch of cool stuff!! It’s gonna have a few different modes; Clock Self-explanatory. Shows the time, date and the day of the week. Press Button A to turn on the backlight, Button B to switch modes (always), and Button C to toggle between 12 and 24 hour mode. Alarm Also pretty intuitive. Allows you to set an alarm and/or an hourly reminder (ALM and SIG). Press Button A to adjust the time and Button C to cycle between 4 states (no ALM/no SIG, ALM/no SIG, no ALM/SIG, ALM/SIG). Timer I replaced the stopwatch with this, because it’s simply better and move versatile. Also, I sometimes forget that I made tea, and I think this is the perfect way to remind myself :’) Press Button A to select the length (I’ll either have a few presets or a limit) and press Button C to start/pause the timer. When the timer has been paused, press button A to reset it. Water tracker Again, I made it for myself, because I forget to drink water… Press Button A to adjust the goal (up to 10L), or press Button C to increment the goal by 50ml. Adjust Press Button A to cycle through everything you can adjust (seconds, hours, minutes, month, date, day of the week), and press Button C to increment it by one. This is all in progress, and I still don’t have the hardware… But my plan so far is: Reverse engineer the watch’s LCD Write the firmware Make a custom PCB Order it Put it all together So far, I’m starting work on the firmware, and only a basic version that runs in serial. But I’m sure with the next 3 months almost free, I’ll finish it for sure."}]...
|
Title: caSTMio by @kitchencel | Stardance
Devlogs Title: caSTMio by @kitchencel | Stardance
Devlogs:
Devlog 1 This is the start of caSTMio. It’s a Casio W-59, but with an STM32 in there that can do a bunch of cool stuff!! It’s gonna have a few different modes; Clock Self-explanatory. Shows the time, date and the day of the week. Press Button A to turn on the backlight, Button B to switch modes (always), and Button C to toggle between 12 and 24 hour mode. Alarm Also pretty intuitive. Allows you to set an alarm and/or an hourly reminder (ALM and SIG). Press Button A to adjust the time and Button C to cycle between 4 states (no ALM/no SIG, ALM/no SIG, no ALM/SIG, ALM/SIG). Timer I replaced the stopwatch with this, because it’s simply better and move versatile. Also, I sometimes forget that I made tea, and I think this is the perfect way to remind myself :’) Press Button A to select the length (I’ll either have a few presets or a limit) and press Button C to start/pause the timer. When the timer has been paused, press button A to reset it. Water tracker Again, I made it for myself, because I forget to drink water… Press Button A to adjust the goal (up to 10L), or press Button C to increment the goal by 50ml. Adjust Press Button A to cycle through everything you can adjust (seconds, hours, minutes, month, date, day of the week), and press Button C to increment it by one. This is all in progress, and I still don’t have the hardware… But my plan so far is: Reverse engineer the watch’s LCD Write the firmware Make a custom PCB Order it Put it all together So far, I’m starting work on the firmware, and only a basic version that runs in serial. But I’m sure with the next 3 months almost free, I’ll finish it for sure.
Devlog 2 Hello everyone! Welcome to my project, caSTMio. It’s a Casio W-59, but with an STM32. I’ve been working on the firmware more, and I am getting closer and closer to finishing the first prototype (outputs to console). I’m still working on the timer, but I think it’s almost there. I’ll then make the PCB, order the parts, and build the watch. Pic alt text: The method responsible for updating the display. Right now, it outputs to serial, but I’ll hook it up to my LCD once I get it working....
|
1793433305.2217143
|
1794038105.2217143
|
|
50696
|
cacosa by @Anamelgar182011 | Stardance
|
Anamelgar182011
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cacosa by @Anamelgar182011 | Stardance
|
1793357508.6195843
|
1793962308.6195843
|
|
54529
|
cafe order program by @kshitijjj | Stardance
|
kshitijjj
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cafe order program by @kshitijjj | Stardanc Title: cafe order program by @kshitijjj | Stardance...
|
1793544889.4651773
|
1794149689.4651773
|
|
55277
|
cafe web by @DARKKNIGHT | Stardance
|
DARKKNIGHT
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cafe web by @DARKKNIGHT | Stardance
|
1793803687.0849469
|
1794408487.0849469
|
|
1591
|
cake game by @yashwaghmare9766 | Stardance
|
yashwaghmare9766
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cake game by @yashwaghmare9766 | Stardance
|
1793447504.9098318
|
1794052304.9098318
|
|
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/...
|
1793800089.7694073
|
1793886489.7694073
|
|
42694
|
calcdeck by @superabdelrahman2011 | Stardance
|
superabdelrahman2011
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: calcdeck by @superabdelrahman2011 | Stardan Title: calcdeck by @superabdelrahman2011 | Stardance...
|
1793796656.7637823
|
1794660656.7637823
|
|
9391
|
calcualter by @Aayan_10 | Stardance
|
Aayan_10
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: calcualter by @Aayan_10 | Stardance
|
1793429269.4679286
|
1794034069.4679286
|
|
20376
|
calculater by @CLK | Stardance
|
CLK
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T19:06:26Z", "hours": 2.0, "multiplier": 1.11, "payout": 3, "blessing": "neutral", "text": "I made a web-calculator it is a calculator website!!! I am very proud of it because it is the first time I codded in javascript", "repo": "https://github.com/NIVLACvt/web-calculater", "demo": "https://nivlacvt.github.io/web-calculater/"}]...
|
[{"post_id": 13946, "ts": "202 [{"post_id": 13946, "ts": "2026-06-22T21:54:35Z", "hours": 0.58, "text": "Added keyboard translations"}, {"post_id": 13639, "ts": "2026-06-22T11:31:28Z", "hours": 0.3306, "text": "Added 0 and RNG button and made numbers easier to see"}, {"post_id": 13116, "ts": "2026-06-21T13:33:02Z", "hours": 0.3872, "text": "Finished calculating part"}, {"post_id": 13098, "ts": "2026-06-21T13:01:33Z", "hours": 1.0725, "text": "just finished all the buttons and symbols"}]...
|
Title: calculater by @CLK | Stardance
Devlogs:
ju Title: calculater by @CLK | Stardance
Devlogs:
just finished all the buttons and symbols
Finished calculating part
Added 0 and RNG button and made numbers easier to see
Added keyboard translations
Ships:
I made a web-calculator it is a calculator website!!! I am very proud of it because it is the first time I codded in javascript...
|
1793724848.9636102
|
1793811248.9636102
|
|
35652
|
calculater by @penkiser23 | Stardance
|
penkiser23
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: calculater by @penkiser23 | Stardance
|
1793282205.7440174
|
1793887005.7440174
|
|
42641
|
calculator by @Jazil | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[{"post_id": 38720, "ts": "202 [{"post_id": 38720, "ts": "2026-08-01T08:26:21Z", "hours": 0.0, "text": "i writed html and css to calculator"}]...
|
Title: calculator by @Jazil | Stardance
Devlogs:
Title: calculator by @Jazil | Stardance
Devlogs:
i writed html and css to calculator...
|
1793850914.9972506
|
1794714914.9972506
|
|
49994
|
calculator by @Rockplayer1352 | Stardance
|
Rockplayer1352
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: calculator by @Rockplayer1352 | Stardance
|
1793314630.4870915
|
1793919430.4870915
|
|
69541
|
calculator by @ajinjoseph1718 | Stardance
|
ajinjoseph1718
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: calculator by @ajinjoseph1718 | Stardance
|
1793584289.8704967
|
1794189089.8704967
|
|
33112
|
calculator by @jaspergerinckx | Stardance
|
jaspergerinckx
|
0
|
0.38
|
0
|
[]
|
[{"post_id": 25425, "ts": "202 [{"post_id": 25425, "ts": "2026-07-09T18:10:55Z", "hours": 0.3836, "text": "its done check it out link in project"}]...
|
Title: calculator by @jaspergerinckx | Stardance
Title: calculator by @jaspergerinckx | Stardance
Devlogs:
its done check it out link in project...
|
1793400656.9547405
|
1794005456.9547405
|
|
31048
|
calculator by @jknig | Stardance
|
jknig
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T10:23:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made it with python My brother helped with the try, except function because I hadn’t learned it yet so yeah I just started so It is a bit basic.", "repo": "https://github.com/jk12121212/caculator.py", "demo": "https://www.online-python.com/siUn1b2eRw"}]...
|
[{"post_id": 34534, "ts": "202 [{"post_id": 34534, "ts": "2026-07-25T10:21:55Z", "hours": 0.3758, "text": "made a calculator.(I just started coding so it is basic.)"}, {"post_id": 24013, "ts": "2026-07-07T09:23:59Z", "hours": 0.3094, "text": "I am working on a simple calculator(first ever prodject)"}]...
|
Title: calculator by @jknig | Stardance
Devlogs:
Title: calculator by @jknig | Stardance
Devlogs:
I am working on a simple calculator(first ever prodject)
made a calculator.(I just started coding so it is basic.)
Ships:
I made it with python My brother helped with the try, except function because I hadn’t learned it yet so yeah I just started so It is a bit basic....
|
1793872342.6721404
|
1793958742.6721404
|
|
29933
|
calculator by @neuro_ | Stardance
|
neuro_
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: calculator by @neuro_ | Stardance
|
1793890130.6642084
|
1794494930.6642084
|