|
53943
|
Speedtickers by @juanes | Stardance
|
juanes
|
0
|
202.27
|
0
|
[]
|
[{"post_id": 74689, "ts": "202 [{"post_id": 74689, "ts": "2026-09-28T00:20:58Z", "hours": 9.7158, "text": "made a custom shader for the 2nd world that adds a fake lightning effect to the tiles. Also made custom backgrounds for the bsides"}, {"post_id": 73347, "ts": "2026-09-24T23:18:57Z", "hours": 2.4997, "text": "reworked more bside levels; added lights/normal maps, and expanded the mockups of the 2nd world"}, {"post_id": 72890, "ts": "2026-09-23T23:34:51Z", "hours": 9.0025, "text": "Started working on the new bside levels(Gameboy, Snes, and alt pallete style) and made the mockups for the 2nd world. Made around 10 new levels, and reworked around 10 old ones"}, {"post_id": 72008, "ts": "2026-09-22T00:11:03Z", "hours": 12.0467, "text": "added 3 new gameboy kaizo levels; the 1st boss sprites now use normal maps; also made some general bug fixes for an expo"}, {"post_id": 69880, "ts": "2026-09-18T00:05:03Z", "hours": 9.5719, "text": "Reworked the intro for the Game. The player shadow now changes color and opacity depending on the movement across the screen, and speed, from the Player. Started developing the cutscenes for the game. The Replays in the game can now use all the items the player can(Rails, keys, etc)"}, {"post_id": 61204, "ts": "2026-09-04T00:54:33Z", "hours": 2.3258, "text": "Added more ui/dialogs to the Editor. The Editor save/load dialog now works."}, {"post_id": 56856, "ts": "2026-08-28T20:17:43Z", "hours": 1.9317, "text": "The level editor now saves correctly every autotile terrain(For some reason the slide/slam autotiles sometimes aren’t saved correctly)"}, {"post_id": 54080, "ts": "2026-08-24T21:12:18Z", "hours": 155.1767, "text": "Finished the initial ver of the Level Editor Save Feature. (Most of the hours were logged previously to Beest)"}]...
|
Title: Speedtickers by @juanes | Stardance
Devlog Title: Speedtickers by @juanes | Stardance
Devlogs:
Finished the initial ver of the Level Editor Save Feature. (Most of the hours were logged previously to Beest)
The level editor now saves correctly every autotile terrain(For some reason the slide/slam autotiles sometimes aren’t saved correctly)
Added more ui/dialogs to the Editor. The Editor save/load dialog now works.
Reworked the intro for the Game. The player shadow now changes color and opacity depending on the movement across the screen, and speed, from the Player. Started developing the cutscenes for the game. The Replays in the game can now use all the items the player can(Rails, keys, etc)
added 3 new gameboy kaizo levels; the 1st boss sprites now use normal maps; also made some general bug fixes for an expo
Started working on the new bside levels(Gameboy, Snes, and alt pallete style) and made the mockups for the 2nd world. Made around 10 new levels, and reworked around 10 old ones
reworked more bside levels; added lights/normal maps, and expanded the mockups of the 2nd world
made a custom shader for the 2nd world that adds a fake lightning effect to the tiles. Also made custom backgrounds for the bsides...
|
1792770475.3417456
|
1793375275.3417456
|
|
47585
|
Endesium by @nikhil_nagaraj | Stardance
|
nikhil_nagaraj
|
1
|
202.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T02:13:35Z", "hours": 202.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a Minecraft mod called Endesium, which is an End Update mod. I learned Minecraft modding from scratch for this. There are 10 new biomes, 15 new mobs, 4 new bosses, 4 new sets of armor, and a lot of cool and incredible stuff. The new structures look incredible, like the elderwood sanctum, and many other cool and magnificent structures. It was challenging to figure out how to make custom mob models and make them spawn with boss bars and stuff of that sort. I am incredibly proud of my project, and I have put over 1 weeks worth of time into this project. I have learned many things along the way, and it was truly an incredible experience learning how to make a mod for Minecraft. It is a fabric 1.21.1 mod, sorry no modrinth - that takes weeks to verify.", "repo": "https://github.com/Infernodude777/endesium", "demo": "https://www.curseforge.com/minecraft/mc-mods/endesium"}]...
|
[{"post_id": 58574, "ts": "202 [{"post_id": 58574, "ts": "2026-08-31T01:13:03Z", "hours": 10.8222, "text": "Devlog 28 - The Egg Becomes an Altar hey guys. last devlog for this project The egg now hatches I made the egg hatch into an end golem after 1 minute - a very op, hard to defeat mob. However, defeating it gives 3-5 additional permanent hearts (lose it upon death). Also, when you kill the dragon now, a chest spawns where it died, with dragon wings (gives iron-level protection, slowness 1 while worn, functions like an elytra). what that means for the endgame so the progression reads clean now. beat the dragon, take the egg, set it up,and call up the colossus that guards everything past the first kill. the dragon fight is the warm-up act for something that doesn’t even spawn until you put the trophy to work. that’s it. that’s the end of the end. thanks for following along - go fight the dragon for real, then come back and raise one of your own."}, {"post_id": 57710, "ts": "2026-08-29T23:19:41Z", "hours": 7.3728, "text": "Devlog 26 hey guys. I turned the dragon fight into a bunch of small fixes that all made the fights read better.nothing shiny, just the stuff that was quietly wrong. stuff that was supposed to do stuff but didnt lol the dragon fight had announcements. not the kind players see - the kind thatonly exist in code. the enrage thresholds (“The Dragon Remembers” at 60%,35%, 15%) and the hoard reveal were computed, and then… dropped. a soundplayed, a title was built, and nobody ever saw the title. the function wasliterally called announce and it announced nothing. same story in the special attacks. the imports for title packets were sittingthere, imported and never used. so now the scripted set-pieces finally namethemselves: Burrow - “The Dragon Descends” before the ground starts shifting Seize - “The Dragon Takes You” right before it swoops to carry you aloft Rifts - “Reality Tears” as the gravity rifts start opening around you i’m genuinely annoyed this was broken for as long as it was. the drama of thedragon fight was all there in the code - the escalation, the set-pieces, the named thresholds - and none of it reached the player. now it does. the sentinel’s grab is escapable now the crown sentinel’s grab-and-hurl from a few devlogs ago was a one-way trip.if it got its hands on you, you watched the animation and then got launched.no counterplay, which felt wrong for a fight that’s supposed to be about reading the boss. so it got the same rule the warden and golem already had: deal enough damage mid-hold and it drops you early. 18 damage is the breaking point - enough that you can’t just tickle it, but enough that a player who’s actually fighting back gets out before the throw. it also shields against the worst feeling case, where the hold just deletes you with nothing to do about it. and while I was in there: the goal list had two goals at priority 4, whichmeant the sentinel’s behavior was occasionally picking the wrong thing to doat the same weight. renumbered so the hierarchy actually means something. next up the dragon’s hoard, the sentinel’s other moves, and the stronghold is still missing its advancements - the burrow is found, but it doesn’t have a single achievement attached to finding it. that’s next. the fights are starting to feel like they have a conversation with you now.the dragon tells you what it’s about to do, and you get to do something about it. That is the top view of the crown sentinel btw, it looks pretty dope imo"}, {"post_id": 57406, "ts": "2026-08-29T15:28:56Z", "hours": 10.3303, "text": "Devlog 25 Wrapping things up Hi guys, this was mostly wrapping up the project. I have had a lot of fun working on the project, but I want to ship soon, maybe at like 200 hours. I hope everyone has enjoyed watching my progress on this, as I thoroughly enjoyed working on it myself. I hope everyone gets a chance to try it out and give some feedback. Models I touched up some 3d models and improved them a bit, making them look a bit cleaner. I touched the void stalker’s model, and the dragon’s model primarily Loot tables I customized the loot tables for a lot of the custom or modified structures like the stronghold to be a lot nicer and more fitting towards the endesium mod. They are a lot stronger, but not too OP I’d say. Nothing much else done I know I spent 10 hours coding, but I didn’t get much done because of how long I spent wondering what to do lol."}, {"post_id": 57050, "ts": "2026-08-29T03:50:55Z", "hours": 2.9678, "text": "Devlog 24 - Making the Stronghold Even Better hey guys. DEVLOG_23 was about replacing the vanilla stronghold - the layout, the rooms, the portal cathedral. and it shipped, and it worked, and then i walked back through it and something was off. the shape was right but the rooms read empty. a big citadel of bare stone is just a bigger version of the problem i was trying to kill. so yesterday/today was the boring pass nobody gets excited about in a change log: making rooms feel lived in. the noise every room had the bones but none of the clutter. so i went room by room and dressed them like actual inhabitants left mess behind: wall shelf rows with candles on top, sconce rows down the hall, two-tone floor tiles instead of one flat slab clustered corners - reading nooks, work benches, storage piles - instead of hanging lanterns and chandeliers where the ceiling actually had headroom for them crypts and catacombs got coffin rows, skull niches, soul lanterns barracks got lockers, footlockers, armor stands treasury got actual stacks of gold, not a promise of gold gardens finally read as gardens - flower meadows instead of a dirt square and corridors stopped being dead space: candle runs, clutter, tiled edges.it’s not glamorous but it’s the difference between a structure and a place. three new district wings once the rooms felt alive, the citadel wanted more than the hub spine. so it grew three themed districts, and i love how they ground the place: Forge - a contained lava pit ringed in polished deepslate, anvils, furnaces, coal stores. the stronghold had no industry before; now it reads like it smiths something down there. Dining Hall - a proper mess: table rows, benches, chandeliers. a fortress this size would have somewhere to eat. Prison - iron-bar cells, chains, a witch behind the barracks. every good stronghold needs a brig. plus a monumental columned entrance to the Great Descent Hall, an amethyst landing dais, cross-bridges over the Star well, a grand staircase dropping from the cathedral gallery, and a carpet runner down every corridor so you always know you’re on the path. Also started playing hades :P"}, {"post_id": 56657, "ts": "2026-08-28T14:38:37Z", "hours": 15.6544, "text": "Devlog 23 - The Stronghold Update hey guys.for a while now the Endesium identity stopped at the end. everything past theportal was ours - the island, the dragon, the resonance, the gear - but the road to it was still vanilla’s stronghold. a cramped maze of hallways and libraries copy-pasted a hundred times, holding the exact same end portal the game shipped with in 2011. it never matched. the mod’s big gate got the smallest room in the game.that’s done now. the vanilla stronghold is gone and the Endesium stronghold replaced it: a buried citadel that previews the end without spoiling it. this one took a while, so let me walk the whole thing. the layout: a citadel vanilla strongholds are random. rooms are scattered, corridors dead-end,libraries repeat, and the portal is wherever the RNG put it. the Endesium stronghold is authored : a fixed, connected, three-times-bigger floor plant that always works. a Great Descent Hall buries you - a switchback staircase that drops from the surface as much as 90 blocks down into the stone, red runner carpet down the aisle, end rods lighting the way, two vindicator sentinels waiting at the top. a sealed Arrival Vault is what the eye of ender actually points at: a quiet chamber with a radial purple sigil on the floor and exactly one grounded door - the route onward, always. - the Hub is the spine: an atrium with a carpeted floor, a central resonance dais (amethyst block, end rod, the works), purpur pillars at the cardinal axes, bookshelves and barrels lining every wall, bats circling the ceiling, and a real staircase up to the gallery instead of a visual platform. junctions are readable - four grounded route markers plus a carpet cross - so you never need signs to find your way. the rooms sixteen distinct room kinds, every one hand-dressed:- Library - bookshelves three shelves high around the walls, two lecterns, a chiseled-bookshelf reading dais, blue carpet, bats.- Treasury - iron-bar vault bars with a single gap, chests and barrels in rows, gold, candles, and a captain guarding the middle.- Guard Post - weapon racks (fence posts) with candles, a phantom spawner in the center, two vindicators on the door.- Sanctum - end stone brick floor, purpur pillars, crying obsidian and a chorus plant on a pedestal, purple carpet, an enderman spawner , a live enderman pacing the corner.- Barracks - four red beds with proper head/foot parts, smoker, furnace, crafting table, three guards on duty.- Scriptorium - lecterns with candles, bookshelves and chiseled shelves, a cauldron of ink, a bat haunting the rafters.- Arboretum - a glass-ceilinged garden: dirt floor, flowering azaleas, ferns, moss carpet, a lily pad pond.- Observatory - concentric purpur ring inlays, an amethyst telescope-core, end-rod instruments along the walls.- Resonance Engine - amethyst conduit pillars with end-rod emitters and a crying obsidian reactor - the end’s power plant, studied safely from outside the portal.- Bastion - deepslate pillars, an iron-bar partition, weapon racks, a captain and two guards. military.- Conservatory - chorus plants and chorus flowers growing on end stone, flower pots and moss, an enderman in residence.- Reliquary - concentric obsidian ritual rings, an ender chest at the heart, candles, a captain standing watch.- Portal Cathedral what’s next the stronghold finally reads like the end’s doorstep. next up is the rest ofthe ten-hour pass - every file retyped, every line deliberate - and afterthat, the bosses and dragon still want their second pass of polish. but thegate is fixed. you’ll never walk vanilla’s cramped hallways to the end again."}, {"post_id": 55578, "ts": "2026-08-27T15:02:09Z", "hours": 16.8225, "text": "Devlog 22 - End Fight Update (again)hey guys.this one’s a two-day entry. yesterday was the sky getting alive and the gear lines finally clicking together into actual fighting systems. today was the dragon. the end fight has been building layers for a while - phases, enrage,scripted moves - but it still had one big problem: the first dragon barely used any of it. that’s fixed now. the first kill is the fight now. therespawned one is the nightmare. yesterday - 8/26the sky got three new mobssky jelly, galefin, and deep lurker went in (that one got its own devlog - 21).the sky half of AmbientSkyManager fills the air with biome motes when youfly high, and the deep half keeps the under-island dark honest: lurkersspawned into the black pockets below the heightmap, capped so the deep end isominous without ever becoming a wall.the sets became systemsthe luminous, ash, and null sets each got a cross-set layer inEndgearSetBonuses - wear the full set and hold that line’s tool andarmor + weapon merge into one fighting identity: luminous + prism grip - speed II and haste II while channelling; every hit blinds with a flash (3 true damage + glowing) and sparks light shards.ash + ember core - fire resistance while channelling; hits stoke the burn for 2 extra seconds and throw weight behind the strike.null + erased edge - strength I and haste I; every hit shreds 4 armor durability off the target and drags them into the blade. and the void set finally got its signature: hover. full void set, sneak inthe air, and you stop falling - a gentle drift at -0.12 blocks/tick instead ofa tumble, with void motes trailing under you. it pairs with the sword’ssingularity for total sky control, and it’s the boots’ tooltip promise kept. today - 8/27the dragon actually fights nowthefour-phase fight controller - impact dives, shockwaves, screeches, gales,storms, collapses, the final roar, catastrophe - now runs on the firstdragon too. before, the first kill was vanilla strafing plus harassment, andall the authored grammar was locked behind the respawned dragon. that gate isgone. the first dragon opens with the full attack schedule, escalates throughall four phases, and the transformation still makes things worse: 1.6x scaleand the resonance-exclusive moves are still the awakened dragon’s alone.the pillars became cooler with new mechanicscrystals were just a heal before. now the aegis is a shield:- every surviving pillar grants the dragon 10% damage reduction (capped at 60%), so clearing the pillars is a real first phase, not an optional chore.- destroying a crystal detonates at its pillar with a roar.- the last crystal falling breaks the aegis: the dragon is staggered for five seconds and takes +40% damage, a wisp wave pours out, and the next scripted set-piece fires immediately. that’s your payoff window. set-pieces are guaranteed nowscripted specials used to roll a dice every tick. now they’re scheduled:one opens the fight about thirty seconds in, every enrage escalationforces the next one within a second, and a broken aegis queues one on thespot. the random cadence only fills the gaps. you will see these moves, everyfight, on purpose. two new attacksOblivion Charge (enrage 2+, set-piece) - the dragon climbs high, paints a straight lane through the nearest player with end-rod markers, then dives it twice, tearing through anyone on the line and leaving void-fire wakes in its path. get off the lane.- Resonance Collapse (transformed dragon only) - drags every player toward the dragon for three seconds with converging rings, then detonates at its position. gain distance and find cover; standing still loses."}, {"post_id": 55084, "ts": "2026-08-26T15:11:55Z", "hours": 5.3419, "text": "Devlog 21 hey guys.the End’s been empty for a while. the ecology mobs live on the islands, thebosses live under them, but the sky itself was a void. this one fixes that,and it brings back something else that was missing: three new mobs three new mobs Sky Jelly - ambient, drifts with the wind. a soft bell of a thing withfour trailing tentacles, pulsing gently and leaving end-rod motes behind it.it bobs upward every now and then like it’s breathing. 8 hp, doesn’t careabout you. just ambient. Galefin - the fastest thing in the End. a sleek sky-fish that cutsthrough the air at 0.75 flying speed and avoids you entirely - the momentyou get within 12 blocks it’s gone. 4 hp. you see them flicker past in thecorner of your eye more than you ever actually look at one. Deep Lurker - this is the mean one. it lives below the islands, in thedark air pockets under the heightmap, and it waits. 22 hp, leaps at you,does real damage. when one spawns you get a portal-particle burst as awarning, and then you have maybe a second to look down.all three are geckolib animated - jelly pulses, galefin swims, lurker idleswith a slow head sway - and all three have spawn eggs and their own loottables. the sky and the deep are managed now AmbientSkyManager runs two server-side systems: sky half - if you’re flying more than 12 blocks above the surface, theair around you fills with biome motes (highland wind, lumen motes, endwastes dust). it makes flying at height feel alive instead of empty. deep half - a managed lurker spawner. every 5 seconds it looks for darkpockets below the islands: solid floor, air to spawn in, brightness under 7,at least 34 blocks of island above you. spawns are capped at 6 lurkerswithin 96 blocks per player, so the deep end gets ominous without everbecoming a wall of them. what’s nextthe deep end is less empty now, but it’s still just lurking. the design docskeep pointing at something bigger under the islands - the Umbral Reach - andthe sky could always use more than motes. more ambient life is on the table."}, {"post_id": 54927, "ts": "2026-08-26T05:00:01Z", "hours": 6.7258, "text": "Devlog 20 - Three New Sets this one adds the thing that’s been missing since the void set went in being actual custom armor that isn’t void. Luminous, Ash, and Null are new. 12 armor pieces, 15 tools, all with their own textures, their own powers, and their own place in the creative tab. ##the new sets the void set already had its silhouette and its trim workflow. the new sets follow the same P-mode two-layer model so trims work the same, but they’re recolored palettes with their own read:- Luminous gold-cyan, glassy, the grove’s light. high enchantability, diamond-tier defense with a light-mobility kit.- Ash gray-ember with ember-orange highlights, volcano-forged. slightly lighter than void but built for fire.- Null violet-void, deleted matter. void-tier defense, hungrier enchant cost, gravity-deletion kit. you can read them now none of the three sets had working names before — datagen was fine, but the generated lang had Luminous_helmet with a capital L, so the game looked for item.endesium.luminous_helmet and found nothing. 26 keys showed item.endesium.___ in inventories. src/main/generated/assets/endesium/lang/en_us.json is now lowercase for all luminous/ash/null armor and tools, the phantom Ash_boots is gone. hover a luminous sword and it actually says luminous sword. armor is per-piece now new rule: every single piece does something on its own. the full set is an upgrade, not the only reason to wear it. Luminous — the grove’s light — GearAbilities per piece + tooltips on GearArmorItem : helmet Gleamsight – night vision while worn- chest Radiant Aegis — attackers get glowing 8s; full set Prism Ward adds darkness 3s + 3 magic burn-back- leggings Lightspeed — speed I (II with full set)- boots Lumen Leap — jump II Ash — the volcano — volcano kit, fire is fuel:- helmet Ember Crown — fire resistance while worn- chest Searing Plate — attackers ignite 4s; burning/in lava gives strength I- leggings Magma Blood — regen I while burning/in lava- boots Ashwalker — stand on lava, and now hold shift in lava to sink at -0.18/tick to -0.55 like scaffolding, release and you stay down with LAVA puffs every 4tfull ash Volcanic Heart is permanent strength I. the set wants you in lava. Null — deleted matter — Erased Mind helmet purges levitation/darkness/nausea every tick, Erased Wound chest gives absorption 5s on hit, Weightless leggings no fall damage, Null Step boots +1 step height via attribute, full set Void Body deletes 25% of incoming projectiles with smoke + shield block feedback. what’s next more landmark variants, ambient life for the empty skies, and the deep end is still sitting there being ominous. Sorry, no sneak peak yet - still not finished yet"}, {"post_id": 54260, "ts": "2026-08-25T04:47:26Z", "hours": 6.335, "text": "Devlog #19 Sorry for the random numbering before - i guess i suck at counting. Anyways, devlog. Updated structures Before, structures were just decoration and weren’t technically vanilla structures (kaupenjoe misled me). However, I managed to turn them into structure with help from OpenCode. I also added some new structues, like a castle (needs some works still), some new cathedrals, willowtree trunk, etc. I am adding some more custom armor, and I will make it cool with cool abilities. Custom armor My plan for custom armor includes: Luminous armor (infinite night vision, light level control panel, more ideas to come), Ash armor (fire-related abilities, ashwalker boots already exist) Null armor (i have no idea on what to do for this, but it sounds cool) Dragon fight Improve the dragon fight so it has several new stages Made it so that it spawns void wisps here and there Added a bunch of new drops it gives, working on adding Dragon Wings (slow but give iron-chestplate armor level) What’s next? Add the custom armor and tools and weapons Finish the dragon fight so it is exceptional"}, {"post_id": 53838, "ts": "2026-08-24T15:09:54Z", "hours": 13.1583, "text": "Devlog 16 Short one, but it is the one I have been putting off. The dragon fight was authored with attacks, phases, telegraphs but the pillars were just decor and the last third of the health bar played identically to the first. The pillars fight back Crystal aegis is the simplest thing in the world: while crystals stand, thedragon heals. One line of health regen did more for the fight’s shape than anyattack I have authored, because it moves the win condition backwards. You donot win by out-DPS-ing a health bar; you win by climbing pillars under fire.Five crystals means two HP a second, which is enough to visibly undo a sloppyopening. That is the fight telling you it is watching. Enrage is a ladder, not a switch Three thresholds - 60, 35, 15 percent - each announced, each spawning void wisps into the arena. The wisps are not the threat; they are the clock . Every second you spend swatting a wisp off your back is a second the dragon is cycling toward catastrophe. From enrage two the dragon leaves breath pools under its flight path, which turns its flyovers into map control. killing the dragon The kill now drops a real pile: heart, fangs, bone, resonant scales. First kill still fires the transformation. /dragonfight gives a live readout for tuning the curve without guessing. Notes for next time The wisps cap at eight; if playtests say the floor is unreadable, that cap is the first knob. Aegis regen is intentionally visible (1-2 HP/s). If it feels unfair, the fix is fewer crystals required, not slower regen. Docs live in docs/DRAGON_FIGHT.md now, including the testing checklist."}, {"post_id": 53144, "ts": "2026-08-23T16:05:28Z", "hours": 10.3856, "text": "Devlog 15 this one is mostly bug fixing, and I lowkey should have done it a while ago. two big ones got found and killed. bosses were not spawning properly the wardens were supposed to be standing in every flagship - crypt floors, balcony rings, throne daises, all of it. and most of them just werent there. I found out that the placement helper was asking for a heightmap that doesn’t even exist yet during world gen. so the game would try to figure out where the ground was, get garbage back, fail the collision check, and die To fix it, I (and opencode) used the surface heightmap that actually works mid-generation, check footing with real collision shapes instead of vibes, and stop teleporting interior wardens to the roof. a warden meant to stand in a crypt now stands in the crypt. if there’s genuinely nowhere legal to stand, we log it loudly instead of pretending everything’s fine. the structure grid I noticed flagships spawn in a straight line. I then found out the placement gate checked chunk coords against two fixed numbers with modulo math - which doesn’t pick ONE spot per cell, it picks EVERY chunk that matches the mod. so the game was building a perfect lattice. cathedral, 160 blocks, cathedral, 160 blocks, forever, in neat little rows like crops. landmarks had the same bug at 256 block scale. both features now hash the cell coordinates themselves to pick a single host chunk per region per cell, so every attempt lands somewhere different. flagships also got pushed out to a 384 block minimum since they’re supposed to be rare landmarks. what’s next back to content. more landmark variants, ambient life in the skies, the deep end is still sitting there on the roadmap being ominous."}, {"post_id": 52823, "ts": "2026-08-23T05:32:07Z", "hours": 4.1633, "text": "Devlog 14 hey guys. another one. smaller than 13 but a lot of the actual gameplay got wired up this time. void gear is done netherite-tier stats: 2031 durability, 9.0 attack damage, 4.0 speed. sword, pickaxe, axe, shovel, hoe — full tool set, all void ingot + stick.the armor follows the void set: helmet, chestplate, leggings, boots. two-layer P-mode armor model with gold shoulder plates. helmet has the retexture layers. the full set bonus is coming later but the base is solid. void ingot chain works: void gem -> smelt -> void ingot. ingot <-> 9 nuggets. void brick from void slate (2x2). slab, stairs, wall. all the recipes are wired up in datagen. black holes hold void sword for 5 seconds with the full void set -> singularity fires 6 blocks ahead, pulls everything in a 14 block radius for 8 seconds, 5 minute cooldown. the HUD has a charge bar now: resonance cyan rising to pale glow, ancient gold pulse when full. the label “VOID SINGULARITY” sits above it.this is client-side display only. the actual singularity logic lives on the server through the use item tick. sonic boom elbyra + resonant wings -> press R -> sonic boom fires. client sends a packet, server validates wings + cooldown + alive-ness before executing. keybind registered on client tick. the client is finally wired all 13 entities now have renderers. the crash where any entity without a renderer NPE’d the level renderer is gone. particles registered (void skirt mote), block render layers set for void glass and mireglass (translucent), guidebook screen opens on right-click.dragon armor model layer registered for the resonant wings passives. what was deleted the old void stalker entity, old resonance lens item, old void shard item, old foundation test block, and the old generated loot/recipe/advancement JSONs for them — all removed. everything has been replaced by the production versions.## what’s nextmore ruin variants for the landmark tier, ambient life for the empty skies, maybe the deep end. see the roadmap. go find a black hole.!!! (the black box is the singularity/black hole)"}, {"post_id": 52693, "ts": "2026-08-22T23:37:07Z", "hours": 8.1931, "text": "Update - What I have worked on I have added a custom mini boss per biome, and I have also added a custom big boss that drops op loot. I am working on names and textures, but this is a WIP. This is going really well so far. Future yap I am going to figure out a name for each item, some custom weapons and abilities, then I will balance out the game a bit. Right now, it is too easy to kill a boss, so I will make them harder."}, {"post_id": 52103, "ts": "2026-08-22T05:44:55Z", "hours": 8.0386, "text": "Devlog #12 Hi guys! I added a lot here. Instead of having multiple small structures that are sort of just arbitrary, I made it so that there is just 1 big but incredible structure per custom biome in my end mod. This makes it feel so much cleaner and nicer, and although there are still some bugs that need to be patched, I plan on improving them a lot. Here are some screenshots that I took of updated structures. I plan to make a lot more and better structures in the futures (also the volcano is split in half so you (the ppl) could see the inside with a vault room)"}, {"post_id": 51443, "ts": "2026-08-21T04:51:58Z", "hours": 11.3122, "text": "Devlog 12 this one is huge. i rebuilt basically every system in the mod and fixed a mountain of bugs that were making the whole thing feel broken. endesium finally feels so much better now and actually playable. Updates: Black holes: the void sword’s signature ability actually works now. hold right-click for 4 seconds with full void armor on and a singularity spawns 6 blocks ahead of your crosshair. it pulls mobs, items, everything within 14 blocks with an inverse-square gravity curve plus an orbital swirl near the core, shreds anything caught inside, then implodes after 8 seconds with falloff damage. accretion disc particles orbit it while it’s live. 5 minute cooldown because it is absolutely devastating. full void set makes you immune to your own hole. Void armor + tools: the whole set got redone from scratch. armor textures are now built directly off vanilla netherite’s palette structure (same silhouette, same transparency map) but re-tinted to abyssal navy with cyan seams and gold shoulder trim, so it renders perfectly on the body — no more magenta mannequin glitch. tools now have true netherite stats: 2031 durability, 9.0 speed, 4.0 damage bonus, proper attack speed/damage attributes on every tool so tooltips show real numbers. pickaxe has an AoE resonance blast, axe has a dash, sword applies slow on hit. Ten landmark structures: every biome got a flagship now, not just perimeters. the ashen expanse has a 28-block stratovolcano with lava falls and a hidden obsidian vault, plus a lava-moated bastion fortress. luminous groves has a 27x27 lumen castle with prism-roofed towers. void skirts has a prison citadel with a 16-block spire and nullwalker wardens. there’s also a wastes cathedral with a crypt, a chorus mother tree, a highland lighthouse with a working beacon, a sunken mire cathedral, a crystal sanctum palace, a crown spire, and a null citadel. each one has exclusive loot you can’t get anywhere else, a guardian mob spawner, environmental dangers, and a resonance mechanism to wake. Item art overhaul: every custom item got handcrafted pixel art instead of flat recolors. edge-darkening, biome-specific palettes (lumen lime, ashen fire, crystal lilac, marsh teal), gold flecks on highlights. skyglass shards are faceted ice-blue, the windscar winch is a bronze gear with a hook, prism seeds have rainbow gradients. also resized everything that was clipping outside its inventory slot. Guidebook rewrite: went from 36 pages to 42 across 8 tabs. every biome gets its own page covering blocks, mobs, and landmarks. new pages for the landmark index, biome relics, exclusive loot tables, and the full tool/armor ability breakdown. if it’s in the mod, it’s in the book now. /locate support: added /endesium locate biome and /endesium locate structure commands so you can find any of the ten biomes or any structure from the command line. no more wandering the void for an hour looking for the volcano. Whats next? Dragon fight polish: the respawned dragon phases work but the telegraphs could be way more readable. i want distinct visual tells before each resonance attack. Sound design: most sounds reuse vanilla assets right now. custom .ogg recordings for the black hole ambience and landmark mechanisms would be great as well. More structure variants: the flagships are rare by design, but smaller biome-specific ruins between them would make exploration feel less empty."}, {"post_id": 50774, "ts": "2026-08-20T04:31:52Z", "hours": 4.8667, "text": "Devlog 12 - a shorter one I am working on adding cool stuff like black holes to my end update mod. I want to make it so that if you get full void armor and right click your void sword for 5 seconds, it summons a black hole (with a long cooldown) that affects every entity thats not wearing any piece of void armor. It may look something like in the image below. I don’t have much to yap about here; sorry :P"}, {"post_id": 50352, "ts": "2026-08-19T15:07:19Z", "hours": 10.3525, "text": "Devlog 11hey guys.some pretty large changes were added.I’ve been working on a big stability and polish pass over the whole mod, fixing a bunch of long-standing issues from the brutal audit and making the realm feel a lot more solid.Updates:- Guidebook clarity: The guidebook was pretty blurry in the inventory, so I fixed the item model to use an integer scale with no rotation, and reworked the screen to draw all the text with shadows. It reads crisp at any GUI scale now, and I added a bunch of new pages - field notes on the ruins, a crafting reference, and notes on the resonance system.- Structure stability: Ruins, spires, and archives used to check support at the origin column’s height, which meant they could float over dips or clip into rises on sloped terrain. I switched all three landmark features to per-column support checks, so each column is sampled at its own surface height. They sit on real ground now.- Far chunk writes: The landmark builders were writing blocks into chunks outside the generating region, which triggered “setBlock in a far chunk” warnings and risked corrupting already-saved chunks. I added a write gate to StructurePlacement that refuses any write outside the generating 3x3 region, so the warnings are gone and the footprints still fit fine.- Resonance system: The Resonance attachment was dead code - it had get and add helpers but nothing ever called them. I built a ResonanceSystem that grants resonance when you defeat Endesium mobs, with tier notices when you cross thresholds. It’s wired into the mod now and persists per player.- Texture fixes: void_gravel.png was 15x16 instead of 16x16, which made it shimmer. I wrote a script that pads any non-power-of-two texture up to the next power of two by repeating edge pixels, and swept the whole texture tree so nothing else can regress.- Verification tooling: I added audit_verify.py, a read-only script that checks every audit fix is present in the source tree, plus a guidebook-specific verifier. It exits non-zero on failure so I can run it in CI or before every release.## Whats next?- Resonance recipes: Now that the resonance system is wired, I want to gate some of the later recipes on resonance tiers so progression through the realm actually matters.- Landmark system: The hand-authored structures work, but I’m thinking about moving the big-footprint ones over to the vanilla Structure system so they get proper bounding-box arbitration instead of the write gate.- More guidebook content: The book is a lot better now, but I want to add an interactive region map and maybe a bestiary section before the next devlog. Also some roti buns i had while coding :P"}, {"post_id": 50065, "ts": "2026-08-19T03:36:42Z", "hours": 1.1294, "text": "added a guidebook to my end update mod. This is a simple update, nothing much. I made it look nice, though a bit blurry. I will fix it, then continue improving the rest of the mod. :D"}, {"post_id": 49637, "ts": "2026-08-18T15:02:34Z", "hours": 8.5408, "text": "Devlog - I improved the biomes and structures in my end update mod by a solid bit. There are now volcanoes in the ashen expanse (WIP), monuments, etc. I am also adding a new guidebook that you get by killing the updated ender dragon to help you in your journey of understanding Endesium and conquering the end."}, {"post_id": 48942, "ts": "2026-08-17T14:44:08Z", "hours": 7.7394, "text": "Update on my end update mod: I added several new biomes - the ashen expanse, luminous grove, shattered highlands, umbral reach, void crown, void marshes, and void skirts. I am working on adding mobs and structures unique to each biome to give it some life, but it is coming together really well."}, {"post_id": 48653, "ts": "2026-08-17T04:16:39Z", "hours": 6.1225, "text": "I’m now doing a deep overhaul of the ender dragon fight in my end update mod. I am adding several new attacks, stages, updating the terrain, etc. I am making this much bigger than what is in the base game, and I am also making it so that it can spawn subminions. Overall, the mod is going very well."}, {"post_id": 48429, "ts": "2026-08-16T19:34:55Z", "hours": 4.3747, "text": "updated main end island to be of many parts. I made it so that there’s a central arena, ruins, ridges, fractures (the part visible in the sc), spires, etc."}, {"post_id": 47874, "ts": "2026-08-16T04:11:16Z", "hours": 4.8725, "text": "added two new biomes to my end mod. I added the end wastes and the chorus wilds. Added some structures and new blocks to give it some life, and as well as added the new mob (void stalker) to it. I am working on adding the next BIG biome - the Deep End (and then after that is the void realm)"}, {"post_id": 47615, "ts": "2026-08-15T16:54:50Z", "hours": 5.5167, "text": "Progress Update – Last 5.5 hours Added a bunch of custom items to my end mod, working on adding functionality to different items. It is going very well overall, thank you kaupenjoe for the yt tutorial!"}, {"post_id": 47294, "ts": "2026-08-15T04:52:46Z", "hours": 3.9925, "text": "Setting up some new blocks that are end themed (this one was bugged, working on fixing it.) Adding new biomes, etc."}, {"post_id": 47020, "ts": "2026-08-14T16:43:21Z", "hours": 3.4886, "text": "modeled a mob, created basic implimentation for the void stalker (name of the mob)"}, {"post_id": 46704, "ts": "2026-08-14T04:36:26Z", "hours": 3.2261, "text": "set up a full repository for the minecraft mod endesium (just an end update because mojang hasn’t made one)"}]...
|
Title: Endesium by @nikhil_nagaraj | Stardance
De Title: Endesium by @nikhil_nagaraj | Stardance
Devlogs:
set up a full repository for the minecraft mod endesium (just an end update because mojang hasn’t made one)
modeled a mob, created basic implimentation for the void stalker (name of the mob)
Setting up some new blocks that are end themed (this one was bugged, working on fixing it.) Adding new biomes, etc.
Progress Update – Last 5.5 hours Added a bunch of custom items to my end mod, working on adding functionality to different items. It is going very well overall, thank you kaupenjoe for the yt tutorial!
added two new biomes to my end mod. I added the end wastes and the chorus wilds. Added some structures and new blocks to give it some life, and as well as added the new mob (void stalker) to it. I am working on adding the next BIG biome - the Deep End (and then after that is the void realm)
updated main end island to be of many parts. I made it so that there’s a central arena, ruins, ridges, fractures (the part visible in the sc), spires, etc.
I’m now doing a deep overhaul of the ender dragon fight in my end update mod. I am adding several new attacks, stages, updating the terrain, etc. I am making this much bigger than what is in the base game, and I am also making it so that it can spawn subminions. Overall, the mod is going very well.
Update on my end update mod: I added several new biomes - the ashen expanse, luminous grove, shattered highlands, umbral reach, void crown, void marshes, and void skirts. I am working on adding mobs and structures unique to each biome to give it some life, but it is coming together really well.
Devlog - I improved the biomes and structures in my end update mod by a solid bit. There are now volcanoes in the ashen expanse (WIP), monuments, etc. I am also adding a new guidebook that you get by killing the updated ender dragon to help you in your journey of understanding Endesium and conquering the end.
added a guidebook to my end update mod. This is a simple update, nothing much. I made it look nice, though a bit blurry. I will fix it, then continue improving the rest of the mod. :D
Devlog 11hey guys.some pretty large changes were added.I’ve been working on a big stability and polish pass over the whole mod, fixing a bunch of long-standing issues from the brutal audit and making the realm feel a lot more solid.Updates:- Guidebook clarity: The guidebook was pretty blurry in the inventory, so I fixed the item model to use an integer scale with no rotation, and reworked the screen to draw all the text with shadows. It reads crisp at any GUI scale now, and I added a bunch of new pages - field notes on the ruins, a crafting reference, and notes on the resonance system.- Structure stability: Ruins, spires, and archives used to check support at the origin column’s height, which meant they could float over dips or clip into rises on sloped terrain. I switched all three landmark features to per-column support checks, so each column is sampled at its own surface height. They sit on real ground now.- Far chunk writes: The landmark builders were writing blocks into chunks outside the generating region, which triggered “setBlock in a far chunk” warnings and risked corrupting already-saved chunks. I added a write gate to StructurePlacement that refuses any write outside the generating 3x3 region, so the warnings are gone and the footprints still fit fine.- Resonance system: The Resonance attachment was dead code - it had get and add helpers but nothing ever called them. I built a ResonanceSystem that grants resonance when you defeat Endesium mobs, with tier notices when you cross thresholds. It’s wired into the mod now and persists per player.- Texture fixes: void_gravel.png was 15x16 instead of 16x16, which made it shimmer. I wrote a script that pads any non-power-of-two texture up to the next power of two by repeating edge pixels, and swept the whole texture tree so nothing else can regress.- Verification tooling: I added audit_verify.py, a read-only script that checks every audit fix is present in the source tree, plus a guidebook-specific verifier. It exits non-zero on failure so I can run it in CI or before every release.## Whats next?- Resonance recipes: Now that the resonance system is wired, I want to gate some of the later recipes on resonance tiers so progression through the realm actually matters.- Landmark system: The hand-authored structures work, but I’m thinking about moving the big-footprint ones over to the vanilla Structure system so they get proper bounding-box arbitration instead of the write gate.- More guidebook content: The book is a lot better now, but I want to add an interactive region map and maybe a bestiary section before the next devlog. Also some roti buns i had while coding :P
Devlog 12 - a shorter one I am working on adding cool stuff like black holes to my end update mod. I want to make it so that if you get full void armor and right click your void sword for 5 seconds, it summons a black hole (with a long cooldown) that affects every entity thats not wearing any piece of void armor. It may look something like in the image below. I don’t have much to yap about here; sorry :P
Devlog 12 this one is huge. i rebuilt basically every system in the mod and fixed a mountain of bugs that were making the whole thing feel broken. endesium finally feels so much better now and actually playable. Updates: Black holes: the void sword’s signature ability actually works now. hold right-click for 4 seconds with full void armor on and a singularity spawns 6 blocks ahead of your crosshair. it pulls mobs, items, everything within 14 blocks with an inverse-square gravity curve plus an orbital swirl near the core, shreds anything caught inside, then implodes after 8 seconds with falloff damage. accretion disc particles orbit it while it’s live. 5 minute cooldown because it is absolutely devastating. full void set makes you immune to your own hole. Void armor + tools: the whole set got redone from scratch. armor textures are now built directly off vanilla netherite’s palette structure (same silhouette, same transparency map) but re-tinted to abyssal navy with cyan seams and gold shoulder trim, so it renders perfectly on the body — no more magenta mannequin glitch. tools now have true netherite stats: 2031 durability, 9.0 speed, 4.0 damage bonus, proper attack speed/damage attributes on every tool so tooltips show real numbers. pickaxe has an AoE resonance blast, axe has a dash, sword applies slow on hit. Ten landmark structures: every biome got a flagship now, not just perimeters. the ashen expanse has a 28-block stratovolcano with lava falls and a hidden obsidian vault, plus a lava-moated bastion fortress. luminous groves has a 27x27 lumen castle with prism-roofed towers. void skirts has a prison citadel with a 16-block spire and nullwalker wardens. there’s also a wastes cathedral with a crypt, a chorus mother tree, a highland lighthouse with a working beacon, a sunken mire cathedral, a crystal sanctum palace, a crown spire, and a null citadel. each one has exclusive loot you can’t get anywhere else, a guardian mob spawner, environmental dangers, and a resonance mechanism to wake. Item art overhaul: every custom item got handcrafted pixel art instead of flat recolors. edge-darkening, biome-specific palettes (lumen lime, ashen fire, crystal lilac, marsh teal), gold flecks on highlights. skyglass shards are faceted ice-blue, the windscar winch is a bronze gear with a hook, prism seeds have rainbow gradients. also resized everything that was clipping outside its inventory slot. Guidebook rewrite: went from 36 pages to 42 across 8 tabs. every biome gets its own page covering blocks, mobs, and landmarks. new pages for the landmark index, biome relics, exclusive loot tables, and the full tool/armor ability breakdown. if it’s in the mod, it’s in the book now. /locate support: added /endesium locate biome and /endesium locate structure commands so you can find any of the ten biomes or any structure from the command line. no more wandering the void for an hour looking for the volcano. Whats next? Dragon fight polish: the respawned dragon phases work but the telegraphs could be way more readable. i want distinct visual tells before each resonance attack. Sound design: most sounds reuse vanilla assets right now. custom .ogg recordings for the black hole ambience and landmark mechanisms would be great as well. More structure variants: the flagships are rare by design, but smaller biome-specific ruins between them would make exploration feel less empty.
Devlog #12 Hi guys! I added a lot here. Instead of having multiple small structures that are sort of just arbitrary, I made it so that there is just 1 big but incredible structure per custom biome in my end mod. This makes it feel so much cleaner and nicer, and although there are still some bugs that need to be patched, I plan on improving them a lot. Here are some screenshots that I took of updated structures. I plan to make a lot more and better structures in the futures (also the volcano is split in half so you (the ppl) could see the inside with a vault room)
Update - What I have worked on I have added a custom mini boss per biome, and I have also added a custom big boss that drops op loot. I am working on names and textures, but this is a WIP. This is going really well so far. Future yap I am going to figure out a name for each item, some custom weapons and abilities, then I will balance out the game a bit. Right now, it is too easy to kill a boss, so I will make them harder.
Devlog 14 hey guys. another one. smaller than 13 but a lot of the actual gameplay got wired up this time. void gear is done netherite-tier stats: 2031 durability, 9.0 attack damage, 4.0 speed. sword, pickaxe, axe, shovel, hoe — full tool set, all void ingot + stick.the armor follows the void set: helmet, chestplate, leggings, boots. two-layer P-mode armor model with gold shoulder plates. helmet has the retexture layers. the full set bonus is coming later but the base is solid. void ingot chain works: void gem -> smelt -> void ingot. ingot <-> 9 nuggets. void brick from void slate (2x2). slab, stairs, wall. all the recipes are wired up in datagen. black holes hold void sword for 5 seconds with the full void set -> singularity fires 6 blocks ahead, pulls everything in a 14 block radius for 8 seconds, 5 minute cooldown. the HUD has a charge bar now: resonance cyan rising to pale glow, ancient gold pulse when full. the label “VOID SINGULARITY” sits above it.this is client-side display only. the actual singularity logic lives on the server through the use item tick. sonic boom elbyra + resonant wings -> press R -> sonic boom fires. client sends a packet, server validates wings + cooldown + alive-ness before executing. keybind registered on client tick. the client is finally wired all 13 entities now have renderers. the crash where any entity without a renderer NPE’d the level renderer is gone. particles registered (void skirt mote), block render layers set for void glass and mireglass (translucent), guidebook screen opens on right-click.dragon armor model layer registered for the resonant wings passives. what was deleted the old void stalker entity, old resonance lens item, old void shard item, old foundation test block, and the old generated loot/recipe/advancement JSONs for them — all removed. everything has been replaced by the production versions.## what’s nextmore ruin variants for the landmark tier, ambient life for the empty skies, maybe the deep end. see the roadmap. go find a black hole.!!! (the black box is the singularity/black hole)
Devlog 15 this one is mostly bug fixing, and I lowkey should have done it a while ago. two big ones got found and killed. bosses were not spawning properly the wardens were supposed to be standing in every flagship - crypt floors, balcony rings, throne daises, all of it. and most of them just werent there. I found out that the placement helper was asking for a heightmap that doesn’t even exist yet during world gen. so the game would try to figure out where the ground was, get garbage back, fail the collision check, and die To fix it, I (and opencode) used the surface heightmap that actually works mid-generation, check footing with real collision shapes instead of vibes, and stop teleporting interior wardens to the roof. a warden meant to stand in a crypt now stands in the crypt. if there’s genuinely nowhere legal to stand, we log it loudly instead of pretending everything’s fine. the structure grid I noticed flagships spawn in a straight line. I then found out the placement gate checked chunk coords against two fixed numbers with modulo math - which doesn’t pick ONE spot per cell, it picks EVERY chunk that matches the mod. so the game was building a perfect lattice. cathedral, 160 blocks, cathedral, 160 blocks, forever, in neat little rows like crops. landmarks had the same bug at 256 block scale. both features now hash the cell coordinates themselves to pick a single host chunk per region per cell, so every attempt lands somewhere different. flagships also got pushed out to a 384 block minimum since they’re supposed to be rare landmarks. what’s next back to content. more landmark variants, ambient life in the skies, the deep end is still sitting there on the roadmap being ominous.
Devlog 16 Short one, but it is the one I have been putting off. The dragon fight was authored with attacks, phases, telegraphs but the pillars were just decor and the last third of the health bar played identically to the first. The pillars fight back Crystal aegis is the simplest thing in the world: while crystals stand, thedragon heals. One line of health regen did more for the fight’s shape than anyattack I have authored, because it moves the win condition backwards. You donot win by out-DPS-ing a health bar; you win by climbing pillars under fire.Five crystals means two HP a second, which is enough to visibly undo a sloppyopening. That is the fight telling you it is watching. Enrage is a ladder, not a switch Three thresholds - 60, 35, 15 percent - each announced, each spawning void wisps into the arena. The wisps are not the threat; they are the clock . Every second you spend swatting a wisp off your back is a second the dragon is cycling toward catastrophe. From enrage two the dragon leaves breath pools under its flight path, which turns its flyovers into map control. killing the dragon The kill now drops a real pile: heart, fangs, bone, resonant scales. First kill still fires the transformation. /dragonfight gives a live readout for tuning the curve without guessing. Notes for next time The wisps cap at eight; if playtests say the floor is unreadable, that cap is the first knob. Aegis regen is intentionally visible (1-2 HP/s). If it feels unfair, the fix is fewer crystals required, not slower regen. Docs live in docs/DRAGON_FIGHT.md now, including the testing checklist.
Devlog #19 Sorry for the random numbering before - i guess i suck at counting. Anyways, devlog. Updated structures Before, structures were just decoration and weren’t technically vanilla structures (kaupenjoe misled me). However, I managed to turn them into structure with help from OpenCode. I also added some new structues, like a castle (needs some works still), some new cathedrals, willowtree trunk, etc. I am adding some more custom armor, and I will make it cool with cool abilities. Custom armor My plan for custom armor includes: Luminous armor (infinite night vision, light level control panel, more ideas to come), Ash armor (fire-related abilities, ashwalker boots already exist) Null armor (i have no idea on what to do for this, but it sounds cool) Dragon fight Improve the dragon fight so it has several new stages Made it so that it spawns void wisps here and there Added a bunch of new drops it gives, working on adding Dragon Wings (slow but give iron-chestplate armor level) What’s next? Add the custom armor and tools and weapons Finish the dragon fight so it is exceptional
Devlog 20 - Three New Sets this one adds the thing that’s been missing since the void set went in being actual custom armor that isn’t void. Luminous, Ash, and Null are new. 12 armor pieces, 15 tools, all with their own textures, their own powers, and their own place in the creative tab. ##the new sets the void set already had its silhouette and its trim workflow. the new sets follow the same P-mode two-layer model so trims work the same, but they’re recolored palettes with their own read:- Luminous gold-cyan, glassy, the grove’s light. high enchantability, diamond-tier defense with a light-mobility kit.- Ash gray-ember with ember-orange highlights, volcano-forged. slightly lighter than void but built for fire.- Null violet-void, deleted matter. void-tier defense, hungrier enchant cost, gravity-deletion kit. you can read them now none of the three sets had working names before — datagen was fine, but the generated lang had Luminous_helmet with a capital L, so the game looked for item.endesium.luminous_helmet and found nothing. 26 keys showed item.endesium.___ in inventories. src/main/generated/assets/endesium/lang/en_us.json is now lowercase for all luminous/ash/null armor and tools, the phantom Ash_boots is gone. hover a luminous sword and it actually says luminous sword. armor is per-piece now new rule: every single piece does something on its own. the full set is an upgrade, not the only reason to wear it. Luminous — the grove’s light — GearAbilities per piece + tooltips on GearArmorItem : helmet Gleamsight – night vision while worn- chest Radiant Aegis — attackers get glowing 8s; full set Prism Ward adds darkness 3s + 3 magic burn-back- leggings Lightspeed — speed I (II with full set)- boots Lumen Leap — jump II Ash — the volcano — volcano kit, fire is fuel:- helmet Ember Crown — fire resistance while worn- chest Searing Plate — attackers ignite 4s; burning/in lava gives strength I- leggings Magma Blood — regen I while burning/in lava- boots Ashwalker — stand on lava, and now hold shift in lava to sink at -0.18/tick to -0.55 like scaffolding, release and you stay down with LAVA puffs every 4tfull ash Volcanic Heart is permanent strength I. the set wants you in lava. Null — deleted matter — Erased Mind helmet purges levitation/darkness/nausea every tick, Erased Wound chest gives absorption 5s on hit, Weightless leggings no fall damage, Null Step boots +1 step height via attribute, full set Void Body deletes 25% of incoming projectiles with smoke + shield block feedback. what’s next more landmark variants, ambient life for the empty skies, and the deep end is still sitting there being ominous. Sorry, no sneak peak yet - still not finished yet
Devlog 21 hey guys.the End’s been empty for a while. the ecology mobs live on the islands, thebosses live under them, but the sky itself was a void. this one fixes that,and it brings back something else that was missing: three new mobs three new mobs Sky Jelly - ambient, drifts with the wind. a soft bell of a thing withfour trailing tentacles, pulsing gently and leaving end-rod motes behind it.it bobs upward every now and then like it’s breathing. 8 hp, doesn’t careabout you. just ambient. Galefin - the fastest thing in the End. a sleek sky-fish that cutsthrough the air at 0.75 flying speed and avoids you entirely - the momentyou get within 12 blocks it’s gone. 4 hp. you see them flicker past in thecorner of your eye more than you ever actually look at one. Deep Lurker - this is the mean one. it lives below the islands, in thedark air pockets under the heightmap, and it waits. 22 hp, leaps at you,does real damage. when one spawns you get a portal-particle burst as awarning, and then you have maybe a second to look down.all three are geckolib animated - jelly pulses, galefin swims, lurker idleswith a slow head sway - and all three have spawn eggs and their own loottables. the sky and the deep are managed now AmbientSkyManager runs two server-side systems: sky half - if you’re flying more than 12 blocks above the surface, theair around you fills with biome motes (highland wind, lumen motes, endwastes dust). it makes flying at height feel alive instead of empty. deep half - a managed lurker spawner. every 5 seconds it looks for darkpockets below the islands: solid floor, air to spawn in, brightness under 7,at least 34 blocks of island above you. spawns are capped at 6 lurkerswithin 96 blocks per player, so the deep end gets ominous without everbecoming a wall of them. what’s nextthe deep end is less empty now, but it’s still just lurking. the design docskeep pointing at something bigger under the islands - the Umbral Reach - andthe sky could always use more than motes. more ambient life is on the table.
Devlog 22 - End Fight Update (again)hey guys.this one’s a two-day entry. yesterday was the sky getting alive and the gear lines finally clicking together into actual fighting systems. today was the dragon. the end fight has been building layers for a while - phases, enrage,scripted moves - but it still had one big problem: the first dragon barely used any of it. that’s fixed now. the first kill is the fight now. therespawned one is the nightmare. yesterday - 8/26the sky got three new mobssky jelly, galefin, and deep lurker went in (that one got its own devlog - 21).the sky half of AmbientSkyManager fills the air with biome motes when youfly high, and the deep half keeps the under-island dark honest: lurkersspawned into the black pockets below the heightmap, capped so the deep end isominous without ever becoming a wall.the sets became systemsthe luminous, ash, and null sets each got a cross-set layer inEndgearSetBonuses - wear the full set and hold that line’s tool andarmor + weapon merge into one fighting identity: luminous + prism grip - speed II and haste II while channelling; every hit blinds with a flash (3 true damage + glowing) and sparks light shards.ash + ember core - fire resistance while channelling; hits stoke the burn for 2 extra seconds and throw weight behind the strike.null + erased edge - strength I and haste I; every hit shreds 4 armor durability off the target and drags them into the blade. and the void set finally got its signature: hover. full void set, sneak inthe air, and you stop falling - a gentle drift at -0.12 blocks/tick instead ofa tumble, with void motes trailing under you. it pairs with the sword’ssingularity for total sky control, and it’s the boots’ tooltip promise kept. today - 8/27the dragon actually fights nowthefour-phase fight controller - impact dives, shockwaves, screeches, gales,storms, collapses, the final roar, catastrophe - now runs on the firstdragon too. before, the first kill was vanilla strafing plus harassment, andall the authored grammar was locked behind the respawned dragon. that gate isgone. the first dragon opens with the full attack schedule, escalates throughall four phases, and the transformation still makes things worse: 1.6x scaleand the resonance-exclusive moves are still the awakened dragon’s alone.the pillars became cooler with new mechanicscrystals were just a heal before. now the aegis is a shield:- every surviving pillar grants the dragon 10% damage reduction (capped at 60%), so clearing the pillars is a real first phase, not an optional chore.- destroying a crystal detonates at its pillar with a roar.- the last crystal falling breaks the aegis: the dragon is staggered for five seconds and takes +40% damage, a wisp wave pours out, and the next scripted set-piece fires immediately. that’s your payoff window. set-pieces are guaranteed nowscripted specials used to roll a dice every tick. now they’re scheduled:one opens the fight about thirty seconds in, every enrage escalationforces the next one within a second, and a broken aegis queues one on thespot. the random cadence only fills the gaps. you will see these moves, everyfight, on purpose. two new attacksOblivion Charge (enrage 2+, set-piece) - the dragon climbs high, paints a straight lane through the nearest player with end-rod markers, then dives it twice, tearing through anyone on the line and leaving void-fire wakes in its path. get off the lane.- Resonance Collapse (transformed dragon only) - drags every player toward the dragon for three seconds with converging rings, then detonates at its position. gain distance and find cover; standing still loses.
Devlog 23 - The Stronghold Update hey guys.for a while now the Endesium identity stopped at the end. everything past theportal was ours - the island, the dragon, the resonance, the gear - but the road to it was still vanilla’s stronghold. a cramped maze of hallways and libraries copy-pasted a hundred times, holding the exact same end portal the game shipped with in 2011. it never matched. the mod’s big gate got the smallest room in the game.that’s done now. the vanilla stronghold is gone and the Endesium stronghold replaced it: a buried citadel that previews the end without spoiling it. this one took a while, so let me walk the whole thing. the layout: a citadel vanilla strongholds are random. rooms are scattered, corridors dead-end,libraries repeat, and the portal is wherever the RNG put it. the Endesium stronghold is authored : a fixed, connected, three-times-bigger floor plant that always works. a Great Descent Hall buries you - a switchback staircase that drops from the surface as much as 90 blocks down into the stone, red runner carpet down the aisle, end rods lighting the way, two vindicator sentinels waiting at the top. a sealed Arrival Vault is what the eye of ender actually points at: a quiet chamber with a radial purple sigil on the floor and exactly one grounded door - the route onward, always. - the Hub is the spine: an atrium with a carpeted floor, a central resonance dais (amethyst block, end rod, the works), purpur pillars at the cardinal axes, bookshelves and barrels lining every wall, bats circling the ceiling, and a real staircase up to the gallery instead of a visual platform. junctions are readable - four grounded route markers plus a carpet cross - so you never need signs to find your way. the rooms sixteen distinct room kinds, every one hand-dressed:- Library - bookshelves three shelves high around the walls, two lecterns, a chiseled-bookshelf reading dais, blue carpet, bats.- Treasury - iron-bar vault bars with a single gap, chests and barrels in rows, gold, candles, and a captain guarding the middle.- Guard Post - weapon racks (fence posts) with candles, a phantom spawner in the center, two vindicators on the door.- Sanctum - end stone brick floor, purpur pillars, crying obsidian and a chorus plant on a pedestal, purple carpet, an enderman spawner , a live enderman pacing the corner.- Barracks - four red beds with proper head/foot parts, smoker, furnace, crafting table, three guards on duty.- Scriptorium - lecterns with candles, bookshelves and chiseled shelves, a cauldron of ink, a bat haunting the rafters.- Arboretum - a glass-ceilinged garden: dirt floor, flowering azaleas, ferns, moss carpet, a lily pad pond.- Observatory - concentric purpur ring inlays, an amethyst telescope-core, end-rod instruments along the walls.- Resonance Engine - amethyst conduit pillars with end-rod emitters and a crying obsidian reactor - the end’s power plant, studied safely from outside the portal.- Bastion - deepslate pillars, an iron-bar partition, weapon racks, a captain and two guards. military.- Conservatory - chorus plants and chorus flowers growing on end stone, flower pots and moss, an enderman in residence.- Reliquary - concentric obsidian ritual rings, an ender chest at the heart, candles, a captain standing watch.- Portal Cathedral what’s next the stronghold finally reads like the end’s doorstep. next up is the rest ofthe ten-hour pass - every file retyped, every line deliberate - and afterthat, the bosses and dragon still want their second pass of polish. but thegate is fixed. you’ll never walk vanilla’s cramped hallways to the end again.
Devlog 24 - Making the Stronghold Even Better hey guys. DEVLOG_23 was about replacing the vanilla stronghold - the layout, the rooms, the portal cathedral. and it shipped, and it worked, and then i walked back through it and something was off. the shape was right but the rooms read empty. a big citadel of bare stone is just a bigger version of the problem i was trying to kill. so yesterday/today was the boring pass nobody gets excited about in a change log: making rooms feel lived in. the noise every room had the bones but none of the clutter. so i went room by room and dressed them like actual inhabitants left mess behind: wall shelf rows with candles on top, sconce rows down the hall, two-tone floor tiles instead of one flat slab clustered corners - reading nooks, work benches, storage piles - instead of hanging lanterns and chandeliers where the ceiling actually had headroom for them crypts and catacombs got coffin rows, skull niches, soul lanterns barracks got lockers, footlockers, armor stands treasury got actual stacks of gold, not a promise of gold gardens finally read as gardens - flower meadows instead of a dirt square and corridors stopped being dead space: candle runs, clutter, tiled edges.it’s not glamorous but it’s the difference between a structure and a place. three new district wings once the rooms felt alive, the citadel wanted more than the hub spine. so it grew three themed districts, and i love how they ground the place: Forge - a contained lava pit ringed in polished deepslate, anvils, furnaces, coal stores. the stronghold had no industry before; now it reads like it smiths something down there. Dining Hall - a proper mess: table rows, benches, chandeliers. a fortress this size would have somewhere to eat. Prison - iron-bar cells, chains, a witch behind the barracks. every good stronghold needs a brig. plus a monumental columned entrance to the Great Descent Hall, an amethyst landing dais, cross-bridges over the Star well, a grand staircase dropping from the cathedral gallery, and a carpet runner down every corridor so you always know you’re on the path. Also started playing hades :P
Devlog 25 Wrapping things up Hi guys, this was mostly wrapping up the project. I have had a lot of fun working on the project, but I want to ship soon, maybe at like 200 hours. I hope everyone has enjoyed watching my progress on this, as I thoroughly enjoyed working on it myself. I hope everyone gets a chance to try it out and give some feedback. Models I touched up some 3d models and improved them a bit, making them look a bit cleaner. I touched the void stalker’s model, and the dragon’s model primarily Loot tables I customized the loot tables for a lot of the custom or modified structures like the stronghold to be a lot nicer and more fitting towards the endesium mod. They are a lot stronger, but not too OP I’d say. Nothing much else done I know I spent 10 hours coding, but I didn’t get much done because of how long I spent wondering what to do lol.
Devlog 26 hey guys. I turned the dragon fight into a bunch of small fixes that all made the fights read better.nothing shiny, just the stuff that was quietly wrong. stuff that was supposed to do stuff but didnt lol the dragon fight had announcements. not the kind players see - the kind thatonly exist in code. the enrage thresholds (“The Dragon Remembers” at 60%,35%, 15%) and the hoard reveal were computed, and then… dropped. a soundplayed, a title was built, and nobody ever saw the title. the function wasliterally called announce and it announced nothing. same story in the special attacks. the imports for title packets were sittingthere, imported and never used. so now the scripted set-pieces finally namethemselves: Burrow - “The Dragon Descends” before the ground starts shifting Seize - “The Dragon Takes You” right before it swoops to carry you aloft Rifts - “Reality Tears” as the gravity rifts start opening around you i’m genuinely annoyed this was broken for as long as it was. the drama of thedragon fight was all there in the code - the escalation, the set-pieces, the named thresholds - and none of it reached the player. now it does. the sentinel’s grab is escapable now the crown sentinel’s grab-and-hurl from a few devlogs ago was a one-way trip.if it got its hands on you, you watched the animation and then got launched.no counterplay, which felt wrong for a fight that’s supposed to be about reading the boss. so it got the same rule the warden and golem already had: deal enough damage mid-hold and it drops you early. 18 damage is the breaking point - enough that you can’t just tickle it, but enough that a player who’s actually fighting back gets out before the throw. it also shields against the worst feeling case, where the hold just deletes you with nothing to do about it. and while I was in there: the goal list had two goals at priority 4, whichmeant the sentinel’s behavior was occasionally picking the wrong thing to doat the same weight. renumbered so the hierarchy actually means something. next up the dragon’s hoard, the sentinel’s other moves, and the stronghold is still missing its advancements - the burrow is found, but it doesn’t have a single achievement attached to finding it. that’s next. the fights are starting to feel like they have a conversation with you now.the dragon tells you what it’s about to do, and you get to do something about it. That is the top view of the crown sentinel btw, it looks pretty dope imo
Devlog 28 - The Egg Becomes an Altar hey guys. last devlog for this project The egg now hatches I made the egg hatch into an end golem after 1 minute - a very op, hard to defeat mob. However, defeating it gives 3-5 additional permanent hearts (lose it upon death). Also, when you kill the dragon now, a chest spawns where it died, with dragon wings (gives iron-level protection, slowness 1 while worn, functions like an elytra). what that means for the endgame so the progression reads clean now. beat the dragon, take the egg, set it up,and call up the colossus that guards everything past the first kill. the dragon fight is the warm-up act for something that doesn’t even spawn until you put the trophy to work. that’s it. that’s the end of the end. thanks for following along - go fight the dragon for real, then come back and raise one of your own.
Ships:
I created a Minecraft mod called Endesium, which is an End Update mod. I learned Minecraft modding from scratch for this. There are 10 new biomes, 15 new mobs, 4 new bosses, 4 new sets of armor, and a lot of cool and incredible stuff. The new structures look incredible, like the elderwood sanctum, and many other cool and magnificent structures. It was challenging to figure out how to make custom mob models and make them spawn with boss bars and stuff of that sort. I am incredibly proud of my project, and I have put over 1 weeks worth of time into this project. I have learned many things along the way, and it was truly an incredible experience learning how to make a mod for Minecraft. It is a fabric 1.21.1 mod, sorry no modrinth - that takes weeks to verify....
|
1792875234.1406589
|
1793739234.1406589
|
|
27346
|
shadow less light by @flyingfish | Stardance
|
flyingfish
|
1
|
200.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:59:09Z", "hours": 200.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun", "repo": "https://github.com/dinotiger01/shadowless-light", "demo": ""}]...
|
[{"post_id": 71477, "ts": "202 [{"post_id": 71477, "ts": "2026-09-20T21:56:22Z", "hours": 7.8586, "text": "https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle"}, {"post_id": 69984, "ts": "2026-09-18T05:47:32Z", "hours": 6.7189, "text": "i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation"}, {"post_id": 68285, "ts": "2026-09-14T20:58:58Z", "hours": 7.6081, "text": "100% done with 3d modeling it just takes a long time to proint everything"}, {"post_id": 66330, "ts": "2026-09-12T03:15:51Z", "hours": 8.2417, "text": "um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel"}, {"post_id": 65764, "ts": "2026-09-11T03:41:50Z", "hours": 4.5517, "text": "i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done"}, {"post_id": 65105, "ts": "2026-09-10T00:33:09Z", "hours": 2.18, "text": "i have finished most of the soldering the rest is just small stuff"}, {"post_id": 64596, "ts": "2026-09-09T03:20:50Z", "hours": 5.7506, "text": "i am at 7/9 sooo close"}, {"post_id": 64439, "ts": "2026-09-08T20:21:40Z", "hours": 2.9669, "text": "i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also"}, {"post_id": 64073, "ts": "2026-09-08T07:05:34Z", "hours": 3.8169, "text": "i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording"}, {"post_id": 63995, "ts": "2026-09-08T03:05:37Z", "hours": 7.0836, "text": "i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr"}, {"post_id": 63665, "ts": "2026-09-07T16:29:00Z", "hours": 2.4503, "text": "i am starting to get the hang of things i lowered my chair and now i dont have insane back pain"}, {"post_id": 63304, "ts": "2026-09-07T01:49:15Z", "hours": 2.8169, "text": "i got some new stuff for soldering um and my back hurts sooo bad"}, {"post_id": 63218, "ts": "2026-09-06T22:02:36Z", "hours": 5.0336, "text": "yooo"}, {"post_id": 62617, "ts": "2026-09-06T02:45:23Z", "hours": 5.6875, "text": "so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow"}, {"post_id": 61747, "ts": "2026-09-04T20:03:13Z", "hours": 7.3389, "text": "it works"}, {"post_id": 36826, "ts": "2026-07-29T04:02:13Z", "hours": 6.045, "text": "3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better"}, {"post_id": 35555, "ts": "2026-07-27T02:13:05Z", "hours": 9.48, "text": "windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit"}, {"post_id": 33887, "ts": "2026-07-24T05:20:04Z", "hours": 4.9367, "text": "alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease"}, {"post_id": 33673, "ts": "2026-07-23T19:40:16Z", "hours": 5.7425, "text": "so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time"}, {"post_id": 32810, "ts": "2026-07-22T06:19:52Z", "hours": 9.4156, "text": "logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light"}, {"post_id": 32122, "ts": "2026-07-21T02:09:02Z", "hours": 6.1692, "text": "uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work"}, {"post_id": 31867, "ts": "2026-07-20T16:31:24Z", "hours": 7.3906, "text": "data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb"}, {"post_id": 31021, "ts": "2026-07-19T02:34:27Z", "hours": 6.3408, "text": "i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar"}, {"post_id": 30448, "ts": "2026-07-18T00:20:00Z", "hours": 4.9019, "text": "pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode"}, {"post_id": 29907, "ts": "2026-07-17T02:32:06Z", "hours": 4.6172, "text": "pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship"}, {"post_id": 29262, "ts": "2026-07-16T02:11:59Z", "hours": 6.4558, "text": "i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think"}, {"post_id": 28654, "ts": "2026-07-15T01:16:48Z", "hours": 10.5153, "text": "so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk"}, {"post_id": 26330, "ts": "2026-07-11T01:59:42Z", "hours": 10.4356, "text": "i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall"}, {"post_id": 24530, "ts": "2026-07-08T04:31:37Z", "hours": 5.7922, "text": "so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library"}, {"post_id": 23669, "ts": "2026-07-06T19:38:41Z", "hours": 4.6003, "text": "so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting"}, {"post_id": 23003, "ts": "2026-07-05T18:22:30Z", "hours": 4.7006, "text": "so uh i worked for a long time then a black out hit and i lost all of it"}, {"post_id": 21865, "ts": "2026-07-04T01:07:06Z", "hours": 4.8339, "text": "i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk"}, {"post_id": 20491, "ts": "2026-07-02T02:58:40Z", "hours": 4.2003, "text": "so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why"}, {"post_id": 19714, "ts": "2026-07-01T03:18:51Z", "hours": 4.7839, "text": "i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler"}, {"post_id": 17315, "ts": "2026-06-28T01:16:37Z", "hours": 9.3347, "text": "so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter"}]...
|
Title: shadow less light by @flyingfish | Stardanc Title: shadow less light by @flyingfish | Stardance
Devlogs:
so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter
i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler
so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why
i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk
so uh i worked for a long time then a black out hit and i lost all of it
so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting
so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library
i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall
so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk
i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think
pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship
pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode
i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar
data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb
uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work
logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light
so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time
alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease
windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit
3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better
it works
so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow
yooo
i got some new stuff for soldering um and my back hurts sooo bad
i am starting to get the hang of things i lowered my chair and now i dont have insane back pain
i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr
i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording
i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also
i am at 7/9 sooo close
i have finished most of the soldering the rest is just small stuff
i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done
um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel
100% done with 3d modeling it just takes a long time to proint everything
i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation
https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle
Ships:
this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun...
|
1792856853.0419824
|
1792943253.0419824
|
|
6943
|
TubeReplacer by @Preloading | Stardance
|
Preloading
|
0
|
197.22
|
0
|
[]
|
[{"post_id": 79718, "ts": "202 [{"post_id": 79718, "ts": "2026-10-15T06:35:36Z", "hours": 1.0169, "text": "To the demo, I added a time limit & a restart app option in case it breaks and the app has to be restarted."}, {"post_id": 79710, "ts": "2026-10-15T05:23:07Z", "hours": 11.7986, "text": "Cooking up the demo, I’ve basically setup a remote control system on this phone, which should hopefully run over the internet! Giving randos complete control of this phone… what could possibly go wrong???? I still need to do some stuff to lock down the system it runs in, and also patch the problems with tubereplacer that came up recently."}, {"post_id": 74763, "ts": "2026-09-28T05:27:24Z", "hours": 2.1983, "text": "Alright, so the results are in. From what it seems, it mostly went well, however there are some issues that came up, primarly due to me not having enough time to test (I released this the day before stardance was extended for another month…. a bit of extra time would have been nice to iron out the few bugs on release, and also time to diagnose the playback errors people encounted). I did a quick 2.0.1 release to fix some of the bigger issues… 5 days after the initial. i’m tired ok?"}, {"post_id": 72543, "ts": "2026-09-23T05:25:42Z", "hours": 3.6169, "text": "Oh dear, publishing it to the world! I’ve decided to say “fuck it, its good enough”. There are some issues which has popped up, like some versions crashing, and the SABR stream never starting issue. I’m praying that it’s not just that bad. Made a reddit post about it :3 https://www.reddit.com/r/LegacyJailbreak/comments/1wnh4il/ Hopefully this doesn’t go catastrophic! I also have to setup a demo. Right now, the big issue is how to. Just a video is kinda… lame? So I want to do somehow make it an interactable demo. However, there is not an emulator for appstore apps for any iOS version between 5-10. This makes things rather tough. I do have some spare phones I can acquire to run it. However, getting the screen out is uhh….. challenging. The version of AirPlay on iOS is too old for the open source projects, and even the closed source, execpt for one, AirServer (which is 20$ per computer). The 30pin -> HDMI adapter -> capture card is extraordinarily unreliable, and keeps disconnecting when I try to use it, and is a pain in the ass to get working. There’s Veency, but it goes black when playing a video, and is unusable slow. And after all that, I have to send it to a server to stream to a web browser, I have to take input, I have to manage launching the correct app, preventing escaping the app, handle crashing, queuing (its one phone so people will have to wait), etc. All in 7 days. oh dear."}, {"post_id": 71634, "ts": "2026-09-21T06:27:35Z", "hours": 2.2925, "text": "Did some stuff to make the challenge solver/nsig/potoken restart when needed. Also reorganized it a lot of that file."}, {"post_id": 70324, "ts": "2026-09-18T22:56:01Z", "hours": 2.3042, "text": "So, it randomly decided to break for many videos, and only for some people. It appears that YT is doing extra things to detect adblockers on web, and something I’m doing is triggering the adblock detection. This is uhh bad :) I get to figure out what I’m missing and implement it properly. Now for bugfixes I made fixed a signin crash on 1.0.1 & 1.1.0 due to a missing cflag fixed the video date failing to load on iOS 5 added proper backoff to SABR"}, {"post_id": 68463, "ts": "2026-09-15T04:46:50Z", "hours": 2.7594, "text": "Bugfixes! fixed a bug where playlist videos fail to play on channel playlists fixed the open source licesnses page crashing on 2.0.0 fixed a bug where closed videos in 2.0.0 continue to play after closing, locking the phone, then unlocking fixed a crashing bug when not connected to internet when fetching profile"}, {"post_id": 67668, "ts": "2026-09-13T20:35:14Z", "hours": 0.9072, "text": "Made it zip the network log stuff for sending over email, as text files generally have a really good compression ratio, (the file is actually 2mb), and email has really low limits."}, {"post_id": 66921, "ts": "2026-09-12T21:55:08Z", "hours": 2.8417, "text": "I managed to get N/Sig deciphering working with HLS streams, meaning you can now watch livestreams, if you change up some settings & it’s buggy. I’m not intending on shipping proper stream support right now, so this will do for release."}, {"post_id": 65754, "ts": "2026-09-11T03:18:56Z", "hours": 5.4256, "text": "Bugfixes! I’ve decided it’s probably good enuff to “feature lock” and just get it ready for release (also cuz stardance ends soon, yet the streak thingy to a plushie continues. as its ending. why. i wanna take a break!) Not much images but Fix an issue with my trimming stuff not working on 1.4.0 Managed to cleanup the stream when switching video on 2.0.0 Some missing thing on the thumbnail speedup thing My failing to do requestProfileForIdentity correctly."}, {"post_id": 64350, "ts": "2026-09-08T17:29:24Z", "hours": 4.5636, "text": "I did a bunch of things, none of which felt that interesting to make a log for, so here’s one big one. The quality selector now works You can now toggle video stats (logging in history) on or off. Some error handling and trimming stuff to save on ram"}, {"post_id": 62657, "ts": "2026-09-06T03:55:15Z", "hours": 2.315, "text": "Did a small hack to add the tweak’s version to the crash reports"}, {"post_id": 61946, "ts": "2026-09-05T03:58:53Z", "hours": 5.835, "text": "So this one is small, but I’ve done an optimzation for the process of getting that little thumbnail. The older youtube clients did indivisual, very small requests for the specific channel, incl the thumbnail. I already have this data with the video requests, and getting the channel data is rather wasteful of the network and slow. I’ve replaced it with just using the avatar from the feed. Speeds things up a decent chunk!"}, {"post_id": 60937, "ts": "2026-09-03T16:40:57Z", "hours": 1.4744, "text": "Some minor sabr tweaks, and also a fix to the channel id failing to load for certain feeds"}, {"post_id": 60505, "ts": "2026-09-02T21:45:45Z", "hours": 2.1469, "text": "I made some of the settings work, and also made it hide the comments count which I don’t have a way of getting a precise number right now. Ignore the playback error."}, {"post_id": 59350, "ts": "2026-09-01T02:54:44Z", "hours": 4.4475, "text": "i did a bunch of misc fixes which aren’t interesting. iOS 5 preference fix some reloading of video changes with SABR cleanup of a bunch of things a fix to the item count (cuz 32bit limit aaaaaaa) memory things some crash bugs with SABR"}, {"post_id": 57701, "ts": "2026-08-29T22:55:46Z", "hours": 5.6717, "text": "A bunch of signin fixes, I fixed the channel id finder failing for different accounts, and I fixed an issue where one of the requests I did on 2.0.0 is synchronous and would not let the app start until it completed."}, {"post_id": 55413, "ts": "2026-08-27T07:02:08Z", "hours": 3.3828, "text": "2.0.0 support! and actually 1.4.0 support this time (oops, i think i clicked the wrong version…). I really hacked my way to 2.0.0 support, as it adds all the stream data to a protobuf container thingy which is never actually generated as protobuf. The protobuf also isn’t a normal function, and I couldn’t figure out how to recreate it, not that it would really work if it does do some protobuf shenanigans. So I did what probably every programmer does, hack it in poorly. When it starts trying to play the video, after the protobuf section, and where i still have access to the legacy GData streams, and I just shove it in there, and it manages to work! Also had to do some extra things to include valid authentication to the SABR stuff so it can play private videos and such. But now 2.0.0 works!"}, {"post_id": 54270, "ts": "2026-08-25T05:15:09Z", "hours": 1.5956, "text": "I managed to get 1.4.0 support working! They started kinda doing what I implemented myself…. which causes issues, but it works! 2.0.0 is going to be hard tho…"}, {"post_id": 53575, "ts": "2026-08-24T05:23:41Z", "hours": 3.7281, "text": "Managed to get videos to count towards your history! Also some kinda boring optimization things (start parsing even while we are still downloading, because net neutrality doesn’t exist for some reason, and someone got 22 seconds for a 2mb file)"}, {"post_id": 51988, "ts": "2026-08-22T00:14:33Z", "hours": 1.3206, "text": "i managed to get private videos to work, however they still don’t show up in the “Uploads” tab."}, {"post_id": 51417, "ts": "2026-08-21T03:27:49Z", "hours": 1.5033, "text": "A bunch of smaller bugfixes, and now it runs on iOS 5. There was some small differences since polyfils, and it doesn’t work with a proxy on (since it proxies localhost). The left device is iOS 5."}, {"post_id": 51306, "ts": "2026-08-20T21:39:31Z", "hours": 2.2778, "text": "I spent a bit of time fixing up the settings menu to properly have the HD options. Unsure how much of this is going to stay like this, but right now both of the HQ ones work, the 360p (Android) plays with SABR for a bit, then it stops as we don’t have proper attestation (our POTokens only work on web based clients). Probably going to have to forbid using sabr on ANDROID. Unsure yet about Android VR or visionOS. They both need a visitorData, which I still have to get. VisionOS has the nice perk of giving a completely unprotected HLS stream, which this can use. Android VR is traditionally unprotected, but I think they kinda ruined that. I also did a tiny bit of work to get closed captions working, which is basically prefixing https://www.youtube.com to the URL if it begins with a slash"}, {"post_id": 50822, "ts": "2026-08-20T08:01:40Z", "hours": 2.6489, "text": "I fixed the support in 1.0.0-1.3.0, 1.4.0 and above, they started changing a bunch of player things which I still have to figure out…."}, {"post_id": 50056, "ts": "2026-08-19T02:53:41Z", "hours": 5.1094, "text": "I managed to fix most of the RAM issues, excluding the one inside the youtube app which my stuff amplifies. I’ve done some stuff to allow you to change apps, lock the phone, etc, and have the stream recover. It’s not perfect, but it works well enough."}, {"post_id": 49349, "ts": "2026-08-18T03:49:07Z", "hours": 3.9958, "text": "It kinda somewhat maybe works! you can make it through a video, however scrubbing thru the video takes forever (some request never finishes), and theres some random stutter in the video. RAM usage is still a problem, and private videos don’t play. To get here, I did things how the HTTP server wanted so other requests can come in while i’m waiting for a segment, and allows this to play fully, however I do still need to fix the buffering issues."}, {"post_id": 48759, "ts": "2026-08-17T09:09:04Z", "hours": 1.1469, "text": "Shockingly, now that I have most of the TS stuff already in place for video, audio is shockingly painless! It was only just like the previous thing, and ADTS headers, https://wiki.multimedia.cx/index.php/ADTS . Time to try it on device!"}, {"post_id": 48723, "ts": "2026-08-17T07:48:03Z", "hours": 1.5411, "text": "OK, so this was quite annoying, It was really hard to find any docs on how esds is decoded, but I got there in the end, these are some of the parts I need to make the ADTS header ( https://wiki.multimedia.cx/index.php/ADTS ). The decoder is quite bad, and just ignores some cases, but hopefully it will work :)"}, {"post_id": 47913, "ts": "2026-08-16T05:50:14Z", "hours": 2.8556, "text": "Figuring out why the player view was never getting freed was taking too long, so uhh audio! yes! I have managed to grab the header out of the app after having to patch wayyy too many bugs with the header parsing, some of which could crash the app if your network is bad. Tiem to parse dis audio header!"}, {"post_id": 46687, "ts": "2026-08-14T03:54:25Z", "hours": 5.185, "text": "I managed to make the buffering system a little more robust, it can complete a video & even seek if your careful to let it play out. I also fixed some of the memory leaks, you can get much farther, but it does still only climbs, at the end of this 25 minute video it got up to 189mbs of ram used, which means we basically leaked 100mb of ram. This is quite unacceptable still, and I get to do more of figuring out why, yay!"}, {"post_id": 46124, "ts": "2026-08-13T04:10:25Z", "hours": 8.5864, "text": "srry for audio, i am in a discord call, but i managed to get more than like 20 seconds to work, however it currently gobbles RAM, and has wayyyy too many crash bugs. I fixed a bunch of the crash bugs, and broken stream bugs, but there’s still some crashing, esp. on video end."}, {"post_id": 45278, "ts": "2026-08-11T17:04:13Z", "hours": 1.8236, "text": "IT PLAYS!!!!!!!!!!!!!!!!!!!!!! YES!!!!!!!!!!!!!! that took wayyy too much debugging (and i also used ai assistance to tell why it wouldn’t play). I got it first working with VLC & other media players, but the iOS 6 player was especially stubborn. It only plays a couple seconds since I only do one request, but it plays. Did i mention it plays? I might try forcing it to use 1080p since 144p is a little… lacking in quality and SABR is defaulting to it, i guess i’ll figure that out later."}, {"post_id": 44998, "ts": "2026-08-11T04:04:30Z", "hours": 5.6678, "text": "Unsure how much of a win this is, but at least FFplay can play the video! However, VLC, built in media players on windows, and more importantly, the video player within iOS 6 cannot play it :( I’ve forced it to use 144p for a while now for a small file size, but it should be able to go quite up in size. Bigger issue is getting it to play, however I think I will wait on that, and work on having it serve the files on the phone so I can debug this a bit easier, and have the player actually like play the files without my syslog stuff. Hopefully I can get the video to play tho :)"}, {"post_id": 44430, "ts": "2026-08-10T05:47:54Z", "hours": 1.2339, "text": "Quite boring when all that exists in these devlogs is random hex eh? Hopefully this should be the last hex blob before actually getting some kinda of video to play! (maybe, miiiight have to do one more as I hook the TS file up with the HTTP server). I managed to packetize the data into PES packets. The next thing for video (no audio) should be packing it all up in one nice TS file. And then if we get lucky, we will get like 4 seconds of a video :D, maybe even up to like 10 since then the buffer runs out, and second requests to SABR aren’t implemented yet."}, {"post_id": 44396, "ts": "2026-08-10T03:25:28Z", "hours": 2.2244, "text": "I now grab h264 samples, and convert them into annex b samples. I think the next part might be actually building the TS file! wow! This means creating packets of the data, and then making packets out of those packets (why…)"}, {"post_id": 43064, "ts": "2026-08-08T03:57:14Z", "hours": 1.8175, "text": "I decided compiling FFmpeg was going to take forever, uhh doesn’t really give good stardance hours, and this is does more stardance hours ig… I did tfdt, tfhd, and trun parsing. I think this is all the parsing I need to do on the video side and the fragment size… i hope. Here’s a screenshot of me just printing the sample size to syslog."}, {"post_id": 42485, "ts": "2026-08-07T07:55:25Z", "hours": 2.5286, "text": "I did some extra work trying to parse MP4, but like… this is going to be a lot of effort to do, and just for the video, not even looking at audio yet. For this reason, I would like to bundle parts off FFMPeg with it, but compiling it is being terrible… I got arm64 after a while, but armv7 just does not want to go :("}, {"post_id": 41141, "ts": "2026-08-05T04:55:53Z", "hours": 6.0775, "text": "POTokens actually work! current protection status being 1 means the session is approved and good to continue throughout the entire stream! I basically implemented the PR at https://github.com/LuanRT/BgUtils/pull/44 , and did some user agent fixes… and my fuckup mis-spelling something I literally said in comments I might of 😭 . And now I get SPS of 1! :D :D :D It only took… like 3 months…. for potokens… 😔 I also figured out that Web offers an HLS stream if you specify an iOS useragent… uhhhhh i pretend not to see (for now), I’m sunk cost right now, and such. I wanna commit video container crimes!"}, {"post_id": 40546, "ts": "2026-08-04T05:23:46Z", "hours": 5.7383, "text": "Actually doing something with the media data we get from SABR now. I have decided that probably the best way to implement this is to convert it into an HLS stream. I came to this decision after fully looking at what SABR outputs, a fragmented MP4 intended for DASH, which the phone cannot play. However, SABR splits up the files based on the header first, then a bunch of fMP4 fragments. With a lot of work, I should be able to manually change the container from fMP4, to MPEG-TS, the format used by HLS, and have it streamed. It does have some hickups, changing stream to a lower or higher quality while streaming would likely be difficult (more concerning with it being a server adaptive bit rate system). Also MPEG-TS looks kinda… janky? This may also bring me some trouble if I chose to add Opus audio, since much of the audio streams are Opus based. Anyways, I now parse the first MP4 stream we get per format (audio & video), specifically the initialization section, and create an HLS manifest out of it! My next step is probably to have the phone itself host an HTTP server to grab the stream from, as it only supports getting videos from URLs. Audio is also in MP4 format, so this should work for it too :D"}, {"post_id": 39802, "ts": "2026-08-03T01:12:06Z", "hours": 2.3247, "text": "Working on some SABR parsing stuff, I got StreamProtectionStatus & NextRequestPolicy, along with the extraction stuff to get the segment from SABR. Doing this kinda of debugging on airplane wifi is rather hard, as the response is quite big, containing video segments."}, {"post_id": 39281, "ts": "2026-08-02T04:46:10Z", "hours": 4.9647, "text": "OK, a couple fun things. I finally got an output from SABR yay! The bug was really stupid, and it took me wayyy to long to figure out. I get the ustreamerconfig as base64, HOWEVER, this isn’t standard base64, it’s URL safe base64… for some reason. To send it in SABR, I have to turn it into bytes, specifically an NSData. These old iOS versions don’t have a standard base64 library, so I import one. The base64 library does not accept the - & _ type, and instead of like throwing any sort of error or even a log, it just… ignores them! So the error was actually accurate, it was a malformed config, specifically ustreamer config. I also did some stuff on POTokens. It appears that youtube did an update, and the POToken engine does more checks to see if it’s on youtube.com, or something like that. It seems it now specifically refuses POTokens were minted on not youtube.com, and only for the video id case, and only sometimes, specifically if fexp in the URL is 51973818, if it’s 51973819 it works. Also for some reason on my end using the visitorData works, which it doesn’t for other people in the youtube.js discord. Oh I should mention it also affects the library BgUtils, which my thing (and yt-dlp, and literally everything) is based on/uses. For now, i’m going to ignore the POToken issue, since I’m honestly not that great at debugging the youtube’s JS (i spent like a couple hours trying, if you search for function Vr in the base.js you’ll find something in the POToken minter as of right now). However according to Luan (the author of the BgUtils thingy), nothing changed in the player code, so idk, Idk how I could really debug the potoken engine. Oh also, something… interesting, someone else in the BgUtils discord decided to uhh fork my thing and using the power of AI, implement POToken gen using QuickJS. I initally tried this for POToken gen but got stuck with me missing polyfills. I’m considering taking parts of the forked code (specifically the polyfills), and some of my older QuickJS code and having two POToken systems you can switch between in case one breaks (ES6 issues for example), but idk if I should. I guess for now, I get to go actually write an implementation reading SABR data/UMP now. Maybe i’ll be doing this on a plane again :D (return flight)"}, {"post_id": 34375, "ts": "2026-07-25T01:13:15Z", "hours": 7.5297, "text": "I’ve been doing a lot of work on getting SABR playback working. I think i’ve got sending “preferred” audio & video formats, client info stuff and probably some other things too. Currently the only response I have is sabr.malformed_config (2c1d0a15 73616272 2e6d616c 666f726d 65645f63 6f6e6669 6710021a 022006). Most of these 7h 30m were done on the ground, but i’m working on this at 37 000ft in the air. Had to do some hacks & scripting to get this to connect to the internet, which needs you to watch an ad every 30 minutes."}, {"post_id": 32689, "ts": "2026-07-22T00:21:33Z", "hours": 2.3422, "text": "I did a bunch of integration stuff, and cleanup, but now it plays 360p from the mweb client! I had to add an extra way to decipher n/sig to it (since youtube is yes), but it seems decently reliable, execpt for me not having POToken generation checks to see if it’s ready. Hopefully shouldn’t be too hard :)"}, {"post_id": 32532, "ts": "2026-07-21T19:26:46Z", "hours": 0.4147, "text": "iOS 5 now works with the botguard stuff! It was pretty simple, I just had it load the cloudflare version of polyfill.io and copied the JS it gave (since it’s based on UA)"}, {"post_id": 32499, "ts": "2026-07-21T18:34:50Z", "hours": 1.1594, "text": "I did some minor optimization of the POToken stuff, so it doesn’t block the main (UI) thread for too long, turning 2478.5ms -> 8.8ms by adding a 0 second settimeout when starting the botguard VM. I also went to go check on iOS 5. When there, I noticed my analytics temp file was failing to write, meaning it sent a “installed” event every launch. This is well… bad. It means my analytics are bad yay! I added a small check to see if I can actually write this file before sending it off, i’ll diagnose it later."}, {"post_id": 32158, "ts": "2026-07-21T03:56:13Z", "hours": 0.7561, "text": "And finally, I DID IT!!!!!!!!!!!!!!! YESS!!!!! This URL was generated on the phone, from a URL from the mobile client, meaning I can now get signed in videos. This was months and have ruined the speed of startup… BUT IT WORKS!!!!! I also have to actually make it like use the n/sig function, and do other tweaks since I used a proxy to manually implant the URL. It also means I can finally start making a SABR client inside this. I am very happy 😭"}, {"post_id": 32127, "ts": "2026-07-21T02:27:00Z", "hours": 3.8428, "text": "YESSS I HAVE A N/SIG SOLVED WITH JS CHALLENGE. I am yet to test if it’s valid though, here’s hoping lol."}, {"post_id": 31906, "ts": "2026-07-20T17:49:16Z", "hours": 1.3297, "text": "In an effort to keep it on device, I tried switching to tree-sitter. I got it all compiled for iOS, and I did get it to just parse the javascript on device! However, it took 40 seconds to parse. Along with this, RAM usage went from 58MB -> 220MB. The 3GS (one of the current targets) only has 256MB, and if I ever even try on the 3G, that only has 128MBs of ram. This is very bad. As much as it pains me, I think the best solution would likely be to have a server pick out the n/sig function, and have the device pull a json file or something which has the functions it needs. Kinda does ruin the “no server is involved” stuff with this, but that kinda does seem like the sacrifice I have to make unfortunately. Sadge :("}, {"post_id": 31547, "ts": "2026-07-20T01:21:56Z", "hours": 2.8094, "text": "So I decided to look at n/sig, as that’s what I need next. N/Sig is basically two steps Find the function for n/sig Run that function. The n/sig function is located somewhere in https://www.youtube.com/s/player/882a803a/player_es6.vflset/en_US/base.js (the link changes as new players come out, so it’s dynamic). If you look at it for a bit, you may notice it’s quite big. 2.4mb. Every other tool puts it into something called meryiah, a JS parser. https://meriyah.github.io/meriyah/ . If you try to put that script into that site, you will notice the output is extremely long. It’s long enough that you cannot select all of it. It’s also long enough to cause memory exhaustion. This is a problem. I cannot run this on my device without causing an out of memory crash. I’m unsure right now how I should get around this, but we will see I also did some integrating the POToken stuff with the rest of that app, but that was relatively minor execpt for the bad memory management I do biting me in the ass. I think this may have also destroyed launch preformance, but i guess we have to see."}, {"post_id": 31466, "ts": "2026-07-19T20:51:47Z", "hours": 1.5017, "text": "I quickly did coldstart token generation. This is intended for when the POToken engine is starting up/unavailable. It’s used to allow for instant playback on actual youtube, and here too I hope. There’s a few things I need to do to make sure this works alright. Right now, if there’s no network on startup, the engine will just be perpetually broken, and that’s not great, so I need to handle that, along with actually integrating it with the rest of the tweak."}, {"post_id": 31112, "ts": "2026-07-19T07:51:46Z", "hours": 2.9272, "text": "i did it! i now have a POToken on device. God that took far too long lol. Now I actually have to like… use them. im going to bed."}, {"post_id": 31024, "ts": "2026-07-19T02:36:09Z", "hours": 5.005, "text": "Probably had some other things, but I got the botguard response in the youtube app instead of the YT Capture app. This was shockingly annoying, since idk why, but the GTMHTTPFetcher just… doesn’t work on the youtube app? Since at least for now this is iOS 5+, I just switched to an equivalent function in the NS stuff. Right now this does botguard responses only, but I need POToken generation, so here I go i guess….. (isn’t this just riveting?)"}, {"post_id": 21806, "ts": "2026-07-03T22:44:25Z", "hours": 4.5053, "text": "I decided that QuickJS was just not working out, and decided to switch over to a hidden webview. I had a few hiccups due to the fact that it’s an ancient webview, and thus missing functions like await, async, and Symbol. The latter was required by the botguard’s iframe, which caused issues trying to polyfill it, but I got there in the end. And now I have a fresh botguard token! Now it’s time for POTokens, and then the needed tokens for uploading videos!"}, {"post_id": 21213, "ts": "2026-07-03T01:08:14Z", "hours": 3.8242, "text": "I fixed an issue where videos with a view count over the 32bit integer limit (2.14B) go into the negatives. This was relatively annoying since the issue was the app turning the int64 into an int when passing it to a function to display the video, meaning I had to RE & recreate the functions for displaying video info three times! (1.2.1 & 1.3.0 had different versions for iPad, and 2.0.0) Also did a small fix to the dislikes where viewing a video where more dislikes than likes (baby shark) would make the likes & dislikes 50/50."}, {"post_id": 18845, "ts": "2026-06-30T01:30:09Z", "hours": 5.8875, "text": "Took a break from PO stuff still, but now you can select a specific channel, though i’ve hidden my other one bcuz privacy."}, {"post_id": 9060, "ts": "2026-06-15T04:01:08Z", "hours": 0.3219, "text": "Since I keep seeing crash reports from people not reading “Known Issues”, i’ve added one for this, and iPad on iOS 9 incompatibilities. Hopefully I will stop seeing all this :)"}, {"post_id": 9053, "ts": "2026-06-15T03:35:25Z", "hours": 5.7428, "text": "I am taking a break from POToken for now, since they are legitimately hell, and it’s kinda gotten in a state where too much is broken and I must do a patch to fix these issues. I’ve managed to fix most of the issues which include Sentence based instead of word based captions not being handled “Viewer Discretion” videos not playing due to some missing flags RYTDL now uses ratio stuff with the from youtube like count instead of relying on just sometimes broken data from RYTDL Homepage length being broken Playlist content (trending, categories, playlists (duh), favourites, watch later) no longer appearing Removing the now broken “Adaptive” option (rip)"}, {"post_id": 7077, "ts": "2026-06-11T21:03:53Z", "hours": 3.9622, "text": "I’m getting somewhere but it’s still quite wrong. I managed to “pass” initalization, but generating a botguard response is just flat out broken. This should look very different. I changed out some bits on how setTimeout & setInterval to get it to initalize, but I don’t know if something there is wrong or what is happening :("}, {"post_id": 1889, "ts": "2026-06-04T03:24:22Z", "hours": 2.4694, "text": "Sooo uhh suffering :D I do not know everything in this 2h 26m, but I spent a bunch of time rewriting some of my requesting stuff to have auth for challenges, and debugging why the challenge response I got was junk. Turns out, I’m bad at javascript and didn’t properly await -_-. Now I can actually get a completed challenge! but only currently in the browser… Time to try it on device!"}]...
|
Title: TubeReplacer by @Preloading | Stardance
De Title: TubeReplacer by @Preloading | Stardance
Devlogs:
Sooo uhh suffering :D I do not know everything in this 2h 26m, but I spent a bunch of time rewriting some of my requesting stuff to have auth for challenges, and debugging why the challenge response I got was junk. Turns out, I’m bad at javascript and didn’t properly await -_-. Now I can actually get a completed challenge! but only currently in the browser… Time to try it on device!
I’m getting somewhere but it’s still quite wrong. I managed to “pass” initalization, but generating a botguard response is just flat out broken. This should look very different. I changed out some bits on how setTimeout & setInterval to get it to initalize, but I don’t know if something there is wrong or what is happening :(
I am taking a break from POToken for now, since they are legitimately hell, and it’s kinda gotten in a state where too much is broken and I must do a patch to fix these issues. I’ve managed to fix most of the issues which include Sentence based instead of word based captions not being handled “Viewer Discretion” videos not playing due to some missing flags RYTDL now uses ratio stuff with the from youtube like count instead of relying on just sometimes broken data from RYTDL Homepage length being broken Playlist content (trending, categories, playlists (duh), favourites, watch later) no longer appearing Removing the now broken “Adaptive” option (rip)
Since I keep seeing crash reports from people not reading “Known Issues”, i’ve added one for this, and iPad on iOS 9 incompatibilities. Hopefully I will stop seeing all this :)
Took a break from PO stuff still, but now you can select a specific channel, though i’ve hidden my other one bcuz privacy.
I fixed an issue where videos with a view count over the 32bit integer limit (2.14B) go into the negatives. This was relatively annoying since the issue was the app turning the int64 into an int when passing it to a function to display the video, meaning I had to RE & recreate the functions for displaying video info three times! (1.2.1 & 1.3.0 had different versions for iPad, and 2.0.0) Also did a small fix to the dislikes where viewing a video where more dislikes than likes (baby shark) would make the likes & dislikes 50/50.
I decided that QuickJS was just not working out, and decided to switch over to a hidden webview. I had a few hiccups due to the fact that it’s an ancient webview, and thus missing functions like await, async, and Symbol. The latter was required by the botguard’s iframe, which caused issues trying to polyfill it, but I got there in the end. And now I have a fresh botguard token! Now it’s time for POTokens, and then the needed tokens for uploading videos!
Probably had some other things, but I got the botguard response in the youtube app instead of the YT Capture app. This was shockingly annoying, since idk why, but the GTMHTTPFetcher just… doesn’t work on the youtube app? Since at least for now this is iOS 5+, I just switched to an equivalent function in the NS stuff. Right now this does botguard responses only, but I need POToken generation, so here I go i guess….. (isn’t this just riveting?)
i did it! i now have a POToken on device. God that took far too long lol. Now I actually have to like… use them. im going to bed.
I quickly did coldstart token generation. This is intended for when the POToken engine is starting up/unavailable. It’s used to allow for instant playback on actual youtube, and here too I hope. There’s a few things I need to do to make sure this works alright. Right now, if there’s no network on startup, the engine will just be perpetually broken, and that’s not great, so I need to handle that, along with actually integrating it with the rest of the tweak.
So I decided to look at n/sig, as that’s what I need next. N/Sig is basically two steps Find the function for n/sig Run that function. The n/sig function is located somewhere in https://www.youtube.com/s/player/882a803a/player_es6.vflset/en_US/base.js (the link changes as new players come out, so it’s dynamic). If you look at it for a bit, you may notice it’s quite big. 2.4mb. Every other tool puts it into something called meryiah, a JS parser. https://meriyah.github.io/meriyah/ . If you try to put that script into that site, you will notice the output is extremely long. It’s long enough that you cannot select all of it. It’s also long enough to cause memory exhaustion. This is a problem. I cannot run this on my device without causing an out of memory crash. I’m unsure right now how I should get around this, but we will see I also did some integrating the POToken stuff with the rest of that app, but that was relatively minor execpt for the bad memory management I do biting me in the ass. I think this may have also destroyed launch preformance, but i guess we have to see.
In an effort to keep it on device, I tried switching to tree-sitter. I got it all compiled for iOS, and I did get it to just parse the javascript on device! However, it took 40 seconds to parse. Along with this, RAM usage went from 58MB -> 220MB. The 3GS (one of the current targets) only has 256MB, and if I ever even try on the 3G, that only has 128MBs of ram. This is very bad. As much as it pains me, I think the best solution would likely be to have a server pick out the n/sig function, and have the device pull a json file or something which has the functions it needs. Kinda does ruin the “no server is involved” stuff with this, but that kinda does seem like the sacrifice I have to make unfortunately. Sadge :(
YESSS I HAVE A N/SIG SOLVED WITH JS CHALLENGE. I am yet to test if it’s valid though, here’s hoping lol.
And finally, I DID IT!!!!!!!!!!!!!!! YESS!!!!! This URL was generated on the phone, from a URL from the mobile client, meaning I can now get signed in videos. This was months and have ruined the speed of startup… BUT IT WORKS!!!!! I also have to actually make it like use the n/sig function, and do other tweaks since I used a proxy to manually implant the URL. It also means I can finally start making a SABR client inside this. I am very happy 😭
I did some minor optimization of the POToken stuff, so it doesn’t block the main (UI) thread for too long, turning 2478.5ms -> 8.8ms by adding a 0 second settimeout when starting the botguard VM. I also went to go check on iOS 5. When there, I noticed my analytics temp file was failing to write, meaning it sent a “installed” event every launch. This is well… bad. It means my analytics are bad yay! I added a small check to see if I can actually write this file before sending it off, i’ll diagnose it later.
iOS 5 now works with the botguard stuff! It was pretty simple, I just had it load the cloudflare version of polyfill.io and copied the JS it gave (since it’s based on UA)
I did a bunch of integration stuff, and cleanup, but now it plays 360p from the mweb client! I had to add an extra way to decipher n/sig to it (since youtube is yes), but it seems decently reliable, execpt for me not having POToken generation checks to see if it’s ready. Hopefully shouldn’t be too hard :)
I’ve been doing a lot of work on getting SABR playback working. I think i’ve got sending “preferred” audio & video formats, client info stuff and probably some other things too. Currently the only response I have is sabr.malformed_config (2c1d0a15 73616272 2e6d616c 666f726d 65645f63 6f6e6669 6710021a 022006). Most of these 7h 30m were done on the ground, but i’m working on this at 37 000ft in the air. Had to do some hacks & scripting to get this to connect to the internet, which needs you to watch an ad every 30 minutes.
OK, a couple fun things. I finally got an output from SABR yay! The bug was really stupid, and it took me wayyy to long to figure out. I get the ustreamerconfig as base64, HOWEVER, this isn’t standard base64, it’s URL safe base64… for some reason. To send it in SABR, I have to turn it into bytes, specifically an NSData. These old iOS versions don’t have a standard base64 library, so I import one. The base64 library does not accept the - & _ type, and instead of like throwing any sort of error or even a log, it just… ignores them! So the error was actually accurate, it was a malformed config, specifically ustreamer config. I also did some stuff on POTokens. It appears that youtube did an update, and the POToken engine does more checks to see if it’s on youtube.com, or something like that. It seems it now specifically refuses POTokens were minted on not youtube.com, and only for the video id case, and only sometimes, specifically if fexp in the URL is 51973818, if it’s 51973819 it works. Also for some reason on my end using the visitorData works, which it doesn’t for other people in the youtube.js discord. Oh I should mention it also affects the library BgUtils, which my thing (and yt-dlp, and literally everything) is based on/uses. For now, i’m going to ignore the POToken issue, since I’m honestly not that great at debugging the youtube’s JS (i spent like a couple hours trying, if you search for function Vr in the base.js you’ll find something in the POToken minter as of right now). However according to Luan (the author of the BgUtils thingy), nothing changed in the player code, so idk, Idk how I could really debug the potoken engine. Oh also, something… interesting, someone else in the BgUtils discord decided to uhh fork my thing and using the power of AI, implement POToken gen using QuickJS. I initally tried this for POToken gen but got stuck with me missing polyfills. I’m considering taking parts of the forked code (specifically the polyfills), and some of my older QuickJS code and having two POToken systems you can switch between in case one breaks (ES6 issues for example), but idk if I should. I guess for now, I get to go actually write an implementation reading SABR data/UMP now. Maybe i’ll be doing this on a plane again :D (return flight)
Working on some SABR parsing stuff, I got StreamProtectionStatus & NextRequestPolicy, along with the extraction stuff to get the segment from SABR. Doing this kinda of debugging on airplane wifi is rather hard, as the response is quite big, containing video segments.
Actually doing something with the media data we get from SABR now. I have decided that probably the best way to implement this is to convert it into an HLS stream. I came to this decision after fully looking at what SABR outputs, a fragmented MP4 intended for DASH, which the phone cannot play. However, SABR splits up the files based on the header first, then a bunch of fMP4 fragments. With a lot of work, I should be able to manually change the container from fMP4, to MPEG-TS, the format used by HLS, and have it streamed. It does have some hickups, changing stream to a lower or higher quality while streaming would likely be difficult (more concerning with it being a server adaptive bit rate system). Also MPEG-TS looks kinda… janky? This may also bring me some trouble if I chose to add Opus audio, since much of the audio streams are Opus based. Anyways, I now parse the first MP4 stream we get per format (audio & video), specifically the initialization section, and create an HLS manifest out of it! My next step is probably to have the phone itself host an HTTP server to grab the stream from, as it only supports getting videos from URLs. Audio is also in MP4 format, so this should work for it too :D
POTokens actually work! current protection status being 1 means the session is approved and good to continue throughout the entire stream! I basically implemented the PR at https://github.com/LuanRT/BgUtils/pull/44 , and did some user agent fixes… and my fuckup mis-spelling something I literally said in comments I might of 😭 . And now I get SPS of 1! :D :D :D It only took… like 3 months…. for potokens… 😔 I also figured out that Web offers an HLS stream if you specify an iOS useragent… uhhhhh i pretend not to see (for now), I’m sunk cost right now, and such. I wanna commit video container crimes!
I did some extra work trying to parse MP4, but like… this is going to be a lot of effort to do, and just for the video, not even looking at audio yet. For this reason, I would like to bundle parts off FFMPeg with it, but compiling it is being terrible… I got arm64 after a while, but armv7 just does not want to go :(
I decided compiling FFmpeg was going to take forever, uhh doesn’t really give good stardance hours, and this is does more stardance hours ig… I did tfdt, tfhd, and trun parsing. I think this is all the parsing I need to do on the video side and the fragment size… i hope. Here’s a screenshot of me just printing the sample size to syslog.
I now grab h264 samples, and convert them into annex b samples. I think the next part might be actually building the TS file! wow! This means creating packets of the data, and then making packets out of those packets (why…)
Quite boring when all that exists in these devlogs is random hex eh? Hopefully this should be the last hex blob before actually getting some kinda of video to play! (maybe, miiiight have to do one more as I hook the TS file up with the HTTP server). I managed to packetize the data into PES packets. The next thing for video (no audio) should be packing it all up in one nice TS file. And then if we get lucky, we will get like 4 seconds of a video :D, maybe even up to like 10 since then the buffer runs out, and second requests to SABR aren’t implemented yet.
Unsure how much of a win this is, but at least FFplay can play the video! However, VLC, built in media players on windows, and more importantly, the video player within iOS 6 cannot play it :( I’ve forced it to use 144p for a while now for a small file size, but it should be able to go quite up in size. Bigger issue is getting it to play, however I think I will wait on that, and work on having it serve the files on the phone so I can debug this a bit easier, and have the player actually like play the files without my syslog stuff. Hopefully I can get the video to play tho :)
IT PLAYS!!!!!!!!!!!!!!!!!!!!!! YES!!!!!!!!!!!!!! that took wayyy too much debugging (and i also used ai assistance to tell why it wouldn’t play). I got it first working with VLC & other media players, but the iOS 6 player was especially stubborn. It only plays a couple seconds since I only do one request, but it plays. Did i mention it plays? I might try forcing it to use 1080p since 144p is a little… lacking in quality and SABR is defaulting to it, i guess i’ll figure that out later.
srry for audio, i am in a discord call, but i managed to get more than like 20 seconds to work, however it currently gobbles RAM, and has wayyyy too many crash bugs. I fixed a bunch of the crash bugs, and broken stream bugs, but there’s still some crashing, esp. on video end.
I managed to make the buffering system a little more robust, it can complete a video & even seek if your careful to let it play out. I also fixed some of the memory leaks, you can get much farther, but it does still only climbs, at the end of this 25 minute video it got up to 189mbs of ram used, which means we basically leaked 100mb of ram. This is quite unacceptable still, and I get to do more of figuring out why, yay!
Figuring out why the player view was never getting freed was taking too long, so uhh audio! yes! I have managed to grab the header out of the app after having to patch wayyy too many bugs with the header parsing, some of which could crash the app if your network is bad. Tiem to parse dis audio header!
OK, so this was quite annoying, It was really hard to find any docs on how esds is decoded, but I got there in the end, these are some of the parts I need to make the ADTS header ( https://wiki.multimedia.cx/index.php/ADTS ). The decoder is quite bad, and just ignores some cases, but hopefully it will work :)
Shockingly, now that I have most of the TS stuff already in place for video, audio is shockingly painless! It was only just like the previous thing, and ADTS headers, https://wiki.multimedia.cx/index.php/ADTS . Time to try it on device!
It kinda somewhat maybe works! you can make it through a video, however scrubbing thru the video takes forever (some request never finishes), and theres some random stutter in the video. RAM usage is still a problem, and private videos don’t play. To get here, I did things how the HTTP server wanted so other requests can come in while i’m waiting for a segment, and allows this to play fully, however I do still need to fix the buffering issues.
I managed to fix most of the RAM issues, excluding the one inside the youtube app which my stuff amplifies. I’ve done some stuff to allow you to change apps, lock the phone, etc, and have the stream recover. It’s not perfect, but it works well enough.
I fixed the support in 1.0.0-1.3.0, 1.4.0 and above, they started changing a bunch of player things which I still have to figure out….
I spent a bit of time fixing up the settings menu to properly have the HD options. Unsure how much of this is going to stay like this, but right now both of the HQ ones work, the 360p (Android) plays with SABR for a bit, then it stops as we don’t have proper attestation (our POTokens only work on web based clients). Probably going to have to forbid using sabr on ANDROID. Unsure yet about Android VR or visionOS. They both need a visitorData, which I still have to get. VisionOS has the nice perk of giving a completely unprotected HLS stream, which this can use. Android VR is traditionally unprotected, but I think they kinda ruined that. I also did a tiny bit of work to get closed captions working, which is basically prefixing https://www.youtube.com to the URL if it begins with a slash
A bunch of smaller bugfixes, and now it runs on iOS 5. There was some small differences since polyfils, and it doesn’t work with a proxy on (since it proxies localhost). The left device is iOS 5.
i managed to get private videos to work, however they still don’t show up in the “Uploads” tab.
Managed to get videos to count towards your history! Also some kinda boring optimization things (start parsing even while we are still downloading, because net neutrality doesn’t exist for some reason, and someone got 22 seconds for a 2mb file)
I managed to get 1.4.0 support working! They started kinda doing what I implemented myself…. which causes issues, but it works! 2.0.0 is going to be hard tho…
2.0.0 support! and actually 1.4.0 support this time (oops, i think i clicked the wrong version…). I really hacked my way to 2.0.0 support, as it adds all the stream data to a protobuf container thingy which is never actually generated as protobuf. The protobuf also isn’t a normal function, and I couldn’t figure out how to recreate it, not that it would really work if it does do some protobuf shenanigans. So I did what probably every programmer does, hack it in poorly. When it starts trying to play the video, after the protobuf section, and where i still have access to the legacy GData streams, and I just shove it in there, and it manages to work! Also had to do some extra things to include valid authentication to the SABR stuff so it can play private videos and such. But now 2.0.0 works!
A bunch of signin fixes, I fixed the channel id finder failing for different accounts, and I fixed an issue where one of the requests I did on 2.0.0 is synchronous and would not let the app start until it completed.
i did a bunch of misc fixes which aren’t interesting. iOS 5 preference fix some reloading of video changes with SABR cleanup of a bunch of things a fix to the item count (cuz 32bit limit aaaaaaa) memory things some crash bugs with SABR
I made some of the settings work, and also made it hide the comments count which I don’t have a way of getting a precise number right now. Ignore the playback error.
Some minor sabr tweaks, and also a fix to the channel id failing to load for certain feeds
So this one is small, but I’ve done an optimzation for the process of getting that little thumbnail. The older youtube clients did indivisual, very small requests for the specific channel, incl the thumbnail. I already have this data with the video requests, and getting the channel data is rather wasteful of the network and slow. I’ve replaced it with just using the avatar from the feed. Speeds things up a decent chunk!
Did a small hack to add the tweak’s version to the crash reports
I did a bunch of things, none of which felt that interesting to make a log for, so here’s one big one. The quality selector now works You can now toggle video stats (logging in history) on or off. Some error handling and trimming stuff to save on ram
Bugfixes! I’ve decided it’s probably good enuff to “feature lock” and just get it ready for release (also cuz stardance ends soon, yet the streak thingy to a plushie continues. as its ending. why. i wanna take a break!) Not much images but Fix an issue with my trimming stuff not working on 1.4.0 Managed to cleanup the stream when switching video on 2.0.0 Some missing thing on the thumbnail speedup thing My failing to do requestProfileForIdentity correctly.
I managed to get N/Sig deciphering working with HLS streams, meaning you can now watch livestreams, if you change up some settings & it’s buggy. I’m not intending on shipping proper stream support right now, so this will do for release.
Made it zip the network log stuff for sending over email, as text files generally have a really good compression ratio, (the file is actually 2mb), and email has really low limits.
Bugfixes! fixed a bug where playlist videos fail to play on channel playlists fixed the open source licesnses page crashing on 2.0.0 fixed a bug where closed videos in 2.0.0 continue to play after closing, locking the phone, then unlocking fixed a crashing bug when not connected to internet when fetching profile
So, it randomly decided to break for many videos, and only for some people. It appears that YT is doing extra things to detect adblockers on web, and something I’m doing is triggering the adblock detection. This is uhh bad :) I get to figure out what I’m missing and implement it properly. Now for bugfixes I made fixed a signin crash on 1.0.1 & 1.1.0 due to a missing cflag fixed the video date failing to load on iOS 5 added proper backoff to SABR
Did some stuff to make the challenge solver/nsig/potoken restart when needed. Also reorganized it a lot of that file.
Oh dear, publishing it to the world! I’ve decided to say “fuck it, its good enough”. There are some issues which has popped up, like some versions crashing, and the SABR stream never starting issue. I’m praying that it’s not just that bad. Made a reddit post about it :3 https://www.reddit.com/r/LegacyJailbreak/comments/1wnh4il/ Hopefully this doesn’t go catastrophic! I also have to setup a demo. Right now, the big issue is how to. Just a video is kinda… lame? So I want to do somehow make it an interactable demo. However, there is not an emulator for appstore apps for any iOS version between 5-10. This makes things rather tough. I do have some spare phones I can acquire to run it. However, getting the screen out is uhh….. challenging. The version of AirPlay on iOS is too old for the open source projects, and even the closed source, execpt for one, AirServer (which is 20$ per computer). The 30pin -> HDMI adapter -> capture card is extraordinarily unreliable, and keeps disconnecting when I try to use it, and is a pain in the ass to get working. There’s Veency, but it goes black when playing a video, and is unusable slow. And after all that, I have to send it to a server to stream to a web browser, I have to take input, I have to manage launching the correct app, preventing escaping the app, handle crashing, queuing (its one phone so people will have to wait), etc. All in 7 days. oh dear.
Alright, so the results are in. From what it seems, it mostly went well, however there are some issues that came up, primarly due to me not having enough time to test (I released this the day before stardance was extended for another month…. a bit of extra time would have been nice to iron out the few bugs on release, and also time to diagnose the playback errors people encounted). I did a quick 2.0.1 release to fix some of the bigger issues… 5 days after the initial. i’m tired ok?
Cooking up the demo, I’ve basically setup a remote control system on this phone, which should hopefully run over the internet! Giving randos complete control of this phone… what could possibly go wrong???? I still need to do some stuff to lock down the system it runs in, and also patch the problems with tubereplacer that came up recently.
To the demo, I added a time limit & a restart app option in case it breaks and the app has to be restarted....
|
1792529450.069319
|
1793134250.069319
|
|
10129
|
reMDer by @Keyboard1000n17 | Stardance
|
Keyboard1000n17
|
0
|
197.03
|
0
|
[]
|
[{"post_id": 71282, "ts": "202 [{"post_id": 71282, "ts": "2026-09-20T16:00:28Z", "hours": 25.7911, "text": "last devlog this is my last devlog the project isn’t complete and i won’t be shipping it. you see, i was banned for 2 months for misconduct on slack (i will not provide details here but i deserved it, it was corny anyway), and as part of that ban, i can’t participate in any events, including stardance. in this time however, i’ve done a lot. there’s now spinners for images, proper tables, and so many more improvements. keep your eyes peeled for a release on the github ! 👀 also it doesn’t matter that this devlog is 15 hours over the limit, its not like i can do anything about it. also if one of you regulars in #stardance see this, can you please ask amber if i can have my sticky streak rewards? i really want the stickers and plushie Changelog ( 446103b ) Render details elements properly again ( f527e5d ) Better logs, align images in row when a paragraph contains only images ( 3df2f59 ) Make task list function use TextChunk over ANSI escapes ( 2367089 ) Add proper tables ( 47c2b42 ) Add aligning components ( 00785d7 ) Move from Chalk/ANSI escapes to OpenTUI StyledText for styles ( 429e4b6 ) Load images lazily with spinner while loading ( a993197 ) Use OpenTUI ImageRenderable for images in renderer ( aa96067 ) Improve types and error handling, work on image bug ( b54ad43 ) Revert “Add footnote plugin (usage WIP) (errors on run)”"}, {"post_id": 64726, "ts": "2026-09-09T11:11:17Z", "hours": 6.0719, "text": "scroll one line at a time, render div and details elements not very big news here, but now you can: scroll just one line at a time instead of a whole renderable/element at once render div and details properly! now you can click on a details element to open and close it! this didn’t even take too long more technical, but i switched to mostly using the opentui renderable api which uses classes like TextRenderable or BoxRenderable that return a Renderable instance instead of functions like Text and Box which return a ProxiedVNode<T> . this is mostly because there’s a bunch of things a Renderable has that a ProxiedVNode doesn’t anyways im currently working on adding footnotes, so see you in a few days Changelog ( 64f6ed8 ) Add footnote plugin (usage WIP) (errors on run) ( ddd5c46 ) Add indicators to details elements and opening on click/space/enter ( 344806a ) Add support for rendering div and details elements ( d3b4a1d ) Fix small layout issues ( 5eb11b9 ) Scroll only one line at a time and convert (mostly) to Renderable API"}, {"post_id": 62808, "ts": "2026-09-06T10:22:48Z", "hours": 10.2442, "text": "table of contents feature is done! took only 10 hours, but im done with the table of contents thing! you can press shift+j to go down to the next heading, and i forgot to add shift+k 😭 anyway this took a while since i couldn’t figure out how to position the box properly and how to style it. this was fucking ass icl. i usually have much more to talk about but this wasn’t the most fun so here’s the commits: Changelog ( 5ccec11 ) Remove unnecessary focusing ToC ( 927cae9 ) Add tab cycling ( ae72d3d ) Scroll ToC menu to selected index instead of blindly 1 down ( 249d61a ) Implement scrolling ToC on pressing J ( a2ae0f2 ) Get table of contents feature working ( a6c7744 ) Add scrolling to next heading on pressing J ( 49f8fec ) Add “? - Help” hint to end of bottom bar"}, {"post_id": 60445, "ts": "2026-09-02T19:38:19Z", "hours": 10.6467, "text": "figlet headings, small headings, bottom bar, help menu and keybinds we’ve got a lot of new stuff! firstly we’ve got a bottom bar! all it does for now is show reMDer with a green bg and the file name next to it, but i’ll add more later! next we’ve got figlet headings! at the start i was thinking about using figlet for headings but i gave up on that. but now, i’m back to using it! this took a good chunk of the overflowing hours here but they look really cool too! passing a --no-render-headings or -H flag will make the headings render as normal text with colors instead of figlet fonts now! there’s now a tiny help menu in the corner! it only shows two keybinds right now–oh and speaking of keybinds… keybindings are now in ! for now you can press q to quit, ? to toggle the help menu, and C (shift+c) to open the console in debug mode and that’s about it next steps? here’s what i’m gonna do next: add support for horizontal rules add a table of contents feature like that of the leaf markdown viewer add some stuff to the bottom bar add an option to put the bottom bar at the top instead add support for a config file using YAML Changelog ( 9557586 ) Add help menu ( a4149e2 ) Add keybinds: q to quit, C to toggle console ( 4b18153 ) Finish figlet fonts support ( d23466d ) Start trying figlet again for ASCII art ( 33d52ea ) Start working on ASCII art for h2 headings ( b0e1668 ) Add option to not print big headings ( c58369c ) Start with bottom bar"}, {"post_id": 56522, "ts": "2026-08-28T10:01:31Z", "hours": 7.42, "text": "code blocks, alerts, emojis and task lists! we’ve got loads of new cool stuff that get rendered now! first, github alerts/callouts now render nicely! they look like this: > [!TAG] > content where TAG can be NOTE , IMPORTANT , TIP , WARNING or CAUTION . they also have these cool icons next to them, but the catch is you need a nerd font for it. i’ll add an option to not need it and only use ascii characters next, we have highlighted code blocks! the renderer can highlight hundreds of languages using shiki ! you might not even have heard of some of the languages that it can highlight! imo its really nice looking and i love it! the bulk of this time came from adding support for task list items because i couldn’t figure out how to do it. eventually after some tinkering i’ve got it to work! it looks kinda cool too tbh i also got emoji support using an extension. it automatically converts :emoji: to the corresponding emoji if its in the unicode specification. finally, i added a simple height option that just sets the height of the renderer. it allows you to set the height of the renderer manually and that’s about it lmao Changelog ( b4f69ad ) Add height option ( beea3a6 ) Add task list items support ( 4c42c84 ) Add emoji support ( 564a761 ) Upgrade markdown-it, fix breaking changes ( 963d910 ) Add alerts support ( 5e266e8 ) Add icons in code blocks ( 0bf0af7 ) Add code block support"}, {"post_id": 54062, "ts": "2026-08-24T20:36:45Z", "hours": 4.4367, "text": "holy fuck, you can pipe into stdin and tables render properly! while this is quite out of schedule (i usually post every 2-3 days), today brings some peak stuff! the peakest part is at the end firstly, i have in fact fixed tables! the issue was i was pushing the accumulated cells array to the rows array in the wrong loop. i was doing this in the loop that iterates over the cells in a row, so it was causing it to repeatedly push the same strings over and over. the fix was putting it in the loop just outside, that is, the loop that iterates over the rows in the table token! i’ve also improved the image handling! now Image classes have the buffer property renamed to content , and has a new property called properties , which is always {} . with this, it has all the properties of ProcessedToken , so my lsp won’t complain that some property doesn’t exist on Image speaking of ProcessedToken , its now an interface instead of a type. there’s also a new TableToken interface that extends ProcessedToken , with an alignment property. this makes it a bit easier to handle tables since the content property is narrowed. also, it seems like opentui’s tables don’t support alignment, so i might have to make a custom table function. i also upgraded opentui from 0.5.7 to 0.5.8! i have no idea what changed, but whatever i’ve also stopped using chalk to color my errors since the opentui console doesn’t support ansi now the peakest part is you can pipe markdown into the program . this is pretty peak and you must agree since there’s a lot of stuff you can do with this. for example, you could render arbitrary markdown without having to create a file first! it has a limitation though: if you’re on windows, you can’t use the interactive mode, and the rendered content is forced to print to stdout. this is because of a bug with bun. if you’re piping into the program, it’ll get the input by calling await Bun.stdin.text() , but this stops sending keypresses to opentui because of a bug in the bun runtime, so you can’t scroll down. i solved this issue (or rather, chatgpt solved this issue) by opening a read stream on /dev/tty . the issue with this is that /dev/tty doesn’t exist on windows since its not unix-like. my idea was to just, not let you do interactive mode on windows if you’re piping content to it. again, this is a bug with bun, and i’ll remove this limitation once one of the two is merged. that’s right, there’s two! here’s one for reference: https://github.com/oven-sh/bun/pull/32153 shit that was long Changelog ( dd07e14 ) Upgrade packages ( 77e6d34 ) Add support for piping into renderer.ts from stdin ( 1995f45 ) Improve image and ANSI handling, stop using chalk in errors ( 22cfacd ) Improve table handling, switch some types to interfaces pls like"}, {"post_id": 53181, "ts": "2026-08-23T16:52:59Z", "hours": 9.7842, "text": "better types. debug mode and stdout! from my last devlog: next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) of these, i’ve done none! what i have done though is add flags and types! i spent a while dealing with type errors because i decided to specify types instead of just putting any on ProcessedToken.content . i also added a debug flag, but literally all it does is show the console i also fixed the width thing, so the content is only as wide as the space you give it so cooll!! the main part of this is that i added a --print-to-stdout flag that just prints the formatted markdown to stdout! you can just scroll in your terminal instead of having a whole ass tui its kinda borked and incomplete though, so i’ll fix it up! it does print some garbage at the beginning so that’s not great anyways, i’d better do what i said i’ll do last devlog! i went off track for this lmao Changelog ( b1c0489 ) Implement half-baked print to stdout option ( aa3c029 ) Add debug flag, fix logic errors ( aa33e84 ) Specify types for ProcessedToken.content instead of any"}, {"post_id": 51600, "ts": "2026-08-21T11:25:29Z", "hours": 8.0094, "text": "(back to) opentui! if you’ve read my last devlog, you might remember that i was considering the jsvision library. however, i came back to opentui because its still much simpler. also, i found that there are libs to adapt ansi! or at least chatgpt did at first i was doing ghostty-opentui , but i realized after some time that it was literally a whole terminal. then i got chatgpt to find me this package called ansi-sequence-parser ( https://www.npmjs.com/package/ansi-sequence-parser ) and its perfect! so now im using that to render the bold and italics! tbh i could just eliminate the middle stage ( stylize.ts ), but i put a lot of work into it and i’m extremely vulnerable to the sunken cost fallacy, so i’m doing this bloat lmao. also, i got ordered lists, bullet lists, and blockquotes working! they look so cool! as for the menu, its not doing very fine, but that’s because i’ve not worked on it! i’ll get to it, don’t worry! next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) Changelog ( 8b44667 ) Add blockquotes and 1 row bottom margin to second-level renderables ( 3e5182f ) Add oredered list handling ( d997aff ) Switch back to OpenTUI, get things working"}, {"post_id": 49847, "ts": "2026-08-18T19:57:55Z", "hours": 8.505, "text": "generational fuck up well i’ve messed up big time, sunken cost fallacy is real and it got me you see, i was using opentui earlier, but i decided to change because i realized that it doesn’t support ansi escape sequences. i landed on neo-neo-blessed , and it seemed cool, until i realized the list selection thing got fucked up because it didn’t handle scrolling list options with heights greater than 1 row properly which is a deal breaker. i also spent a lot of time patching its types, in fact that’s what most of this time went to i think i’ll use jsvision. it seems interesting and i’ve got nothing to lose. the only issue is it has one maintainer and 9 stars, but gpt found it, and it seems cool. also they have demos of the unmodified lib running in the browser which i wanted to do, so this will be fun Changelog ( 33e1c91 ) Start using neo-neo-blessed and do a generational fuck up"}, {"post_id": 47449, "ts": "2026-08-15T11:47:19Z", "hours": 9.8211, "text": "TUI! i’ve got news: the TUI renders! for this tui, im using opentui! right now, the tui only shows an interactive list of files, and its supposed to render the file content if you select one, but that’s not happening right now. i’ve been working on the function to make opentui render the markdown. while opentui does have its own thing for markdown rendering ( ), i’m gonna render my own markdown. im currently trying to get tables working! Changelog ( c8ab716 ) Work further on rendering, start with rendering tables ( dc8b0be ) Start using OpenTUI for rendering TUI ( 86347cf ) Render unknown HTML correctly (without showing tags)"}, {"post_id": 44744, "ts": "2026-08-10T18:22:19Z", "hours": 2.7394, "text": "it works holy shit it works, the problem was that i was running a function but i wasn’t putting it in a console.log . the test function for reference returned a string. also, unknown tags are handled somewhat properly. i need to actually fix that, but once i do, im gonna start on the tui!! its been 96+ hours now what a crazy thing, i expected this to take 10-20 hours and now look at this… anyways, i’ll go fix the unknown tag thing! after that i’ll start working on the tui Changelog ( c1461c3 ) Get unknown HTML tags rendering"}, {"post_id": 43978, "ts": "2026-08-09T13:44:03Z", "hours": 10.3797, "text": "headings! unknown tag handling (that doesn’t work)! well we’ve got some nice stuff now! here’s a list of everything, including problems!: just whitespace? no more! : tokens that are just whitespace get omitted typescript lsp doesn’t complain : oh my god finally that was so annoying what’s this tag? : if it doesn’t have a handler, it falls back to the default, that is, it turns into a string! this doesn’t work properly though, i have to fix this ching chong ruby tags : now ruby tags are supported! is that a highlighter? : mark elements are now supported, which just put a yellow bg on some text is this a block element or not? : now the renderer can tell by looking at a token’s block property proper heading rendering?!?!? : chatgpt wrote the entirety of this part because you cannot bother me to make an efficient function that wraps giant text art letters based on width where’s the inline code? : that’s right, it doesn’t work and gets completely omitted! Changelog ( 456161f ) Trim content, add boolean property ( 07da8a6 ) Add handlers type to make the LSP shut up, trim strings in test file ( b4d251c ) Add handling for unknown tags ( d903b48 ) Add support for dfn , samp , ruby tags ( 813d934 ) Fix code to stop TypeScript ( vtsls lsp) warnings"}, {"post_id": 40582, "ts": "2026-08-04T07:04:35Z", "hours": 9.9967, "text": "typescript! i’ve moved to typescript, cleaned up some code, finished that image function from last devlog, and upgraded packages! finished the image function : now it works perfectly! upgraded packages : shiki was upgraded! its the code coloring package btw added a test : i can’t keep pressing the arrow keys in bun repl i have to do this moved to typescript : this is the main thing. devs on discord kept telling me to use and i said i’d do it soon. i wasn’t planning on it at this time, but i did because i got fed up with a stupid bug where i was accidentally setting token types to a boolean instead of a string. that prompted me to just do it™ and now i’m fixing a bunch of bugs! still not sure why the language server is just complaining about cases that can’t happen, but that’s what typescript is for i guess Changelog ( 688afd8 ) Start moving to TypeScript ( ac99373 ) Switch to map for aliases, add test, clean up code ( c62c57b ) Upgrade packages, clean up code ( f98e65c ) Finish revamping image function"}, {"post_id": 38811, "ts": "2026-08-01T11:37:47Z", "hours": 10.2436, "text": "WIP WORK // INCOMPLETE // this was a lot of work, and i’m still not done with html in the stylizer! here’s a list of changes with explanations: add more aliases to the aliases array in the html parsing section: this makes it so that html tokens and markdown tokens have the same types convert the array of allowed html tags into a set : sets have a .has() function that lets us find an element in O(1) time complexity which is much faster compared to Array.prototype.includes() which has an O(n) time complexity properly implement disallowed tags: these tags show as plain text because they are disallowed and shouldn’t be processed in markdown put non-block tokens as children of an inline token: non-block tokens only got parsed in the part where inline tokens were processed set attributes: the objects returned by the stylize function now have a properties key better error handling: now, where it used to just throw an error about being undefined or whatever, it will catch it, and throw a more useful error with better debug info [BUGFIX] make sure that arrays don’t get nested: this was a bug where arrays would get nested for some reason [BUGFIX] set token.level and token.nesting properly when processing html: this is necessary because the while loop depends on the nesting to know when to stop accumulating tokens and process them [WIP] html handling: any tokens having the substring _open in their .type property are handled all together, with a handlers object made up of functions. this handling is recursive token with types that don’t match the substring _open get handled through other branches of the if statement ( else if(...) {..} ) [WIP] bullet list handling: i did not realize that there were more markdown-it tokens that i had not added handling for in the stylize function. i also need to do this for some more token types too [WIP] revamp image handling: instead of just a complicated function, i added a class called Image that has a function to render the image. its nearly complete but it has some errors that i committed because i need to commit often lmao chatpgt usage now here i used chatgpt a lot for debugging. here’s exactly what i used it for: why tokens weren’t being processed: this is the problem the array nesting bugfix fixed fixing infinite recursion: i accidentally did that lmfao replacing top-level non-block tokens with an inline token that contains those top-level non-block tokens as children figuring how to set the level property of the tokens questions about syntax and mutation of global vars Changelog ( 5e931f7 ) Revamp image function (WIP) ( 0ce066f ) Improve error handling and fix token.level assignment ( 0f28b75 ) Process details element in stylizer ( 0e154f3 ) Start improving stylizer (WIP) why such long devlogs? you may have noticed i’ve been going more and more time without devlogging. that’s because i like devlogging when there’s a big new thing, not for every small little thing. my plan for this devlog was to announce that i was done with processing html in the stylize function, but that hasn’t happened yet because well, there were a latta bugs here and there, and i had to fix those too. as for the length of the devlog text, i like writing about my progress here because its the only place where it makes sense to talk about it in-depth"}, {"post_id": 35679, "ts": "2026-07-27T08:45:19Z", "hours": 7.8072, "text": "HTML parsing is now complete its been nearly 2 weeks and i have great news: html parsing is complete what this means is that html blocks get processed into token streams like the one’s markdown-it makes. now, i must clarify that these html blocks were already in a token stream but they were distinctly html, having the type html_block , and if i didn’t convert those html blocks into markdown-it’s _open / _close tokens, i’d have to parse it in the file that styles the tokens, and many html tags do the exact same thing as their markdown counterparts so i could reuse some functions. i must also clarify that i have NOT done anything for stylizing html in the stylize.js file, which deals with processing text formatting and image processing next up: stylizing html! Changelog ( c5a5ce0 ) Finish HTML parsing ( 841ba42 ) Start work on HTML parsing"}, {"post_id": 29515, "ts": "2026-07-16T14:30:25Z", "hours": 1.24, "text": "improvements and fixes to inline rendering this is way earlier than my normal schedule, but that’s because i’ve got something to show . basically, inline rendering was bugged , and not only did i fix it , i also made it so that it works better ! that’s all you need to know, do NOT read the rest of this if you don’t want to be bored to death, its a really lengthy explanation of this the initial bug was that inline rendering wouldn’t work at all. i figured out the problem was that i wasn’t pushing \"inline\" to the state array somewhere. i realized that it wasn’t working when called in the table rendering function, and that was because i wasn’t pushing \"inline\" to the state array. the reason for this is because the renderInline function slices the state array at the index after the \"inline\" string, so if its something like [\"paragraph\", \"inline\", \"bold\", \"italic\"] , the function slices at index 2 because \"inline\" is at index 1, and we get [\"bold\", \"italic\"] . the problem is, if \"inline\" doesn’t exist, running indexOf(\"inline\") returns -1, so it slices at -1 + 1 , which is 0, so its just the whole array. but anything before “inline” isn’t a valid style, and since the function for that is undefined, it goes kaboom and throws an error saying that it’s not a function. also gpt found 5 other bugs but they’re kinda irrelevant the fix was making it so that the renderInline function itself pushed \"inline' to the state array instead of depending on it being already there. this also removed the need for making sure that the inline string was already there. i might do this with the rest of the functions too actually :goonology: also removed unnecessary state.pop() occurrences since the pop method is destructive and can mess up everything as for the improvement, you might see in the first screenshot that there’s a bunch of text tokens together. yk, they could be squished together into one token… oh right, that’s what i did! i changed the renderInline function to make a variable where the text accumulates until there’s no more text or if there’s an image, on which it gets pushed to the contents array now the most important thing is that there’s only one more thing left to do: html rendering . this is the last thing before i get to actually rendering stuff on the screen! this is exciting! Changelog ( 9de477d ) Fix, improve inline rendering please like this took more than an hour to write"}, {"post_id": 29168, "ts": "2026-07-15T21:42:41Z", "hours": 4.2522, "text": "THAT WAS SO LONG WHAT ON EARTH in short, tables now work and the inline rendering function is fixed! this took a while because i genuinely had no idea what i was doing. now the long stuff: tables go brr i got distracted while writing this and realized everything’s actually borked, but tables do somewhat work! its still borked tho– also i realized that my whole code is borked, but… inline rendering includes links now! still have no idea how i missed that other i just changed image function so that it returns an object with a prototype function instead of unnecessarily repeating the function as a property of all the image objects, so if there’s 10 pictures in a file, there will only be one function to render each as opposed to 10 instances of that function Changelog ( d8feb46 ) Add table support, fix inline rendering oh fuck, my code is COMPLETELY borked"}, {"post_id": 27805, "ts": "2026-07-13T17:59:20Z", "hours": 2.5478, "text": "PEAK CODE gng TS IS PEAK!!!! i added a function that renders code AND ITS PEAK JUST SEE THE SS now some of this time came from trying to figure out why my code was joining the contents of a function, and it was because i forgot to add the argument that gave the coloring function (chalk library) the text to color. hey, at least i found a way to read the contents of functions time to go steal code from closed-source packages leaving that aside, my next step is thematic breaks. this shouldn’t be too hard, in fact, i’ll do it rn since it’s that easy. rn its 8:49 PM GMT+0300, i’ll tell in the next paragraph when i finish it. [8:54 PM] just did it, it only took like 2 mins, the other 3 were because i found a bug that never removed codeBlock from the stack after it was added. that’s about it, and this devlog was quite short. well, comparatively, to my other devlogs, after all there’s people posting 4 word devlogs. you should follow this project tho Changelog ( a17bd2b ) Add thematic break support ( e28f1b1 ) Add code block styling"}, {"post_id": 26701, "ts": "2026-07-11T17:20:33Z", "hours": 4.4769, "text": "when the FUCK did this become 4 hours so uhh i spent like all of this time debugging and improving my code. first thing is, i replaced these “microfunctions”, as i call them, with an object that had keys whose values were arrow functions. these arrow functions did the exact same thing and took up less space and was even more readable! second, i spent some time on a stupid bug where the main function in stylize.js would hang. i thought it was an issue with the image function, but after half an hour or so, when i added console.log(done) right before the return, i realized it had to do with the main function that was calling the image function, and sure enough, the second i looked at it, i realized the problem: it was a while loop and i forgot to add a line that incremented the index, so it just kept doing the same thing forever until i killed the process oh well, more hours for me third, i improved (or rather cleaned) my image function. it returns promises and doesn’t use terminal-image directly. instead, i made it so that it would return an object with a bunch of keys, one of which is a function that takes the whole object as an input. this function actually renders the image, since i plan to write the function to display it in a way that deals with image rendering after rendering text, and while the images get rendered, a spinner takes their place temporarily, but the images replace those spinners once they are processed fourth thing is, i made it so that the main function calls the renderInline function instead of the paragraph function. in fact, this paragraph function is completely useless, so i went ahead and removed it too. lastly, i upgraded a bunch of packages: upgraded typescript from version 5 to 5.9.3 upgraded got from version 15.0.7 to 15.1.0 upgraded markdown-it from version 14.2.0 to 14.3.0 upgraded shiki from version 4.3.0 to 4.3.1 if you wonder what these packages are typescript is, well, the typescript language, not sure why i have it, might be a dependency for another package. got is some package that does pretty much the same thing as the default fetch() but it can give me a buffer, which i need for images markdown-it is the markdown parser shiki is for coloring code. fancy, right? Changelog ( 9118913 ) Improve code ( 5b9c953 ) Remove test file ( ab3af08 ) Test image URL parsing on GitHub aight this took me 2 hours to write and i started coding again in the middle of writing this"}, {"post_id": 21475, "ts": "2026-07-03T13:24:58Z", "hours": 5.595, "text": "oof! that was a lot of work, but now we’re REALLY getting somewhere!!! first thing, headings actually work now, and if there’s a link in the heading, it gets displayed right below the heading! tbf i did rip the heading thing straight out of the original index.js file when i was trying to make a markdown parser using regex secondly, and the more important thing, image rendering now works . pretty big milestone. i achieved this through the terminal-image npm package. however, this took a while because i couldn’t figure out why it wouldn’t render. the problem was tmux–it was stripping the codes it didn’t recognise so i implemented another system to detect if the terminal had color and/or image support to decide whether to use ansi blocks or actual images. now, it works! ts so peak fr tl;dr headings work (i ripped them out of my original implementation in index.js ) images work (took me a while because it didn’t work properly in tmux we getting somewhere with this one 🔥 Changelog ( 9941b1b ) Finish image rendering ( 007b3f4 ) Work on image rendering ( 609be18 ) Make heading work"}, {"post_id": 18690, "ts": "2026-06-29T21:31:37Z", "hours": 6.2242, "text": "holy this shit is so long heyo! this is a long one, so i’ll go over this commit by commit ( 0ad2cb2 ) Start paragraph parsing here, i did these: i made a global string state to maintain the nesting while styling. managing this was quite tedious and useless i added a helper function to get the style of a token called getStyle() . i’ll explain the use for it below. i continued working on the heading() and paragraph() functions as well as the stylize() function ( eb218d2 ) Add markdown extensions as for this one, i added a bunch of packages, mostly extensions for markdown-it . these are: markdown-it-footnote markdown-it-github-alerts markdown-it-sanitizer markdown-it-table markdown-it-task-lists shiki (for code highlighting) terminal-image i removed a few of these later because they were either not really working properly or just weren’t necessary. besides these, i also configured the plugin to use the plugins, enable the autolink extension and also replace all HTML line breaks ( <br> ) with double newlines ( \\n\\n ) ( 5ecef2c ) Start working on image rendering and colors/styles now here is where i found a gem in my dependency tree. you see, i was searching for a package to handle color rendering since i sure as hell wasn’t gonna deal with the hex codes shiki , the code-highlighting plugin, was giving me for the colors of the tokens. so i saw a package called chalk and it sounded familiar. turns out, shiki had chalk as a dependency, so it was already installed! for that reason, i added a chalk import in this commit. i also started working on an image function to render images, and named it renderImage() . also added a great error message if two requirements weren’t met: throw new Error ( \" WRONG TOKEN IDIOT DEV \" ); but that was all i really did in that function ( 0dc393d ) Remove unnecessary object processing and dependencies this is where i removed markdown-it-footnote and markdown-it-table because i realized there just wasn’t a point in those since they weren’t letting me test my function, they were erroring out for some reason and i found out markdown-it-table already had support for markdown tables. i also removed the mapping function in the parser stage that i made to give myself only a few fields. it was pretty useless since i kept randomly finding that i’d need some new property. ( 8a5200c ) Continue work on inline parsing, add terminal-link latest commit, this is where i did a lot of work: i removed terminal-image as a dependency since i found that bun already provided a class for it ( Bun.Image ) and it also had webp support unlike terminal-image , so no point in another package when a built-in one works better i made the getStyles() function better i added a bunch of micro-functions like bold() , italic() , etc. i also renamed renderImage() to image() i combined two if statements into one in this image() function because why 2 if statements when 1 i did a lot of work in the renderInline() function. now it uses computed function names that call those micro-functions. i also changed that global string state to a global array, made things much easier. i worked on the heading() and paragraph() functions further that’s about it gng, also its 12:28 am for me rn this is why we devlog more often gng ✌️"}, {"post_id": 17162, "ts": "2026-06-27T21:04:18Z", "hours": 2.7842, "text": "toiling away… toiling away at this code… today was a bunch of stuff i added a renderInline() function to render stuff inline. i still need to add images and links, but i’d need a lib for links, and maybe for the images too i worked more on the main function. right now, im trying to get paragraphs actually rendered, which will take a while. i also added a heading() function that will render headings, emphasis on will because its not being called yet it took me a lot of thinking to get here so that part wasn’t too fun (a person who thinks all the time, has nothing to think about 🔥) changelog ( e24a192 ) Work more on the stylizer ( 1a02163 ) Start actual work on stylizer"}, {"post_id": 16483, "ts": "2026-06-26T20:35:10Z", "hours": 1.5342, "text": "revamp! i revamped the parse-input.js file! now, it has two functions: giveFields(obj) this is a function called by the second function. since markdown-it (the parser im using now!) has a lot of fields that i don’t need. so this function returns a mapped array with the fields type , tag , nesting , content , and children . as for this children field, the children field is an array of objects, where the objects are just like the parent object, with lots of unnecessary fields. for those, i used recursion! (it’s my first time using recursion ) parse(input) : this is the function that i’ll be using to get the tokens i need to style! what it does is pretty simple: initialize a new instance of the MarkdownIt constructor (? i’m not too sure if it’s a constructor) get markdown-it ’s tokens using their parsing function make a constant whose content is an array of objects returned by the first function ( giveFields() if your memory is that terrible). again its a mapped array that gives only select fields from the markdown-it tokens return that constant in other news, i wrote 2 more test markdown files. one tests the behaviour of headings and the other tests the behaviour of inline stuff like bold and italic text! Changelog ( 88bad121 ) Revamp parse-input.js ( 3eda61e5 ) Add more stuff to inlines.md"}, {"post_id": 15772, "ts": "2026-06-25T17:18:25Z", "hours": 2.5692, "text": "FUCK fuck this rewrite, i’m abandoning this shithole of a parser i’m trying to make, i’ll just go use an already existing parser, its just not worth it it’s too much hassle to make an in-house parser, so here’s my plan: i install a markdown parser that returns a tree of text, not html, and as a dependency in the styling part, i’ll go ahead and read the tree of text that the parser returns it gets passed to the renderer hopefully this will move much faster now!"}, {"post_id": 11542, "ts": "2026-06-18T20:48:29Z", "hours": 2.0211, "text": "rewrite i started a rewrite! what i was doing earlier was honestly too messy to actually use. my earlier way was making a bunch of regexes and using those to match the remaining text. my new method is still using regexes, but i split the whole thing into two parts: block parser and inline parser. block parser the block parser splits the markdown doc on newlines and checks what it starts with or ends with. when it finds that some line is not a paragraph, it pushes a token to the tokens array indicating that it is the start of a block. when it detects that the block has ended, it pushes a token to the tokens array indicating the end of the block. this is currently only implemented for headings, more are coming. it took this long because me dumb inline parser the inline parser loops through the existing tokens array made by the block parser and looks for characters that indicate the start of an inline token like bold, italic and so on. like the block parser, it will push start and end tokens to the tokens array the implementation of the inline parser has not started yet new character i added a backslash to the giant block letters i made for headings! Changelog (bac8c5a) Start parser rewrite (664713e) Add backslash in heading"}, {"post_id": 10859, "ts": "2026-06-17T20:14:25Z", "hours": 7.0403, "text": "help me what on god’s green earth is this so after dealing with a shit ton of regex and doing pretty much nothing with it besides some stuff that would improve performance, i have decided that regex is not the way. instead, i’ll just set a bunch of flags with empty content and make a separate function that processes everything. i think the styling function will handle tokens because that’s its job, to style the tokens. at least i have something to follow now. (i did not implement any of this yet) Changelog fc8de72 : Fix some regexes fe6eeef : Change some regexes f67c3b5 : Change matching system in parser 8a80409 : Add some HTML support in lexical parser 0727d82 : Finish lexical parser (almost) b7bc45b : Make lexical parser work"}, {"post_id": 7594, "ts": "2026-06-12T18:16:30Z", "hours": 6.0661, "text": "i got bombed by my own regex anyways, so i started making a lexical parser and uhh its not going all sunshine and rainbows. the blockquote regex doesn’t really work right and also i checked the gfm spec since i want to adhere to it and uhh fuck i might be cooked. i thought ts was going to be a 20h project help meeeeeee also yes it took me 6 hours for 74 lines of code sob this is just great"}, {"post_id": 6452, "ts": "2026-06-10T21:06:48Z", "hours": 1.475, "text": "HEADINGS NOW RENDER! headings now render! as you can see in the screenshot, it now renders the headings as big boys also, me very happy. this took a while because i lowk didn’t know what to really do. i didn’t think about how i would do it, i was only thinking about doing it anyways gn gng"}, {"post_id": 5881, "ts": "2026-06-09T20:48:17Z", "hours": 6.8622, "text": "took only this long to make a bunch of letters you see, i had to make a bunch of custom glyphs to render headings in the terminal. making that for pretty much all the characters on your keyboard isn’t quite easy but hey its done now. the thing is, this is only for level one headings. once i finish the actual parser, i’ll add glyphs for the rest of the headings. in the meantime, i’ll have to do the rest. i did not expect to have spent this long on the project already yk"}, {"post_id": 4481, "ts": "2026-06-07T20:14:04Z", "hours": 0.4414, "text": "a terminal markdown reader that has actual headings? never could have thought of it huh well this is what i’m doing. literally a markdown reader that prints text the way you might have written it. anyways so this is gonna use bun since bun is ultra fast. also this might be a 10-20h proj, shouldn’t be too hard. well i like more hours, so i might also add stuff like: browsing all the markdown files in a directory (and subdirectories) editing (very unlikely!) well i don’t really know what else to put so ig that’s it? anyways i have actually done some work, that is, my file currently ouputs some text. literally the raw original text. what’d you expect from 24m of coding"}]...
|
Title: reMDer by @Keyboard1000n17 | Stardance
Dev Title: reMDer by @Keyboard1000n17 | Stardance
Devlogs:
a terminal markdown reader that has actual headings? never could have thought of it huh well this is what i’m doing. literally a markdown reader that prints text the way you might have written it. anyways so this is gonna use bun since bun is ultra fast. also this might be a 10-20h proj, shouldn’t be too hard. well i like more hours, so i might also add stuff like: browsing all the markdown files in a directory (and subdirectories) editing (very unlikely!) well i don’t really know what else to put so ig that’s it? anyways i have actually done some work, that is, my file currently ouputs some text. literally the raw original text. what’d you expect from 24m of coding
took only this long to make a bunch of letters you see, i had to make a bunch of custom glyphs to render headings in the terminal. making that for pretty much all the characters on your keyboard isn’t quite easy but hey its done now. the thing is, this is only for level one headings. once i finish the actual parser, i’ll add glyphs for the rest of the headings. in the meantime, i’ll have to do the rest. i did not expect to have spent this long on the project already yk
HEADINGS NOW RENDER! headings now render! as you can see in the screenshot, it now renders the headings as big boys also, me very happy. this took a while because i lowk didn’t know what to really do. i didn’t think about how i would do it, i was only thinking about doing it anyways gn gng
i got bombed by my own regex anyways, so i started making a lexical parser and uhh its not going all sunshine and rainbows. the blockquote regex doesn’t really work right and also i checked the gfm spec since i want to adhere to it and uhh fuck i might be cooked. i thought ts was going to be a 20h project help meeeeeee also yes it took me 6 hours for 74 lines of code sob this is just great
help me what on god’s green earth is this so after dealing with a shit ton of regex and doing pretty much nothing with it besides some stuff that would improve performance, i have decided that regex is not the way. instead, i’ll just set a bunch of flags with empty content and make a separate function that processes everything. i think the styling function will handle tokens because that’s its job, to style the tokens. at least i have something to follow now. (i did not implement any of this yet) Changelog fc8de72 : Fix some regexes fe6eeef : Change some regexes f67c3b5 : Change matching system in parser 8a80409 : Add some HTML support in lexical parser 0727d82 : Finish lexical parser (almost) b7bc45b : Make lexical parser work
rewrite i started a rewrite! what i was doing earlier was honestly too messy to actually use. my earlier way was making a bunch of regexes and using those to match the remaining text. my new method is still using regexes, but i split the whole thing into two parts: block parser and inline parser. block parser the block parser splits the markdown doc on newlines and checks what it starts with or ends with. when it finds that some line is not a paragraph, it pushes a token to the tokens array indicating that it is the start of a block. when it detects that the block has ended, it pushes a token to the tokens array indicating the end of the block. this is currently only implemented for headings, more are coming. it took this long because me dumb inline parser the inline parser loops through the existing tokens array made by the block parser and looks for characters that indicate the start of an inline token like bold, italic and so on. like the block parser, it will push start and end tokens to the tokens array the implementation of the inline parser has not started yet new character i added a backslash to the giant block letters i made for headings! Changelog (bac8c5a) Start parser rewrite (664713e) Add backslash in heading
FUCK fuck this rewrite, i’m abandoning this shithole of a parser i’m trying to make, i’ll just go use an already existing parser, its just not worth it it’s too much hassle to make an in-house parser, so here’s my plan: i install a markdown parser that returns a tree of text, not html, and as a dependency in the styling part, i’ll go ahead and read the tree of text that the parser returns it gets passed to the renderer hopefully this will move much faster now!
revamp! i revamped the parse-input.js file! now, it has two functions: giveFields(obj) this is a function called by the second function. since markdown-it (the parser im using now!) has a lot of fields that i don’t need. so this function returns a mapped array with the fields type , tag , nesting , content , and children . as for this children field, the children field is an array of objects, where the objects are just like the parent object, with lots of unnecessary fields. for those, i used recursion! (it’s my first time using recursion ) parse(input) : this is the function that i’ll be using to get the tokens i need to style! what it does is pretty simple: initialize a new instance of the MarkdownIt constructor (? i’m not too sure if it’s a constructor) get markdown-it ’s tokens using their parsing function make a constant whose content is an array of objects returned by the first function ( giveFields() if your memory is that terrible). again its a mapped array that gives only select fields from the markdown-it tokens return that constant in other news, i wrote 2 more test markdown files. one tests the behaviour of headings and the other tests the behaviour of inline stuff like bold and italic text! Changelog ( 88bad121 ) Revamp parse-input.js ( 3eda61e5 ) Add more stuff to inlines.md
toiling away… toiling away at this code… today was a bunch of stuff i added a renderInline() function to render stuff inline. i still need to add images and links, but i’d need a lib for links, and maybe for the images too i worked more on the main function. right now, im trying to get paragraphs actually rendered, which will take a while. i also added a heading() function that will render headings, emphasis on will because its not being called yet it took me a lot of thinking to get here so that part wasn’t too fun (a person who thinks all the time, has nothing to think about 🔥) changelog ( e24a192 ) Work more on the stylizer ( 1a02163 ) Start actual work on stylizer
holy this shit is so long heyo! this is a long one, so i’ll go over this commit by commit ( 0ad2cb2 ) Start paragraph parsing here, i did these: i made a global string state to maintain the nesting while styling. managing this was quite tedious and useless i added a helper function to get the style of a token called getStyle() . i’ll explain the use for it below. i continued working on the heading() and paragraph() functions as well as the stylize() function ( eb218d2 ) Add markdown extensions as for this one, i added a bunch of packages, mostly extensions for markdown-it . these are: markdown-it-footnote markdown-it-github-alerts markdown-it-sanitizer markdown-it-table markdown-it-task-lists shiki (for code highlighting) terminal-image i removed a few of these later because they were either not really working properly or just weren’t necessary. besides these, i also configured the plugin to use the plugins, enable the autolink extension and also replace all HTML line breaks ( <br> ) with double newlines ( \n\n ) ( 5ecef2c ) Start working on image rendering and colors/styles now here is where i found a gem in my dependency tree. you see, i was searching for a package to handle color rendering since i sure as hell wasn’t gonna deal with the hex codes shiki , the code-highlighting plugin, was giving me for the colors of the tokens. so i saw a package called chalk and it sounded familiar. turns out, shiki had chalk as a dependency, so it was already installed! for that reason, i added a chalk import in this commit. i also started working on an image function to render images, and named it renderImage() . also added a great error message if two requirements weren’t met: throw new Error ( " WRONG TOKEN IDIOT DEV " ); but that was all i really did in that function ( 0dc393d ) Remove unnecessary object processing and dependencies this is where i removed markdown-it-footnote and markdown-it-table because i realized there just wasn’t a point in those since they weren’t letting me test my function, they were erroring out for some reason and i found out markdown-it-table already had support for markdown tables. i also removed the mapping function in the parser stage that i made to give myself only a few fields. it was pretty useless since i kept randomly finding that i’d need some new property. ( 8a5200c ) Continue work on inline parsing, add terminal-link latest commit, this is where i did a lot of work: i removed terminal-image as a dependency since i found that bun already provided a class for it ( Bun.Image ) and it also had webp support unlike terminal-image , so no point in another package when a built-in one works better i made the getStyles() function better i added a bunch of micro-functions like bold() , italic() , etc. i also renamed renderImage() to image() i combined two if statements into one in this image() function because why 2 if statements when 1 i did a lot of work in the renderInline() function. now it uses computed function names that call those micro-functions. i also changed that global string state to a global array, made things much easier. i worked on the heading() and paragraph() functions further that’s about it gng, also its 12:28 am for me rn this is why we devlog more often gng ✌️
oof! that was a lot of work, but now we’re REALLY getting somewhere!!! first thing, headings actually work now, and if there’s a link in the heading, it gets displayed right below the heading! tbf i did rip the heading thing straight out of the original index.js file when i was trying to make a markdown parser using regex secondly, and the more important thing, image rendering now works . pretty big milestone. i achieved this through the terminal-image npm package. however, this took a while because i couldn’t figure out why it wouldn’t render. the problem was tmux–it was stripping the codes it didn’t recognise so i implemented another system to detect if the terminal had color and/or image support to decide whether to use ansi blocks or actual images. now, it works! ts so peak fr tl;dr headings work (i ripped them out of my original implementation in index.js ) images work (took me a while because it didn’t work properly in tmux we getting somewhere with this one 🔥 Changelog ( 9941b1b ) Finish image rendering ( 007b3f4 ) Work on image rendering ( 609be18 ) Make heading work
when the FUCK did this become 4 hours so uhh i spent like all of this time debugging and improving my code. first thing is, i replaced these “microfunctions”, as i call them, with an object that had keys whose values were arrow functions. these arrow functions did the exact same thing and took up less space and was even more readable! second, i spent some time on a stupid bug where the main function in stylize.js would hang. i thought it was an issue with the image function, but after half an hour or so, when i added console.log(done) right before the return, i realized it had to do with the main function that was calling the image function, and sure enough, the second i looked at it, i realized the problem: it was a while loop and i forgot to add a line that incremented the index, so it just kept doing the same thing forever until i killed the process oh well, more hours for me third, i improved (or rather cleaned) my image function. it returns promises and doesn’t use terminal-image directly. instead, i made it so that it would return an object with a bunch of keys, one of which is a function that takes the whole object as an input. this function actually renders the image, since i plan to write the function to display it in a way that deals with image rendering after rendering text, and while the images get rendered, a spinner takes their place temporarily, but the images replace those spinners once they are processed fourth thing is, i made it so that the main function calls the renderInline function instead of the paragraph function. in fact, this paragraph function is completely useless, so i went ahead and removed it too. lastly, i upgraded a bunch of packages: upgraded typescript from version 5 to 5.9.3 upgraded got from version 15.0.7 to 15.1.0 upgraded markdown-it from version 14.2.0 to 14.3.0 upgraded shiki from version 4.3.0 to 4.3.1 if you wonder what these packages are typescript is, well, the typescript language, not sure why i have it, might be a dependency for another package. got is some package that does pretty much the same thing as the default fetch() but it can give me a buffer, which i need for images markdown-it is the markdown parser shiki is for coloring code. fancy, right? Changelog ( 9118913 ) Improve code ( 5b9c953 ) Remove test file ( ab3af08 ) Test image URL parsing on GitHub aight this took me 2 hours to write and i started coding again in the middle of writing this
PEAK CODE gng TS IS PEAK!!!! i added a function that renders code AND ITS PEAK JUST SEE THE SS now some of this time came from trying to figure out why my code was joining the contents of a function, and it was because i forgot to add the argument that gave the coloring function (chalk library) the text to color. hey, at least i found a way to read the contents of functions time to go steal code from closed-source packages leaving that aside, my next step is thematic breaks. this shouldn’t be too hard, in fact, i’ll do it rn since it’s that easy. rn its 8:49 PM GMT+0300, i’ll tell in the next paragraph when i finish it. [8:54 PM] just did it, it only took like 2 mins, the other 3 were because i found a bug that never removed codeBlock from the stack after it was added. that’s about it, and this devlog was quite short. well, comparatively, to my other devlogs, after all there’s people posting 4 word devlogs. you should follow this project tho Changelog ( a17bd2b ) Add thematic break support ( e28f1b1 ) Add code block styling
THAT WAS SO LONG WHAT ON EARTH in short, tables now work and the inline rendering function is fixed! this took a while because i genuinely had no idea what i was doing. now the long stuff: tables go brr i got distracted while writing this and realized everything’s actually borked, but tables do somewhat work! its still borked tho– also i realized that my whole code is borked, but… inline rendering includes links now! still have no idea how i missed that other i just changed image function so that it returns an object with a prototype function instead of unnecessarily repeating the function as a property of all the image objects, so if there’s 10 pictures in a file, there will only be one function to render each as opposed to 10 instances of that function Changelog ( d8feb46 ) Add table support, fix inline rendering oh fuck, my code is COMPLETELY borked
improvements and fixes to inline rendering this is way earlier than my normal schedule, but that’s because i’ve got something to show . basically, inline rendering was bugged , and not only did i fix it , i also made it so that it works better ! that’s all you need to know, do NOT read the rest of this if you don’t want to be bored to death, its a really lengthy explanation of this the initial bug was that inline rendering wouldn’t work at all. i figured out the problem was that i wasn’t pushing "inline" to the state array somewhere. i realized that it wasn’t working when called in the table rendering function, and that was because i wasn’t pushing "inline" to the state array. the reason for this is because the renderInline function slices the state array at the index after the "inline" string, so if its something like ["paragraph", "inline", "bold", "italic"] , the function slices at index 2 because "inline" is at index 1, and we get ["bold", "italic"] . the problem is, if "inline" doesn’t exist, running indexOf("inline") returns -1, so it slices at -1 + 1 , which is 0, so its just the whole array. but anything before “inline” isn’t a valid style, and since the function for that is undefined, it goes kaboom and throws an error saying that it’s not a function. also gpt found 5 other bugs but they’re kinda irrelevant the fix was making it so that the renderInline function itself pushed "inline' to the state array instead of depending on it being already there. this also removed the need for making sure that the inline string was already there. i might do this with the rest of the functions too actually :goonology: also removed unnecessary state.pop() occurrences since the pop method is destructive and can mess up everything as for the improvement, you might see in the first screenshot that there’s a bunch of text tokens together. yk, they could be squished together into one token… oh right, that’s what i did! i changed the renderInline function to make a variable where the text accumulates until there’s no more text or if there’s an image, on which it gets pushed to the contents array now the most important thing is that there’s only one more thing left to do: html rendering . this is the last thing before i get to actually rendering stuff on the screen! this is exciting! Changelog ( 9de477d ) Fix, improve inline rendering please like this took more than an hour to write
HTML parsing is now complete its been nearly 2 weeks and i have great news: html parsing is complete what this means is that html blocks get processed into token streams like the one’s markdown-it makes. now, i must clarify that these html blocks were already in a token stream but they were distinctly html, having the type html_block , and if i didn’t convert those html blocks into markdown-it’s _open / _close tokens, i’d have to parse it in the file that styles the tokens, and many html tags do the exact same thing as their markdown counterparts so i could reuse some functions. i must also clarify that i have NOT done anything for stylizing html in the stylize.js file, which deals with processing text formatting and image processing next up: stylizing html! Changelog ( c5a5ce0 ) Finish HTML parsing ( 841ba42 ) Start work on HTML parsing
WIP WORK // INCOMPLETE // this was a lot of work, and i’m still not done with html in the stylizer! here’s a list of changes with explanations: add more aliases to the aliases array in the html parsing section: this makes it so that html tokens and markdown tokens have the same types convert the array of allowed html tags into a set : sets have a .has() function that lets us find an element in O(1) time complexity which is much faster compared to Array.prototype.includes() which has an O(n) time complexity properly implement disallowed tags: these tags show as plain text because they are disallowed and shouldn’t be processed in markdown put non-block tokens as children of an inline token: non-block tokens only got parsed in the part where inline tokens were processed set attributes: the objects returned by the stylize function now have a properties key better error handling: now, where it used to just throw an error about being undefined or whatever, it will catch it, and throw a more useful error with better debug info [BUGFIX] make sure that arrays don’t get nested: this was a bug where arrays would get nested for some reason [BUGFIX] set token.level and token.nesting properly when processing html: this is necessary because the while loop depends on the nesting to know when to stop accumulating tokens and process them [WIP] html handling: any tokens having the substring _open in their .type property are handled all together, with a handlers object made up of functions. this handling is recursive token with types that don’t match the substring _open get handled through other branches of the if statement ( else if(...) {..} ) [WIP] bullet list handling: i did not realize that there were more markdown-it tokens that i had not added handling for in the stylize function. i also need to do this for some more token types too [WIP] revamp image handling: instead of just a complicated function, i added a class called Image that has a function to render the image. its nearly complete but it has some errors that i committed because i need to commit often lmao chatpgt usage now here i used chatgpt a lot for debugging. here’s exactly what i used it for: why tokens weren’t being processed: this is the problem the array nesting bugfix fixed fixing infinite recursion: i accidentally did that lmfao replacing top-level non-block tokens with an inline token that contains those top-level non-block tokens as children figuring how to set the level property of the tokens questions about syntax and mutation of global vars Changelog ( 5e931f7 ) Revamp image function (WIP) ( 0ce066f ) Improve error handling and fix token.level assignment ( 0f28b75 ) Process details element in stylizer ( 0e154f3 ) Start improving stylizer (WIP) why such long devlogs? you may have noticed i’ve been going more and more time without devlogging. that’s because i like devlogging when there’s a big new thing, not for every small little thing. my plan for this devlog was to announce that i was done with processing html in the stylize function, but that hasn’t happened yet because well, there were a latta bugs here and there, and i had to fix those too. as for the length of the devlog text, i like writing about my progress here because its the only place where it makes sense to talk about it in-depth
typescript! i’ve moved to typescript, cleaned up some code, finished that image function from last devlog, and upgraded packages! finished the image function : now it works perfectly! upgraded packages : shiki was upgraded! its the code coloring package btw added a test : i can’t keep pressing the arrow keys in bun repl i have to do this moved to typescript : this is the main thing. devs on discord kept telling me to use and i said i’d do it soon. i wasn’t planning on it at this time, but i did because i got fed up with a stupid bug where i was accidentally setting token types to a boolean instead of a string. that prompted me to just do it™ and now i’m fixing a bunch of bugs! still not sure why the language server is just complaining about cases that can’t happen, but that’s what typescript is for i guess Changelog ( 688afd8 ) Start moving to TypeScript ( ac99373 ) Switch to map for aliases, add test, clean up code ( c62c57b ) Upgrade packages, clean up code ( f98e65c ) Finish revamping image function
headings! unknown tag handling (that doesn’t work)! well we’ve got some nice stuff now! here’s a list of everything, including problems!: just whitespace? no more! : tokens that are just whitespace get omitted typescript lsp doesn’t complain : oh my god finally that was so annoying what’s this tag? : if it doesn’t have a handler, it falls back to the default, that is, it turns into a string! this doesn’t work properly though, i have to fix this ching chong ruby tags : now ruby tags are supported! is that a highlighter? : mark elements are now supported, which just put a yellow bg on some text is this a block element or not? : now the renderer can tell by looking at a token’s block property proper heading rendering?!?!? : chatgpt wrote the entirety of this part because you cannot bother me to make an efficient function that wraps giant text art letters based on width where’s the inline code? : that’s right, it doesn’t work and gets completely omitted! Changelog ( 456161f ) Trim content, add boolean property ( 07da8a6 ) Add handlers type to make the LSP shut up, trim strings in test file ( b4d251c ) Add handling for unknown tags ( d903b48 ) Add support for dfn , samp , ruby tags ( 813d934 ) Fix code to stop TypeScript ( vtsls lsp) warnings
it works holy shit it works, the problem was that i was running a function but i wasn’t putting it in a console.log . the test function for reference returned a string. also, unknown tags are handled somewhat properly. i need to actually fix that, but once i do, im gonna start on the tui!! its been 96+ hours now what a crazy thing, i expected this to take 10-20 hours and now look at this… anyways, i’ll go fix the unknown tag thing! after that i’ll start working on the tui Changelog ( c1461c3 ) Get unknown HTML tags rendering
TUI! i’ve got news: the TUI renders! for this tui, im using opentui! right now, the tui only shows an interactive list of files, and its supposed to render the file content if you select one, but that’s not happening right now. i’ve been working on the function to make opentui render the markdown. while opentui does have its own thing for markdown rendering ( ), i’m gonna render my own markdown. im currently trying to get tables working! Changelog ( c8ab716 ) Work further on rendering, start with rendering tables ( dc8b0be ) Start using OpenTUI for rendering TUI ( 86347cf ) Render unknown HTML correctly (without showing tags)
generational fuck up well i’ve messed up big time, sunken cost fallacy is real and it got me you see, i was using opentui earlier, but i decided to change because i realized that it doesn’t support ansi escape sequences. i landed on neo-neo-blessed , and it seemed cool, until i realized the list selection thing got fucked up because it didn’t handle scrolling list options with heights greater than 1 row properly which is a deal breaker. i also spent a lot of time patching its types, in fact that’s what most of this time went to i think i’ll use jsvision. it seems interesting and i’ve got nothing to lose. the only issue is it has one maintainer and 9 stars, but gpt found it, and it seems cool. also they have demos of the unmodified lib running in the browser which i wanted to do, so this will be fun Changelog ( 33e1c91 ) Start using neo-neo-blessed and do a generational fuck up
(back to) opentui! if you’ve read my last devlog, you might remember that i was considering the jsvision library. however, i came back to opentui because its still much simpler. also, i found that there are libs to adapt ansi! or at least chatgpt did at first i was doing ghostty-opentui , but i realized after some time that it was literally a whole terminal. then i got chatgpt to find me this package called ansi-sequence-parser ( https://www.npmjs.com/package/ansi-sequence-parser ) and its perfect! so now im using that to render the bold and italics! tbh i could just eliminate the middle stage ( stylize.ts ), but i put a lot of work into it and i’m extremely vulnerable to the sunken cost fallacy, so i’m doing this bloat lmao. also, i got ordered lists, bullet lists, and blockquotes working! they look so cool! as for the menu, its not doing very fine, but that’s because i’ve not worked on it! i’ll get to it, don’t worry! next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) Changelog ( 8b44667 ) Add blockquotes and 1 row bottom margin to second-level renderables ( 3e5182f ) Add oredered list handling ( d997aff ) Switch back to OpenTUI, get things working
better types. debug mode and stdout! from my last devlog: next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) of these, i’ve done none! what i have done though is add flags and types! i spent a while dealing with type errors because i decided to specify types instead of just putting any on ProcessedToken.content . i also added a debug flag, but literally all it does is show the console i also fixed the width thing, so the content is only as wide as the space you give it so cooll!! the main part of this is that i added a --print-to-stdout flag that just prints the formatted markdown to stdout! you can just scroll in your terminal instead of having a whole ass tui its kinda borked and incomplete though, so i’ll fix it up! it does print some garbage at the beginning so that’s not great anyways, i’d better do what i said i’ll do last devlog! i went off track for this lmao Changelog ( b1c0489 ) Implement half-baked print to stdout option ( aa3c029 ) Add debug flag, fix logic errors ( aa33e84 ) Specify types for ProcessedToken.content instead of any
holy fuck, you can pipe into stdin and tables render properly! while this is quite out of schedule (i usually post every 2-3 days), today brings some peak stuff! the peakest part is at the end firstly, i have in fact fixed tables! the issue was i was pushing the accumulated cells array to the rows array in the wrong loop. i was doing this in the loop that iterates over the cells in a row, so it was causing it to repeatedly push the same strings over and over. the fix was putting it in the loop just outside, that is, the loop that iterates over the rows in the table token! i’ve also improved the image handling! now Image classes have the buffer property renamed to content , and has a new property called properties , which is always {} . with this, it has all the properties of ProcessedToken , so my lsp won’t complain that some property doesn’t exist on Image speaking of ProcessedToken , its now an interface instead of a type. there’s also a new TableToken interface that extends ProcessedToken , with an alignment property. this makes it a bit easier to handle tables since the content property is narrowed. also, it seems like opentui’s tables don’t support alignment, so i might have to make a custom table function. i also upgraded opentui from 0.5.7 to 0.5.8! i have no idea what changed, but whatever i’ve also stopped using chalk to color my errors since the opentui console doesn’t support ansi now the peakest part is you can pipe markdown into the program . this is pretty peak and you must agree since there’s a lot of stuff you can do with this. for example, you could render arbitrary markdown without having to create a file first! it has a limitation though: if you’re on windows, you can’t use the interactive mode, and the rendered content is forced to print to stdout. this is because of a bug with bun. if you’re piping into the program, it’ll get the input by calling await Bun.stdin.text() , but this stops sending keypresses to opentui because of a bug in the bun runtime, so you can’t scroll down. i solved this issue (or rather, chatgpt solved this issue) by opening a read stream on /dev/tty . the issue with this is that /dev/tty doesn’t exist on windows since its not unix-like. my idea was to just, not let you do interactive mode on windows if you’re piping content to it. again, this is a bug with bun, and i’ll remove this limitation once one of the two is merged. that’s right, there’s two! here’s one for reference: https://github.com/oven-sh/bun/pull/32153 shit that was long Changelog ( dd07e14 ) Upgrade packages ( 77e6d34 ) Add support for piping into renderer.ts from stdin ( 1995f45 ) Improve image and ANSI handling, stop using chalk in errors ( 22cfacd ) Improve table handling, switch some types to interfaces pls like
code blocks, alerts, emojis and task lists! we’ve got loads of new cool stuff that get rendered now! first, github alerts/callouts now render nicely! they look like this: > [!TAG] > content where TAG can be NOTE , IMPORTANT , TIP , WARNING or CAUTION . they also have these cool icons next to them, but the catch is you need a nerd font for it. i’ll add an option to not need it and only use ascii characters next, we have highlighted code blocks! the renderer can highlight hundreds of languages using shiki ! you might not even have heard of some of the languages that it can highlight! imo its really nice looking and i love it! the bulk of this time came from adding support for task list items because i couldn’t figure out how to do it. eventually after some tinkering i’ve got it to work! it looks kinda cool too tbh i also got emoji support using an extension. it automatically converts :emoji: to the corresponding emoji if its in the unicode specification. finally, i added a simple height option that just sets the height of the renderer. it allows you to set the height of the renderer manually and that’s about it lmao Changelog ( b4f69ad ) Add height option ( beea3a6 ) Add task list items support ( 4c42c84 ) Add emoji support ( 564a761 ) Upgrade markdown-it, fix breaking changes ( 963d910 ) Add alerts support ( 5e266e8 ) Add icons in code blocks ( 0bf0af7 ) Add code block support
figlet headings, small headings, bottom bar, help menu and keybinds we’ve got a lot of new stuff! firstly we’ve got a bottom bar! all it does for now is show reMDer with a green bg and the file name next to it, but i’ll add more later! next we’ve got figlet headings! at the start i was thinking about using figlet for headings but i gave up on that. but now, i’m back to using it! this took a good chunk of the overflowing hours here but they look really cool too! passing a --no-render-headings or -H flag will make the headings render as normal text with colors instead of figlet fonts now! there’s now a tiny help menu in the corner! it only shows two keybinds right now–oh and speaking of keybinds… keybindings are now in ! for now you can press q to quit, ? to toggle the help menu, and C (shift+c) to open the console in debug mode and that’s about it next steps? here’s what i’m gonna do next: add support for horizontal rules add a table of contents feature like that of the leaf markdown viewer add some stuff to the bottom bar add an option to put the bottom bar at the top instead add support for a config file using YAML Changelog ( 9557586 ) Add help menu ( a4149e2 ) Add keybinds: q to quit, C to toggle console ( 4b18153 ) Finish figlet fonts support ( d23466d ) Start trying figlet again for ASCII art ( 33d52ea ) Start working on ASCII art for h2 headings ( b0e1668 ) Add option to not print big headings ( c58369c ) Start with bottom bar
table of contents feature is done! took only 10 hours, but im done with the table of contents thing! you can press shift+j to go down to the next heading, and i forgot to add shift+k 😭 anyway this took a while since i couldn’t figure out how to position the box properly and how to style it. this was fucking ass icl. i usually have much more to talk about but this wasn’t the most fun so here’s the commits: Changelog ( 5ccec11 ) Remove unnecessary focusing ToC ( 927cae9 ) Add tab cycling ( ae72d3d ) Scroll ToC menu to selected index instead of blindly 1 down ( 249d61a ) Implement scrolling ToC on pressing J ( a2ae0f2 ) Get table of contents feature working ( a6c7744 ) Add scrolling to next heading on pressing J ( 49f8fec ) Add “? - Help” hint to end of bottom bar
scroll one line at a time, render div and details elements not very big news here, but now you can: scroll just one line at a time instead of a whole renderable/element at once render div and details properly! now you can click on a details element to open and close it! this didn’t even take too long more technical, but i switched to mostly using the opentui renderable api which uses classes like TextRenderable or BoxRenderable that return a Renderable instance instead of functions like Text and Box which return a ProxiedVNode<T> . this is mostly because there’s a bunch of things a Renderable has that a ProxiedVNode doesn’t anyways im currently working on adding footnotes, so see you in a few days Changelog ( 64f6ed8 ) Add footnote plugin (usage WIP) (errors on run) ( ddd5c46 ) Add indicators to details elements and opening on click/space/enter ( 344806a ) Add support for rendering div and details elements ( d3b4a1d ) Fix small layout issues ( 5eb11b9 ) Scroll only one line at a time and convert (mostly) to Renderable API
last devlog this is my last devlog the project isn’t complete and i won’t be shipping it. you see, i was banned for 2 months for misconduct on slack (i will not provide details here but i deserved it, it was corny anyway), and as part of that ban, i can’t participate in any events, including stardance. in this time however, i’ve done a lot. there’s now spinners for images, proper tables, and so many more improvements. keep your eyes peeled for a release on the github ! 👀 also it doesn’t matter that this devlog is 15 hours over the limit, its not like i can do anything about it. also if one of you regulars in #stardance see this, can you please ask amber if i can have my sticky streak rewards? i really want the stickers and plushie Changelog ( 446103b ) Render details elements properly again ( f527e5d ) Better logs, align images in row when a paragraph contains only images ( 3df2f59 ) Make task list function use TextChunk over ANSI escapes ( 2367089 ) Add proper tables ( 47c2b42 ) Add aligning components ( 00785d7 ) Move from Chalk/ANSI escapes to OpenTUI StyledText for styles ( 429e4b6 ) Load images lazily with spinner while loading ( a993197 ) Use OpenTUI ImageRenderable for images in renderer ( aa96067 ) Improve types and error handling, work on image bug ( b54ad43 ) Revert “Add footnote plugin (usage WIP) (errors on run)”...
|
1792803099.7726493
|
1793407899.7726493
|
|
10356
|
Comet Programming Language by @SpookyDervish | Sta Comet Programming Language by @SpookyDervish | Stardance...
|
SpookyDervish
|
1
|
192.82
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T00:29:49Z", "hours": 95.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Comet is in a mostly stable state and ready for people to use! I’ve written a large amount of documentation for the syntax itself, however, Comet is a lower-level programming language and not written for absolute beginner programmers. Please report any bugs on the “Issues” page of the Github/Chookspace repository!", "repo": "https://chookspace.com/Comet/Comet", "demo": "https://chsp.au/Comet/Comet/downloads.html"}]...
|
[{"post_id": 75051, "ts": "202 [{"post_id": 75051, "ts": "2026-09-29T00:28:39Z", "hours": 90.8728, "text": "Rewriting in Rust"}, {"post_id": 26285, "ts": "2026-07-11T00:06:25Z", "hours": 6.9497, "text": "Optimizing Compiler | Devlog #03 New Features ───────────────────────────────────────── Hello again! I’ve turned Comet into an optimizing compiler! So far we don’t have much, but Comet now has constant folding and constant propagation. But what does that actually mean? “Constant Folding” Constant folding means we look through the code for any math expressions or other things of the like. If there are any constants in the math expression, then we can replace the expression with what it will equal. For example: int x = ( 2 + 3 ) * ( 4 + 5 ) The constant folder will see (2+3), and because the expression only has constants it will replace it with 5 int x = 5 * ( 4 + 5 ) The constant folder then sees (4+5), and replaces it with 9. int x = 5 * 9 And finally it sees 5 * 9 and replaces it with 45. int x = 45 We’ve turned a 7 instruction expression into 1 instruction! “Constant Propogation” Constant propogation means that if a variable stays a value that the compiler knows throughout the variable’s lifetime, then we can replace all instances of that variable with its value. For example: int x = 2 + 3 int y = x + 3 * 2 Constant folding runs and we get int x = 5 int y = x + 6 x is a compile time constant now, and because it never stops being a constant, we can replace all values of x with 5. int x = 5 int y = 5 + 6 See how we can now run constant folding again now that we have more information? This is why compilers run optimizations over and over, until the code doesn’t change anymore. Bug Fixes ───────────────────────────────────────── Along with adding an optimizer, I’ve fixed a large bug Return statements are automatically added to functions now! Before, if you didn’t add a return statement, your function could go past where it should’ve been, crashing your program and possibly even running code it shouldn’t. That is now fixed. Comet also throws an error if you don’t include a return statement in a non-void function. Docs ───────────────────────────────────────── Finally, I’ve extended the docs on the Comet website. It previously only have information on everything up to loops, but now includes info on structs and arrays. That’s all from me, see you next time!"}, {"post_id": 25598, "ts": "2026-07-09T23:20:09Z", "hours": 3.9903, "text": "Sockets in Comet | Devlog #02 External Library Updates ───────────────────────────────────────── External libraries now have the ability to define enums. With this, I’ve begun work on a socket library for fun. Socket External Lib ───────────────────────────────────────── In the screenshot I’ve included, I’ve got a very tiny client and server example set up where the server waits for a single connection, and then prints out what the connection sent. I’ve got the core functions done but I’m gonna add more methods like readExact, readAll, those kinds of methods that just make your life a bit easier. Bug Fixes ───────────────────────────────────────── With the help of a friend, I’ve fixed a number of bugs. I also got cometc and comet to compile without any warnings, which is nice. Some bugs where: A lexer issue where trying to access a field from a list access would be incorrectly seen as a decimal number unless you added a space. Type checking on arrays was extremely strict and so I’ve lessened it so that arrays are usable See you next time!"}, {"post_id": 23866, "ts": "2026-07-07T01:45:34Z", "hours": 91.2869, "text": "Devlog #1 - Core of Comet is done What I currently have I’ve got generics, arrays, structs, inheritance, external library support, a package manager, exceptions, loops, enums, and everything else working. My next steps are writing some of the standard library in C, after I get the language to a usable state I’m planning to bootstrap it! What I did since I created the project When I created this project on Stardance I had already begun working on it before the competition started. I think I had already spent around 100 hours on the project. The project was originally written in LLVM, however, LLVM was quite difficult to get working, and I wanted to make progress rather than be stuck fighting with a slow piece of junk. So I decided to rewrite the entire compiler. I created a VM and decided that the VM would be my compilation target. This made things such as exceptions possible because I would not have to worry about stack unwinding and other very complicated and difficult things. I’ve made a huge amount of progress since then, and have gotten exceptions, external libraries, generics and structs, as well as arrays working since I created this project. I must admit, I forgot about the devlogs until now and so this is why I’m so far ahead and creating my first devlog only now. :P I’ll make sure to keep you guys updated though, see you soon once I get a socket running!"}]...
|
Title: Comet Programming Language by @SpookyDervis Title: Comet Programming Language by @SpookyDervish | Stardance
Devlogs:
Devlog #1 - Core of Comet is done What I currently have I’ve got generics, arrays, structs, inheritance, external library support, a package manager, exceptions, loops, enums, and everything else working. My next steps are writing some of the standard library in C, after I get the language to a usable state I’m planning to bootstrap it! What I did since I created the project When I created this project on Stardance I had already begun working on it before the competition started. I think I had already spent around 100 hours on the project. The project was originally written in LLVM, however, LLVM was quite difficult to get working, and I wanted to make progress rather than be stuck fighting with a slow piece of junk. So I decided to rewrite the entire compiler. I created a VM and decided that the VM would be my compilation target. This made things such as exceptions possible because I would not have to worry about stack unwinding and other very complicated and difficult things. I’ve made a huge amount of progress since then, and have gotten exceptions, external libraries, generics and structs, as well as arrays working since I created this project. I must admit, I forgot about the devlogs until now and so this is why I’m so far ahead and creating my first devlog only now. :P I’ll make sure to keep you guys updated though, see you soon once I get a socket running!
Sockets in Comet | Devlog #02 External Library Updates ───────────────────────────────────────── External libraries now have the ability to define enums. With this, I’ve begun work on a socket library for fun. Socket External Lib ───────────────────────────────────────── In the screenshot I’ve included, I’ve got a very tiny client and server example set up where the server waits for a single connection, and then prints out what the connection sent. I’ve got the core functions done but I’m gonna add more methods like readExact, readAll, those kinds of methods that just make your life a bit easier. Bug Fixes ───────────────────────────────────────── With the help of a friend, I’ve fixed a number of bugs. I also got cometc and comet to compile without any warnings, which is nice. Some bugs where: A lexer issue where trying to access a field from a list access would be incorrectly seen as a decimal number unless you added a space. Type checking on arrays was extremely strict and so I’ve lessened it so that arrays are usable See you next time!
Optimizing Compiler | Devlog #03 New Features ───────────────────────────────────────── Hello again! I’ve turned Comet into an optimizing compiler! So far we don’t have much, but Comet now has constant folding and constant propagation. But what does that actually mean? “Constant Folding” Constant folding means we look through the code for any math expressions or other things of the like. If there are any constants in the math expression, then we can replace the expression with what it will equal. For example: int x = ( 2 + 3 ) * ( 4 + 5 ) The constant folder will see (2+3), and because the expression only has constants it will replace it with 5 int x = 5 * ( 4 + 5 ) The constant folder then sees (4+5), and replaces it with 9. int x = 5 * 9 And finally it sees 5 * 9 and replaces it with 45. int x = 45 We’ve turned a 7 instruction expression into 1 instruction! “Constant Propogation” Constant propogation means that if a variable stays a value that the compiler knows throughout the variable’s lifetime, then we can replace all instances of that variable with its value. For example: int x = 2 + 3 int y = x + 3 * 2 Constant folding runs and we get int x = 5 int y = x + 6 x is a compile time constant now, and because it never stops being a constant, we can replace all values of x with 5. int x = 5 int y = 5 + 6 See how we can now run constant folding again now that we have more information? This is why compilers run optimizations over and over, until the code doesn’t change anymore. Bug Fixes ───────────────────────────────────────── Along with adding an optimizer, I’ve fixed a large bug Return statements are automatically added to functions now! Before, if you didn’t add a return statement, your function could go past where it should’ve been, crashing your program and possibly even running code it shouldn’t. That is now fixed. Comet also throws an error if you don’t include a return statement in a non-void function. Docs ───────────────────────────────────────── Finally, I’ve extended the docs on the Comet website. It previously only have information on everything up to loops, but now includes info on structs and arrays. That’s all from me, see you next time!
Rewriting in Rust
Ships:
Comet is in a mostly stable state and ready for people to use! I’ve written a large amount of documentation for the syntax itself, however, Comet is a lower-level programming language and not written for absolute beginner programmers. Please report any bugs on the “Issues” page of the Github/Chookspace repository!...
|
1792986752.654363
|
1793073152.654363
|
|
34808
|
Chess Game App in Web by @srimaan-gande | Stardanc Chess Game App in Web by @srimaan-gande | Stardance...
|
srimaan-gande
|
1
|
192.0
|
194
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-20T03:07:36Z", "hours": 48.0, "multiplier": 4.28, "payout": 194, "blessing": "neutral", "text": "Javascript Chess Game Credit: Abdul at THE SOLUTION HUB A fully-featured chess game built with vanilla JavaScript, jQuery, and CSS. Features complete standard chess rules plus advanced tournament rules. Features Implemented Core Chess Rules Standard piece movement : King, Queen, Rook, Bishop, Knight, Pawn Capture mechanics : Standard captures with algebraic notation (e.g., exd5 , Nxf3 ) Check detection : Real-time check status display Checkmate detection : Automatic game end with # notation Stalemate detection : Draw when no legal moves and not in check Castling : Kingside (O-O) and Queenside (O-O-O) with full validation King and rook must not have moved Path must be clear King cannot be in, move through, or end in check Pawn promotion : Automatic queen promotion on 8th/1st rank Advanced Rules En Passant : Capture pawn that moved two squares Visual highlight of en passant target square Correct capture mechanics (removes pawn from adjacent rank) Only available immediately after opponent’s double-move Threefold Repetition : Automatic draw detection Tracks full position including castling rights and en passant Draws when same position occurs 3 times Alert notification on draw Fifty-Move Rule : Automatic draw detection Half-move clock resets on pawn moves and captures Draws after 100 half-moves (50 full moves) without progress Alert notification on draw Draw by Agreement : “Offer Draw” button with confirmation Resignation : “Resign” button with confirmation dialog Visual Design (8-bit/Arcade Theme) Fonts : Press Start 2P (headers) + VT323 (monospace) CRT scanline overlay : Subtle horizontal lines Vignette effect : Darkened edges Pixel-perfect borders : 2px solid with inset shadows Neon glow effects : White/amber/red text shadows Hover animations : Scale + glow on squares Valid move pulse : Animated glow on legal destinations Custom scrollbars : Arcade-styled for move list Game over modal : Alert dialogs for checkmate/stalemate/draw User Interface Objects Turn display : “It’s White’s Turn!” / “It’s Black’s Turn” Status display : CHECK, CHECKMATE, STALEMATE, DRAW states with pulsing animations Move list panel : Side panel with numbered moves Control buttons : Restart, Offer Draw, Resign Responsive layout : Flexbox side-by-side (board + move list) Rank/file labels : 1-8 and a-h with grid positioning Controls Click piece → Select (shows legal moves) Click highlighted square → Move piece Click own piece → Switch selection Restart Game → Reset to initial position Offer Draw → Propose draw to opponent Resign → Concede the game", "repo": "https://github.com/tutugoy/chess-game-app", "demo": "https://tutugoy.github.io/chess-game-app/"}]...
|
[{"post_id": 42830, "ts": "202 [{"post_id": 42830, "ts": "2026-08-07T19:27:06Z", "hours": 10.0, "text": "Chess game update I am posting this devlog to save my time that I worked on. I don’t have anything major to report, because currently, I am changing the CSS on the board, and mainly fixed issues related to the buttons and the mood bar because I didn’t connect them properly to the rest of the menu. But with this devlog, I also want to share my idea of what the game will be in the future. Chess is a basic game that anyone can make, so my plan is to make it into an actual single player game . With this, there will be a storyline of sorts, with bosses, quests, and more (similar to the Super Mario deluxe game). My main doubt is should I make it into a game like this and keep the same chess aspect, or if I should I add more modifications, like powerups or smth."}, {"post_id": 41385, "ts": "2026-08-05T15:46:13Z", "hours": 10.0, "text": "Chess game update - mood bar This is yesterdays update because I forgot to post, but this time, I reverted my changes back to the arcade CSS because the menu and promotion wasn’t working correctly, and so I thought going element by element might be more efficient and easier for me to catch bugs. This update adds new button CSS that is sort of like Duolingo’s buttons, but I found some on Uiverse that I liked which I used. ( https://uiverse.io/snooka1/soft-quail-12 ). I also found a range slider on FreeFrontend.com ( https://freefrontend.com/css-range-sliders/ , called Neumorphism - Range Slider) that I modified to keep a face on the top for the difficulty, and then also made a bar behind it with the same color turning from green to red as it increases. I plan on making more changes to the overall CSS today as well."}, {"post_id": 40491, "ts": "2026-08-04T01:55:10Z", "hours": 11.0, "text": "Chess game - CSS Update Today, i removed all the arcade themed CSS. This includes: The game board The font The scanlines (that nobody could rly see) The scanlines on each game board slot (also which nobody could see) The grey and white board color The glow effect on everything So right now, its pretty bare. I do want to note that the promotion dial and the menu are not working properly right now because I removed some CSS. I will fix that tmrw. I am also currently working on making ideas for the duolingo slab design theme, and it will prob include interactive buttons and overall better scheme."}, {"post_id": 39275, "ts": "2026-08-02T04:26:35Z", "hours": 13.0, "text": "Chess game update As mentioned yesterday, I was working on a fairly new update. This time, I took the code for the dial for promotion, and replicated it to make a small menu that fits all of the commands of the following: Resigning Offering a Draw Restarting the game Flipping Board Move takeback (center button) For some reason, the move takeback button also doesn’t work, so I plan on fixing that as well as making the CSS better. I realized that the whole design isn’t as user friendly, and I kind of just did whatever I could to fit the theme, and that takes away from the goal of proper UI. I really like duolingo’s style of buttons and UI, so I will try to replication it in my own way if possible. This obviously will take a long time, so I am guessing this update will finish in 2-3 days optimistically. Btw link to project if you want to test: https://tutugoy.github.io/chess-game-app/"}, {"post_id": 38574, "ts": "2026-08-01T01:47:41Z", "hours": 9.0, "text": "Chess progress I am currently working on more functionality abilities and fixing some newfound bugs in the code. I don’t want to spoil just yet but I really liked the dial for the promotion, so I want to build on that feature with everything else. I understand this will be a difficult task, but by doing this, I can make the app much more functional! (I am currently coding the JS so I don’t have any good pictures to show so here is the old pic) Like I said, tomorrow I will have something good to show!"}, {"post_id": 38150, "ts": "2026-07-31T12:06:34Z", "hours": 9.0, "text": "Chess update - Promotion! I finished the promotion code today! Although I have mentioned it before, here is a summary of how it works. You go to the end, and a dial with 4 pieces appears. Choose yours and you will become that piece. I fixed the issue with the turn ending at the wrong time as well, which is good. But when doing this, I ran into a couple problems. Firstly, the game didn’t count any pieces taken for my pawn to promote. For example, if a white pawn was on g7 and a black rook on h8, the pawn should have the ability to take the rook and promote on the white turn. Although this happens visually, the game counts the rook as still alive. This is an issue I am currently working on right now."}, {"post_id": 37415, "ts": "2026-07-30T03:35:07Z", "hours": 9.0, "text": "Chess game update This is a major advancement in my pawn promotion mechanics. Since yesterday I have been working on pawn promotion, and I figured the best way could be a sort of dial. As you can see in the picture, this is what the dial will look like when trying to promote, and when clicking on one of the pieces, that piece will be selected. Super simple is what I thought at first, but it was much worse than that. Building the dial was an utter pain. The CSS features kept making it into a square that was twisted where it connected to all the sides where the sections split. The center was supposed to be hollow, but I am still unsure on its main use, so I kept it solid for now. The promotion works, but 2 main issues arise. Firstly, if I click out of promotion dial, it ends my turn without me doing anything. So I don’t even get to make a move at all. Secondly, if I click any of the pieces, it is still my turn for some reason. I believe the issue is that my JS counts clicking a legal square to move to as the end of my turn, which is why it is doing this. I will fix the rest tomorrow as I believe taking time to rest might help me think of a solution."}, {"post_id": 36335, "ts": "2026-07-28T11:56:56Z", "hours": 10.0, "text": "Chess game updates I recently got my first ship rated and I understood what mistakes I made and what I needed to fix. I understood that even though the game was well made in terms of how it works, it wasn’t user friendly and the theme made it harder to see. Thanks to all who helped give feedback for this, and my first change is to make the pieces actual vectors. This was an issue all of the users pointed out, so I hope this fixes at least one of the problems. I will continue moving forward with this in mind, and I am currently working on my other changes as well. (This is the only one that properly is working so I wrote about it)"}, {"post_id": 35304, "ts": "2026-07-26T16:57:03Z", "hours": 8.0, "text": "Chess update - bug fixes and initial work on Auto saving I used my time today to just update some other features that had bugs that I haven’t fixed yet, like the clock sometimes doesn’t work between turns. I also started working on Auto Saving so that the game saves in local storage so you could resume later, but it isn’t looking very good right now because I messed with the wrong code and the entire thing broke. I need to fix that tomorrow but overall this was a mostly successful use of time."}, {"post_id": 34601, "ts": "2026-07-25T13:44:43Z", "hours": 9.0, "text": "Chess game update Loading and saving games is now a feature as well. The app will export a JSON file containing data of the match, including time left for both sides, which pieces are still on the board, and the movelist as well. In addition, I have fixed bugs with the take back button, where it was removing pieces from the board entirely. I will focus on addition promotion tomorrow as I haven’t done that yet."}, {"post_id": 34026, "ts": "2026-07-24T13:25:10Z", "hours": 9.0, "text": "Chess game update - functionality I added a game clock (10 mins for now) and the take back move button. These are just functionality changes not anything major. it took a while because I also had to figure out how to make the clocks go around after the board was flipped so it was taking a long time for that. Also the game now has to read the move list and revert changes to the board for the move back so that also took long. I need to fix some issues with the clock, something I am working on now."}, {"post_id": 33846, "ts": "2026-07-24T02:48:00Z", "hours": 2.0, "text": "Chess game update - more functionality I have spent this time fixing the numerous issues that came with flipping the board, including deleting the pieces, changing their positions, making the move list somehow go into the negatives, and more I didn’t even notice but the console did. I had to perform a git restore to remove the changes and recode the entire thing again. It did workout and now it works well."}, {"post_id": 33441, "ts": "2026-07-23T12:10:29Z", "hours": 10.0, "text": "Chess game update I am currently trying to fix some issues when implementing the stockfish engine as it is too strong at level 1. This is proving to be a big challenge but I will be able to complete it soon. While doing so, I also thought of improving some functionality and I have added a feature to flip the board. This feature also has a lot of issues and both will most likely be fixed in the next devlog."}, {"post_id": 33130, "ts": "2026-07-22T19:15:52Z", "hours": 9.0, "text": "Chess Game update - Stockfish Engine Yesterday I started working on a stockfish engine for my game. I finished it today and it has some very strong features. You can now play in 3 modes: PvP PvE (Player plays as white) PvE (Player plays as Black) I used the LiChess stockfish engine to complete this part of the project (Link to release: https://github.com/lichess-org/stockfish.js/releases/tag/ddugovic-250718 ) The engine has all the features to calculate the best moves and complete them. To make it easier, I added a level system from 1-20 so that the bot is easier or harder to beat, but after testing, I found that the bot takes longer to respond with a move when its at level 20 and is still very smart and powerful at level 1. I think I may have integrated the engine incorrectly when connecting it to my current project, so in my next update, I will be fixing this issue."}, {"post_id": 32657, "ts": "2026-07-21T23:05:55Z", "hours": 8.0, "text": "Chess game update I am currently working on building a bot you can play against. It is very tough to find another person to play with especially on the same screen/device so this could fix that issue very easily. The bot will be stockfish and make moves for either black or white. For now, I will code it just for black and make it for white later. This devlog is for me to log my hours, but the bot is nearly finished and will take me a little more time. This also introduces the need to switch from white to black, so in the future I will be adding that feature as well."}, {"post_id": 32121, "ts": "2026-07-21T02:01:49Z", "hours": 0.0, "text": "Chess game fix quick For some reason King + Knight VS King was not working from my last update, which was because I did not properly edit the code. I have fixed the issue and that should be working now. This devlog isn’t major or an update but just a fix."}, {"post_id": 31992, "ts": "2026-07-20T20:34:58Z", "hours": 8.0, "text": "Chess game update Today I added the insufficient material feature. It took me a while to figure out because I was trying to use formulas and math to make the code analyze if a certain set of pieces can lead to a checkmate, but I realized that instead of calculating, I can just find which combinations of pieces cannot lead to checkmate, and then list those pieces in the code for the game to constantly check, and then determine if its a stalemate/draw. Below is the combinations of pieces that cannot lead to a checkmate that my code checks and accounts for: King vs King King + Bishop vs King King + Knight vs King King + Bishop vs King + Bishop (same color squares)"}, {"post_id": 31566, "ts": "2026-07-20T02:23:14Z", "hours": 3.0, "text": "Chess game final update before shipping This is my final update for the chess game. In this update I added sound effects and fixed some final issues before shipping."}, {"post_id": 31232, "ts": "2026-07-19T14:01:17Z", "hours": 7.0, "text": "Chess game fix So far, I worked on fixing the bug in my code which made my pieces disappear as mentioned last time. I am also currently working on trying to add sound effects to make the game more interesting to play and use. This devlog so that I log my hours and I will be posting another one soon."}, {"post_id": 31017, "ts": "2026-07-19T02:30:11Z", "hours": 9.0, "text": "Chess game updates Today, I made some decent functionality changes. It took very long because I couldn’t figure it out for a while because I had to do research on how to, but I figured out how to do the en passant, threefold repetition, and 50 move rule by updating the JS. I also fixed the previous issue where when the player is in check by another, they can’t block it with another piece, even if they should be able to. I was also able to fix this issue as well. Unfortunately, the logic of JS I made for the en passant, threefold repetition and 50 move rule introduced a new problem of erasing any piece that can be taken. For example, if a pawn is able to take another and I click on that pawn to see its possible moves, and then click on another piece, the opposing pawn disappears. I didn’t have enough time to fix the issue and will be working on it another time."}, {"post_id": 30466, "ts": "2026-07-18T01:40:46Z", "hours": 12.0, "text": "Chess game Update BIG I did a lot of work today in my chess engine. I had a lot of time and I was able to do a decent bit of research and use AI to find resources on making an old video game/arcade style design to the game board. Because of this, I spent a lot of time on CSS and JS, coding to fix the prior issues in my code as well as making changes so that it looks as good as it can. Firstly, the pieces can finally be moved only where they should. Before, any piece could move anywhere by clicking the square, unless it was already occupied. Now I fixed the javascript code so that the code checks if that piece can legally move there and stops it otherwise. I also added the ability to castle for both black and white for more functionality. In addition, I also made the resign feature work for both black and white, as it changes who has the ability to resign based on if the current turn is White’s or Black’s. If it is white, for example, the resign button will say Resign (White) so white loses and black wins, and vice versa. Because the game already has so much code on checking pieces and their positions, I figured I could also add a list on the side that says which pieces have been moved so far. I didn’t exactly how to put it in algebric notation so after researching, I had the idea of basically taking the position of the piece’s sqaure, then use javascript to convert into the grid number, and then add the letters in front if the piece moved is any piece other than a pawn. The list also shows castling, checks and checkmates. The board was looking really bland so I did research on ways to make it an arcade/old style like I said before. I first starting to make a scanline on the screen by using CSS and duplicating gradients on the screen. It is very hard to see but it is there. Next, I made the game boxes better by making them seamless when placed next to each other. I also made the hover highlight the boxes instead of making them bigger like before. I also added more diagonal scanlines in them as well. Next, I made as many elements neon to make it bright. As I was making this I also research online that the scroll bar in webpages can be edited. So when the move list is truncated, it shows custom white scroll bars as well. I also found that you can make really cool effects when hovering over buttons, so using CSS I also made the buttons have a horizontal box that goes over to show the animation of the color changing, and I added angled boxes in the back of it that animate and lift, making the button look like its coming up. I will probably add more functionality next time."}, {"post_id": 29649, "ts": "2026-07-16T18:32:03Z", "hours": 5.0, "text": "Chess game Update This is my third update for the chess game. I wanted to add some more functionality to the game with features in more popular chess game engines like Chess.com where it has draw and resign features. I also added a restart game feature since it is single player, but currently there is an issue where the pieces persist at their prior position even though according to the game, they are not there. They button CSS is also not aligned and good compared to the gradient style with the rest of the page, so for the future, I plan on making it one single theme and keeping the page more organized."}, {"post_id": 29265, "ts": "2026-07-16T02:21:42Z", "hours": 5.0, "text": "Chess App Updates Today, I worked on making the app better by making it figure out checks, checkmates, and stalemates. I used AI to understand how to do this, and by using resources online, I also figured out how to input gradients and better CSS functionality for the app to look better. The code for checks and checkmates mainly relies on the JS where it looks at and detects if any legal moves are left for the king to continue in play. I still haven’t added functionality for it to stop pieces from going into positions they shouldn’t be able to. Overall that is the main things I did today."}, {"post_id": 28672, "ts": "2026-07-15T02:11:01Z", "hours": 3.0, "text": "Chess game today I made my first chess game board using this tutorial: https://www.youtube.com/watch?v=SS5amIbX0Mo&list=LL&index=3&t=56s using it I was able to follow along and run the code and use google to understand what each piece of code does to the overall project. Some limits to the project are that the game is able to move the pieces but does not recognize checks or checkmates. I will do more research and try to improve it as much as I can."}]...
|
Title: Chess Game App in Web by @srimaan-gande | S Title: Chess Game App in Web by @srimaan-gande | Stardance
Devlogs:
Chess game today I made my first chess game board using this tutorial: https://www.youtube.com/watch?v=SS5amIbX0Mo&list=LL&index=3&t=56s using it I was able to follow along and run the code and use google to understand what each piece of code does to the overall project. Some limits to the project are that the game is able to move the pieces but does not recognize checks or checkmates. I will do more research and try to improve it as much as I can.
Chess App Updates Today, I worked on making the app better by making it figure out checks, checkmates, and stalemates. I used AI to understand how to do this, and by using resources online, I also figured out how to input gradients and better CSS functionality for the app to look better. The code for checks and checkmates mainly relies on the JS where it looks at and detects if any legal moves are left for the king to continue in play. I still haven’t added functionality for it to stop pieces from going into positions they shouldn’t be able to. Overall that is the main things I did today.
Chess game Update This is my third update for the chess game. I wanted to add some more functionality to the game with features in more popular chess game engines like Chess.com where it has draw and resign features. I also added a restart game feature since it is single player, but currently there is an issue where the pieces persist at their prior position even though according to the game, they are not there. They button CSS is also not aligned and good compared to the gradient style with the rest of the page, so for the future, I plan on making it one single theme and keeping the page more organized.
Chess game Update BIG I did a lot of work today in my chess engine. I had a lot of time and I was able to do a decent bit of research and use AI to find resources on making an old video game/arcade style design to the game board. Because of this, I spent a lot of time on CSS and JS, coding to fix the prior issues in my code as well as making changes so that it looks as good as it can. Firstly, the pieces can finally be moved only where they should. Before, any piece could move anywhere by clicking the square, unless it was already occupied. Now I fixed the javascript code so that the code checks if that piece can legally move there and stops it otherwise. I also added the ability to castle for both black and white for more functionality. In addition, I also made the resign feature work for both black and white, as it changes who has the ability to resign based on if the current turn is White’s or Black’s. If it is white, for example, the resign button will say Resign (White) so white loses and black wins, and vice versa. Because the game already has so much code on checking pieces and their positions, I figured I could also add a list on the side that says which pieces have been moved so far. I didn’t exactly how to put it in algebric notation so after researching, I had the idea of basically taking the position of the piece’s sqaure, then use javascript to convert into the grid number, and then add the letters in front if the piece moved is any piece other than a pawn. The list also shows castling, checks and checkmates. The board was looking really bland so I did research on ways to make it an arcade/old style like I said before. I first starting to make a scanline on the screen by using CSS and duplicating gradients on the screen. It is very hard to see but it is there. Next, I made the game boxes better by making them seamless when placed next to each other. I also made the hover highlight the boxes instead of making them bigger like before. I also added more diagonal scanlines in them as well. Next, I made as many elements neon to make it bright. As I was making this I also research online that the scroll bar in webpages can be edited. So when the move list is truncated, it shows custom white scroll bars as well. I also found that you can make really cool effects when hovering over buttons, so using CSS I also made the buttons have a horizontal box that goes over to show the animation of the color changing, and I added angled boxes in the back of it that animate and lift, making the button look like its coming up. I will probably add more functionality next time.
Chess game updates Today, I made some decent functionality changes. It took very long because I couldn’t figure it out for a while because I had to do research on how to, but I figured out how to do the en passant, threefold repetition, and 50 move rule by updating the JS. I also fixed the previous issue where when the player is in check by another, they can’t block it with another piece, even if they should be able to. I was also able to fix this issue as well. Unfortunately, the logic of JS I made for the en passant, threefold repetition and 50 move rule introduced a new problem of erasing any piece that can be taken. For example, if a pawn is able to take another and I click on that pawn to see its possible moves, and then click on another piece, the opposing pawn disappears. I didn’t have enough time to fix the issue and will be working on it another time.
Chess game fix So far, I worked on fixing the bug in my code which made my pieces disappear as mentioned last time. I am also currently working on trying to add sound effects to make the game more interesting to play and use. This devlog so that I log my hours and I will be posting another one soon.
Chess game final update before shipping This is my final update for the chess game. In this update I added sound effects and fixed some final issues before shipping.
Chess game update Today I added the insufficient material feature. It took me a while to figure out because I was trying to use formulas and math to make the code analyze if a certain set of pieces can lead to a checkmate, but I realized that instead of calculating, I can just find which combinations of pieces cannot lead to checkmate, and then list those pieces in the code for the game to constantly check, and then determine if its a stalemate/draw. Below is the combinations of pieces that cannot lead to a checkmate that my code checks and accounts for: King vs King King + Bishop vs King King + Knight vs King King + Bishop vs King + Bishop (same color squares)
Chess game fix quick For some reason King + Knight VS King was not working from my last update, which was because I did not properly edit the code. I have fixed the issue and that should be working now. This devlog isn’t major or an update but just a fix.
Chess game update I am currently working on building a bot you can play against. It is very tough to find another person to play with especially on the same screen/device so this could fix that issue very easily. The bot will be stockfish and make moves for either black or white. For now, I will code it just for black and make it for white later. This devlog is for me to log my hours, but the bot is nearly finished and will take me a little more time. This also introduces the need to switch from white to black, so in the future I will be adding that feature as well.
Chess Game update - Stockfish Engine Yesterday I started working on a stockfish engine for my game. I finished it today and it has some very strong features. You can now play in 3 modes: PvP PvE (Player plays as white) PvE (Player plays as Black) I used the LiChess stockfish engine to complete this part of the project (Link to release: https://github.com/lichess-org/stockfish.js/releases/tag/ddugovic-250718 ) The engine has all the features to calculate the best moves and complete them. To make it easier, I added a level system from 1-20 so that the bot is easier or harder to beat, but after testing, I found that the bot takes longer to respond with a move when its at level 20 and is still very smart and powerful at level 1. I think I may have integrated the engine incorrectly when connecting it to my current project, so in my next update, I will be fixing this issue.
Chess game update I am currently trying to fix some issues when implementing the stockfish engine as it is too strong at level 1. This is proving to be a big challenge but I will be able to complete it soon. While doing so, I also thought of improving some functionality and I have added a feature to flip the board. This feature also has a lot of issues and both will most likely be fixed in the next devlog.
Chess game update - more functionality I have spent this time fixing the numerous issues that came with flipping the board, including deleting the pieces, changing their positions, making the move list somehow go into the negatives, and more I didn’t even notice but the console did. I had to perform a git restore to remove the changes and recode the entire thing again. It did workout and now it works well.
Chess game update - functionality I added a game clock (10 mins for now) and the take back move button. These are just functionality changes not anything major. it took a while because I also had to figure out how to make the clocks go around after the board was flipped so it was taking a long time for that. Also the game now has to read the move list and revert changes to the board for the move back so that also took long. I need to fix some issues with the clock, something I am working on now.
Chess game update Loading and saving games is now a feature as well. The app will export a JSON file containing data of the match, including time left for both sides, which pieces are still on the board, and the movelist as well. In addition, I have fixed bugs with the take back button, where it was removing pieces from the board entirely. I will focus on addition promotion tomorrow as I haven’t done that yet.
Chess update - bug fixes and initial work on Auto saving I used my time today to just update some other features that had bugs that I haven’t fixed yet, like the clock sometimes doesn’t work between turns. I also started working on Auto Saving so that the game saves in local storage so you could resume later, but it isn’t looking very good right now because I messed with the wrong code and the entire thing broke. I need to fix that tomorrow but overall this was a mostly successful use of time.
Chess game updates I recently got my first ship rated and I understood what mistakes I made and what I needed to fix. I understood that even though the game was well made in terms of how it works, it wasn’t user friendly and the theme made it harder to see. Thanks to all who helped give feedback for this, and my first change is to make the pieces actual vectors. This was an issue all of the users pointed out, so I hope this fixes at least one of the problems. I will continue moving forward with this in mind, and I am currently working on my other changes as well. (This is the only one that properly is working so I wrote about it)
Chess game update This is a major advancement in my pawn promotion mechanics. Since yesterday I have been working on pawn promotion, and I figured the best way could be a sort of dial. As you can see in the picture, this is what the dial will look like when trying to promote, and when clicking on one of the pieces, that piece will be selected. Super simple is what I thought at first, but it was much worse than that. Building the dial was an utter pain. The CSS features kept making it into a square that was twisted where it connected to all the sides where the sections split. The center was supposed to be hollow, but I am still unsure on its main use, so I kept it solid for now. The promotion works, but 2 main issues arise. Firstly, if I click out of promotion dial, it ends my turn without me doing anything. So I don’t even get to make a move at all. Secondly, if I click any of the pieces, it is still my turn for some reason. I believe the issue is that my JS counts clicking a legal square to move to as the end of my turn, which is why it is doing this. I will fix the rest tomorrow as I believe taking time to rest might help me think of a solution.
Chess update - Promotion! I finished the promotion code today! Although I have mentioned it before, here is a summary of how it works. You go to the end, and a dial with 4 pieces appears. Choose yours and you will become that piece. I fixed the issue with the turn ending at the wrong time as well, which is good. But when doing this, I ran into a couple problems. Firstly, the game didn’t count any pieces taken for my pawn to promote. For example, if a white pawn was on g7 and a black rook on h8, the pawn should have the ability to take the rook and promote on the white turn. Although this happens visually, the game counts the rook as still alive. This is an issue I am currently working on right now.
Chess progress I am currently working on more functionality abilities and fixing some newfound bugs in the code. I don’t want to spoil just yet but I really liked the dial for the promotion, so I want to build on that feature with everything else. I understand this will be a difficult task, but by doing this, I can make the app much more functional! (I am currently coding the JS so I don’t have any good pictures to show so here is the old pic) Like I said, tomorrow I will have something good to show!
Chess game update As mentioned yesterday, I was working on a fairly new update. This time, I took the code for the dial for promotion, and replicated it to make a small menu that fits all of the commands of the following: Resigning Offering a Draw Restarting the game Flipping Board Move takeback (center button) For some reason, the move takeback button also doesn’t work, so I plan on fixing that as well as making the CSS better. I realized that the whole design isn’t as user friendly, and I kind of just did whatever I could to fit the theme, and that takes away from the goal of proper UI. I really like duolingo’s style of buttons and UI, so I will try to replication it in my own way if possible. This obviously will take a long time, so I am guessing this update will finish in 2-3 days optimistically. Btw link to project if you want to test: https://tutugoy.github.io/chess-game-app/
Chess game - CSS Update Today, i removed all the arcade themed CSS. This includes: The game board The font The scanlines (that nobody could rly see) The scanlines on each game board slot (also which nobody could see) The grey and white board color The glow effect on everything So right now, its pretty bare. I do want to note that the promotion dial and the menu are not working properly right now because I removed some CSS. I will fix that tmrw. I am also currently working on making ideas for the duolingo slab design theme, and it will prob include interactive buttons and overall better scheme.
Chess game update - mood bar This is yesterdays update because I forgot to post, but this time, I reverted my changes back to the arcade CSS because the menu and promotion wasn’t working correctly, and so I thought going element by element might be more efficient and easier for me to catch bugs. This update adds new button CSS that is sort of like Duolingo’s buttons, but I found some on Uiverse that I liked which I used. ( https://uiverse.io/snooka1/soft-quail-12 ). I also found a range slider on FreeFrontend.com ( https://freefrontend.com/css-range-sliders/ , called Neumorphism - Range Slider) that I modified to keep a face on the top for the difficulty, and then also made a bar behind it with the same color turning from green to red as it increases. I plan on making more changes to the overall CSS today as well.
Chess game update I am posting this devlog to save my time that I worked on. I don’t have anything major to report, because currently, I am changing the CSS on the board, and mainly fixed issues related to the buttons and the mood bar because I didn’t connect them properly to the rest of the menu. But with this devlog, I also want to share my idea of what the game will be in the future. Chess is a basic game that anyone can make, so my plan is to make it into an actual single player game . With this, there will be a storyline of sorts, with bosses, quests, and more (similar to the Super Mario deluxe game). My main doubt is should I make it into a game like this and keep the same chess aspect, or if I should I add more modifications, like powerups or smth.
Ships:
Javascript Chess Game Credit: Abdul at THE SOLUTION HUB A fully-featured chess game built with vanilla JavaScript, jQuery, and CSS. Features complete standard chess rules plus advanced tournament rules. Features Implemented Core Chess Rules Standard piece movement : King, Queen, Rook, Bishop, Knight, Pawn Capture mechanics : Standard captures with algebraic notation (e.g., exd5 , Nxf3 ) Check detection : Real-time check status display Checkmate detection : Automatic game end with # notation Stalemate detection : Draw when no legal moves and not in check Castling : Kingside (O-O) and Queenside (O-O-O) with full validation King and rook must not have moved Path must be clear King cannot be in, move through, or end in check Pawn promotion : Automatic queen promotion on 8th/1st rank Advanced Rules En Passant : Capture pawn that moved two squares Visual highlight of en passant target square Correct capture mechanics (removes pawn from adjacent rank) Only available immediately after opponent’s double-move Threefold Repetition : Automatic draw detection Tracks full position including castling rights and en passant Draws when same position occurs 3 times Alert notification on draw Fifty-Move Rule : Automatic draw detection Half-move clock resets on pawn moves and captures Draws after 100 half-moves (50 full moves) without progress Alert notification on draw Draw by Agreement : “Offer Draw” button with confirmation Resignation : “Resign” button with confirmation dialog Visual Design (8-bit/Arcade Theme) Fonts : Press Start 2P (headers) + VT323 (monospace) CRT scanline overlay : Subtle horizontal lines Vignette effect : Darkened edges Pixel-perfect borders : 2px solid with inset shadows Neon glow effects : White/amber/red text shadows Hover animations : Scale + glow on squares Valid move pulse : Animated glow on legal destinations Custom scrollbars : Arcade-styled for move list Game over modal : Alert dialogs for checkmate/stalemate/draw User Interface Objects Turn display : “It’s White’s Turn!” / “It’s Black’s Turn” Status display : CHECK, CHECKMATE, STALEMATE, DRAW states with pulsing animations Move list panel : Side panel with numbered moves Control buttons : Restart, Offer Draw, Resign Responsive layout : Flexbox side-by-side (board + move list) Rank/file labels : 1-8 and a-h with grid positioning Controls Click piece → Select (shows legal moves) Click highlighted square → Move piece Click own piece → Switch selection Restart Game → Reset to initial position Offer Draw → Propose draw to opponent Resign → Concede the game...
|
1792882071.2105198
|
1793746071.2105198
|
|
2805
|
FPEeee by @Duck | Stardance
|
Duck
|
2
|
191.0
|
1850
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T04:30:31Z", "hours": 58.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is an updated version of my physics engine, using a new simulation method called XPBD! It was a bit challenging learning the basics of vector calculus, but it was worth it for the added flexibility of XPBD constraints and integration. I’m also really proud of getting OpenGL rendering working for some of the demos, because making an 3D renderer could be a project in and of itself! (Not this renderer though, it’s pretty barebones.) I’m especially happy with the cloth demo, with the best 3D rendering and (in my opinion) the best showcase of the engine’s features! (Also the least laggy of them all? I know why but it’s still kinda weird, being the most complex demo.) Writing it in C was a probably a bit harder than using a higher level language like C++, but being able to compile the entire project from source in less than two seconds on my machine was a big plus! I hope you enjoy playing with the physics demos! I worked really hard on this project!!", "repo": "https://github.com/duckdood/fpeeee", "demo": "https://duckdood.github.io/physics_demo"}, {"ship_num": 2, "ts": "2026-09-06T04:53:48Z", "hours": 133.0, "multiplier": 16.74, "payout": 1850, "blessing": "neutral", "text": "This is a position-based physics engine made all in C for portability and versatility. It had many challenging moments when making it, such as triangle collisions, spatial partitioning, performance optimization, and more, but I had a lot of fun building it, showing it off to my friends and family, and learning more about physics.", "repo": "https://github.com/duckdood/fpeeee", "demo": "https://duckdood.github.io/physics_demo"}]...
|
[{"post_id": 80800, "ts": "202 [{"post_id": 80800, "ts": "2026-10-18T20:26:33Z", "hours": 1.6025, "text": "Devlog #22 (I just realized that I accidentally did two devlog #15s but it’s too late now) Getting ready for another ship I edited some constraints to be more stable, edited the website to be a bit more clear of where the controls are if your screen is too small to fit them, and had a NIGHTMARE fiddling with ffmpeg to try and replace the video on the README to not be too laggy or low quality but also not too big. I also tried to do some performance optimizations for phones, but I couldn’t figure it out. This is the mp4 version animated WebP that I eventually got ffmpeg to spit out. For some reason animated WebPs don’t work in devlogs."}, {"post_id": 79264, "ts": "2026-10-13T08:10:35Z", "hours": 2.3019, "text": "Devlog #21 MERGING I’ve been rewriting a lot of the physics engine for XPBD (eXtended Position Based Dynamics) since the last ship, but on a separate branch so that if I broke anything too bad it wouldn’t show up on the website, but today I finally merged the xpbd branch into main. Sadly, it is a fair bit slower than the previous verlet integration (at least for my simple demos), but it’s a far more flexible integration and constraint scheme and I think the tradeoff is worth it. (I am a bit disappointed with the performance on the website though, I swear it was faster before I merged it! It’s a lot faster natively!)"}, {"post_id": 78023, "ts": "2026-10-09T07:13:56Z", "hours": 4.0489, "text": "Devlog #20 Another constraint, and another failed side project. Boundary constraint I added a constraint that I named a “boundary constraint”, that confines a particle to being on the specific side of a line e.g. making four lines around the edges of the screen and making sure the particle is on the side which is visible on screen. This is different from a wall because walls have two sides (and also zero thickness) which can cause a particle that’s going super fast to completely pass through to the other side of the wall in a single physics step, whereas with a boundary it will always snap it back to the correct side of the line. (If this was a bad explanation, I’m sorry). Failed lua integration I suppose the word ‘failed’ is a bit harsh in this scenario, I was just dipping my toes into integrating a little lua shell into the demos that would let you spawn particles and stuff programatically, but I decided it wasn’t worth it for small demos that aren’t meant to be super duper flexible anyway because they’re just meant to show off cool features the engine can do. throwing balls very quickly at the wall, which don’t clip through VVV"}, {"post_id": 75992, "ts": "2026-10-01T22:09:53Z", "hours": 10.0394, "text": "Devlog #19 Optimization and Interaction I’ve optimized the triangle collision code to use the spatial partitioning I implemented before for collisions. It goes through each triangle and checks what balls are in its bounding box with the collision grid, and completely skips any balls that aren’t close. This allows for about a thousand balls in a scene (at least on my computer), which is a lot better than the hundred or so you’d get with just bounding box checks and the tens or so you would get with a naive approach. Sadly, this change is only on the XPBD branch for now, meaning it won’t reflect on the website, but you’d still probably have to be spawning balls for a while for that to slow down, depending on the computer. I’ve also added far better interaction to the cloth, using some matrix multiplication and some raycast tests, you can now drag the cloth around with your mouse! This change was on the main branch too, so this is right on the website , right now! I did try to implement a system for having the cloth tear when it was under stress, but it would have required me to rework a lot of stuff and it didn’t quite work out. :("}, {"post_id": 74317, "ts": "2026-09-27T05:22:56Z", "hours": 11.4481, "text": "Devlog #18 Fluid simulation For a couple days I’ve been researching and trying to implement a PBF (position based fluid) fluid simulation, but there are barely any resources on the topic that I’ve been able to find, and the ones I have found are very math oriented with evil cryptic symbols that take a while to wrap my head around. The fluid simulation does work, but it’s much laggier, a lot finickier, and not a lot better (if at all better) than just chucking a couple thousand balls together and having them collide normally."}, {"post_id": 72994, "ts": "2026-09-24T05:51:47Z", "hours": 9.7506, "text": "Devlog #17 OpenGL integration I spend the last couple days integrating OpenGL rendering into a couple of the projects, meaning the graphics will be a lot better and rendered on the GPU instead of being rendered on the CPU, as well as speeding up the demos because even with the added visual complexity, the GPU is just so much faster at rendering! I made these changes of the main branch so that they would reflect on the website sooner, but git’s merge system is actually super good and it took no more than 15 minutes to merge the OpenGL rendering to the XPBD branch. I’ve only migrated over the cloth and fluid demos, but they’re the ones that needed it the most, and it’s not too hard to add it to more demos after I’ve had most of the OpenGL boilerplate implemented."}, {"post_id": 70439, "ts": "2026-09-19T06:17:10Z", "hours": 8.4, "text": "Devlog #16 I migrated the XPBD stuff to 3D and moved all the demos to work with it as well, not much interesting to talk about though. Here’s a demo of it working though"}, {"post_id": 66409, "ts": "2026-09-12T07:11:52Z", "hours": 10.2822, "text": "Devlog #15: Rebuilding because why not A bit before shipping, I heard about another physics method called XPBD (extended position based dynamics) that’s a lot more powerful and flexible, and I decided, after I would ship, I would try to convert my engine to that. I kinda have to remake almost all of the physics stuff I already made, but I can recycle a lot of the older code, just making it fit the new framework, and being a lot more educated about physics simulation stuff than when I started this project, it wasn’t too hard to rewrite some new stuff. Right now I have ported over my ball pit thingy, not a lot to show that’s different from old devlogs, but hey, it’s the inside that counts, right?"}, {"post_id": 62664, "ts": "2026-09-06T04:32:53Z", "hours": 6.1839, "text": "Devlog #15: shipping! Super small devlog, just editing the website and the README and stuff like that, really want to ship now! It just took a while to add messages to all the different demos and I may have tried a little bit of engine stuff but it just didn’t work out."}, {"post_id": 59457, "ts": "2026-09-01T10:01:32Z", "hours": 10.425, "text": "Devlog #14 I added edge detection for 3D triangles and other miscellaneous stuff, like improving the website, adding VSync to the demos, but that stuff’s boring so I’m just going to show off the new demo! It might be the coolest one so far, but it was one of the easiest to make. I’m planning on shipping real soon though, just wanna add a few things to the website and readme!"}, {"post_id": 56613, "ts": "2026-08-28T13:09:26Z", "hours": 10.6511, "text": "Devlog #13 I added triangle-walls which vertices are 3 dynamic spheres, which can collide with other particles and have all 4 particles update with their own velocities! This makes the engine a lot more flexible, so you don’t have to make big grids of spheres if you want to be able to have walls that can move, instead of being static. And it makes rigidbodies (probably) possible! (Press enter to spawn balls) Demo! This devlog is a bit long, sorry! I didn’t want to go too far over 10 hours like a did a couple devlogs ago. 2D 2D is, of course, simpler than 3D, and the length of the function for these walls definitely show that (~40 lines). I used the same algorithm to find the closest position on a line to another position as I used for detecting collisions on the edges of the static 3D walls a while ago. It gives you a lerpable value from from the first point to the second point of the line, and you can use that to find the point you are looking for. Comparing it to the circle you’re checking against, will give the distance and the normal of the collision. You can use that information to move the circle out of the wall, and push the wall away, using the value to lerp between as the ratio to push each of the points that the wall is made of away. 3D This function is a bit more complicated, being about 80 lines long, but a lot of the information in the 2D version is applicable here too. Here, instead of trying to find the closest point, we are trying to find the barycentric coordinates of the point, which is similar to the value to lerp between the two points in 2D, but for 3D (It’s basically just 3 numbers which tell you how close you are to each vertex of a triangle, and can describe any point on the triangle). This involves find the triangle’s area that you are checking against using the cross product, getting the distance of the point inward to the triangle for each edge, and calculating some inverse areas, which magically (not really) give you the barycentric coordinates. We then use these coordinates, as long as the distance to the triangle face using the dot product, to figure out whether the ball is colliding with the face, and if so, moving the ball outside of the triangle and moving the 3 vertices away as well, of course using each barycentric coordinate as a weight for how much to move each individual vertex. I haven’t implemented detections with the edges of the triangles exactly yet though, only the faces, but I will try to implement it soon!"}, {"post_id": 50030, "ts": "2026-08-19T01:48:43Z", "hours": 11.2506, "text": "Devlog #12 I improved the website to include multiple demos, and I made a couple improvements to the performance of the spatial partitioning detection, but I’ve mostly just been doing tinkering and testing with the engine some more."}, {"post_id": 31654, "ts": "2026-07-20T07:22:53Z", "hours": 7.2706, "text": "Devlog #11: Not a huge devlog, I’ve mostly been having fun with this little parachute demo I made! I definitely spent too much time just playing with it. I’ve also been experimenting a bit with multithreading, but it’s not in a stable or performant enough state right now to showcase. mp4 compression will hate this"}, {"post_id": 27421, "ts": "2026-07-12T23:48:38Z", "hours": 6.1297, "text": "Devlog #10: I ported the spatial partitioning to 3D! It’s definitely a lot laggier in the 3D environment, because it needs to check 3x the partitions per ball, but it’s still a lot better than having no spatial partitioning at all. One of the problems I encountered when transitioning to 3D was lag, but not in the expected “It’s going to be laggy when you have a lot of balls” way. For some strange reason, the framerate was still below 60 even when there were no balls in the world! It turned out to be an issue with needing to calloc a big region of memory everytime it would sort the balls into their partitions, but I was able to fix it by keeping the allocation throughout the lifetime of the partition grid. I also fixed it in the 2D version, even though it wasn’t really a problem there, it also wasn’t really a problem to fix either. (In the video you will notice the balls disappearing, the sample I whipped up for the devlog just automatically despawns balls when they leave the partitioning grid. Also some balls fly off when spawning, because sometimes the balls spawn inside one another) I’m getting a bit burnt out from this project though, I might ship after maybe adding multithreading, creating the README, and maybe making some more demos. I’ve been watching some videos on real rigidbody physics, and I want to try that out too!"}, {"post_id": 24090, "ts": "2026-07-07T13:02:59Z", "hours": 25.6289, "text": "Devlog #9: Intro I added spatial partitioning to the engine to speed up collisions when you have a lot of balls in a scene. Partitioning explanation Spatial partitioning is an optimization that divides the world into a grid, so balls only check other balls that are in close cells, instead of every ball checking all others, which is O(n^2). It seems pretty simple, but I tried 4 different ways before getting a good result. Judging by the time logged, I struggled. First Attempt (Dense grid) I first tried a naive implementation, which was making a big grid, with each cell having a list of pointers to balls that are in it. The problem is, each cell needs to have the total amount of balls that could be in it allocated. For the best performance, each grid cell should be the same size as a ball, and for the size I use here, you need the grid dimensions to be in the 100s. with 1000 balls, and with 64 bit pointers, you could have 1000 * 8 * 300 * 300 bytes allocated total, ~720 MB. You can get away with a lot less pointers, but that still wasn’t satisfying, or flexible. Second Attempt (Sparse grid) My second try was a grid, but you only store cells which have balls in them. This doesn’t solve the high number of pointers per cell, but it uses less cells overall. It should’ve been easier, but C doesn’t have any built in hashmaps. The physics code doesn’t use many libraries, and I didn’t want to rely on more, so I had the bright idea to make my own hashmap. It didn’t work and I gave up, and that was the end of the sparse grid. Third Attempt (Resizable arrays) The third attempt was like the first, but I decided to try allocating the memory on the fly, when balls moved around, but it didn’t work out. Working Attempt!! (Sorting) The most successful attempt was a grid, every cell is allocated, and yet, uses the least memory. Instead of storing pointers, each cell only stores two things: An offset and a length. Just indices into the ball array, which sounds easy, but then you realize - the balls are in a random order. To fix this, when updating the grid, you sort the balls into the cell they’re in. You may think that going into the dark cave of sorting is a bad idea, but here, it’s just a counting sort. Then it sets each cell’s fields, and you have your partitions. Detecting Collisions Collisions are easier than constructing the grid, you just check every ball, find its cell, check balls in close cells, then you’re done. Struggles There was a lot of friction with memory errors. To fix them, I learned GDB, and learnt about sanitizers, which detect lots of hard to catch memory errors. One time the program would randomly crash, and it was really hard to fix, but a sanitizer detected an easy out of bounds error when rendering. Not even a physics thing. :( Sorry!! Sorry for the long post, and the time it took me to post it, The devlog guide says to keep it short and post often, but I fell down a rabbit hole with optimizing, and was putting off writing as I knew it would be unwieldy in length. I haven’t implemented partitioning in 3d yet, but it should be easy to transfer over. It’s hard to see the balls in the video, but I want to keep the video smaller. It gets laggy in the video as well, but there are 7000 balls in the scene at the end, and I check collisions 15 times per frame, I am also recording too. Try it out If you read all the way down here, you might want to try the engine. I have a build on my pages , but it’s kinda slow on web. Click to attract P to set where the balls shoot to when spawned Enter to spawn balls Scroll to change spawn speed (at least until I change the demo). On some screens the simulation doesn’t show up until you click fullscreen. Sorry for weird wording, max devlog size is 4k characters."}, {"post_id": 13602, "ts": "2026-06-22T09:10:49Z", "hours": 9.5267, "text": "Devlog #8: I added a function that generates wheels (kinda lame), but I also added a GitHub action that automatically compiles and pushes my commits to my GitHub pages so now theres a web demo also i did just like a ton of testing and playing and stuff which is what pushed it to 9 hours"}, {"post_id": 11197, "ts": "2026-06-18T10:07:28Z", "hours": 12.275, "text": "Devlog 7: Finally added mass to the engine! Before now all the particles had the same mass (just implicitly, so basically all of them had a mass of 1), making the small ones super dense. Took so long because I had to migrate back to 2d in order to make sure the mass was working in 2d (everything was in 3d already so I actually added mass to 3d first), and had to update the 2d rendering for it to be able to render in 3d, but now everything (especially springs), is a lot cooler!"}, {"post_id": 7804, "ts": "2026-06-13T00:51:39Z", "hours": 3.5253, "text": "I added the shape generators back for 3d, now we have ✨ 3D cloth ✨!"}, {"post_id": 7351, "ts": "2026-06-12T08:09:41Z", "hours": 12.0594, "text": "Trying to move to 3D, finally got triangle-sphere collisions working the edges were by far the hardest part, the sphere-face collision actually wasn’t too hard the engine wasn’t built for walls to be able to move, but it can handle it semi fine (I’m just having rotating walls for the cool 3d showcase)"}, {"post_id": 3300, "ts": "2026-06-06T04:57:51Z", "hours": 5.0347, "text": "Added some functions that generate shapes for you, for example, cloth!"}, {"post_id": 2633, "ts": "2026-06-05T08:26:08Z", "hours": 1.5244, "text": "not that big but i migrated to the sdl callback system, so it works on emscripten now (can run in browser) ignore my screen recorder quality"}, {"post_id": 2039, "ts": "2026-06-04T10:12:11Z", "hours": 5.5597, "text": "got circle-circle collision working and with a lot of balls its a bit like a fluid cleaned up main.c as well too"}, {"post_id": 721, "ts": "2026-06-02T09:46:29Z", "hours": 5.7058, "text": "includes double pendulum for clout not actually accurate but looks fine it uses verlet integration and supports springs as well"}]...
|
Title: FPEeee by @Duck | Stardance
Devlogs:
inclu Title: FPEeee by @Duck | Stardance
Devlogs:
includes double pendulum for clout not actually accurate but looks fine it uses verlet integration and supports springs as well
got circle-circle collision working and with a lot of balls its a bit like a fluid cleaned up main.c as well too
not that big but i migrated to the sdl callback system, so it works on emscripten now (can run in browser) ignore my screen recorder quality
Added some functions that generate shapes for you, for example, cloth!
Trying to move to 3D, finally got triangle-sphere collisions working the edges were by far the hardest part, the sphere-face collision actually wasn’t too hard the engine wasn’t built for walls to be able to move, but it can handle it semi fine (I’m just having rotating walls for the cool 3d showcase)
I added the shape generators back for 3d, now we have ✨ 3D cloth ✨!
Devlog 7: Finally added mass to the engine! Before now all the particles had the same mass (just implicitly, so basically all of them had a mass of 1), making the small ones super dense. Took so long because I had to migrate back to 2d in order to make sure the mass was working in 2d (everything was in 3d already so I actually added mass to 3d first), and had to update the 2d rendering for it to be able to render in 3d, but now everything (especially springs), is a lot cooler!
Devlog #8: I added a function that generates wheels (kinda lame), but I also added a GitHub action that automatically compiles and pushes my commits to my GitHub pages so now theres a web demo also i did just like a ton of testing and playing and stuff which is what pushed it to 9 hours
Devlog #9: Intro I added spatial partitioning to the engine to speed up collisions when you have a lot of balls in a scene. Partitioning explanation Spatial partitioning is an optimization that divides the world into a grid, so balls only check other balls that are in close cells, instead of every ball checking all others, which is O(n^2). It seems pretty simple, but I tried 4 different ways before getting a good result. Judging by the time logged, I struggled. First Attempt (Dense grid) I first tried a naive implementation, which was making a big grid, with each cell having a list of pointers to balls that are in it. The problem is, each cell needs to have the total amount of balls that could be in it allocated. For the best performance, each grid cell should be the same size as a ball, and for the size I use here, you need the grid dimensions to be in the 100s. with 1000 balls, and with 64 bit pointers, you could have 1000 * 8 * 300 * 300 bytes allocated total, ~720 MB. You can get away with a lot less pointers, but that still wasn’t satisfying, or flexible. Second Attempt (Sparse grid) My second try was a grid, but you only store cells which have balls in them. This doesn’t solve the high number of pointers per cell, but it uses less cells overall. It should’ve been easier, but C doesn’t have any built in hashmaps. The physics code doesn’t use many libraries, and I didn’t want to rely on more, so I had the bright idea to make my own hashmap. It didn’t work and I gave up, and that was the end of the sparse grid. Third Attempt (Resizable arrays) The third attempt was like the first, but I decided to try allocating the memory on the fly, when balls moved around, but it didn’t work out. Working Attempt!! (Sorting) The most successful attempt was a grid, every cell is allocated, and yet, uses the least memory. Instead of storing pointers, each cell only stores two things: An offset and a length. Just indices into the ball array, which sounds easy, but then you realize - the balls are in a random order. To fix this, when updating the grid, you sort the balls into the cell they’re in. You may think that going into the dark cave of sorting is a bad idea, but here, it’s just a counting sort. Then it sets each cell’s fields, and you have your partitions. Detecting Collisions Collisions are easier than constructing the grid, you just check every ball, find its cell, check balls in close cells, then you’re done. Struggles There was a lot of friction with memory errors. To fix them, I learned GDB, and learnt about sanitizers, which detect lots of hard to catch memory errors. One time the program would randomly crash, and it was really hard to fix, but a sanitizer detected an easy out of bounds error when rendering. Not even a physics thing. :( Sorry!! Sorry for the long post, and the time it took me to post it, The devlog guide says to keep it short and post often, but I fell down a rabbit hole with optimizing, and was putting off writing as I knew it would be unwieldy in length. I haven’t implemented partitioning in 3d yet, but it should be easy to transfer over. It’s hard to see the balls in the video, but I want to keep the video smaller. It gets laggy in the video as well, but there are 7000 balls in the scene at the end, and I check collisions 15 times per frame, I am also recording too. Try it out If you read all the way down here, you might want to try the engine. I have a build on my pages , but it’s kinda slow on web. Click to attract P to set where the balls shoot to when spawned Enter to spawn balls Scroll to change spawn speed (at least until I change the demo). On some screens the simulation doesn’t show up until you click fullscreen. Sorry for weird wording, max devlog size is 4k characters.
Devlog #10: I ported the spatial partitioning to 3D! It’s definitely a lot laggier in the 3D environment, because it needs to check 3x the partitions per ball, but it’s still a lot better than having no spatial partitioning at all. One of the problems I encountered when transitioning to 3D was lag, but not in the expected “It’s going to be laggy when you have a lot of balls” way. For some strange reason, the framerate was still below 60 even when there were no balls in the world! It turned out to be an issue with needing to calloc a big region of memory everytime it would sort the balls into their partitions, but I was able to fix it by keeping the allocation throughout the lifetime of the partition grid. I also fixed it in the 2D version, even though it wasn’t really a problem there, it also wasn’t really a problem to fix either. (In the video you will notice the balls disappearing, the sample I whipped up for the devlog just automatically despawns balls when they leave the partitioning grid. Also some balls fly off when spawning, because sometimes the balls spawn inside one another) I’m getting a bit burnt out from this project though, I might ship after maybe adding multithreading, creating the README, and maybe making some more demos. I’ve been watching some videos on real rigidbody physics, and I want to try that out too!
Devlog #11: Not a huge devlog, I’ve mostly been having fun with this little parachute demo I made! I definitely spent too much time just playing with it. I’ve also been experimenting a bit with multithreading, but it’s not in a stable or performant enough state right now to showcase. mp4 compression will hate this
Devlog #12 I improved the website to include multiple demos, and I made a couple improvements to the performance of the spatial partitioning detection, but I’ve mostly just been doing tinkering and testing with the engine some more.
Devlog #13 I added triangle-walls which vertices are 3 dynamic spheres, which can collide with other particles and have all 4 particles update with their own velocities! This makes the engine a lot more flexible, so you don’t have to make big grids of spheres if you want to be able to have walls that can move, instead of being static. And it makes rigidbodies (probably) possible! (Press enter to spawn balls) Demo! This devlog is a bit long, sorry! I didn’t want to go too far over 10 hours like a did a couple devlogs ago. 2D 2D is, of course, simpler than 3D, and the length of the function for these walls definitely show that (~40 lines). I used the same algorithm to find the closest position on a line to another position as I used for detecting collisions on the edges of the static 3D walls a while ago. It gives you a lerpable value from from the first point to the second point of the line, and you can use that to find the point you are looking for. Comparing it to the circle you’re checking against, will give the distance and the normal of the collision. You can use that information to move the circle out of the wall, and push the wall away, using the value to lerp between as the ratio to push each of the points that the wall is made of away. 3D This function is a bit more complicated, being about 80 lines long, but a lot of the information in the 2D version is applicable here too. Here, instead of trying to find the closest point, we are trying to find the barycentric coordinates of the point, which is similar to the value to lerp between the two points in 2D, but for 3D (It’s basically just 3 numbers which tell you how close you are to each vertex of a triangle, and can describe any point on the triangle). This involves find the triangle’s area that you are checking against using the cross product, getting the distance of the point inward to the triangle for each edge, and calculating some inverse areas, which magically (not really) give you the barycentric coordinates. We then use these coordinates, as long as the distance to the triangle face using the dot product, to figure out whether the ball is colliding with the face, and if so, moving the ball outside of the triangle and moving the 3 vertices away as well, of course using each barycentric coordinate as a weight for how much to move each individual vertex. I haven’t implemented detections with the edges of the triangles exactly yet though, only the faces, but I will try to implement it soon!
Devlog #14 I added edge detection for 3D triangles and other miscellaneous stuff, like improving the website, adding VSync to the demos, but that stuff’s boring so I’m just going to show off the new demo! It might be the coolest one so far, but it was one of the easiest to make. I’m planning on shipping real soon though, just wanna add a few things to the website and readme!
Devlog #15: shipping! Super small devlog, just editing the website and the README and stuff like that, really want to ship now! It just took a while to add messages to all the different demos and I may have tried a little bit of engine stuff but it just didn’t work out.
Devlog #15: Rebuilding because why not A bit before shipping, I heard about another physics method called XPBD (extended position based dynamics) that’s a lot more powerful and flexible, and I decided, after I would ship, I would try to convert my engine to that. I kinda have to remake almost all of the physics stuff I already made, but I can recycle a lot of the older code, just making it fit the new framework, and being a lot more educated about physics simulation stuff than when I started this project, it wasn’t too hard to rewrite some new stuff. Right now I have ported over my ball pit thingy, not a lot to show that’s different from old devlogs, but hey, it’s the inside that counts, right?
Devlog #16 I migrated the XPBD stuff to 3D and moved all the demos to work with it as well, not much interesting to talk about though. Here’s a demo of it working though
Devlog #17 OpenGL integration I spend the last couple days integrating OpenGL rendering into a couple of the projects, meaning the graphics will be a lot better and rendered on the GPU instead of being rendered on the CPU, as well as speeding up the demos because even with the added visual complexity, the GPU is just so much faster at rendering! I made these changes of the main branch so that they would reflect on the website sooner, but git’s merge system is actually super good and it took no more than 15 minutes to merge the OpenGL rendering to the XPBD branch. I’ve only migrated over the cloth and fluid demos, but they’re the ones that needed it the most, and it’s not too hard to add it to more demos after I’ve had most of the OpenGL boilerplate implemented.
Devlog #18 Fluid simulation For a couple days I’ve been researching and trying to implement a PBF (position based fluid) fluid simulation, but there are barely any resources on the topic that I’ve been able to find, and the ones I have found are very math oriented with evil cryptic symbols that take a while to wrap my head around. The fluid simulation does work, but it’s much laggier, a lot finickier, and not a lot better (if at all better) than just chucking a couple thousand balls together and having them collide normally.
Devlog #19 Optimization and Interaction I’ve optimized the triangle collision code to use the spatial partitioning I implemented before for collisions. It goes through each triangle and checks what balls are in its bounding box with the collision grid, and completely skips any balls that aren’t close. This allows for about a thousand balls in a scene (at least on my computer), which is a lot better than the hundred or so you’d get with just bounding box checks and the tens or so you would get with a naive approach. Sadly, this change is only on the XPBD branch for now, meaning it won’t reflect on the website, but you’d still probably have to be spawning balls for a while for that to slow down, depending on the computer. I’ve also added far better interaction to the cloth, using some matrix multiplication and some raycast tests, you can now drag the cloth around with your mouse! This change was on the main branch too, so this is right on the website , right now! I did try to implement a system for having the cloth tear when it was under stress, but it would have required me to rework a lot of stuff and it didn’t quite work out. :(
Devlog #20 Another constraint, and another failed side project. Boundary constraint I added a constraint that I named a “boundary constraint”, that confines a particle to being on the specific side of a line e.g. making four lines around the edges of the screen and making sure the particle is on the side which is visible on screen. This is different from a wall because walls have two sides (and also zero thickness) which can cause a particle that’s going super fast to completely pass through to the other side of the wall in a single physics step, whereas with a boundary it will always snap it back to the correct side of the line. (If this was a bad explanation, I’m sorry). Failed lua integration I suppose the word ‘failed’ is a bit harsh in this scenario, I was just dipping my toes into integrating a little lua shell into the demos that would let you spawn particles and stuff programatically, but I decided it wasn’t worth it for small demos that aren’t meant to be super duper flexible anyway because they’re just meant to show off cool features the engine can do. throwing balls very quickly at the wall, which don’t clip through VVV
Devlog #21 MERGING I’ve been rewriting a lot of the physics engine for XPBD (eXtended Position Based Dynamics) since the last ship, but on a separate branch so that if I broke anything too bad it wouldn’t show up on the website, but today I finally merged the xpbd branch into main. Sadly, it is a fair bit slower than the previous verlet integration (at least for my simple demos), but it’s a far more flexible integration and constraint scheme and I think the tradeoff is worth it. (I am a bit disappointed with the performance on the website though, I swear it was faster before I merged it! It’s a lot faster natively!)
Devlog #22 (I just realized that I accidentally did two devlog #15s but it’s too late now) Getting ready for another ship I edited some constraints to be more stable, edited the website to be a bit more clear of where the controls are if your screen is too small to fit them, and had a NIGHTMARE fiddling with ffmpeg to try and replace the video on the README to not be too laggy or low quality but also not too big. I also tried to do some performance optimizations for phones, but I couldn’t figure it out. This is the mp4 version animated WebP that I eventually got ffmpeg to spit out. For some reason animated WebPs don’t work in devlogs.
Ships:
This is a position-based physics engine made all in C for portability and versatility. It had many challenging moments when making it, such as triangle collisions, spatial partitioning, performance optimization, and more, but I had a lot of fun building it, showing it off to my friends and family, and learning more about physics.
This is an updated version of my physics engine, using a new simulation method called XPBD! It was a bit challenging learning the basics of vector calculus, but it was worth it for the added flexibility of XPBD constraints and integration. I’m also really proud of getting OpenGL rendering working for some of the demos, because making an 3D renderer could be a project in and of itself! (Not this renderer though, it’s pretty barebones.) I’m especially happy with the cloth demo, with the best 3D rendering and (in my opinion) the best showcase of the engine’s features! (Also the least laggy of them all? I know why but it’s still kinda weird, being the most complex demo.) Writing it in C was a probably a bit harder than using a higher level language like C++, but being able to compile the entire project from source in less than two seconds on my machine was a big plus! I hope you enjoy playing with the physics demos! I worked really hard on this project!!...
|
1792994010.0916433
|
1793080410.0916433
|
|
43572
|
AKidsDream by @MrCode | Stardance
|
MrCode
|
2
|
190.61
|
2036
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T13:57:00Z", "hours": 107.0, "multiplier": 19.36, "payout": 1877, "blessing": "neutral", "text": "👾 AKidsDream~~(name work in progress)~~ , is a early version of a turn based strategy game , where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. 🏳️🏴Goal Its not just an attempt to make a game , its the challenge of creating modular , future proof system and to learn to clean code , using all my knoweledge of over the past 4 years of learning . (so even if i dont get rich with this game i did learn a lot xdd) What’s🆕 As this isn’t the first ship of the project, the project now contains: Mana💎 & a working card/hand systems Juicy new animations (as you may have seen with thecard drawing) more ℹ️nfo (who is playing and support for multiple local players) Hardships ( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///) Trying to code everything modular and clean takes time, which is valuable resource :( Also the progress feels much slower at the beginning (but i could reuse the modular ability system for the cards which made everything easier:)) As i have invested close to 200hourse, the project has grown so much that sometimes its hard to see how one system may break another , then its another 1 hour debugging", "repo": "https://github.com/MrCode200/AKidsDream", "demo": "https://github.com/MrCode200/AKidsDream/releases/tag/v0.2.0-pre-alpha.1"}, {"ship_num": 2, "ts": "2026-08-09T19:50:41Z", "hours": 72.0, "multiplier": 8.67, "payout": 159, "blessing": "neutral", "text": "👾 AKidsDream(name work in progress), is a early version of a turn based strategy game, where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. A Kid’s Dream 🌜is my attempt to recreate that experience. Not exactly as it was, but from the pieces that remain in my memory. It is a game inspired by childhood imagination, handmade rules, and the joy of turning simple ideas into an adventure. ⚔️ Currently the game is in very early alpha, basically a proof of concept. I would love support, about what you would like to see, Game Design tips and tricks and what a winning condition could be. (destroy objectives vs destory a unit(like a king 🤴)", "repo": "https://github.com/MrCode200/AKidsDream", "demo": "https://github.com/MrCode200/AKidsDream/releases/tag/v0.2.0-pre-alpha.1"}]...
|
[{"post_id": 75690, "ts": "202 [{"post_id": 75690, "ts": "2026-09-30T19:21:12Z", "hours": 11.6108, "text": "Devlog 16: Extensions, Plugins && MODSSSSS Yes, it has been time, for what has given success to most games EVER!!!!!! ➕MODS Hard as hell to implement, as you need to make sure that each coding dependencies are implemented correctly… Had to change hole game structure to be easily extendable/moddable (fun and hard ) But i have to say i am learning more which is awsome But still many bugs and logic to fix/implement lul…"}, {"post_id": 70733, "ts": "2026-09-19T17:44:42Z", "hours": 10.015, "text": "Devlog 15: The Power of Plugins 🔌 Turned the Tween System into a plugin :)) Now it is way easier to reuse animations everywhere 🎞️ Also finished all Card + Hand logic 🃏 and cleaned up lots of code + bugs along the way 😭 The project’s recent work includes a refactor of the ability/card systems plus deck and cardcasting functionality."}, {"post_id": 65311, "ts": "2026-09-10T11:39:01Z", "hours": 10.4142, "text": "Devlog 14: Is it SatisFeelingable enough ☺️ (Help Q&Q: what animation feels more satisfying ?:00) Added clean card animation (in not so clean code 😭😭) More information on who’s turn it is. with bumb up🆙 animations for the Q&Q see the videos <3 Next 🆙: Card Deck and card into effect animations (spawn animations if above works without coding problems, which i feel is a delusional hope🥲 )"}, {"post_id": 62821, "ts": "2026-09-06T10:50:51Z", "hours": 11.515, "text": "Devlog 13: 3rr0Rssss$s ❌ and ✅Results<> Completely rewrote ȩ̷̪̓̈́́́͗͝ŗ̵͔̥̜̹̬̭̯̏̆̽͂̈́̅̐͛̾͘ͅr̸͗̌͌̾̌̾̂́͜ö̷̪̰́͊̆͗̈́̿̏́̀̂r̶̨̮̹͎̹̫͑̅̂̽̾̎͌s , Now each method returns in its chain a Result<TValue, TError> Methods like Map,Bind,Tap etc. make it now super easy to process results and errors :))"}, {"post_id": 61536, "ts": "2026-09-04T14:30:32Z", "hours": 12.2986, "text": "Devlog 12: Cards and MORE Cards 🃏 I have added Cards which can now summon units Also needed to redo the ability validation as now the modular ability system came in handy. I was able to combine both the Ability System and the Cards , so that the cards can use them freely."}, {"post_id": 58885, "ts": "2026-08-31T13:41:36Z", "hours": 8.9453, "text": "Devlog 11: I Hereby SUMMON YOU! (#°Д°) Today we are adding CARDS , 🃏Cards contain MANA Portrait Health Duration (after how many rounds does the card play its effect ) One problem i am encountering is how to identify clicking vs draggin in godot 😵💫, but i believe i could use a workaround"}, {"post_id": 56779, "ts": "2026-08-28T17:55:17Z", "hours": 13.4456, "text": "Devlog 10: MOOORE ANIMATIONSS!!!! Added a TweenComponent🎞️, allowing quick *reactive* and configurabel way to add TWEENS Created AutoGenerated Scripts⚙️ (if you know Godot.SignalNames , in a way i created the same) And for some reason one of my scripts reset so i had to debug it completly from the beginning 😭, but somehow it just got better lol."}, {"post_id": 53811, "ts": "2026-08-24T14:46:01Z", "hours": 11.2481, "text": "Devlog 9: Soo can i remove it?:0 New modular UI animations and able to delete and see order of tiles selected 😃 Tween Component 🎞️ Allows Resources to animate specifics (loop, ping pong) on specific actions (ready, shown etc.) For multiselectable tiles, there is a new layer which shows when which tiles were selected. Allows also the deletion of tiles if still valid."}, {"post_id": 50525, "ts": "2026-08-19T18:26:55Z", "hours": 8.7558, "text": "Devlog 8: So thats how much more i can CUT you😈 100+ hours 🥳 Finally added a UI for Pool Points💯 (How often an ability can be cast) Pool Updates 💧 The pool shows Icon and Count/MaxCount , with custom ANIMATIONS when the count changes Blocking Manager 🫸 The new Blocking Manager keeps track of the game states and automatically, blocks specific ui. Very Dynamic ( •̀ ω •́ )✧ (using enums for options) Next UP: More juicy animations for the Pool count (showing diff, based on current selected tiles, and a crash animation (hopefully 😅, if i can figure that out xd ))"}, {"post_id": 47365, "ts": "2026-08-15T08:27:57Z", "hours": 4.3611, "text": "Devlog 8: Ahhh you, I hit ( ̄ε(# ̄)💥╰╮o( ̄皿 ̄///) Through the new ability System, was finally able to add hit flashes ! But it was such a pain to get the Shaders working 〒▽〒 , they were never firing once, but 3 - 4 times in one row which didn’t make sense for 1 SLAP. If you hit them hard enough they jitter 😱 … Future destination 🛣️ I could imagine updating the system to be reactive to the effect applied to each Unit (so more DMG => More BOOM💥) Also added finally animations (was time).🕺"}, {"post_id": 46304, "ts": "2026-08-13T13:09:07Z", "hours": 3.7408, "text": "Devlog 7: 🐦🔥 HUGE Ability CHANGES Finally finished the new ability system (just took like 14 HOuRs Xdd) The new system introducestwo ways of running abilities (🤫see video): ⛓️Sequential Runs all selected tiles one by one, and casts the effect 📦Batch Runs the effect on all selected tiles. Also Added Context so that Abilities/Effects can now communicate and influence each other : Cost = Base Cost + Selected Tiles ... Damage = Cost * Base Damage (infinite cycle of death 🩻) This will allow huge upgrades to make in a modular way complex abilities super simple and fast ."}, {"post_id": 45761, "ts": "2026-08-12T13:46:07Z", "hours": 11.2067, "text": "Devlog 6: Rebuilding the Ability System Completely restructured the ability system , allowing abilities to be either sequentially or in batches . Also improved the underlying patterns, making abilities easier to modify, reuse, and plug into the game.(see image) Currently implementing EffectTrigger , which allows Effects of abilities to happen on specific Frames or after specific Time etc."}, {"post_id": 44495, "ts": "2026-08-10T09:23:28Z", "hours": 1.1089, "text": "Devlog 5: Camera Movement & Board Centralization Added camera movement and board centralization It feels super smooth ( zooming and moving ) thanks to lerp (love that name xd) 🤫 Also auto centers dynamically based on BOARD SIZE (if you want you can fight your friends on 1000 x 1000 tiles lul)"}, {"post_id": 44174, "ts": "2026-08-09T19:13:05Z", "hours": 0.4558, "text": "Devlog 4: Pre-Alpha Release 🥳🥳 Pre-alpha release is out! ( under review shipping, follow to see when comes live ;)) Also fixed positioning of ability buttons 🔥"}, {"post_id": 44122, "ts": "2026-08-09T18:03:26Z", "hours": 6.4614, "text": "Devlog 3: Big Progress on Units & Turn Logic Made great progress… ( •̀ ω •́ )✧ Added unit sprites Implemented turn logic Overengineered like always, xd but if i every want to make a 2v2 or how many vs how many , it will work Good thing: it now supports local X vs X , which is great for testing. :)) Next up: cool animations hehehe."}, {"post_id": 40688, "ts": "2026-08-04T11:39:41Z", "hours": 1.4419, "text": "Devlog 2: A Super Compact, Dynamic Ability System Drag and drop your Patterns (Cross, etc.) and Tada👀, you’ve got a new ability.💪 Need a special effect? Just plug in one of: DamageEffect SpawnEffect MoveSelfEffect …and many more."}, {"post_id": 40390, "ts": "2026-08-03T21:11:26Z", "hours": 63.7325, "text": "Devlog 1: 50 hours in the bag, joined stardance now! Added Ability system and backend Teams Logic (nothing visual sadly yet…)"}]...
|
Title: AKidsDream by @MrCode | Stardance
Devlogs: Title: AKidsDream by @MrCode | Stardance
Devlogs:
Devlog 1: 50 hours in the bag, joined stardance now! Added Ability system and backend Teams Logic (nothing visual sadly yet…)
Devlog 2: A Super Compact, Dynamic Ability System Drag and drop your Patterns (Cross, etc.) and Tada👀, you’ve got a new ability.💪 Need a special effect? Just plug in one of: DamageEffect SpawnEffect MoveSelfEffect …and many more.
Devlog 3: Big Progress on Units & Turn Logic Made great progress… ( •̀ ω •́ )✧ Added unit sprites Implemented turn logic Overengineered like always, xd but if i every want to make a 2v2 or how many vs how many , it will work Good thing: it now supports local X vs X , which is great for testing. :)) Next up: cool animations hehehe.
Devlog 4: Pre-Alpha Release 🥳🥳 Pre-alpha release is out! ( under review shipping, follow to see when comes live ;)) Also fixed positioning of ability buttons 🔥
Devlog 5: Camera Movement & Board Centralization Added camera movement and board centralization It feels super smooth ( zooming and moving ) thanks to lerp (love that name xd) 🤫 Also auto centers dynamically based on BOARD SIZE (if you want you can fight your friends on 1000 x 1000 tiles lul)
Devlog 6: Rebuilding the Ability System Completely restructured the ability system , allowing abilities to be either sequentially or in batches . Also improved the underlying patterns, making abilities easier to modify, reuse, and plug into the game.(see image) Currently implementing EffectTrigger , which allows Effects of abilities to happen on specific Frames or after specific Time etc.
Devlog 7: 🐦🔥 HUGE Ability CHANGES Finally finished the new ability system (just took like 14 HOuRs Xdd) The new system introducestwo ways of running abilities (🤫see video): ⛓️Sequential Runs all selected tiles one by one, and casts the effect 📦Batch Runs the effect on all selected tiles. Also Added Context so that Abilities/Effects can now communicate and influence each other : Cost = Base Cost + Selected Tiles ... Damage = Cost * Base Damage (infinite cycle of death 🩻) This will allow huge upgrades to make in a modular way complex abilities super simple and fast .
Devlog 8: Ahhh you, I hit ( ̄ε(# ̄)💥╰╮o( ̄皿 ̄///) Through the new ability System, was finally able to add hit flashes ! But it was such a pain to get the Shaders working 〒▽〒 , they were never firing once, but 3 - 4 times in one row which didn’t make sense for 1 SLAP. If you hit them hard enough they jitter 😱 … Future destination 🛣️ I could imagine updating the system to be reactive to the effect applied to each Unit (so more DMG => More BOOM💥) Also added finally animations (was time).🕺
Devlog 8: So thats how much more i can CUT you😈 100+ hours 🥳 Finally added a UI for Pool Points💯 (How often an ability can be cast) Pool Updates 💧 The pool shows Icon and Count/MaxCount , with custom ANIMATIONS when the count changes Blocking Manager 🫸 The new Blocking Manager keeps track of the game states and automatically, blocks specific ui. Very Dynamic ( •̀ ω •́ )✧ (using enums for options) Next UP: More juicy animations for the Pool count (showing diff, based on current selected tiles, and a crash animation (hopefully 😅, if i can figure that out xd ))
Devlog 9: Soo can i remove it?:0 New modular UI animations and able to delete and see order of tiles selected 😃 Tween Component 🎞️ Allows Resources to animate specifics (loop, ping pong) on specific actions (ready, shown etc.) For multiselectable tiles, there is a new layer which shows when which tiles were selected. Allows also the deletion of tiles if still valid.
Devlog 10: MOOORE ANIMATIONSS!!!! Added a TweenComponent🎞️, allowing quick *reactive* and configurabel way to add TWEENS Created AutoGenerated Scripts⚙️ (if you know Godot.SignalNames , in a way i created the same) And for some reason one of my scripts reset so i had to debug it completly from the beginning 😭, but somehow it just got better lol.
Devlog 11: I Hereby SUMMON YOU! (#°Д°) Today we are adding CARDS , 🃏Cards contain MANA Portrait Health Duration (after how many rounds does the card play its effect ) One problem i am encountering is how to identify clicking vs draggin in godot 😵💫, but i believe i could use a workaround
Devlog 12: Cards and MORE Cards 🃏 I have added Cards which can now summon units Also needed to redo the ability validation as now the modular ability system came in handy. I was able to combine both the Ability System and the Cards , so that the cards can use them freely.
Devlog 13: 3rr0Rssss$s ❌ and ✅Results<> Completely rewrote ȩ̷̪̓̈́́́͗͝ŗ̵͔̥̜̹̬̭̯̏̆̽͂̈́̅̐͛̾͘ͅr̸͗̌͌̾̌̾̂́͜ö̷̪̰́͊̆͗̈́̿̏́̀̂r̶̨̮̹͎̹̫͑̅̂̽̾̎͌s , Now each method returns in its chain a Result<TValue, TError> Methods like Map,Bind,Tap etc. make it now super easy to process results and errors :))
Devlog 14: Is it SatisFeelingable enough ☺️ (Help Q&Q: what animation feels more satisfying ?:00) Added clean card animation (in not so clean code 😭😭) More information on who’s turn it is. with bumb up🆙 animations for the Q&Q see the videos <3 Next 🆙: Card Deck and card into effect animations (spawn animations if above works without coding problems, which i feel is a delusional hope🥲 )
Devlog 15: The Power of Plugins 🔌 Turned the Tween System into a plugin :)) Now it is way easier to reuse animations everywhere 🎞️ Also finished all Card + Hand logic 🃏 and cleaned up lots of code + bugs along the way 😭 The project’s recent work includes a refactor of the ability/card systems plus deck and cardcasting functionality.
Devlog 16: Extensions, Plugins && MODSSSSS Yes, it has been time, for what has given success to most games EVER!!!!!! ➕MODS Hard as hell to implement, as you need to make sure that each coding dependencies are implemented correctly… Had to change hole game structure to be easily extendable/moddable (fun and hard ) But i have to say i am learning more which is awsome But still many bugs and logic to fix/implement lul…
Ships:
👾 AKidsDream(name work in progress), is a early version of a turn based strategy game, where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. A Kid’s Dream 🌜is my attempt to recreate that experience. Not exactly as it was, but from the pieces that remain in my memory. It is a game inspired by childhood imagination, handmade rules, and the joy of turning simple ideas into an adventure. ⚔️ Currently the game is in very early alpha, basically a proof of concept. I would love support, about what you would like to see, Game Design tips and tricks and what a winning condition could be. (destroy objectives vs destory a unit(like a king 🤴)
👾 AKidsDream~~(name work in progress)~~ , is a early version of a turn based strategy game , where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. 🏳️🏴Goal Its not just an attempt to make a game , its the challenge of creating modular , future proof system and to learn to clean code , using all my knoweledge of over the past 4 years of learning . (so even if i dont get rich with this game i did learn a lot xdd) What’s🆕 As this isn’t the first ship of the project, the project now contains: Mana💎 & a working card/hand systems Juicy new animations (as you may have seen with thecard drawing) more ℹ️nfo (who is playing and support for multiple local players) Hardships ( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///) Trying to code everything modular and clean takes time, which is valuable resource :( Also the progress feels much slower at the beginning (but i could reuse the modular ability system for the cards which made everything easier:)) As i have invested close to 200hourse, the project has grown so much that sometimes its hard to see how one system may break another , then its another 1 hour debugging...
|
1792979343.917258
|
1793065743.917258
|
|
22316
|
Regim by @satish | Stardance
|
satish
|
0
|
186.57
|
0
|
[]
|
[{"post_id": 25329, "ts": "202 [{"post_id": 25329, "ts": "2026-07-09T15:32:04Z", "hours": 9.2267, "text": "Noticed a lot of things broke after the recent foundation change from 3 State HMM to 4 State. Started by profiling the research pipeline with py-spy. Rewrote the feature engineering loop using vectorized NumPy operations and numba.jit for the rolling entropy calculations. Cut preprocessing time from 22min to 6min using better caching routes. Also fixed a silent type coercion bug that was casting ints to floats incorrectly."}, {"post_id": 25122, "ts": "2026-07-09T04:10:23Z", "hours": 77.0039, "text": "Fixed several issues that surfaced after the 4-state HMM migration. The dashboard is now stable across all 8 assets. Fixed SPY regime forecasts showing negative probabilities by adding eigen-decomposition stability checks before forecast generation. Resolved Chrome/Recharts memory leak on the comparison tab by switching to lazy loading for asset comparison charts, reducing memory usage by ~40%. Fixed crypto state collapse on volatile days by increasing minimum state occupancy to 5% and re-running with 60 random seeds. Resolved 404 errors on the SHAP endpoint for IWM by fixing feature extraction in the KernelExplainer. Extended Yahoo Finance cache TTL to 7200s with fallback to previous day’s data when rate-limited. Fixed regime confidence display on the live tab by correcting posterior probability parsing. All 8 assets now load correctly across all 3 time periods. Next up: multi-asset portfolio execution endpoint and backtest optimization for 1-year periods."}, {"post_id": 19799, "ts": "2026-07-01T05:54:19Z", "hours": 100.3392, "text": "Migrated Regim’s core regime detection from 3-state to 4-state HMM. This required substantial refactoring of the backend: adding a 4th state (distinguishing “Crash” from “Bearish”), updating all 11 API endpoints to handle the new state space, re-validating statistical tests, and fixing cascading issues with backtest accuracy, regime labeling, and volatility forecasting."}]...
|
Title: Regim by @satish | Stardance
Devlogs:
Migr Title: Regim by @satish | Stardance
Devlogs:
Migrated Regim’s core regime detection from 3-state to 4-state HMM. This required substantial refactoring of the backend: adding a 4th state (distinguishing “Crash” from “Bearish”), updating all 11 API endpoints to handle the new state space, re-validating statistical tests, and fixing cascading issues with backtest accuracy, regime labeling, and volatility forecasting.
Fixed several issues that surfaced after the 4-state HMM migration. The dashboard is now stable across all 8 assets. Fixed SPY regime forecasts showing negative probabilities by adding eigen-decomposition stability checks before forecast generation. Resolved Chrome/Recharts memory leak on the comparison tab by switching to lazy loading for asset comparison charts, reducing memory usage by ~40%. Fixed crypto state collapse on volatile days by increasing minimum state occupancy to 5% and re-running with 60 random seeds. Resolved 404 errors on the SHAP endpoint for IWM by fixing feature extraction in the KernelExplainer. Extended Yahoo Finance cache TTL to 7200s with fallback to previous day’s data when rate-limited. Fixed regime confidence display on the live tab by correcting posterior probability parsing. All 8 assets now load correctly across all 3 time periods. Next up: multi-asset portfolio execution endpoint and backtest optimization for 1-year periods.
Noticed a lot of things broke after the recent foundation change from 3 State HMM to 4 State. Started by profiling the research pipeline with py-spy. Rewrote the feature engineering loop using vectorized NumPy operations and numba.jit for the rolling entropy calculations. Cut preprocessing time from 22min to 6min using better caching routes. Also fixed a silent type coercion bug that was casting ints to floats incorrectly....
|
1792694877.493044
|
1793299677.493044
|
|
25644
|
rlbuddy by @kmdw | Stardance
|
kmdw
|
3
|
185.95
|
2643
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T00:20:30Z", "hours": 40.0, "multiplier": 18.76, "payout": 740, "blessing": "neutral", "text": "I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 2, "ts": "2026-09-07T20:33:21Z", "hours": 27.0, "multiplier": 16.74, "payout": 457, "blessing": "neutral", "text": "rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 3, "ts": "2026-08-25T22:08:36Z", "hours": 109.0, "multiplier": 17.59, "payout": 1446, "blessing": "neutral", "text": "rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}]...
|
[{"post_id": 80191, "ts": "202 [{"post_id": 80191, "ts": "2026-10-16T17:13:05Z", "hours": 3.4819, "text": "more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps"}, {"post_id": 77292, "ts": "2026-10-06T13:38:54Z", "hours": 0.4772, "text": "A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker."}, {"post_id": 75881, "ts": "2026-10-01T13:48:20Z", "hours": 5.9928, "text": "I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague."}, {"post_id": 74679, "ts": "2026-09-27T23:46:54Z", "hours": 3.0297, "text": "Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!"}, {"post_id": 73444, "ts": "2026-09-25T03:22:46Z", "hours": 4.635, "text": "I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!"}, {"post_id": 72491, "ts": "2026-09-23T02:26:44Z", "hours": 1.8381, "text": "rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!"}, {"post_id": 72027, "ts": "2026-09-22T00:56:20Z", "hours": 3.9097, "text": "I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX."}, {"post_id": 71420, "ts": "2026-09-20T19:51:05Z", "hours": 4.5228, "text": "rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly."}, {"post_id": 70888, "ts": "2026-09-19T23:20:36Z", "hours": 2.1058, "text": "Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well"}, {"post_id": 69896, "ts": "2026-09-18T01:01:05Z", "hours": 0.9667, "text": "IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/"}, {"post_id": 69850, "ts": "2026-09-17T22:15:40Z", "hours": 1.67, "text": "IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up."}, {"post_id": 68661, "ts": "2026-09-15T14:25:29Z", "hours": 2.6667, "text": "I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot."}, {"post_id": 68281, "ts": "2026-09-14T20:49:26Z", "hours": 3.1181, "text": "I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!"}, {"post_id": 67059, "ts": "2026-09-13T03:19:34Z", "hours": 2.9378, "text": "I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!"}, {"post_id": 66867, "ts": "2026-09-12T20:09:08Z", "hours": 2.0211, "text": "I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans."}, {"post_id": 66219, "ts": "2026-09-11T22:03:11Z", "hours": 2.5883, "text": "I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\\Windows\\Fonts\\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\\Local vs. AppData\\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on."}, {"post_id": 65417, "ts": "2026-09-10T15:25:20Z", "hours": 0.8867, "text": "I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs"}, {"post_id": 65067, "ts": "2026-09-09T22:28:11Z", "hours": 1.5, "text": "More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)"}, {"post_id": 64822, "ts": "2026-09-09T14:32:38Z", "hours": 1.4469, "text": "I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!"}, {"post_id": 63368, "ts": "2026-09-07T04:36:35Z", "hours": 1.4131, "text": "Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later."}, {"post_id": 62559, "ts": "2026-09-06T00:29:40Z", "hours": 1.8697, "text": "Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser."}, {"post_id": 60965, "ts": "2026-09-03T17:23:52Z", "hours": 2.9253, "text": "I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)"}, {"post_id": 60552, "ts": "2026-09-02T23:31:23Z", "hours": 3.3072, "text": "I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)"}, {"post_id": 59926, "ts": "2026-09-01T23:19:29Z", "hours": 2.5164, "text": "rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself."}, {"post_id": 59228, "ts": "2026-08-31T21:59:04Z", "hours": 0.4561, "text": "I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter"}, {"post_id": 56962, "ts": "2026-08-29T00:27:50Z", "hours": 9.075, "text": "rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!"}, {"post_id": 55430, "ts": "2026-08-27T08:04:57Z", "hours": 3.0236, "text": "rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes."}, {"post_id": 55160, "ts": "2026-08-26T17:10:01Z", "hours": 2.6972, "text": "Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!"}, {"post_id": 54013, "ts": "2026-08-24T19:11:04Z", "hours": 4.6756, "text": "Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out."}, {"post_id": 51407, "ts": "2026-08-21T02:54:11Z", "hours": 1.5947, "text": "rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!"}, {"post_id": 49990, "ts": "2026-08-19T00:44:44Z", "hours": 1.4564, "text": "I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording."}, {"post_id": 49200, "ts": "2026-08-17T21:06:45Z", "hours": 9.2278, "text": "I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones"}, {"post_id": 46652, "ts": "2026-08-14T02:03:01Z", "hours": 4.1664, "text": "rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :("}, {"post_id": 42417, "ts": "2026-08-07T03:32:05Z", "hours": 2.1161, "text": "The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)"}, {"post_id": 40468, "ts": "2026-08-04T00:47:59Z", "hours": 2.2011, "text": "I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!"}, {"post_id": 38450, "ts": "2026-07-31T20:22:49Z", "hours": 6.755, "text": "rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there)."}, {"post_id": 34762, "ts": "2026-07-25T19:02:58Z", "hours": 1.9536, "text": "Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting."}, {"post_id": 30390, "ts": "2026-07-17T21:27:26Z", "hours": 3.8292, "text": "Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now."}, {"post_id": 28659, "ts": "2026-07-15T01:29:51Z", "hours": 13.4597, "text": "It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds."}, {"post_id": 23975, "ts": "2026-07-07T06:51:05Z", "hours": 8.1119, "text": "rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!"}, {"post_id": 22551, "ts": "2026-07-05T02:19:55Z", "hours": 3.7678, "text": "rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)"}, {"post_id": 21165, "ts": "2026-07-02T23:37:22Z", "hours": 12.7792, "text": "rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!"}, {"post_id": 16053, "ts": "2026-06-26T02:45:17Z", "hours": 2.3483, "text": "Got it working as an actual overlay!! Right now it just displays ranks, though"}, {"post_id": 15855, "ts": "2026-06-25T19:39:34Z", "hours": 30.4556, "text": "I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi."}]...
|
Title: rlbuddy by @kmdw | Stardance
Devlogs:
I go Title: rlbuddy by @kmdw | Stardance
Devlogs:
I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi.
Got it working as an actual overlay!! Right now it just displays ranks, though
rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!
rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)
rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!
It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds.
Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now.
Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting.
rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there).
I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!
The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)
rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :(
I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones
I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording.
rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!
Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out.
Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!
rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes.
rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!
I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter
rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself.
I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)
I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)
Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser.
Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later.
I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!
More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)
I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs
I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\Windows\Fonts\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\Local vs. AppData\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on.
I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans.
I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!
I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!
I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot.
IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up.
IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/
Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well
rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly.
I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX.
rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!
I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!
Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!
I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague.
A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker.
more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps
Ships:
rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!
rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!
I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!...
|
1792975657.752514
|
1793062057.752514
|
|
2449
|
JARVIS by @venkata_m | Stardance
|
venkata_m
|
1
|
185.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T03:43:55Z", "hours": 183.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a windows desktop AI assistant called JARVIS (inspired from Iron Man) with full voice responsiveness. It can control your computer, automate tasks, and works with your favorite apps! It has multi-provider support so you can just plop in a API key of your choice! The parts that were challenging were trying to maintain gpu performance with local AI models running and a whisper model for optimal experience. Another challenge was finding a provider to actually use to start testing as Im poor (I mean I have no money but my parents rich) and just cant spend money on this. Somethings people should know to test. Expect JARVIS to pickup other input if you are talking and incorrect input at times too (whisper medium is the default change to heavy for better experience though slower response). Download JARVIS setup.exe install (run as admin) and make sure to pin to desktop to make sure its always there! You can hit CTRL + SHIFT + J to open JARVIS from anywhere. Overall I think you guys will enjoy this!", "repo": "https://github.com/ONEPUNCHMAN411/Jarvis", "demo": "https://github.com/ONEPUNCHMAN411/Jarvis/releases/tag/v1.0"}]...
|
[{"post_id": 20335, "ts": "202 [{"post_id": 20335, "ts": "2026-07-01T22:14:14Z", "hours": 0.3053, "text": "Updated readme and actually made it my own (used a template before) and then clarified my ai usage in there too cuz it wasnt before. Will reship with some small changes."}, {"post_id": 15797, "ts": "2026-06-25T17:55:55Z", "hours": 1.6942, "text": "Ok so I spent a couple hours Playing with JARVIS cuz I was bored waiting for shipping review and I found out that I used the wrong SDK method for elevenlabs and I know that is a huge deal for people who want the natural JARVIS voice so I went ahead and fixed that. Also got one of the buttons fixed (mcp) because even though I thought I fixed it, it seemed to have still crashed sometimes so I went ahead and changed that. This is the LAST offical devlog hopefully I am going to reship thanks!"}, {"post_id": 14850, "ts": "2026-06-24T03:31:24Z", "hours": 10.1603, "text": "I got a really long session in but its worth it here is all of what I did (PS: this is my last devlog am shipping): Removed test files and patch files Fixed UI lag (the orb made it super laggy) Fixed crashing upon clicking mcp button Fixed Minimized window launching Fixed a lot more but those are the major ones Added direct UI calling for any ui features on your computer Thank you all for following this journey I hope you enjoy this project!"}, {"post_id": 12651, "ts": "2026-06-20T17:48:15Z", "hours": 5.0919, "text": "Got efficent work done today!: Added context window auto compaction so you have less usage but have persistent context Diff Viewer to view any changes JARVIS makes to files Dry Run tools to make sure shell commands are safe Confidence meter to show if JARVIS is sure about its answer/code Style Transfer Rewrite for all your essays and pdfs This was the first offical time JARVIS was hooked up and tested with the new features because I spent so long trying to find a free api provider and I finally did. I will now be testing and showing all features from today!"}, {"post_id": 12047, "ts": "2026-06-19T17:27:56Z", "hours": 10.3764, "text": "I didnt sleep all night for this but here is what I added: Browser bookmark imports and search capability so JARVIS can help you remember important sites Screenshot library so that JARVIS has improved context across sessions Conversation Personas so that the system prompt for JARVIS changes based on what you need Code Review Tool to help you do security, bug, and performance issues Thats it! im gon sleep now"}, {"post_id": 11708, "ts": "2026-06-19T02:11:45Z", "hours": 6.48, "text": "Got more features ! Here is what I added:: Clipboard History Manager to help you remember the thing you wanted 30 days ago Usage analytics so you can track your usage across sessions and make sure you dont get a $5000 api bill"}, {"post_id": 11383, "ts": "2026-06-18T17:01:06Z", "hours": 4.5725, "text": "JARVIS has new features! Added Folder and File cleanup feature to organize all your messes! Added Process watching so that JARVIS can keep an eye on tasks for you Thats the work for today!"}, {"post_id": 11040, "ts": "2026-06-18T02:14:11Z", "hours": 4.8919, "text": "Just got features added here is what was done: App launch sequence so you can start a set of apps depending on what you are doing Window focus history to have better context for JARVIS with the apps you are using Follow for more updates and eventually use it!"}, {"post_id": 10101, "ts": "2026-06-16T18:13:46Z", "hours": 2.2414, "text": "Made some small ui tweaks and fixed a LOT of bugs getting ready to ship in the next week or so"}, {"post_id": 9283, "ts": "2026-06-15T16:13:06Z", "hours": 6.445, "text": "Here is what I got done: Added support for app testing so JARVIS can directly test any apps you make and report back to you Added api testing support to test all your apis Added image editor so you can quick edit you photos Great day looking forward to tommorow!"}, {"post_id": 8963, "ts": "2026-06-14T22:20:52Z", "hours": 6.5175, "text": "Alright here is what was added: Postgresql query tool for all you database nerds out there Password file encryption vault for all your passwords to be stored locally and securely QR Code generator for all your needs Thats it not a lot but progress!"}, {"post_id": 8736, "ts": "2026-06-14T15:12:03Z", "hours": 5.995, "text": "Got a bunch of new features!: Added a smart scheduler program so you can have JARVIS manage time Added contact store so that JARVIS always remembers people Added region watcher so you can have jarvis monitor things while you are away Thats it for today!"}, {"post_id": 8471, "ts": "2026-06-14T02:37:12Z", "hours": 2.4428, "text": "Nothing too much for this log but here is what I added: Phone Voice commands meaning you can open the webserver of JARVIS and have it send commands on your computer or do tasks for you! Smart autofill for when you are filling forms and dont want to keep having to fill them out just fill it out once and never again! Thats it for today!"}, {"post_id": 8154, "ts": "2026-06-13T16:26:34Z", "hours": 7.3447, "text": "I added some new cool features: Global Dictation meaning you can do CTRL+SHIFT+D anywhere and speak and it will type that into the text space Workspace Layouts so you can change your workspace based on what you are doing Screen annotation so that JARVIS can basiclly doodle on your screen to show you things Added small calender to the side for easy access Thats all for today will get back tommorow!"}, {"post_id": 7566, "ts": "2026-06-12T17:26:49Z", "hours": 7.3233, "text": "UI Redesign done will be making some tweaks here and there but also added these: Blender MCP to let JARVIS control blender for you 3D creative work Slack plugin to control your team’s slack work RAG system so you can upload pdfs, docx and more to chat with Thats all for today"}, {"post_id": 6558, "ts": "2026-06-11T00:42:17Z", "hours": 6.9153, "text": "Just finished a good session here is what was added: Automatic Macro Making capabilities by jarvis as long as you describe it Scheduled prompts for repeated tasks that you want to happen at certain times Built in App Viewer so you can view the apps you developed from within jarvis Thats all for now will get back with more!"}, {"post_id": 6218, "ts": "2026-06-10T13:29:23Z", "hours": 7.2811, "text": "Alright! Here is what I got done: Added template prompt system (just to get people ideas) Added bookmark Buttons for specific conversations you may want Added auto named chat sessions so you dont have to! Thats all for right now will continue working!"}, {"post_id": 5976, "ts": "2026-06-10T00:39:16Z", "hours": 5.2711, "text": "Got some things done nothing major but here it is: Added voice memo plugins to record and manage your voice memos VIA jarvis Added Habit & Time Tracker feature for when you need to manage your behavior with JARVIS Added Discord plugin for message management especially if you want to use jarvis in a Non-Profit Situation"}, {"post_id": 5713, "ts": "2026-06-09T16:41:27Z", "hours": 8.9403, "text": "Got a lot done but definetly procrastinated too much because this should not have taken almost 9 hours. So I added a notification alert system so that JARVIS can now remind you of things from the new TO DO list feature OR the calender feature. Also added support for google calender so you can ask JARVIS to control that however you want. And finally I added a small network management system (just to find devices on your network, and be able to help you use them in a Homelab enviornment)."}, {"post_id": 5355, "ts": "2026-06-09T02:58:46Z", "hours": 8.0947, "text": "Just finished a long session but here is what I got done: Added a code executor tool so that JARVIS can directly execute any code it makes or you give it Added a context pin feature so that you can pin files, or important context to all conversations Added themes to let you customize what you do Added chat search (shouldve been here) so that you can search through all your previous chats Added media controller so that jarvis can control music and make reccomendations. Overall productive though I might take a break for 3-4 days soon"}, {"post_id": 4995, "ts": "2026-06-08T17:17:58Z", "hours": 6.7908, "text": "Got a Lot done while watching reddit stories lol! I added a pomodoro timer for students who want to use JARVIS as a study tool. Added ocr so it can read text out of images. Add image generation tab so you can generate your own custom images using dall-e 3. And also added a translate feature for all you language work! Got a lot more days of working ahead wish me good luck!"}, {"post_id": 4607, "ts": "2026-06-07T23:42:36Z", "hours": 8.5611, "text": "Got a lot of things done here! So first I made a quick usage tracker to keep track of your context window and usage on your AI provider. Second I got a browser plugin that can control a browser using playwright meaning it can use urls and use a browser as any human would. Finally, I added a camera vision feature so basiclly you can put any object on your camera (if you have one) and it will be able to tell things about it without you telling it what it is using moondream. Also built a sidepanel (not shown here) that allows you to pull up documents and images on the side of the jarvis app for quick access!"}, {"post_id": 3979, "ts": "2026-06-07T03:46:54Z", "hours": 9.9158, "text": "Just got finished working on elevenlabs compatibility so you can choose your own voice for jarvis and also added a long term memory system using chromaDB. Also added video transcription so you can drag in any file and it will transcribe it and summarize it for you."}, {"post_id": 3624, "ts": "2026-06-06T17:15:11Z", "hours": 5.2022, "text": "Added a local Moondream vision model so non-vision providers can still describe screenshots as text. Added a file converter plugin to convert, batch convert, and resize images between PNG, JPG, WEBP, BMP, TIFF, GIF, and ICO. Jarvis will be able to use these features through key words and convert and will auto use Moondream for providers without vision"}, {"post_id": 3270, "ts": "2026-06-06T03:42:51Z", "hours": 7.8389, "text": "Fixed MCP crash, added SSH manager button, built a vision bridge so blind AI providers can “see” screenshots via text descriptions, added a typing feature that pairs with vision to type things, notes plugin, system monitor, clipboard history tracker, and a conversation summarizer. Productive day."}, {"post_id": 2789, "ts": "2026-06-05T16:31:05Z", "hours": 4.8008, "text": "Finished UI and design thought Im definetly changing fonts. Now just gotta get the buttons working and we will be good until I start working on the features."}, {"post_id": 2517, "ts": "2026-06-05T01:37:56Z", "hours": 4.7686, "text": "Just finished working on a feature to connect remote SSH sessions to JARVIS so it can control your homelabs, Virtual Machines and more!"}, {"post_id": 2203, "ts": "2026-06-04T15:55:41Z", "hours": 19.0556, "text": "Made the main app and Just got mcp dev tools setup so you can attach extra tools if you want! Also made a bunch of bug patches because I realized it didnt work half the time lol."}]...
|
Title: JARVIS by @venkata_m | Stardance
Devlogs:
Title: JARVIS by @venkata_m | Stardance
Devlogs:
Made the main app and Just got mcp dev tools setup so you can attach extra tools if you want! Also made a bunch of bug patches because I realized it didnt work half the time lol.
Just finished working on a feature to connect remote SSH sessions to JARVIS so it can control your homelabs, Virtual Machines and more!
Finished UI and design thought Im definetly changing fonts. Now just gotta get the buttons working and we will be good until I start working on the features.
Fixed MCP crash, added SSH manager button, built a vision bridge so blind AI providers can “see” screenshots via text descriptions, added a typing feature that pairs with vision to type things, notes plugin, system monitor, clipboard history tracker, and a conversation summarizer. Productive day.
Added a local Moondream vision model so non-vision providers can still describe screenshots as text. Added a file converter plugin to convert, batch convert, and resize images between PNG, JPG, WEBP, BMP, TIFF, GIF, and ICO. Jarvis will be able to use these features through key words and convert and will auto use Moondream for providers without vision
Just got finished working on elevenlabs compatibility so you can choose your own voice for jarvis and also added a long term memory system using chromaDB. Also added video transcription so you can drag in any file and it will transcribe it and summarize it for you.
Got a lot of things done here! So first I made a quick usage tracker to keep track of your context window and usage on your AI provider. Second I got a browser plugin that can control a browser using playwright meaning it can use urls and use a browser as any human would. Finally, I added a camera vision feature so basiclly you can put any object on your camera (if you have one) and it will be able to tell things about it without you telling it what it is using moondream. Also built a sidepanel (not shown here) that allows you to pull up documents and images on the side of the jarvis app for quick access!
Got a Lot done while watching reddit stories lol! I added a pomodoro timer for students who want to use JARVIS as a study tool. Added ocr so it can read text out of images. Add image generation tab so you can generate your own custom images using dall-e 3. And also added a translate feature for all you language work! Got a lot more days of working ahead wish me good luck!
Just finished a long session but here is what I got done: Added a code executor tool so that JARVIS can directly execute any code it makes or you give it Added a context pin feature so that you can pin files, or important context to all conversations Added themes to let you customize what you do Added chat search (shouldve been here) so that you can search through all your previous chats Added media controller so that jarvis can control music and make reccomendations. Overall productive though I might take a break for 3-4 days soon
Got a lot done but definetly procrastinated too much because this should not have taken almost 9 hours. So I added a notification alert system so that JARVIS can now remind you of things from the new TO DO list feature OR the calender feature. Also added support for google calender so you can ask JARVIS to control that however you want. And finally I added a small network management system (just to find devices on your network, and be able to help you use them in a Homelab enviornment).
Got some things done nothing major but here it is: Added voice memo plugins to record and manage your voice memos VIA jarvis Added Habit & Time Tracker feature for when you need to manage your behavior with JARVIS Added Discord plugin for message management especially if you want to use jarvis in a Non-Profit Situation
Alright! Here is what I got done: Added template prompt system (just to get people ideas) Added bookmark Buttons for specific conversations you may want Added auto named chat sessions so you dont have to! Thats all for right now will continue working!
Just finished a good session here is what was added: Automatic Macro Making capabilities by jarvis as long as you describe it Scheduled prompts for repeated tasks that you want to happen at certain times Built in App Viewer so you can view the apps you developed from within jarvis Thats all for now will get back with more!
UI Redesign done will be making some tweaks here and there but also added these: Blender MCP to let JARVIS control blender for you 3D creative work Slack plugin to control your team’s slack work RAG system so you can upload pdfs, docx and more to chat with Thats all for today
I added some new cool features: Global Dictation meaning you can do CTRL+SHIFT+D anywhere and speak and it will type that into the text space Workspace Layouts so you can change your workspace based on what you are doing Screen annotation so that JARVIS can basiclly doodle on your screen to show you things Added small calender to the side for easy access Thats all for today will get back tommorow!
Nothing too much for this log but here is what I added: Phone Voice commands meaning you can open the webserver of JARVIS and have it send commands on your computer or do tasks for you! Smart autofill for when you are filling forms and dont want to keep having to fill them out just fill it out once and never again! Thats it for today!
Got a bunch of new features!: Added a smart scheduler program so you can have JARVIS manage time Added contact store so that JARVIS always remembers people Added region watcher so you can have jarvis monitor things while you are away Thats it for today!
Alright here is what was added: Postgresql query tool for all you database nerds out there Password file encryption vault for all your passwords to be stored locally and securely QR Code generator for all your needs Thats it not a lot but progress!
Here is what I got done: Added support for app testing so JARVIS can directly test any apps you make and report back to you Added api testing support to test all your apis Added image editor so you can quick edit you photos Great day looking forward to tommorow!
Made some small ui tweaks and fixed a LOT of bugs getting ready to ship in the next week or so
Just got features added here is what was done: App launch sequence so you can start a set of apps depending on what you are doing Window focus history to have better context for JARVIS with the apps you are using Follow for more updates and eventually use it!
JARVIS has new features! Added Folder and File cleanup feature to organize all your messes! Added Process watching so that JARVIS can keep an eye on tasks for you Thats the work for today!
Got more features ! Here is what I added:: Clipboard History Manager to help you remember the thing you wanted 30 days ago Usage analytics so you can track your usage across sessions and make sure you dont get a $5000 api bill
I didnt sleep all night for this but here is what I added: Browser bookmark imports and search capability so JARVIS can help you remember important sites Screenshot library so that JARVIS has improved context across sessions Conversation Personas so that the system prompt for JARVIS changes based on what you need Code Review Tool to help you do security, bug, and performance issues Thats it! im gon sleep now
Got efficent work done today!: Added context window auto compaction so you have less usage but have persistent context Diff Viewer to view any changes JARVIS makes to files Dry Run tools to make sure shell commands are safe Confidence meter to show if JARVIS is sure about its answer/code Style Transfer Rewrite for all your essays and pdfs This was the first offical time JARVIS was hooked up and tested with the new features because I spent so long trying to find a free api provider and I finally did. I will now be testing and showing all features from today!
I got a really long session in but its worth it here is all of what I did (PS: this is my last devlog am shipping): Removed test files and patch files Fixed UI lag (the orb made it super laggy) Fixed crashing upon clicking mcp button Fixed Minimized window launching Fixed a lot more but those are the major ones Added direct UI calling for any ui features on your computer Thank you all for following this journey I hope you enjoy this project!
Ok so I spent a couple hours Playing with JARVIS cuz I was bored waiting for shipping review and I found out that I used the wrong SDK method for elevenlabs and I know that is a huge deal for people who want the natural JARVIS voice so I went ahead and fixed that. Also got one of the buttons fixed (mcp) because even though I thought I fixed it, it seemed to have still crashed sometimes so I went ahead and changed that. This is the LAST offical devlog hopefully I am going to reship thanks!
Updated readme and actually made it my own (used a template before) and then clarified my ai usage in there too cuz it wasnt before. Will reship with some small changes.
Ships:
I made a windows desktop AI assistant called JARVIS (inspired from Iron Man) with full voice responsiveness. It can control your computer, automate tasks, and works with your favorite apps! It has multi-provider support so you can just plop in a API key of your choice! The parts that were challenging were trying to maintain gpu performance with local AI models running and a whisper model for optimal experience. Another challenge was finding a provider to actually use to start testing as Im poor (I mean I have no money but my parents rich) and just cant spend money on this. Somethings people should know to test. Expect JARVIS to pickup other input if you are talking and incorrect input at times too (whisper medium is the default change to heavy for better experience though slower response). Download JARVIS setup.exe install (run as admin) and make sure to pin to desktop to make sure its always there! You can hit CTRL + SHIFT + J to open JARVIS from anywhere. Overall I think you guys will enjoy this!...
|
1792878734.9896028
|
1793742734.9896028
|
|
2129
|
SuperOrbital by @obedot | Stardance
|
obedot
|
1
|
183.0
|
2657
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T00:50:05Z", "hours": 183.0, "multiplier": 14.57, "payout": 2657, "blessing": "neutral", "text": "SUPERORBITAL: The Quest of the Anomaly After months of hard work, @orivio and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8", "repo": "https://github.com/orivio/super_orbital", "demo": "https://obedh.itch.io/superorbital"}]...
|
[{"post_id": 72452, "ts": "202 [{"post_id": 72452, "ts": "2026-09-23T00:34:22Z", "hours": 3.1192, "text": "Finished Up the GitHub Readme, Game Trailer, and Itch.io page! I did all the last remaining steps to finishing the game before shipping. I made a trailer of about 1 minute, and wrote a section of the GitHub Readme about the making of SuperOrbital. I’m going to ship now!"}, {"post_id": 71290, "ts": "2026-09-20T16:09:42Z", "hours": 4.3556, "text": "FINALLY fixed an annoying physics bug, improved the intro cutscene, and made the black holes look better I’m very happy to say that the dash/platform bug I was experiencing previously has now been solved. The player used to clip out of bounds if you dashed into a moving platform, but now, the player will get teleported back to where they were before. I also did some work on the intro cutscene, and while it isn’t yet finalized, I think it looks much better. Also, I made the center of the black hole a perfect circle now."}, {"post_id": 69415, "ts": "2026-09-17T00:28:27Z", "hours": 4.0075, "text": "THE FINISHING TOUCHES Yo yo yo, I am very close to shipping my game. I only have a little bit more to do. I’ve been working on improving the cutscenes, for example, making the colors look better and improving the perspective. I still have more work to do though, of course. Next up, I’m going to polish some of the movement mechanics some more, and then I’ll get some friends to playtest it."}, {"post_id": 65675, "ts": "2026-09-10T23:59:06Z", "hours": 9.0878, "text": "Greatly Improved Sound and Level Design I found it suprisingly easy to make good sound effects for my game. I dropped a rock on the ground and recorded it, and now, that’s the sound that plays when the player lands on rocky terrain after falling. I took a screwdriver and hit it against a bunch of things until I found something that sounded good. It’s a fun process! I also worked more on level design, by balancing everything so that the progression felt natural. I am almost finished with the final level, which I hope will challenging but fun."}, {"post_id": 63535, "ts": "2026-09-07T13:31:33Z", "hours": 1.2772, "text": "Added checkpoints to the levels If you find that the game is too challenging, you can turn on checkpoints in the settings menu. This lets you respawn at the nearest checkpoint after dying, instead of starting the whole level over again. I hope that this option can make my game playable by more people of different skill levels."}, {"post_id": 63220, "ts": "2026-09-06T22:04:35Z", "hours": 5.6608, "text": "Redesigned Old Levels to Work Better With New Player Movement With player movement out of the way, I can get to making even better levels. This one in particular, which you can see below, is a level I’m quite proud of. I took inspiration from Hollow Knight’s Path of Pain a little bit. I don’t have much left to do, but I definitely want to add some better sound effects."}, {"post_id": 62481, "ts": "2026-09-05T21:00:44Z", "hours": 5.6092, "text": "Finishing the Movement and Experimenting with Dynamic Lighting I finally got all the movement mechanics down. I still might refine the black holes a little bit, but first I want to redesign some of the earlier levels. My teammate suggested dynamic lighting for our game, and while it looks cool, it seems to difficult to set up completely for our Stardance release."}, {"post_id": 61134, "ts": "2026-09-03T21:52:29Z", "hours": 2.725, "text": "Greatly improved the Level Select screen by making animated level buttons I used Godot’s Tweens to make the level select buttons rotate and pop when you select them. The effect isn’t perfect yet, but it’s getting there. What do think of the effect?"}, {"post_id": 60806, "ts": "2026-09-03T12:28:16Z", "hours": 0.8911, "text": "Fixed a Tricky Level Transition Bug I was experiencing this frustrating bug where, if you try to run back and forth between levels too fast, you can fall off the map. I expanded the camera boundaries to see what was happening better, and slowed down the game a bit using Godot’s awesome tools. I solved the bug by reordering the level transition code. On the first slide, you can see the original bug, and on the third slide, you can see the fixed version."}, {"post_id": 60543, "ts": "2026-09-02T23:03:33Z", "hours": 1.2192, "text": "Refined the Gravity Switch Shockwave Even More It made the shockwave effect go by faster, and be properly centered on the player. This makes the shockwave feel just right when playing the game, and gives the gravity switch the perfect amount of impact."}, {"post_id": 60497, "ts": "2026-09-02T21:24:04Z", "hours": 7.9831, "text": "Improved Game Juice and Improved Visual Effects Game Juice I started working on adding the little details to the movement that make the game way more fun to play. I added a few freeze frames when starting a dash, which was inspired by Celeste. I also added a bit of camera shake to give the player even more feedback on their movement. Visual Effects This part was really satisfying. I made a shockwave warp effect around the player when they perform a gravity switch, which looks great. Then I made the black holes look better by distorting the background. Frustrating Bugs I’ve been having a lot of movement bugs that are tricky and inconsistent to replicate, and I can’t figure them out yet. Next Steps I still need to get the AnimationTree to work, but that should really be quite easy. I still have to redesign some levels."}, {"post_id": 59189, "ts": "2026-08-31T20:47:27Z", "hours": 4.8492, "text": "Added more to the opening cutscene I don’t want to give away the intro until the game is ready, but I’ll share parts of what I made. This first frame took me the longest, over 2 hours. I planned to animate the guy standing up and walking, but I now realize that that’s probably not feasible. I think it will look great anyway though. I might improve some little parts of the drawing. Creating a cutscene manager in Godot I set up an AnimationPlayer to direct the cutscene, and it’s actually quite easy. I do need to align my crossfades correctly and sync everything with the music."}, {"post_id": 58502, "ts": "2026-08-30T22:41:57Z", "hours": 6.7444, "text": "Created a rough draft of the intro cutscene, and composed music for it The intro cutscene/storyboard I used libresprite to make a basic idea of what the intro cutscene should look like. I still have more to add, and as you can tell, the text is practically illegible. Yeah, libresprite doesn’t have a text tool. But I’ll fix it soon and it’ll look awesome. The intro music I made this song using FamiStudio with the EPSM expansion and FamiStudio’s default instrument pack. This let me use the instruments I wanted while still sounding retro-ish. My brother helped me work on the song, because he’s way better at music than I am. I still need to revise the song more, this is more of a first draft. Any feedback would be appreciated lol"}, {"post_id": 57575, "ts": "2026-08-29T19:17:53Z", "hours": 2.8072, "text": "Redoing the Player Movement I remade the player movement system from scratch, because my previous implementation just wasn’t working. It was buggy, and the movement didn’t feel good to play. My new movement system is not entirely complete, but it already feels much better. For one thing, the variable jump height is much smoother, and stopping a jump midair doesn’t feel as abrupt. I added coyote time, jump buffering, air friction, and faster falling for game juice. I still need to fine tune the settings, and get some more people to playtest the movement. There are more movement mechanics I need to add, such as dashing, but I want to get the basic movement completely down first."}, {"post_id": 56888, "ts": "2026-08-28T21:33:33Z", "hours": 3.1403, "text": "Started refactoring the player movement script. I’m starting from scratch, so I only have basic horizontal movement yet. I added an input sequence recorder to make it easier to replicate bugs, so you can record a sequence of inputs and then play them back again."}, {"post_id": 56307, "ts": "2026-08-28T01:19:58Z", "hours": 3.0025, "text": "Fully refactored the level manager. After a few hours, I have finally cleaned up all the code for level transitions. Now, the code is easier to understand and maintain, and adding new levels takes significantly less time and effort. I added comments on all the related code to make it even easier to read. I also fixed a few bugs in the process. For example, trying to open the menu during a level transition used to put the game in a glitched state, but I fixed that now. I moved towards a cleaner architecture where the scene root (play.tscn) manages the game state, and the pause menu asks the play scene to open the menu, instead of just going ahead and doing it. It’s possible that this refactor may have broken some other aspects of the game, so I’ll have to look over everything later, but right now, it seems to be working fine."}, {"post_id": 54818, "ts": "2026-08-25T23:28:18Z", "hours": 1.6025, "text": "Polished the levels even more, added new art assets, and fixed some minor tile inconsistencies. I also drew this boulder, which currently doesn’t look that great, but I’ll improve it later and add it somewhere where it fits in the game. I showed this game to my grandma, and she was able to figure out the controls pretty quickly, so I see that as a win."}, {"post_id": 54128, "ts": "2026-08-24T23:06:45Z", "hours": 4.1431, "text": "Greatly improved the facility’s tileset by adding details and more background elements."}, {"post_id": 47770, "ts": "2026-08-15T22:44:25Z", "hours": 5.9028, "text": "Well, I tried to refactor the entire world system, but I gave up. It was just taking way too long. I guess I’ll just have to deal with the spaghetti code for now. I did finish the level select screen, and I think it looks pretty good. I just have to rename some of the levels because they are named very generic things."}, {"post_id": 47113, "ts": "2026-08-14T19:20:03Z", "hours": 9.8889, "text": "I’m redoing the level system to clean up the spaghetti code situation. My teammate redesigned one of the characters, and I added it to the game."}, {"post_id": 44826, "ts": "2026-08-10T21:02:18Z", "hours": 9.2131, "text": "I’m bettering my backgrounds, bettering my visuals, bettering my levels!"}, {"post_id": 43535, "ts": "2026-08-08T21:13:55Z", "hours": 5.8183, "text": "Added some more levels to my platformer game, and pretty much done-iffied the player sprite and sound effects"}, {"post_id": 39099, "ts": "2026-08-01T20:07:54Z", "hours": 9.0683, "text": "I’ve added a few more challenging levels. I also almost finished up the sprite work on the protagonist."}, {"post_id": 36431, "ts": "2026-07-28T15:36:26Z", "hours": 3.005, "text": "Made new run, idle, and jump animations and added the final layer"}, {"post_id": 35254, "ts": "2026-07-26T15:39:00Z", "hours": 1.1678, "text": "Added some great audio settings"}, {"post_id": 35153, "ts": "2026-07-26T12:07:00Z", "hours": 9.5392, "text": "Added a save file system"}, {"post_id": 32506, "ts": "2026-07-21T18:48:48Z", "hours": 10.2469, "text": "I added input control remapping for my platformer game. We also added more dialogue."}, {"post_id": 31328, "ts": "2026-07-19T17:03:06Z", "hours": 9.1842, "text": "I tried adding a parallax effect, but it didn’t turn out how I wanted. I fixed a bug with the camera scale not being a whole number ratio. I’m starting to add the last few mechanics to the game, which involve Black Holes."}, {"post_id": 27351, "ts": "2026-07-12T20:49:33Z", "hours": 6.6386, "text": "I just finished a new tileset for my 2d platformer."}, {"post_id": 20330, "ts": "2026-07-01T22:08:11Z", "hours": 6.9336, "text": "I made better running and jumping animations for my 2D platformer."}, {"post_id": 15865, "ts": "2026-06-25T19:51:18Z", "hours": 7.995, "text": "I made this cool background for my game’s menu. I learned about shaders from the book “The Book of Shaders” by Patricio Gonzalez Vivo and Jen Lowe, and some of my shaders were inspired by the content in that book. The star effect was inspired by this very helpful reddit post: https://www.reddit.com/r/godot/comments/1m0czqd/starry_background_in_this_many_lines_of_shader/"}, {"post_id": 12686, "ts": "2026-06-20T18:43:02Z", "hours": 2.7389, "text": "I added another level with a lot of spikes, platforms and timing!"}, {"post_id": 12003, "ts": "2026-06-19T16:14:06Z", "hours": 1.7231, "text": "I added a level that teaches you the jump cutting mechanic in my 2D platformer game. I’m also experimenting with new character sprites."}, {"post_id": 11513, "ts": "2026-06-18T20:06:11Z", "hours": 4.5739, "text": "I added Jump Cutting, Jump Buffering, and Death to my platformer"}, {"post_id": 5261, "ts": "2026-06-08T23:43:38Z", "hours": 6.7183, "text": "Setting up basic movement and levels for my platformer (guys I KNOW the sprites look bad)"}]...
|
Title: SuperOrbital by @obedot | Stardance
Devlog Title: SuperOrbital by @obedot | Stardance
Devlogs:
Setting up basic movement and levels for my platformer (guys I KNOW the sprites look bad)
I added Jump Cutting, Jump Buffering, and Death to my platformer
I added a level that teaches you the jump cutting mechanic in my 2D platformer game. I’m also experimenting with new character sprites.
I added another level with a lot of spikes, platforms and timing!
I made this cool background for my game’s menu. I learned about shaders from the book “The Book of Shaders” by Patricio Gonzalez Vivo and Jen Lowe, and some of my shaders were inspired by the content in that book. The star effect was inspired by this very helpful reddit post: https://www.reddit.com/r/godot/comments/1m0czqd/starry_background_in_this_many_lines_of_shader/
I made better running and jumping animations for my 2D platformer.
I just finished a new tileset for my 2d platformer.
I tried adding a parallax effect, but it didn’t turn out how I wanted. I fixed a bug with the camera scale not being a whole number ratio. I’m starting to add the last few mechanics to the game, which involve Black Holes.
I added input control remapping for my platformer game. We also added more dialogue.
Added a save file system
Added some great audio settings
Made new run, idle, and jump animations and added the final layer
I’ve added a few more challenging levels. I also almost finished up the sprite work on the protagonist.
Added some more levels to my platformer game, and pretty much done-iffied the player sprite and sound effects
I’m bettering my backgrounds, bettering my visuals, bettering my levels!
I’m redoing the level system to clean up the spaghetti code situation. My teammate redesigned one of the characters, and I added it to the game.
Well, I tried to refactor the entire world system, but I gave up. It was just taking way too long. I guess I’ll just have to deal with the spaghetti code for now. I did finish the level select screen, and I think it looks pretty good. I just have to rename some of the levels because they are named very generic things.
Greatly improved the facility’s tileset by adding details and more background elements.
Polished the levels even more, added new art assets, and fixed some minor tile inconsistencies. I also drew this boulder, which currently doesn’t look that great, but I’ll improve it later and add it somewhere where it fits in the game. I showed this game to my grandma, and she was able to figure out the controls pretty quickly, so I see that as a win.
Fully refactored the level manager. After a few hours, I have finally cleaned up all the code for level transitions. Now, the code is easier to understand and maintain, and adding new levels takes significantly less time and effort. I added comments on all the related code to make it even easier to read. I also fixed a few bugs in the process. For example, trying to open the menu during a level transition used to put the game in a glitched state, but I fixed that now. I moved towards a cleaner architecture where the scene root (play.tscn) manages the game state, and the pause menu asks the play scene to open the menu, instead of just going ahead and doing it. It’s possible that this refactor may have broken some other aspects of the game, so I’ll have to look over everything later, but right now, it seems to be working fine.
Started refactoring the player movement script. I’m starting from scratch, so I only have basic horizontal movement yet. I added an input sequence recorder to make it easier to replicate bugs, so you can record a sequence of inputs and then play them back again.
Redoing the Player Movement I remade the player movement system from scratch, because my previous implementation just wasn’t working. It was buggy, and the movement didn’t feel good to play. My new movement system is not entirely complete, but it already feels much better. For one thing, the variable jump height is much smoother, and stopping a jump midair doesn’t feel as abrupt. I added coyote time, jump buffering, air friction, and faster falling for game juice. I still need to fine tune the settings, and get some more people to playtest the movement. There are more movement mechanics I need to add, such as dashing, but I want to get the basic movement completely down first.
Created a rough draft of the intro cutscene, and composed music for it The intro cutscene/storyboard I used libresprite to make a basic idea of what the intro cutscene should look like. I still have more to add, and as you can tell, the text is practically illegible. Yeah, libresprite doesn’t have a text tool. But I’ll fix it soon and it’ll look awesome. The intro music I made this song using FamiStudio with the EPSM expansion and FamiStudio’s default instrument pack. This let me use the instruments I wanted while still sounding retro-ish. My brother helped me work on the song, because he’s way better at music than I am. I still need to revise the song more, this is more of a first draft. Any feedback would be appreciated lol
Added more to the opening cutscene I don’t want to give away the intro until the game is ready, but I’ll share parts of what I made. This first frame took me the longest, over 2 hours. I planned to animate the guy standing up and walking, but I now realize that that’s probably not feasible. I think it will look great anyway though. I might improve some little parts of the drawing. Creating a cutscene manager in Godot I set up an AnimationPlayer to direct the cutscene, and it’s actually quite easy. I do need to align my crossfades correctly and sync everything with the music.
Improved Game Juice and Improved Visual Effects Game Juice I started working on adding the little details to the movement that make the game way more fun to play. I added a few freeze frames when starting a dash, which was inspired by Celeste. I also added a bit of camera shake to give the player even more feedback on their movement. Visual Effects This part was really satisfying. I made a shockwave warp effect around the player when they perform a gravity switch, which looks great. Then I made the black holes look better by distorting the background. Frustrating Bugs I’ve been having a lot of movement bugs that are tricky and inconsistent to replicate, and I can’t figure them out yet. Next Steps I still need to get the AnimationTree to work, but that should really be quite easy. I still have to redesign some levels.
Refined the Gravity Switch Shockwave Even More It made the shockwave effect go by faster, and be properly centered on the player. This makes the shockwave feel just right when playing the game, and gives the gravity switch the perfect amount of impact.
Fixed a Tricky Level Transition Bug I was experiencing this frustrating bug where, if you try to run back and forth between levels too fast, you can fall off the map. I expanded the camera boundaries to see what was happening better, and slowed down the game a bit using Godot’s awesome tools. I solved the bug by reordering the level transition code. On the first slide, you can see the original bug, and on the third slide, you can see the fixed version.
Greatly improved the Level Select screen by making animated level buttons I used Godot’s Tweens to make the level select buttons rotate and pop when you select them. The effect isn’t perfect yet, but it’s getting there. What do think of the effect?
Finishing the Movement and Experimenting with Dynamic Lighting I finally got all the movement mechanics down. I still might refine the black holes a little bit, but first I want to redesign some of the earlier levels. My teammate suggested dynamic lighting for our game, and while it looks cool, it seems to difficult to set up completely for our Stardance release.
Redesigned Old Levels to Work Better With New Player Movement With player movement out of the way, I can get to making even better levels. This one in particular, which you can see below, is a level I’m quite proud of. I took inspiration from Hollow Knight’s Path of Pain a little bit. I don’t have much left to do, but I definitely want to add some better sound effects.
Added checkpoints to the levels If you find that the game is too challenging, you can turn on checkpoints in the settings menu. This lets you respawn at the nearest checkpoint after dying, instead of starting the whole level over again. I hope that this option can make my game playable by more people of different skill levels.
Greatly Improved Sound and Level Design I found it suprisingly easy to make good sound effects for my game. I dropped a rock on the ground and recorded it, and now, that’s the sound that plays when the player lands on rocky terrain after falling. I took a screwdriver and hit it against a bunch of things until I found something that sounded good. It’s a fun process! I also worked more on level design, by balancing everything so that the progression felt natural. I am almost finished with the final level, which I hope will challenging but fun.
THE FINISHING TOUCHES Yo yo yo, I am very close to shipping my game. I only have a little bit more to do. I’ve been working on improving the cutscenes, for example, making the colors look better and improving the perspective. I still have more work to do though, of course. Next up, I’m going to polish some of the movement mechanics some more, and then I’ll get some friends to playtest it.
FINALLY fixed an annoying physics bug, improved the intro cutscene, and made the black holes look better I’m very happy to say that the dash/platform bug I was experiencing previously has now been solved. The player used to clip out of bounds if you dashed into a moving platform, but now, the player will get teleported back to where they were before. I also did some work on the intro cutscene, and while it isn’t yet finalized, I think it looks much better. Also, I made the center of the black hole a perfect circle now.
Finished Up the GitHub Readme, Game Trailer, and Itch.io page! I did all the last remaining steps to finishing the game before shipping. I made a trailer of about 1 minute, and wrote a section of the GitHub Readme about the making of SuperOrbital. I’m going to ship now!
Ships:
SUPERORBITAL: The Quest of the Anomaly After months of hard work, @orivio and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8...
|
1792853530.485897
|
1792939930.485897
|
|
22691
|
Scratcher by @BetterClient | Stardance
|
BetterClient
|
0
|
182.41
|
0
|
[]
|
[{"post_id": 81059, "ts": "202 [{"post_id": 81059, "ts": "2026-10-19T18:13:33Z", "hours": 5.56, "text": "CLI I did some small refactors and added a new CLI, built with Clikt It’s very simple to use: scratcher check file --options //check the file for any compilation errors without compiling scratcher compile file --options outFile //compile into a .sb3 file scratcher standard-library //print out the standard library Clikt also provides easy to use help menus I also added a sort function to the array and list libraries"}, {"post_id": 78430, "ts": "2026-10-10T19:47:24Z", "hours": 7.5478, "text": "PROPER ERRORS Errors are the one thing that I knew were terrible but I could never build up the courage to fix. So I just fixed them. Now all errors in the language are formatted nicely, show you exactly where the error happened and give you a nice description. Along with this, I made a new system for collecting errors, so now the compiler won’t stop at the first error and will continue going and give you all errors at once. This makes fixing code a lot easier. This also opens up the possibility of an LSP server later on (before and after in images)"}, {"post_id": 76716, "ts": "2026-10-04T12:20:48Z", "hours": 6.6447, "text": "More demos and QOL Try it out: https://scratch.mit.edu/projects/1387804691/ Demos Math lexer, parser and interpreter: New demo that lets you input math expressions (eg: 1 + 1 ) and get the result. 3d cube renderer: a spinning 3d cube and player controls QOL Smarter inlining cost calculation A math centered optimization for removing identities Get rid of PromoteToGlobals (temp) GC documentation Codegen fixes (receiver functions generate the same block, causing scratch to get confused) Stack size optimization (reuse stack slots of the same type) Fix crash when the garbage collector is disabled"}, {"post_id": 74467, "ts": "2026-09-27T13:15:50Z", "hours": 7.5128, "text": "Demo programs and general improvements I added demo programs to scratcher, these show the language actually being used Try one out! https://scratch.mit.edu/projects/1385339395/ General improvements Bug fixes Dummy sprite Make the type checker ignored in inlined functions Make topLevelInit smaller and remove unused functions from final compilation TurboWarp specific compilation mode with faster operations on strings/lists (not compatible with vanilla scratch if enabled)"}, {"post_id": 72783, "ts": "2026-09-23T18:48:59Z", "hours": 2.1378, "text": "Indexed repeat and general improvements Added a new indexed for and repeat statement which allows way easier index tracking: //Before: int index = 0; repeat(10) { ... index++; } //After: repeat(10) { index -> ... } I also made the PooledList get garbage collected with the refcount gc Did some really small refactors aswell"}, {"post_id": 71161, "ts": "2026-09-20T11:38:26Z", "hours": 2.5564, "text": "List pools Static lists are cool, but they are very limited expressiveness wise because they must be known at compile time Pools fix this by having a pool of static lists that the user code can allocate at any time PooledList a = allocate(); But because the pool is limited, the pooled list must be freed when not needed, the garbage collector will not handle it(yet) a.free(); Other than that, the PooledList behaves just like a List and can do almost anything a List does I also added proper documentation for Out of memory errors."}, {"post_id": 70752, "ts": "2026-09-19T18:17:22Z", "hours": 10.2792, "text": "QOL I added a shit ton of quality of life stuff: Tons of bug fixes Big array syntax: int[] myArray = [1, 2, 3, 4, 5, 6]; Safe casting for enums(previously a panic): Result.Success? a = res as? Result.Success; Out of memory detection: Scratch caps lists at 200k elements, after that it silently stops adding stuff to the list Compact int list: Store pretty much infinite integers without wasting heap space SHORT CIRCUITS: DONT EXECUTE RIGHT SIDE OF && or || if left side is false/true! If statements without braces: if(a) b++; CONTINUE AND BREAK: while(true) { if(a) break; if(b) continue; } STATIC LISTS: store data outside of the heap in scratch lists so that you dont run out of heap space: static str[] myList; This also allows for file reading: static str[] myList = \"hello.json\"; So you can properly store data(like ROMs) CASE SENSITIVE EQUALS: DID YOU KNOW THAT SCRATCH “=” BLOCK IS CASE INSENSITIVE??? And its pretty hard to make it case sensitive Now you can do “===” and its case sensitive: 'a' === 'A' RETURNS FALSE"}, {"post_id": 65445, "ts": "2026-09-10T16:08:38Z", "hours": 8.1706, "text": "DOCUMENTATION I do not want to touch any markdown ever again"}, {"post_id": 62828, "ts": "2026-09-06T11:04:43Z", "hours": 2.5681, "text": "Privates Added a “private” keyword, anything declared private cannot be accessed from outside the current file. This prevents the user from messing with internal states of libraries they are using For example, the list library from the standard library. Now you can’t directly mess with the list pointer triangles.ptr[5] = ...; This now results in an error because “ptr” is private! I also added some small optimizations for lambdas."}, {"post_id": 60869, "ts": "2026-09-03T14:48:30Z", "hours": 3.9831, "text": "Operator overloading Added operator overloading, now you can define overloads for specific operators so that code looks cleaner Just use the operator keyword with the correct signature and you’re done! You can overload the operators: +, -, /, *, %, [], []= For example: warp operator <T> void T[].set(int index, T item) { self::replace(this, item, index); } //use array[index] = item //compiler translates to set(array, index, item) I also realized that my previous refactor of arrays broke my nullability system: int[] a = Array(int, 5); say(a[3]); This would print null , which my type system missed I fixed this by moving arrays to a standard library module, the same array import works, but you have to change how you create the array: //before: int[] a = Array(int, 5); //doesn't need to be marked as null!!! int[] a = Array(int, 5); a[0] = ...; a[1] = ...; ... //after int?[] a = arrayOfNulls(5); //null filled int[] a = arrayOf(5, (int index) -> { return index * 5; //value of the array at that index });"}, {"post_id": 58837, "ts": "2026-08-31T12:49:12Z", "hours": 1.1706, "text": "Import some import names into unqualified co ntext Before: //import import list; //use list::List<str> myList = list::newList(); After: //import import list::*; //use List<str> myList = newList();"}, {"post_id": 58031, "ts": "2026-08-30T11:39:09Z", "hours": 1.2083, "text": "Pattern matching for sealed enums Previously if you wanted to check sealed enums types and use them, you had to do very ugly syntax for actually getting the variant instance: auto out = tryGet(); when(out) { Result.Success -> { auto suc = out as Result.Success; looks::say(\"Success! ${suc.out.x}\"); Now you don’t have to do all of this: when(tryGet()) { Result.Success suc -> { looks::say(\"Success! ${suc.out.x}\"); This is just syntax improvement, doesn’t change the generated code or anything, just helps the developer"}, {"post_id": 56767, "ts": "2026-08-28T17:36:33Z", "hours": 3.9356, "text": "ACTUAL ARRAYS!! Previously, scratcher “arrays” were just lists, you could add more items, it would dynamically resize, it was written in the kotlin DSL, so technically it was just a list. I removed the previous list code, reused some of it and added a new Array system Along with that, the normal lists got rewritten in 100% scratcher with no internal functions The new system is almost fully backwards compatible in source code, you just have to make a few changes The new implementation is more clear, more expressive and more like regular programming languages"}, {"post_id": 54379, "ts": "2026-08-25T10:59:05Z", "hours": 2.1919, "text": "I’m sorry For over 2 months, scratcher has had an “export” keyword, which was fully unused, until today: I implemented the export keyword on functions, which allows for code written in plain scratch to interact with scratcher code: export warp void myFunction() { ... } Export requires that your function arguments are all primitives and that the return is also a primitive, but other than that, it does not change anything, just exposes the function cleanly to regular scratch code. However, scratcher type checking still applies, so if the native scratch code passes in a string to a float argument, it will still cause a panic Even when you have obfuscation enabled, exports will stay and let native scratch use it with its original name"}, {"post_id": 52903, "ts": "2026-08-23T08:56:58Z", "hours": 3.9047, "text": "Sealed enums and faster GC I added a new type of object, sealed enums: sealed enum Animal { Cat(str name, int age, bool isMeowing), Dog(str name, int age), Unknown } They allow for storing data inside enums, they’re very similar to rust enums: sealed enum Result<T> { Success(T out), Failure } I also refactored lambdas to use a sealed enum instead of a big struct: //before struct LambdaCaptures(Lambda0Captures? c0, Lambda1Captures? c1, Lambda2Captures? c2); //after sealed enum LambdaCaptures { Lambda0Captures(Box$int capture0, ...), Lambda1Captures(Box$float capture0, ...) } Sealed enums only store a tag and a pointer, so if you use a lot of lambdas, this will save a TON of heap space Faster garbage collector! I made the marking phase of the mark and sweep collector faster by using an epoch based cleanup approach Now, instead of clearing and re-populating the marked list, we don’t ever clear it and we invalidate it by just increasing the epoch. This makes the isMarked check go from O(n) to O(1) while also improving marking speed because scratch doesn’t have to resize our list"}, {"post_id": 51327, "ts": "2026-08-20T22:21:05Z", "hours": 5.0097, "text": "MORE FUCKING ABSTRACTIONS!!! I added receiver/extension functions. These allow you to write code that takes in a type as a special argument You define them just like how it works in kotlin: warp <T, R> R T.let((T) -> R action) { return action(this); } It just compiles to a regular function warp <T, R> R let(T this, (T) -> R action) { return action(this); } But the compiler lets you call it with the special argument: thing.let((int a) -> ...); I also added a very big standard library module (written in scratcher!) with a ton of these functions built-in, they allow you to write more expressive code: triangles .filterNotNull() .filter((Triangle<float> t) -> t.x1 > 150) .filter((Triangle<float> t) -> t.y1 < 150) .forEach((Triangle<float> tri) -> ...) I also rewrote the entirety of string lib during this, now you have to use the extensions library to use strings, but its way more powerful (and written in scratcher)! I also added a new “char” type, which stores a single character (wow really???) I also added “safe dot calls” that allow you to use stuff as if they’re not null: triangles.forEach((Triangle<float>? t) -> { t?.x1?.let((float x1) -> { looks::say(\"x1: ${x1}\"); }); }); This only calls the let function if t?.x1 is not null There is a big problem with all this powerful new code though… the garbage collector can no longer keep up, a single mark and sweep takes over 1 second! Which is especially bad because the garbage collector needs the entire application to stop in order to run. You do not want your code to completely stop for a whole second(maybe you do? weirdo), so I have to fix this in my next few devlogs…"}, {"post_id": 49925, "ts": "2026-08-18T21:52:59Z", "hours": 6.2256, "text": "Lambdas I added lambdas to Scratcher! They allow you to write more expressive code like map(list, a -> a + 1) , which literally adds 1 to every element of list I also allow using outer variables within lambdas int a = ...; map(list, b -> { a++; b + a }); I allow this through boxing, the local variables become boxes and the lambdas get the local variable’s box, this makes lambdas more powerful than most languages as this allows for variables to be shared mutable state across lambdas, this also allows the local variables to get garbage collected. Of course, scratch doesn’t support this natively, so lambdas are 100% compiler sugar and just lowers to regular functions and uses function references(which is also 100% compiler sugar). void lambda::defunc@lambad@0(LambdaCaptures c, args...) { ... }"}, {"post_id": 46470, "ts": "2026-08-13T18:15:50Z", "hours": 1.7033, "text": "Fixed the garbage collector… turns out I broke it accidentally while cleaning up code in my last devlog, 3 line change but took a long time to find Made it so the stack allocator doesn’t do redundant operations like 1+1 and inlines them as 2 instead"}, {"post_id": 46037, "ts": "2026-08-12T23:23:02Z", "hours": 1.3453, "text": "100 hours! Evil hack part 4: Death of evil hack So I was using a really terrible hack to implement stuff like FunctionInlining, Safe dot and the elvis expression, the hack is basically (ab)using the when expression to do stuff like run code inside expressions and use local variables inside expressions. So to stop this from becoming a hack, I added it directly to the AST as StatementExpression(not to be confused with ExpressionStatement), which can be used to contain statements inside expressions. All of my evil hacks have been replaced by StatementExpression. I also added some small optimizations for StatementExpressions!"}, {"post_id": 45987, "ts": "2026-08-12T20:32:56Z", "hours": 5.7503, "text": "General language improvements Elvis expressions: If a value is nullable, it is not usable by anything that only accepts non-null values, to solve this, I added the elvis expression, which allows you to give a fallback for null values(compilation in image 2): //int doesn't have to be nullable because we have a fallback value! int x = functionThatReturnsNull()?: 5; String boxing and nullable primitives Previously, scratcher only supported having structs, enums and function references as nullable, now it also supports having primitive types as nullable: str? x = functionThatReturnsNullableString(); //distinguish between literal null and string null if(x == null) looks::say(\"null!\"); if(x == \"null\") looks::say(\"null as string!\"); //the compiler achieves this by boxing the string return with a struct: //struct StringBox(str value) //the actual type behind the scenes is: //StringBox? x = ...; Safe dot traversal If a struct instance is nullable, you cannot use regular struct.member because that may result in a NullPointerException, to solve this I added ?. which allows for null safe traversal(compilation in image 1): //if nullableTriangle == null, return null //if nullableTriangle != null, return nullableTriangle.x1 int? x1 = nullableTriangle?.x1; Deepseek fix I noticed that FunctionInlining completely ignored execution order, so I asked deepseek to solve it(this happened after I added string boxing). But I found a better solution to the same problem later on, so I reverted deepseek’s fix and wrote my own, which is 260 lines compared to deepseek’s 360 lines, over 100 lines shorter!"}, {"post_id": 42848, "ts": "2026-08-07T19:46:20Z", "hours": 7.4364, "text": "Second garbage collector! Added a second garbage collector! If your app does not contain any cyclic objects and needs high performance, you can now enable the ARC collector! This garbage collector works by automatically detecting when objects go out of scope and decrementing their reference count, if an object’s reference count goes to 0, it is freed. This is more performant than the mark and sweep collector because the objects are freed at the moment they are unused instead of stopping the entire program to collect garbage. This works for all cases, except for cases where there is a cyclic object. Because the cyclic object owns itself, so its reference count is always at 1."}, {"post_id": 32011, "ts": "2026-07-20T21:29:16Z", "hours": 4.2214, "text": "Even more abstractions please Added generics support, which allows the user to define generic functions/structs that apply with every type, for example: warp <T> void forEach(T[] a, (T) -> void action) { for(T t in a) { action(t); } } Depending on what type you used to call this, a new version of forEach gets generated, if you called it with an integer: warp void forEach@int(int[] a, (int) -> void action) { for(int t in a) { action(t); } } Of course I also allow this on structs: struct Triangle<Num>(Num x1, Num y1, Num x2, Num y2, Num x3, Num y3); Also did some small changes: Added an FPS counter to my test code Better optimizations that actually detect not(not(x)) Optimized triangle::fill even more (+2 fps) Made DynamicDispatchHandler actually use the apply return properly (it was always returning true)"}, {"post_id": 27929, "ts": "2026-07-13T21:08:14Z", "hours": 2.6361, "text": "More abstractions please! Added dynamic function dispatch which allows for functions to take in other functions as arguments, of course, this isn’t possible at all in normal scratch, so actually FunctionLiteral gets turned into an integer and a custom dispatch function gets created for every function literal’s signature which allows for a binary search to call the actual function Also made HeapConversion reuse stack slots instead of allocating one for every variable(mostly by AI)"}, {"post_id": 27608, "ts": "2026-07-13T10:50:48Z", "hours": 1.5486, "text": "Refactored the entire type system to use a sealed interface instead of an unsafe single class Nothing much to say, this doesn’t affect the input code or the output project, I did just cleanup"}, {"post_id": 27567, "ts": "2026-07-13T08:35:21Z", "hours": 0.8472, "text": "Did more syntax improvements Added ++ and – support: index++; Added type inference support: auto a = Triangle(5, 15, 60, -120, 240, 67); //type automatically becomes Triangle auto a = func(); //type automatically becomes the return type of func"}, {"post_id": 27415, "ts": "2026-07-12T23:35:13Z", "hours": 2.3778, "text": "Scratcher is at 100 commits! (Now 104 cause all of these refactors are different commits) Completely refactored all translation steps to use the ASTVisitor. Also did type resolving cleanup. Function Reachability : Went from 117 to 32 lines Function expression lowering : Went from 439 to 293 lines Re Parse Local Variables : Went from 34 to 27 lines Remove Empty Allocations : Went from 97 to 79 lines ConvertToHeapAccess : Biggest refactor of this whole devlog, went from 500 lines to 418, split into 5 files"}, {"post_id": 26200, "ts": "2026-07-10T21:13:19Z", "hours": 3.26, "text": "Fixed a lot of bugs with when expressions, also got deepseek to fix some of them Added If expressions, which allow using if statements inside other expressions, for example, here is some previously invalid code that is now valid: int max = if (a > b) a else b; str message = if (score >= 90) { looks::say(\"something\"); \"You win!\" } else { looks::say(\"something\"); \"You lose :(\" } triangles[15] = Triangle( utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), if(mode == TriangleRenderMode.OFF) { 5 } else { triangles[14].y3 } ); These still get lowered properly and just look like normal if statements in the final scratch code"}, {"post_id": 25224, "ts": "2026-07-09T10:42:23Z", "hours": 3.3289, "text": "Added more syntax improvements! Else if : Added support for else if, which replaces big blocks //Before: if(triangles[14].y1 >= 15) { looks::say(\">=15\"); } else { if(triangles[14].y2 >= 155) { looks::say(\"<=15\"); } else { looks::say(\"Both false!\"); } } //After: if(triangles[14].y1 >= 15) { looks::say(\">=15\"); } else if(triangles[14].y2 >= 155) { looks::say(\"<=15\"); } else { looks::say(\"Both false!\"); } Compound assignment : Added support for compound assignment //Before: triangles[15].y3 = triangles[15].y3 + 5; //After: triangles[15].y3 += 5; Enums : Added support for enums, which are just fancy integer wrappers enum TriangleRenderMode(OFF, RENDER, ITHINK); TriangleRenderMode mode = TriangleRenderMode.OFF; When : Added support for when expressions/statements that allow for matching a subject: //Before: if(answer == \"off\") { mode = TriangleRenderMode.OFF; } else if(answer == \"render\") { mode = TriangleRenderMode.RENDER; } else { mode = TriangleRenderMode.ITHINK; looks::say(\"If thinking is your power, what are you without it?\"); return; } //After: TriangleRenderMode mode = when(answer) { \"off\" -> TriangleRenderMode.OFF \"render\" -> TriangleRenderMode.RENDER else -> { looks::say(\"If thinking is your power, what are you without it?\"); TriangleRenderMode.ITHINK; } };"}, {"post_id": 24407, "ts": "2026-07-07T22:53:21Z", "hours": 2.6547, "text": "Tried to do turbowarp only return optimization, wasn’t able to make it very good… reverted it Improved the structure of CompilationConstants Added string::split and string::substring Made some of the list functions inlined (itemAt, clear, length)"}, {"post_id": 22179, "ts": "2026-07-04T14:42:02Z", "hours": 1.2922, "text": "Made the garbage collector treat top level variables as roots, this prevents top level variables from getting freed I added 2 modes to this Reflect: This uses a hacked block to read the variables by name and reduce script size if theres a lot of variables(this doesn’t render properly inside the editor but it works) NoReflect: Get all the top level variables at compile time and mark them one by one"}, {"post_id": 22122, "ts": "2026-07-04T12:41:23Z", "hours": 7.6808, "text": "Garbage collection Added a mark and sweep garbage collector to my language, it walks the roots, marks every used object, then frees all unused objects! Most impressive part of this(in my opinion) is that most of the garbage collector is actually written in my language Misc The garbage collector gets called automatically every 1 second, but you can turn it off (CompilationConstants.AUTOMATIC_GC) If you want to manage memory manually, you can turn off the garbage collector entirely (CompilationConstants.MANUAL_MEMORY)"}, {"post_id": 19412, "ts": "2026-06-30T18:41:23Z", "hours": 1.5931, "text": "Added a name parameter to alloc which acts as runtime type metadata, soon to be used."}, {"post_id": 18732, "ts": "2026-06-29T22:21:59Z", "hours": 0.6683, "text": "Added more compiler sugar for lists: list[index] replaces list::itemAt(list, index) list[index] = ...; replaces list::replace(list, item, index) for(type name in list) {} replaces int len = list::length(list); int i = 0; while (i < len) { type name = list::itemAt(list, i); i = i + 1; } (i am not proud of the shitcode that was used to get for(type name in list) working)"}, {"post_id": 18693, "ts": "2026-06-29T21:37:55Z", "hours": 3.1528, "text": "Added list support! A very barebones implementation that allows the user to create, add to, read from and delete items from lists!"}, {"post_id": 18194, "ts": "2026-06-29T08:15:19Z", "hours": 1.2822, "text": "Made “PromoteToGlobals” which is a more powerful version of OptimizeToGlobals which allows for recursive functions to have their locals turned into globals aswell This is something called liveness analysis, the compiler looks at the code paths and decides at which points a variable is “live”, which means it can’t get overwritten by a recursive call Example: warp int fib(int n) { return 0 if n <= 0; return 1 if n == 1; if (n == 2) { int b = n * 2; return otherFunc(b); } return fib(n - 1) + fib(n - 2); } In this function the “b” variable can be turned into a global because it cannot get overwritten by a recursive call, its used too early for that to happen"}, {"post_id": 17754, "ts": "2026-06-28T17:51:46Z", "hours": 1.5667, "text": "Did some compiler testing Fixed function inlining bugs Fixed a single use assignment bug Created a triangle library that allows for triangle rendering using the pen"}, {"post_id": 17603, "ts": "2026-06-28T13:52:43Z", "hours": 1.7214, "text": "Borrowed the “return expr if(cond)” syntax from ruby Implemented Tail call optimization which optimizes away recursion on tail calls Example: Before: str count(int amount) { return \"Done!\" if amount == 1; return count(amount - 1); } After: str count(int amount) { int tco@argument@amount = amount; while (true) { if (tco@argument@amount == 1) return \"Done !\"; tco@argument@amount = tco@argument@amount - 1; } }"}, {"post_id": 17283, "ts": "2026-06-28T00:21:23Z", "hours": 5.7767, "text": "Source code of the image: on GreenFlag { if(a() == 5) { looks::say(\"yo!\"); } int index = 0; index = index + 1; rgb(index, 5, 5); index = 5; while(true) { pen::eraseAll(); render(); } } The image is of the entire flow working perfectly: The index variable had their value propagated to “1” by the Sequential constant propagation optimization The variable got its uses removed by Inline single-use assignments Then the variable got fully removed by Dead store elimination The rgb function got inlined. Then while it was inlined, because the rgb function’s return wasn’t being used, it got fully removed(the inlining preserves side effects while removing its return value, but because it didn’t have any side effects it got fully removed) Same with the a() function: It got inlined Then the if statement became if(5 == 5) { looks::say(\"yo!\"); } Then Constant folding turned 5 == 5 into true Then Dead code elimination turned if(true) into just the then block I know most optimizations look like they aren’t that powerful, but when combined with other optimizations and ran in a loop, they can pile up and actually optimize code Optimizations Simplify boolean equality : Simplifies x == true to x , simplifies x == false to !x Simplify double negation : Simplifies !!x to x , simplifies --x to x Constant folding : Simplifies true == true to true , simplifies 5 + 5 to 10 Repeat to While : Converts repeat(amount) to a while loop Dead code elimination : Removes provably unreachable code blocks, eg: if(true) { ... } else { .. } turns into ... , removing the if and the else block entirely Now the big ones Sequential constant propagation : Analyzes the control flow of your program, removing useless variable assignments and inlining their expressions Inline single use assignment : Self explanatory Dead store elimination : Removes useless “set variable to x” blocks that don’t get used afterwards Function inlining : The compiler evaluates a cost for every function call is inside a function, if that total cost is less than 10,000, it gets inlined inside that function, removing call overhead and allowing for further optimization Other misc stuff: Fixed the while bug (if you called a function inside a while statement, it would only get called once) Made function lowering not allocate a stack slot if we’re ignoring return Made the OptimizeToGlobals optimization be called last to allow variable optimizations to happen first"}, {"post_id": 16526, "ts": "2026-06-26T21:46:14Z", "hours": 2.3836, "text": "Optimizations OptimizeToGlobals : If the compiler can prove that a function is not recursive and runs atomically(single threaded), it gets rid of the function’s primitive local variables, which improves performance as scratch’s list operations are more expensive than local variables InlineSingleUseVariables : Pretty self explanatory, if a variable is only used once, it will be inlined ConvertToHeapAccess : I did optimizations on the normal heap converter so that it doesn’t allocate a stack pointer for functions that don’t need one Images don’t show the OptimizeToGlobals optimization cause the testing function I have for that is too long Before and after on the RGB function"}, {"post_id": 16206, "ts": "2026-06-26T10:29:30Z", "hours": 1.5267, "text": "Created Motion and Pen library Added support for top level variables Made an optimization to get rid of useless “replace with -1” blocks(image 1 is before, image 2 is after), this greatly reduces the code size(images are only one example, it was being put everywhere)"}, {"post_id": 15894, "ts": "2026-06-25T20:34:04Z", "hours": 1.4264, "text": "Did warning cleanup Added a nullability “system”, I allow the ? to be put on struct fields, and you can put null as the argument on those fields, then you have to check if they are null and do !! to use them"}, {"post_id": 15790, "ts": "2026-06-25T17:47:54Z", "hours": 3.6944, "text": "Did a lot of refactors Created SensingLib and CalendarLib Made a system to allow standard libraries to be inlined into your code to reduce file size Added support for structs, Right now you have to manually free your structs"}, {"post_id": 15329, "ts": "2026-06-24T22:06:11Z", "hours": 1.2928, "text": "Created a library for casting primitives to other primitives Expanded the math library a lot Added duplicate function and struct detection(yes I forgot before) Added code to prioritize function(int) over function(float) if calling with an int Added “warp” and “export” modifiers to function declarations, the warp modifier maps to the “Run without screen refresh” field, and export is currently unused, but later it will be used to export a function so that its properly usable from normal scratch code"}, {"post_id": 15271, "ts": "2026-06-24T20:05:11Z", "hours": 1.885, "text": "Did general bug fixes Added more standard library functions Added runtime type checking and exceptions"}, {"post_id": 15169, "ts": "2026-06-24T17:20:15Z", "hours": 2.2017, "text": "Did a small refactor on obfuscation Created a type safe(kinda) kotlin DSL for making standard library functions way more readable and simpler to create I rewrote the Memory library with the kotlin DSL Image 1: Before Image 2: After"}, {"post_id": 15063, "ts": "2026-06-24T14:04:20Z", "hours": 1.6278, "text": "I added an event system, making it so your code can actually run on GreenFlag { main(); } on KeyPressed(W) { looks::say(\"W was pressed!\"); } These events are translated into functions and the compiler generates scratch events that call these on KeyPressed(W) { compiler@eventlistener@F(); } void compiler@eventlistener@F() { looks::say(\"W was pressed!\"); } The compiler also generates a initializer green flag block which clears the heap and reserves an index for every other entrypoint(image 2)"}, {"post_id": 14757, "ts": "2026-06-23T23:45:31Z", "hours": 8.0742, "text": "I finished the pipeline from my language’s AST to scratch, it was pretty mind numbing Stage 1: The code does reachability, from the source file(where the compilation started) and finds all functions that we can call from the source Stage 2: Using those functions, we lower call expressions to statements and returns to heap accesses, here’s how that looks in code: Before : void main() { looks::say(fib(5)); } After : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } Notice how the nested call turned into a seperate statement. Why do we need this? Because scratch does not support returning stuff from functions, only arguments. Stage 3: We re-parse all locals on the reachable functions because the last stage added more locals Stage 4: We add a parameter to all functions named “stack” Stage 5: We add free(stack) calls at the end or before the return statement, this frees our stack automatically. We also add alloc before function calls so that we have a stack to pass to the function Here’s how that looks like in code: Before : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } After : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); //allocate a stack for fib fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); //free our stack } Notice how we have UNKNOWN in place for a number in the allocation and freeing, this is because we just added more locals for the allocations and we can’t know how many slots we need. Standard library functions are already compiled to scratch statements so they don’t need a stack allocated for them Stage 6: We re-parse local variables so we have a count. Stage 7: We count the re-parsed locals for every function and figure out which local variables can be reached in every function Stage 8: We convert all local variables to heap slots We traverse all statements and expressions, replacing all variable accesses with heap[stack + variableIndex]. While in this process we also convert the unknowns into the actual sizes since we just counted the locals in stage 7 Here’s how this entire stage looks like in code: Before : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); } After : void main(int stack) { heap[stack] = -1; heap[stack + 1] = -1; alloc(3, stack + 1); //we just pass the index here since alloc will write to that index fib(heap[stack + 1], 5, stack); looks::say(heap[stack]); free(stack, 2); //We have 2 locals } By using a stack we get access to a lot of things like returning, recursion and local variables. Scratch doesn’t even support local variables, so we have to hack it with a global list. Notice how we don’t free the allocation? That’s because all functions are compiled by the same compiler and that compiler added free() to all functions with a stack. Stage 9: If a function doesn’t have any local variables, this is where we delete their allocations and free’s so that they don’t mess up the heap For example : alloc(0, index); and the target function for this allocation will have its free(stack, 0) call removed. Stage 10: Finally we create dummy scratch functions for our very lowered AST And finally in stage 11 we create the code blocks for the scratch functions and write to disk And it successfully calculates fib(9) as 34"}, {"post_id": 13952, "ts": "2026-06-22T22:02:44Z", "hours": 2.9797, "text": "I made a wrapper for the raw opcode classes that make valid code easier to make, then I did a ton of bug fixes and did a small refactor"}, {"post_id": 13260, "ts": "2026-06-21T18:26:43Z", "hours": 0.5228, "text": "Did a refactor, and intellij decided to corrupt some of the files, so I had to fix it"}, {"post_id": 13207, "ts": "2026-06-21T17:10:57Z", "hours": 3.1617, "text": "Implemented 90% of scratch’s blocks in the wrapper"}, {"post_id": 13095, "ts": "2026-06-21T12:57:42Z", "hours": 2.4425, "text": "Worked on a very basic scratch wrapper, it can generate a recursive function, gonna add more scratch blocks so that actual logic can be generated in this wrapper"}, {"post_id": 12772, "ts": "2026-06-20T21:38:46Z", "hours": 0.7953, "text": "Added static type checking, which makes sure the correct types are used everywhere. It prevents the user from using a number in an if statement’s condition. It also prevents you from assigning a string to an integer field"}, {"post_id": 12746, "ts": "2026-06-20T20:50:32Z", "hours": 2.8928, "text": "I added the AST parsing, which is able to parse the ANTLR parse tree into an AST (sorry the image is bad, its all I can show)"}, {"post_id": 12579, "ts": "2026-06-20T15:22:11Z", "hours": 3.0503, "text": "Worked on the first stage of AST parsing: Only parse top level elements (imports, structs, variables) and don’t parse the insides of functions"}]...
|
Title: Scratcher by @BetterClient | Stardance
Dev Title: Scratcher by @BetterClient | Stardance
Devlogs:
Worked on the first stage of AST parsing: Only parse top level elements (imports, structs, variables) and don’t parse the insides of functions
I added the AST parsing, which is able to parse the ANTLR parse tree into an AST (sorry the image is bad, its all I can show)
Added static type checking, which makes sure the correct types are used everywhere. It prevents the user from using a number in an if statement’s condition. It also prevents you from assigning a string to an integer field
Worked on a very basic scratch wrapper, it can generate a recursive function, gonna add more scratch blocks so that actual logic can be generated in this wrapper
Implemented 90% of scratch’s blocks in the wrapper
Did a refactor, and intellij decided to corrupt some of the files, so I had to fix it
I made a wrapper for the raw opcode classes that make valid code easier to make, then I did a ton of bug fixes and did a small refactor
I finished the pipeline from my language’s AST to scratch, it was pretty mind numbing Stage 1: The code does reachability, from the source file(where the compilation started) and finds all functions that we can call from the source Stage 2: Using those functions, we lower call expressions to statements and returns to heap accesses, here’s how that looks in code: Before : void main() { looks::say(fib(5)); } After : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } Notice how the nested call turned into a seperate statement. Why do we need this? Because scratch does not support returning stuff from functions, only arguments. Stage 3: We re-parse all locals on the reachable functions because the last stage added more locals Stage 4: We add a parameter to all functions named “stack” Stage 5: We add free(stack) calls at the end or before the return statement, this frees our stack automatically. We also add alloc before function calls so that we have a stack to pass to the function Here’s how that looks like in code: Before : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } After : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); //allocate a stack for fib fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); //free our stack } Notice how we have UNKNOWN in place for a number in the allocation and freeing, this is because we just added more locals for the allocations and we can’t know how many slots we need. Standard library functions are already compiled to scratch statements so they don’t need a stack allocated for them Stage 6: We re-parse local variables so we have a count. Stage 7: We count the re-parsed locals for every function and figure out which local variables can be reached in every function Stage 8: We convert all local variables to heap slots We traverse all statements and expressions, replacing all variable accesses with heap[stack + variableIndex]. While in this process we also convert the unknowns into the actual sizes since we just counted the locals in stage 7 Here’s how this entire stage looks like in code: Before : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); } After : void main(int stack) { heap[stack] = -1; heap[stack + 1] = -1; alloc(3, stack + 1); //we just pass the index here since alloc will write to that index fib(heap[stack + 1], 5, stack); looks::say(heap[stack]); free(stack, 2); //We have 2 locals } By using a stack we get access to a lot of things like returning, recursion and local variables. Scratch doesn’t even support local variables, so we have to hack it with a global list. Notice how we don’t free the allocation? That’s because all functions are compiled by the same compiler and that compiler added free() to all functions with a stack. Stage 9: If a function doesn’t have any local variables, this is where we delete their allocations and free’s so that they don’t mess up the heap For example : alloc(0, index); and the target function for this allocation will have its free(stack, 0) call removed. Stage 10: Finally we create dummy scratch functions for our very lowered AST And finally in stage 11 we create the code blocks for the scratch functions and write to disk And it successfully calculates fib(9) as 34
I added an event system, making it so your code can actually run on GreenFlag { main(); } on KeyPressed(W) { looks::say("W was pressed!"); } These events are translated into functions and the compiler generates scratch events that call these on KeyPressed(W) { compiler@eventlistener@F(); } void compiler@eventlistener@F() { looks::say("W was pressed!"); } The compiler also generates a initializer green flag block which clears the heap and reserves an index for every other entrypoint(image 2)
Did a small refactor on obfuscation Created a type safe(kinda) kotlin DSL for making standard library functions way more readable and simpler to create I rewrote the Memory library with the kotlin DSL Image 1: Before Image 2: After
Did general bug fixes Added more standard library functions Added runtime type checking and exceptions
Created a library for casting primitives to other primitives Expanded the math library a lot Added duplicate function and struct detection(yes I forgot before) Added code to prioritize function(int) over function(float) if calling with an int Added “warp” and “export” modifiers to function declarations, the warp modifier maps to the “Run without screen refresh” field, and export is currently unused, but later it will be used to export a function so that its properly usable from normal scratch code
Did a lot of refactors Created SensingLib and CalendarLib Made a system to allow standard libraries to be inlined into your code to reduce file size Added support for structs, Right now you have to manually free your structs
Did warning cleanup Added a nullability “system”, I allow the ? to be put on struct fields, and you can put null as the argument on those fields, then you have to check if they are null and do !! to use them
Created Motion and Pen library Added support for top level variables Made an optimization to get rid of useless “replace with -1” blocks(image 1 is before, image 2 is after), this greatly reduces the code size(images are only one example, it was being put everywhere)
Optimizations OptimizeToGlobals : If the compiler can prove that a function is not recursive and runs atomically(single threaded), it gets rid of the function’s primitive local variables, which improves performance as scratch’s list operations are more expensive than local variables InlineSingleUseVariables : Pretty self explanatory, if a variable is only used once, it will be inlined ConvertToHeapAccess : I did optimizations on the normal heap converter so that it doesn’t allocate a stack pointer for functions that don’t need one Images don’t show the OptimizeToGlobals optimization cause the testing function I have for that is too long Before and after on the RGB function
Source code of the image: on GreenFlag { if(a() == 5) { looks::say("yo!"); } int index = 0; index = index + 1; rgb(index, 5, 5); index = 5; while(true) { pen::eraseAll(); render(); } } The image is of the entire flow working perfectly: The index variable had their value propagated to “1” by the Sequential constant propagation optimization The variable got its uses removed by Inline single-use assignments Then the variable got fully removed by Dead store elimination The rgb function got inlined. Then while it was inlined, because the rgb function’s return wasn’t being used, it got fully removed(the inlining preserves side effects while removing its return value, but because it didn’t have any side effects it got fully removed) Same with the a() function: It got inlined Then the if statement became if(5 == 5) { looks::say("yo!"); } Then Constant folding turned 5 == 5 into true Then Dead code elimination turned if(true) into just the then block I know most optimizations look like they aren’t that powerful, but when combined with other optimizations and ran in a loop, they can pile up and actually optimize code Optimizations Simplify boolean equality : Simplifies x == true to x , simplifies x == false to !x Simplify double negation : Simplifies !!x to x , simplifies --x to x Constant folding : Simplifies true == true to true , simplifies 5 + 5 to 10 Repeat to While : Converts repeat(amount) to a while loop Dead code elimination : Removes provably unreachable code blocks, eg: if(true) { ... } else { .. } turns into ... , removing the if and the else block entirely Now the big ones Sequential constant propagation : Analyzes the control flow of your program, removing useless variable assignments and inlining their expressions Inline single use assignment : Self explanatory Dead store elimination : Removes useless “set variable to x” blocks that don’t get used afterwards Function inlining : The compiler evaluates a cost for every function call is inside a function, if that total cost is less than 10,000, it gets inlined inside that function, removing call overhead and allowing for further optimization Other misc stuff: Fixed the while bug (if you called a function inside a while statement, it would only get called once) Made function lowering not allocate a stack slot if we’re ignoring return Made the OptimizeToGlobals optimization be called last to allow variable optimizations to happen first
Borrowed the “return expr if(cond)” syntax from ruby Implemented Tail call optimization which optimizes away recursion on tail calls Example: Before: str count(int amount) { return "Done!" if amount == 1; return count(amount - 1); } After: str count(int amount) { int tco@argument@amount = amount; while (true) { if (tco@argument@amount == 1) return "Done !"; tco@argument@amount = tco@argument@amount - 1; } }
Did some compiler testing Fixed function inlining bugs Fixed a single use assignment bug Created a triangle library that allows for triangle rendering using the pen
Made “PromoteToGlobals” which is a more powerful version of OptimizeToGlobals which allows for recursive functions to have their locals turned into globals aswell This is something called liveness analysis, the compiler looks at the code paths and decides at which points a variable is “live”, which means it can’t get overwritten by a recursive call Example: warp int fib(int n) { return 0 if n <= 0; return 1 if n == 1; if (n == 2) { int b = n * 2; return otherFunc(b); } return fib(n - 1) + fib(n - 2); } In this function the “b” variable can be turned into a global because it cannot get overwritten by a recursive call, its used too early for that to happen
Added list support! A very barebones implementation that allows the user to create, add to, read from and delete items from lists!
Added more compiler sugar for lists: list[index] replaces list::itemAt(list, index) list[index] = ...; replaces list::replace(list, item, index) for(type name in list) {} replaces int len = list::length(list); int i = 0; while (i < len) { type name = list::itemAt(list, i); i = i + 1; } (i am not proud of the shitcode that was used to get for(type name in list) working)
Added a name parameter to alloc which acts as runtime type metadata, soon to be used.
Garbage collection Added a mark and sweep garbage collector to my language, it walks the roots, marks every used object, then frees all unused objects! Most impressive part of this(in my opinion) is that most of the garbage collector is actually written in my language Misc The garbage collector gets called automatically every 1 second, but you can turn it off (CompilationConstants.AUTOMATIC_GC) If you want to manage memory manually, you can turn off the garbage collector entirely (CompilationConstants.MANUAL_MEMORY)
Made the garbage collector treat top level variables as roots, this prevents top level variables from getting freed I added 2 modes to this Reflect: This uses a hacked block to read the variables by name and reduce script size if theres a lot of variables(this doesn’t render properly inside the editor but it works) NoReflect: Get all the top level variables at compile time and mark them one by one
Tried to do turbowarp only return optimization, wasn’t able to make it very good… reverted it Improved the structure of CompilationConstants Added string::split and string::substring Made some of the list functions inlined (itemAt, clear, length)
Added more syntax improvements! Else if : Added support for else if, which replaces big blocks //Before: if(triangles[14].y1 >= 15) { looks::say(">=15"); } else { if(triangles[14].y2 >= 155) { looks::say("<=15"); } else { looks::say("Both false!"); } } //After: if(triangles[14].y1 >= 15) { looks::say(">=15"); } else if(triangles[14].y2 >= 155) { looks::say("<=15"); } else { looks::say("Both false!"); } Compound assignment : Added support for compound assignment //Before: triangles[15].y3 = triangles[15].y3 + 5; //After: triangles[15].y3 += 5; Enums : Added support for enums, which are just fancy integer wrappers enum TriangleRenderMode(OFF, RENDER, ITHINK); TriangleRenderMode mode = TriangleRenderMode.OFF; When : Added support for when expressions/statements that allow for matching a subject: //Before: if(answer == "off") { mode = TriangleRenderMode.OFF; } else if(answer == "render") { mode = TriangleRenderMode.RENDER; } else { mode = TriangleRenderMode.ITHINK; looks::say("If thinking is your power, what are you without it?"); return; } //After: TriangleRenderMode mode = when(answer) { "off" -> TriangleRenderMode.OFF "render" -> TriangleRenderMode.RENDER else -> { looks::say("If thinking is your power, what are you without it?"); TriangleRenderMode.ITHINK; } };
Fixed a lot of bugs with when expressions, also got deepseek to fix some of them Added If expressions, which allow using if statements inside other expressions, for example, here is some previously invalid code that is now valid: int max = if (a > b) a else b; str message = if (score >= 90) { looks::say("something"); "You win!" } else { looks::say("something"); "You lose :(" } triangles[15] = Triangle( utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), if(mode == TriangleRenderMode.OFF) { 5 } else { triangles[14].y3 } ); These still get lowered properly and just look like normal if statements in the final scratch code
Scratcher is at 100 commits! (Now 104 cause all of these refactors are different commits) Completely refactored all translation steps to use the ASTVisitor. Also did type resolving cleanup. Function Reachability : Went from 117 to 32 lines Function expression lowering : Went from 439 to 293 lines Re Parse Local Variables : Went from 34 to 27 lines Remove Empty Allocations : Went from 97 to 79 lines ConvertToHeapAccess : Biggest refactor of this whole devlog, went from 500 lines to 418, split into 5 files
Did more syntax improvements Added ++ and – support: index++; Added type inference support: auto a = Triangle(5, 15, 60, -120, 240, 67); //type automatically becomes Triangle auto a = func(); //type automatically becomes the return type of func
Refactored the entire type system to use a sealed interface instead of an unsafe single class Nothing much to say, this doesn’t affect the input code or the output project, I did just cleanup
More abstractions please! Added dynamic function dispatch which allows for functions to take in other functions as arguments, of course, this isn’t possible at all in normal scratch, so actually FunctionLiteral gets turned into an integer and a custom dispatch function gets created for every function literal’s signature which allows for a binary search to call the actual function Also made HeapConversion reuse stack slots instead of allocating one for every variable(mostly by AI)
Even more abstractions please Added generics support, which allows the user to define generic functions/structs that apply with every type, for example: warp <T> void forEach(T[] a, (T) -> void action) { for(T t in a) { action(t); } } Depending on what type you used to call this, a new version of forEach gets generated, if you called it with an integer: warp void forEach@int(int[] a, (int) -> void action) { for(int t in a) { action(t); } } Of course I also allow this on structs: struct Triangle<Num>(Num x1, Num y1, Num x2, Num y2, Num x3, Num y3); Also did some small changes: Added an FPS counter to my test code Better optimizations that actually detect not(not(x)) Optimized triangle::fill even more (+2 fps) Made DynamicDispatchHandler actually use the apply return properly (it was always returning true)
Second garbage collector! Added a second garbage collector! If your app does not contain any cyclic objects and needs high performance, you can now enable the ARC collector! This garbage collector works by automatically detecting when objects go out of scope and decrementing their reference count, if an object’s reference count goes to 0, it is freed. This is more performant than the mark and sweep collector because the objects are freed at the moment they are unused instead of stopping the entire program to collect garbage. This works for all cases, except for cases where there is a cyclic object. Because the cyclic object owns itself, so its reference count is always at 1.
General language improvements Elvis expressions: If a value is nullable, it is not usable by anything that only accepts non-null values, to solve this, I added the elvis expression, which allows you to give a fallback for null values(compilation in image 2): //int doesn't have to be nullable because we have a fallback value! int x = functionThatReturnsNull()?: 5; String boxing and nullable primitives Previously, scratcher only supported having structs, enums and function references as nullable, now it also supports having primitive types as nullable: str? x = functionThatReturnsNullableString(); //distinguish between literal null and string null if(x == null) looks::say("null!"); if(x == "null") looks::say("null as string!"); //the compiler achieves this by boxing the string return with a struct: //struct StringBox(str value) //the actual type behind the scenes is: //StringBox? x = ...; Safe dot traversal If a struct instance is nullable, you cannot use regular struct.member because that may result in a NullPointerException, to solve this I added ?. which allows for null safe traversal(compilation in image 1): //if nullableTriangle == null, return null //if nullableTriangle != null, return nullableTriangle.x1 int? x1 = nullableTriangle?.x1; Deepseek fix I noticed that FunctionInlining completely ignored execution order, so I asked deepseek to solve it(this happened after I added string boxing). But I found a better solution to the same problem later on, so I reverted deepseek’s fix and wrote my own, which is 260 lines compared to deepseek’s 360 lines, over 100 lines shorter!
100 hours! Evil hack part 4: Death of evil hack So I was using a really terrible hack to implement stuff like FunctionInlining, Safe dot and the elvis expression, the hack is basically (ab)using the when expression to do stuff like run code inside expressions and use local variables inside expressions. So to stop this from becoming a hack, I added it directly to the AST as StatementExpression(not to be confused with ExpressionStatement), which can be used to contain statements inside expressions. All of my evil hacks have been replaced by StatementExpression. I also added some small optimizations for StatementExpressions!
Fixed the garbage collector… turns out I broke it accidentally while cleaning up code in my last devlog, 3 line change but took a long time to find Made it so the stack allocator doesn’t do redundant operations like 1+1 and inlines them as 2 instead
Lambdas I added lambdas to Scratcher! They allow you to write more expressive code like map(list, a -> a + 1) , which literally adds 1 to every element of list I also allow using outer variables within lambdas int a = ...; map(list, b -> { a++; b + a }); I allow this through boxing, the local variables become boxes and the lambdas get the local variable’s box, this makes lambdas more powerful than most languages as this allows for variables to be shared mutable state across lambdas, this also allows the local variables to get garbage collected. Of course, scratch doesn’t support this natively, so lambdas are 100% compiler sugar and just lowers to regular functions and uses function references(which is also 100% compiler sugar). void lambda::defunc@lambad@0(LambdaCaptures c, args...) { ... }
MORE FUCKING ABSTRACTIONS!!! I added receiver/extension functions. These allow you to write code that takes in a type as a special argument You define them just like how it works in kotlin: warp <T, R> R T.let((T) -> R action) { return action(this); } It just compiles to a regular function warp <T, R> R let(T this, (T) -> R action) { return action(this); } But the compiler lets you call it with the special argument: thing.let((int a) -> ...); I also added a very big standard library module (written in scratcher!) with a ton of these functions built-in, they allow you to write more expressive code: triangles .filterNotNull() .filter((Triangle<float> t) -> t.x1 > 150) .filter((Triangle<float> t) -> t.y1 < 150) .forEach((Triangle<float> tri) -> ...) I also rewrote the entirety of string lib during this, now you have to use the extensions library to use strings, but its way more powerful (and written in scratcher)! I also added a new “char” type, which stores a single character (wow really???) I also added “safe dot calls” that allow you to use stuff as if they’re not null: triangles.forEach((Triangle<float>? t) -> { t?.x1?.let((float x1) -> { looks::say("x1: ${x1}"); }); }); This only calls the let function if t?.x1 is not null There is a big problem with all this powerful new code though… the garbage collector can no longer keep up, a single mark and sweep takes over 1 second! Which is especially bad because the garbage collector needs the entire application to stop in order to run. You do not want your code to completely stop for a whole second(maybe you do? weirdo), so I have to fix this in my next few devlogs…
Sealed enums and faster GC I added a new type of object, sealed enums: sealed enum Animal { Cat(str name, int age, bool isMeowing), Dog(str name, int age), Unknown } They allow for storing data inside enums, they’re very similar to rust enums: sealed enum Result<T> { Success(T out), Failure } I also refactored lambdas to use a sealed enum instead of a big struct: //before struct LambdaCaptures(Lambda0Captures? c0, Lambda1Captures? c1, Lambda2Captures? c2); //after sealed enum LambdaCaptures { Lambda0Captures(Box$int capture0, ...), Lambda1Captures(Box$float capture0, ...) } Sealed enums only store a tag and a pointer, so if you use a lot of lambdas, this will save a TON of heap space Faster garbage collector! I made the marking phase of the mark and sweep collector faster by using an epoch based cleanup approach Now, instead of clearing and re-populating the marked list, we don’t ever clear it and we invalidate it by just increasing the epoch. This makes the isMarked check go from O(n) to O(1) while also improving marking speed because scratch doesn’t have to resize our list
I’m sorry For over 2 months, scratcher has had an “export” keyword, which was fully unused, until today: I implemented the export keyword on functions, which allows for code written in plain scratch to interact with scratcher code: export warp void myFunction() { ... } Export requires that your function arguments are all primitives and that the return is also a primitive, but other than that, it does not change anything, just exposes the function cleanly to regular scratch code. However, scratcher type checking still applies, so if the native scratch code passes in a string to a float argument, it will still cause a panic Even when you have obfuscation enabled, exports will stay and let native scratch use it with its original name
ACTUAL ARRAYS!! Previously, scratcher “arrays” were just lists, you could add more items, it would dynamically resize, it was written in the kotlin DSL, so technically it was just a list. I removed the previous list code, reused some of it and added a new Array system Along with that, the normal lists got rewritten in 100% scratcher with no internal functions The new system is almost fully backwards compatible in source code, you just have to make a few changes The new implementation is more clear, more expressive and more like regular programming languages
Pattern matching for sealed enums Previously if you wanted to check sealed enums types and use them, you had to do very ugly syntax for actually getting the variant instance: auto out = tryGet(); when(out) { Result.Success -> { auto suc = out as Result.Success; looks::say("Success! ${suc.out.x}"); Now you don’t have to do all of this: when(tryGet()) { Result.Success suc -> { looks::say("Success! ${suc.out.x}"); This is just syntax improvement, doesn’t change the generated code or anything, just helps the developer
Import some import names into unqualified co ntext Before: //import import list; //use list::List<str> myList = list::newList(); After: //import import list::*; //use List<str> myList = newList();
Operator overloading Added operator overloading, now you can define overloads for specific operators so that code looks cleaner Just use the operator keyword with the correct signature and you’re done! You can overload the operators: +, -, /, *, %, [], []= For example: warp operator <T> void T[].set(int index, T item) { self::replace(this, item, index); } //use array[index] = item //compiler translates to set(array, index, item) I also realized that my previous refactor of arrays broke my nullability system: int[] a = Array(int, 5); say(a[3]); This would print null , which my type system missed I fixed this by moving arrays to a standard library module, the same array import works, but you have to change how you create the array: //before: int[] a = Array(int, 5); //doesn't need to be marked as null!!! int[] a = Array(int, 5); a[0] = ...; a[1] = ...; ... //after int?[] a = arrayOfNulls(5); //null filled int[] a = arrayOf(5, (int index) -> { return index * 5; //value of the array at that index });
Privates Added a “private” keyword, anything declared private cannot be accessed from outside the current file. This prevents the user from messing with internal states of libraries they are using For example, the list library from the standard library. Now you can’t directly mess with the list pointer triangles.ptr[5] = ...; This now results in an error because “ptr” is private! I also added some small optimizations for lambdas.
DOCUMENTATION I do not want to touch any markdown ever again
QOL I added a shit ton of quality of life stuff: Tons of bug fixes Big array syntax: int[] myArray = [1, 2, 3, 4, 5, 6]; Safe casting for enums(previously a panic): Result.Success? a = res as? Result.Success; Out of memory detection: Scratch caps lists at 200k elements, after that it silently stops adding stuff to the list Compact int list: Store pretty much infinite integers without wasting heap space SHORT CIRCUITS: DONT EXECUTE RIGHT SIDE OF && or || if left side is false/true! If statements without braces: if(a) b++; CONTINUE AND BREAK: while(true) { if(a) break; if(b) continue; } STATIC LISTS: store data outside of the heap in scratch lists so that you dont run out of heap space: static str[] myList; This also allows for file reading: static str[] myList = "hello.json"; So you can properly store data(like ROMs) CASE SENSITIVE EQUALS: DID YOU KNOW THAT SCRATCH “=” BLOCK IS CASE INSENSITIVE??? And its pretty hard to make it case sensitive Now you can do “===” and its case sensitive: 'a' === 'A' RETURNS FALSE
List pools Static lists are cool, but they are very limited expressiveness wise because they must be known at compile time Pools fix this by having a pool of static lists that the user code can allocate at any time PooledList a = allocate(); But because the pool is limited, the pooled list must be freed when not needed, the garbage collector will not handle it(yet) a.free(); Other than that, the PooledList behaves just like a List and can do almost anything a List does I also added proper documentation for Out of memory errors.
Indexed repeat and general improvements Added a new indexed for and repeat statement which allows way easier index tracking: //Before: int index = 0; repeat(10) { ... index++; } //After: repeat(10) { index -> ... } I also made the PooledList get garbage collected with the refcount gc Did some really small refactors aswell
Demo programs and general improvements I added demo programs to scratcher, these show the language actually being used Try one out! https://scratch.mit.edu/projects/1385339395/ General improvements Bug fixes Dummy sprite Make the type checker ignored in inlined functions Make topLevelInit smaller and remove unused functions from final compilation TurboWarp specific compilation mode with faster operations on strings/lists (not compatible with vanilla scratch if enabled)
More demos and QOL Try it out: https://scratch.mit.edu/projects/1387804691/ Demos Math lexer, parser and interpreter: New demo that lets you input math expressions (eg: 1 + 1 ) and get the result. 3d cube renderer: a spinning 3d cube and player controls QOL Smarter inlining cost calculation A math centered optimization for removing identities Get rid of PromoteToGlobals (temp) GC documentation Codegen fixes (receiver functions generate the same block, causing scratch to get confused) Stack size optimization (reuse stack slots of the same type) Fix crash when the garbage collector is disabled
PROPER ERRORS Errors are the one thing that I knew were terrible but I could never build up the courage to fix. So I just fixed them. Now all errors in the language are formatted nicely, show you exactly where the error happened and give you a nice description. Along with this, I made a new system for collecting errors, so now the compiler won’t stop at the first error and will continue going and give you all errors at once. This makes fixing code a lot easier. This also opens up the possibility of an LSP server later on (before and after in images)
CLI I did some small refactors and added a new CLI, built with Clikt It’s very simple to use: scratcher check file --options //check the file for any compilation errors without compiling scratcher compile file --options outFile //compile into a .sb3 file scratcher standard-library //print out the standard library Clikt also provides easy to use help menus I also added a sort function to the array and list libraries...
|
1792482509.6003482
|
1793087309.6003482
|
|
30441
|
Weather Underground Station Status Checker by @Kru Weather Underground Station Status Checker by @Krupam | Stardance...
|
Krupam
|
0
|
180.79
|
0
|
[]
|
[{"post_id": 79620, "ts": "202 [{"post_id": 79620, "ts": "2026-10-14T18:51:09Z", "hours": 9.4867, "text": "Weather Emails, mobile tweaks, map zoom Soooooooooooooo close to shipping. Map Zoom: The Map will now automatically zoom based the center of the points. Humidity and Dew point data collection: The place the data was being scraped from got changed so I had to update the logic. Weather Emails: Created another CRUD for another email list. This list will get a monthly email summarizing the weather for the past 30 days for each of the stations. I created the web page for it, but need to finish cleaning it up, allowing people to sign up for the service and make the emails send automaticcally. Mobile Tweaks: The mobile version of the website did not look good. I spent a lot of time trying to fix it before I was able to get it to look like this!"}, {"post_id": 77451, "ts": "2026-10-07T02:02:30Z", "hours": 7.9642, "text": "Map! And Develop mode Map I used ArcGIS’s JS to create a map tab that show cases all stations that have a latitude and longitude value. I am working on getting them on the first ever scrape but you can also edit them within the settings page. There is a link that takes you to the station page as well. Develop Mode Created a toggle within the .env file. If on, the program will use the SQlite db and be able to run on VS Code for example. When it is off, it needs the PostGRESql db to function. Docker Docker is really infuriating lmao. Spent most of my time fixing tiny bugs."}, {"post_id": 74611, "ts": "2026-09-27T19:29:59Z", "hours": 9.5544, "text": "Docker Deployment (ALMOST finished) Hey guys! Docker: I am using Docker for deployment of this system to make it easy for anyone who has a weather station or network of them to showcase and monitor their own data. Docker is a type of virtualization (similar to VMs but instead sharing the kernel) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). (Yes I pulled that explanation from my last devlog lmao). I will have a tutorial in the ReadME. Within the docker stack, there are several containers with different jobs and responsibilities: Web: Hosts the FastAPI webserver. It uses a endpoint (/health) to monitor the servers responses. It is hosted on port 8000 by default (configurable in the .env file). I would forward this through Nginx or a Cloudflare tunnel to host it under your own domain. Scraper: Runs the status and weather scrapers every 15 and 5 minutes (offset by two mins) respectively through a crontab file ( scraper.crontab ). It is run using Supercronic. The scraper waits for the web server as well. Flock is used to prevent two instances of a program. DB: PostgreSQL server that holds all of the data. Weather data, users, etc. All of the other containers wait till the DB is healthy to start. Db_backup: A container created by Prodrigestivill to automate backups of Postgres databases. I have it configured to keep the last month and 14 days of backups. It saves all backups to the /opt/mesonet-backups folder. I wrote scripts in order to test restoring backups (creates test table, restores using latest backup, and deletes it), create a manual backup, and restore the last backup. Email Alerts: Fairly similar to how emails are sent in the status-scraper, it obtains admin recpients from the web sever uses enviroment vairbales to send an email. It asks for subject and text using arguments in the terminal, so the user can send emails manually to admins as well. Health-tests: Runs a couple of health based scripts on a Supercronic schedule. Monthly restore test (runs the restore test mentioned before) and a daily backup health (checks how old the backup is). Emails will be sent to admins if the restore fails or the backup is more than 26 hours old. Persistent Storage: All the containers used volumes that continued even if the containers were deleted to be updated, the data (and the backups) are fine."}, {"post_id": 72413, "ts": "2026-09-22T21:20:07Z", "hours": 8.7489, "text": "Docker and Environment Variables Hey guys! It has been a couple of days… Time Crunch: So I looked on my calendar a week ago and realized that Stardance was almost over, and thought “this is plenty of time”. Then a couple of days ago I really felt the pressure. I wanted to get this out before the program finished so I started on the final bits and deployment to turn this into a usable system. Docker: If you don’t know what docker is, count your lucky stars. Just kidding, its very cool when it works . It is a type of virtualization (similar to VMs but instead sharing the kernal) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). I have worked with docker with pre-built images and containers before and never really went into the DIY portion. This was my first intro into it and I had to do a lot of googling and the such. It was really frustrating and required quite a few head banging. NOTE: I did use AI sometimes (tried as little as I could) to get docker working. You can see me sometimes using it in my lapse recordings, but I tried to keep it closed as long as I could to stop me from using it :D. Environment Variables: I was told that hard coding my config values in a config file was a bad idea…and it makes sense. It took a bit, but once I setup environment variables, oh man did it get so much better. This also makes it a lot easier in docker to setup the container. Very happy about this. Help from a friend! I told this story a couple of weeks ago, but one of my friend’s dad found my repo and left a couple of issues on my page and these were my last two. I really gotta thank him for these ideas."}, {"post_id": 69905, "ts": "2026-09-18T01:25:16Z", "hours": 7.5397, "text": "API Email Calls, Hardware specifications, Docker? Hey guys, School started two weeks ago, so my posts will be a little delayed lol… API Email Calls: I originally hard coded my email lists for Reports, station-specific, admin, and global emails, but I wanted to unify them with the rest of the API. I spent a lot of time creating columns in SQL, endpoint CRUD, settings HTML page CRUD, as well as changing the scrapers to pull the lists and use them. Hardware specifications: I added columns in SQL to add Hardware metadata for the stations. It can be seen in all dashboards (see photo) Docker: I was thinking of creating a docker container for this setup to make deployment easier. Would that be something you guys would like to see? Let me know."}, {"post_id": 59930, "ts": "2026-09-01T23:50:25Z", "hours": 5.4425, "text": "Robots.txt, User login error, API security, credit footer, station hardware Whats up? Robots.txt: For those who don’t know, a “robots.txt” tells scrapers and any bots where they allowed to go on your website. I only allowed them to go on public html pages. However this is only a recommendation, the big guys can do whatever they want. User Login Error: I had this error where any public accounts (or not admins) would get a error when logging in. I was searching for permissions with the wrong column in the database 😅. API Security: I made sure there were no open routes and everything was secured. Credit Footer: This was pretty cool. At the end of ever page, I added this little footer with my name and a link to the github repo. Station Hardware: I added a new column to store station hardware info. This is mainly for what weather station model it is. Ex: Davis Vantage Pro2. I am working on making the update form in the settings page allow to update this info as well as more station info."}, {"post_id": 57799, "ts": "2026-08-30T02:58:26Z", "hours": 6.3317, "text": "Some Help and ReadMe! The project is almost done! (why do I feel like I will be saying that a lot…) Some help! Today I saw interesting post on Facebook about a website someone my age built and I commented it on it asking if I could see the code cause I was curious if they used Flask, FastAPI, etc. I also posted my project and to my surprise, the poster is actually my friend’s dad (small world am I right) and he reviewed my code and left a few issues on it. He even downloaded it to update my requirements.txt. I then merged his request. Thank you for all of your help! ReadMe: I spent all of today working on the readme, you can read it here . However here is a little sneak peak: Hey! My name is Krupam, and I am a nerd. If you are reading this, you are most likely one as well. I love weather, and learning about it. Other people who love weather will create and host Personal Weather Stations (PWS) and post the data to websites like Weather Underground. I have used these stations for my own research projects. Check one out!. In my area, there is a mesonet (regional network of PWS’s) from the Save Barnegat Bay non-profit (check them out, they are awesome!). I have used plenty of their stations in my research. I was given the amazing opportunity to present my research at one of their meetings regarding their mesonet. It was eye-opening! As I listened into the meeting, they discussed one of the current issues; they could never tell when a weather station went down. The station owners would find out days after if not weeks. This program is the solution to that and more. The system is a weather-station data platform and monitoring system. The system collects data from Weather Underground (WU), turns it into usable information, and alerts station owners and administrators when a station needs attention. All data is shown on the website in a easy, user-friendly approach. This includes dashboards, graphing, analysis, scientific tests, and admin controls (accessed through JWT-based auth). The system is coded mostly in Python and there are three main systems: The weather and status scrapers, backend, and frontend website."}, {"post_id": 55719, "ts": "2026-08-27T18:10:45Z", "hours": 8.3564, "text": "Settings Page, API Stations List Call for Scraping System Hey! Here is what I have been up to… Settings Page: This is a Admin only page (will pop up in nav bar when admin) that configures, deletes, creates, the main functionalities. This includes stations and users. After every function is run a error/success message will show with detailed intomation depending on the function. These Functions include: Modify User: Change role, username, password Register User: Create Delete User Read User Assigned Stations: Choose a station, the page will reload and show all stations the user can access. Grant User Access: Choose a user, and give them access to a station. This is view only by default Revoke Access: Remove User access to a specific station. On reload after choosing a user it will show any assigned stations Update User Access: Choose a user, on reload it wil show all available stations and when selected, will show what access it has. You then check/uncheck the access you want it to have and submit. Modify Station: Currently only allows to change station name. Create Station: Enter new id and name as well as options to be public and in maintenance mode (default off). Delete Station: Deletes station only from the current stations. Does not delete data. I need to rewrite this to make it so it stops collecting data instead. Read all Stations: Lists all stations and if they are in maintenance or not API Stations List Call I realized around 11 at night that I did something very dumb. All of the stations in the configs for the Weather and Status scrapers were hard coded values and were NOT synced with the current stations database. To combat this, I added a new column to the Stations database table. This column was called collect_active or something of the sort. I plan to migrate the delete function to turning off the collection. I then changed the scrapers to pull a new current list at every run and used that as their truth. I finished this around 3 AM last night 😭 . If you guys have any other ideas, let me know!"}, {"post_id": 54509, "ts": "2026-08-25T15:13:24Z", "hours": 8.2236, "text": "Admin Settings Page (WIP) Settings Page: Now that the main functionality of the site is finished, I started making HTML representations of all the methods I have predefined. This includes CRUD (create, read, update, and delete) functions for several pieces of the website. Here are the ones I started to make: Reset/Update User password, username, role. Register Users Delete User Read User Assigned Stations Grant User Access to a station Revoke User Acccess to a station Modify User Access to a station. Everything uses HTLM forms and when they submit, they will return a pop up success or error message. There are a couple of other features I forgot that I made (Such happens when coding at ungodly hours) but anyone can try out the website (if I am working on it at the same time) at https://sbb.krupamlab.com"}, {"post_id": 54016, "ts": "2026-08-24T19:16:15Z", "hours": 8.4358, "text": "CSV Downloads, Weather Table, Error Details on pages, and a profile indicator! Let’s jump into it! CSV Downloads: For graphing, analysis, tests, and table pages, I created CSV downloads. Graphing: Downloads raw data Analysis: Downloads analysis summary and raw data Tests: Downloads test results and raw data Weather Tables: Downloads raw data Weather Tables: In the public dashboards, there is now a table at the bottom with all data from the current day. There are quick buttons to go forward and back a day as well as a day input and go button. Profile Indicator: It is just a blank profile picture icon with your username next to it. It only shows when logged in. When clicked it sends you to the my-stations page. Error Details: If there are specific error details in the backend, they will be sent to the error page. Otherwise a generic 40X error will be show"}, {"post_id": 47248, "ts": "2026-08-15T01:38:47Z", "hours": 8.2772, "text": "Testing Page Finished! (without csvs…) HTML Form Bug Fixes: Sup guys, here is what I have been up to… Testing Page: Oh man this was pretty hard. I actually had writers block but for code. I just couldn’t think of a solution. I just sat there trying to think of how to implement the system. With enough brute force however and some breaks, I did manage to get it working. What is it? This page allows the user to run scientific tests. These tests include Linear Regressions, ANOVAS, and T-Tests. Linear Regressions look for a relationship between variables. ANOVAS and T-tests determine if there a difference between groups of data (single variable). Functionality: The form will ask the user to choose a test, station, variable, unit, and time range, as well as test-specific inputs to run a test. Once the user submits the test, it will either return a graphical result (for the Linear Regression) or stats of the T-Test or ANOVA. The Tests will only make groups depending on the same time frame but different stations. (I only decided to do one for simplicity) This all works but I need to create the ability to download the csv of the data used for the tests. General Inputs: Test Type (T-test, ANOVA, Linear Regression) Range Type: (Relative or Date) Last ___ (hours, months, etc) Start and end date Units (Imperial or metric) Test Specific Inputs: When a test is chosen, test-specific inputs appear. (this happens for other forms such as graphing and analysis pages. I just forgot to mention it) The appeared inputs are then required (like the other default inputs like time, etc) but when a different test is choosen the required inputs are updated with the new ones. These include: Linear Regression: Station X Variable Y Variable Regression T-Test: Outcome Variable Station A Station B ANOVAS: Outcome Variable Station A Station B Station C HTML Form Fixes: I went through all of the Forms that have inputs that switch and make them work nicely with the backend. I make inputs that switch be required and seen at the right time."}, {"post_id": 42348, "ts": "2026-08-07T00:58:02Z", "hours": 10.1181, "text": "Testing Page (Still WIP), General Bug Fixing, and Site Cleanup Yikes, I got reaaaal close to hitting the 10 hour limit for these devlogs 😅… Site Cleanup I am really proud of this one. I finally took time to go around and get most of the small detailed squared away. I got the site favicon (small icon in the web tab) and other meta data information fixed (like the .webmanifest) working. I also spent a good chunk of time creating the home page and making it look professional. General Bug Fixing I took some time to go through the website and found some tiny bugs. I also had a few of my friends test out the website (they didnt break it!!!!). Small stuff like making it easier to see the graphs, titles on the tabs, etc. Test Page This page is like the ultimate boss for me haha. I would like this page to contain linear regressions (LR), ANOVAS, and T-tests. These are scientific tests used to find statistical differences in data. (see the below screen shot for a better explanation of all of these tests. The user chooses a station, range mode, range, units, and the type of test. Then based on that test, a few options are given: LR: X Variable Y Variable Title Mode A: Choose 1 station but two time ranges (same variable) Mode B: Choose 2 stations with one time range (same variable) ANOVA: Mode a/b Three or more time ranges/station depending on mode Two ranges/station depending on mode"}, {"post_id": 39249, "ts": "2026-08-02T03:01:23Z", "hours": 8.5142, "text": "A Variable Analysis Page and Graphing with a date system! Hey guys! Here is what I have been up to… Graphing Date System: As well as a “last _ ____” system (relative range), I created a version that allows me to choose “Date Range.” Date Range allows you to choose between two dates. It sounds simple but was a lot harder to code 😅. As I wrote most of the code while being really sleep deprived, take a look over at @app.get(\"/graph/weather/{station_id}\") on the project’s github page. (I recommend using ctrl + f to find it) Variable Analysis Page: This page is pretty similar to the graphing page (see previous devlogs) where it uses a HTML form with query variables to create calculations. The user selects a weather station, variable, range mode (relative or date), inputs for that mode (hours/date, etc) and the units. Then the latest, minimum, maximum, mean, median, range, sample value (n value), and the overall trend (falling, steady, rising, insufficient data). The time will also be shown if applicable (latest value). You can then download a csv of all the data the calculations were derived from. Under that is another box showing the full time the data is collected from as well as the units Future: I still need to add a tab for more advanced analysis such as linear regressions, anovas, t-tests, etc. If you guys have any more ideas, Let me know!!!"}, {"post_id": 35547, "ts": "2026-07-27T01:45:56Z", "hours": 5.8625, "text": "#Graphing Page!!! As well as other bug fixes… Graphing Page This page is created by making a HTML form and submitting as a POST request to the same method that creates the dashboard graphs. All the graph information is a query request (the infomation after a question mark in a url, see photo). This means you can bookmark a graph to see the most recent data with your own personal preset. The user must select the station (from a list), type a title, the time range, (last __ unit), and the variables they would like. They can choose as many variables as they would like. There are also variable type presets a user can choose. It will preset everything to make the graph including the time range and title. Once a graph is generated, it will be displayed with the options to download it as a png, download the csv data, or the clear the graph. I am working on a date range next as well as the analysis page with linear regressions, t-tests, ANOVAS, etc. Bug Fixes I had a couple of friends test out the site to find some bugs, and boy did they deliver. They managed to point out some logical errors I had, and I fixed them."}, {"post_id": 34238, "ts": "2026-07-24T19:31:03Z", "hours": 9.2097, "text": "Owner Dashboard (finished), Maintenace and Public Toggles, Dashboard Graphs, and Graph Page (WIP) A lot has happened, lets dive into it: Owner Dashboard: This dashboard may not look very different from the public dashboard but it hold a lot more features: Status widget with the status time and last status. A green check if online or a red X if not. If offline, no weather data/widgets are shown and instead a gear widget with more information is shown. This includes if a alert was sent, last time connected, first time offline, and consecutive offline checks Maintenance and Public toggles Maintenance toggle: If in maintenance mode, no emails will be sent about the status of the station but it will still be logged. Public toggle: If off, the station will not be shown in the public dashboard list. If you try to go to the url directly it will show a “Station Not available” Page. Dashboard Graphs Graphs are created using Matplotlib and show cased on both dashboards. This includes solar, precipitation, pressure, and temperature graphs. Graphing Page (and analysis) This page is currently being worked on but will allow anyone to choose the time range, variables (yes multiple!), station, and unit. I also want to have a section for analysis like regressions and so on. Lmk how this is looking so far!"}, {"post_id": 33234, "ts": "2026-07-22T23:24:27Z", "hours": 8.8756, "text": "Owner Dashboard (WIP) and Maintenance Toggle Welcome back to a episode of me going insane! :D (jk) Owner Dashboard (WIP) The owner dashboard is a dashboard that is separate from the public dashboards. You must log in to access a page called “My Stations”. This page lists all stations that your account has permission to view. The account that you are using must have the station added by a administrator (rn all of those methods are in the docs. I plan on moving them to html soon) Purpose of Owner Dashboard The owner dashboard holds some extra functionalities based on the status: Online It will show a green or red icon based on the status (along with the circle up by the units toggle) and display the exact time and status of the station. The time of status is separate from weather. If you have the permissions to do so, you can then toggle the maintenance and public modes. (Only maintenance mode has been implemented thus far) The maintenance mode stops any emails from being sent about the station Public mode will allow the station’s public dashboard to be listed on the website. Offline: Shows everything in online*. Does not show weather data Displays how many times the station has been shown to be offline. (consecutive offline) The time of last connection. First offline (this is when the station is set as offline) If an alert email was sent Let me know if you guys have any ideas!"}, {"post_id": 30867, "ts": "2026-07-18T20:24:01Z", "hours": 7.3928, "text": "Public Dashboard and dashboard widgets!!! I had a lot of fun with this… Public Dashboard This is a public webpage anyone (no need to log in) for each station, listing the current weather conditions and status in a nice gui. In here are some widgets I made by myself all in CSS and HTML. (I don’t like JS if you couldn’t tell…) These weather values include: Temperature Dew Point Humidity Precipitation Rate Precipitation Accumulation UV Index Solar Radiation Atmospheric Pressure Wind Speed Wind Gusts Wind Direction Dashboard Widgets: I made a couple of widgets that update based on the values: Temperature Pressure Wind Temperature: A small thermometer that fills up as the temperature gets higher. (I have to rescale it for Celsius) Pressure: A small barometer that changes based on the pressure. The center pressure (29.92) is the atmospheric pressure at sea level. Wind Speed: A little compass shows the cardinal through tertiary wind directions (16 directions). The current wind is represented by the blue arrow. The arrow is where the wind is coming from (how wind is properly notated) Let Me know if you guys have any other ideas, I would love to hear em!"}, {"post_id": 29927, "ts": "2026-07-17T03:08:44Z", "hours": 7.7744, "text": "Working Error Pages, User Updates, Logouts, Weather Post/Weather History and a (partial) public dashboard Been a couple of days guys, here is what I have been up to: Error Pages: Whenever there is some sort of error such as 404 (not found), 401 (unauthorized), 403 (Forbidden), you will get forwarded to error pages. These pages will prompt you to return or log in, depending on the error. User Updates: Admins can know easily update usernames, passwords, roles, etc. However this is still in the API and not a webpage yet. Logouts: When you sign in, your menu bar will no longer have a sign in option (shocker) and has an option to log out. This “new” menu bar is created using jinja2 if-statements in the layout.html. Weather/Weather History: A Weather Underground Scraper (I made this for a seperate project, check it out: https://github.com/Krupamc/weather_underground_datascraper ) gathers weather data for each station (returns a null filled json if station is offline) and posts it to the API. The API stores it in the database. We can access the current weather for each station as a well as the history. The default history is 20 entries but can be extended with queries. Public Dashboard: Now this is the fun one. This pulls the current status, weather values, time (as a date and timestamp in a readable format), as well as wind direction in label format (e.g. NNE) and sends it to the public dashboard. The dashboard then takes the values and puts them in an easy format. It is not finished, I plan to have pressure, temperature, and wind widgets that change based on the current values."}, {"post_id": 27946, "ts": "2026-07-13T21:48:30Z", "hours": 4.7169, "text": "Registration Form, Posting Status, Status History Hola guys! Registration There is now a registration form! It takes in a username and password and creates a user. However this user has no permissions and the person has to contact the admin to give them permissions. (in the future, a regular base user will still be able to do more stuff, see more detailed data maybe? But I don’t want to block data based on accounts. Maybe emails of your favorite stations?) Posting Status When the status checker runs, it will send the results over HTTP post to the database (DB) to be saved. The “current” Status DB model is overwritten by new data, but if there is a change in the status in any way, the change will be saved to the Status History DB Model. Time Another tiny detail is that before the status checker would store time in local time, but I changed that to be UTC time. UTC time is now universal and I plan to display the time in the local timezone based on the browser time zone. Easter Egg I added a easter egg in the website, I wonder if someone will find it… Thanks for reading these devlogs, this is not necessarily a fancy/flashy project and it means a lot when someone does ❤️."}, {"post_id": 27422, "ts": "2026-07-12T23:48:53Z", "hours": 2.1436, "text": "LOGIN FORMS!!! And Station Lists… Hey guys! Whats up? I’ll tell you whats up, the moon. 😅 Dad jokes aside, I am really excited to update you. Login forms…how exciting Wait wait I can explain. It is cool I swear. When you input your credentials into the form and submit it, it will check the database (DB) if you have the right ones. If you don’t you will get the invalid screen shown below (I definitely didn’t forget my own password…). But if you put in the right credentials, you will be given a access_token cookie. This cookie will let you stay logged in till the cookie expires (set for 30 mins ). Once you are logged it, it will direct you to your account dashboard and show you all the stations you have access to. (I didn’t make that one yet but shhhhh) Station List When you click on the Weather Station tab, it will show you a list of every single weather station in the network. Something else cool, whenever you hover/click a button, it will change color. Just fun for me. Save Barnegat Bay I am building this system as a idea I had for the Save Barnegat Bay (SBB) non-profit organization. I utilize their weather stations all of the time for my projects that I love giving back to their mesonet! Once I am finished building this, you will be able to access the SBB weather stations and see weather points as well as graphs and stuff. Oop can’t spoil all of my planned features"}, {"post_id": 27355, "ts": "2026-07-12T20:56:47Z", "hours": 8.9144, "text": "Website Backend, JWT, and HTML Front End Ok, these dev logs keep getting exponentially longer and longer ;-; What the hell is JWT? JWT (JSON Web Token) is a way for my authenticate a user. It essentially is how I can do logins. When a user is registered, their username and hashed password is stored in the SQL database (DB). When someone would like to authenticate, their password is hashed and sent with the username. The DB check if the username and hashed password match and send back a JWT token that expires after a set time (30 mins but configurable). During this time the user would be able access their station dashboard, etc. Admin accounts have the same log in procedure. They however have the power to give each user (based on their user id in the DB) access to specific stations. This includes the ability to see the station dashboard, toggle maintenance mode, and toggle if the station is public (on our site). Backend: Added functions for creating accounts and logging in. Most functions now require either a general account or a admin account. If this is not fulfilled a 401 error is sent (Unauthorized error). As of right now, only admins can register accounts. The access to each station can be updated by a admin at any time. I did some more stuff but I honestly forgot :) HTML Front End This was honestly my favorite part so far. I started by getting the Jinja2 template system to work as well as mounting the static directory. The layout.html file allows me to change it slightly for every page. That is a bad explanation but it is a really cool system. I got the home page done (needs some text and description but thats a later me issue). I am working on getting the general station page. It will list every station and allow you to click on them to get forwarded to that stations public dashboard. Sanity Check? I am having so much fun with HTML. It gives a certain gratification that SQL can’t give. I feel very happy :D Any ideas pls let me know!"}, {"post_id": 26761, "ts": "2026-07-11T18:56:34Z", "hours": 4.8619, "text": "SQL Database, Website Backend, Dashboard When I said a lot last time…that was nothing compared to now ;-; What am I going on about? Well, I wanted a way for station owners to be able to be able to toggle maintenance mode without the admin (whoever deploys this for their own mesonet) directly editing a json file every time. One thing led to another and now I am making a website… Website Plan: This website will run on a FastAPI backend with either Jinja2 or Htmx front-end. There will be a public “dashboard” where anyone can take a look at general station stats and current weather conditions. The weather conditions will also be made graphical with Matplotlib. Historical data will also be accessible. However on the same site, people will be able to log in. Logged in users will be able to access only certain stations they are allotted. They will have a more detailed dashboard with more stats. Certain users will be able to toggle maintenance mode and some won’t. Admin accounts will be able to see and toggle for all stations. Usernames and passwords will be hashed and saved in the database. The log in system will also make use of cookies/sessions to keep the user logged in. Planned SQLite Models users: (DONE) id username password_hash role (admin, station staff, etc) user_station_access user_id station_id can_view can_toggle_maintenance stations: id station_id is_in_maintenance is_public station_status: station_id last_status consec_offline first_offline last_conected alert_sent station_current_weather: temp dew humd wind_speed wind_gust wind_dir pressure precip_rate precip_accum uv solar Progress? I have made all the models and created basic routes. There is a CRUD (Create, Read, Update, and Delete) for the stations based on another config file. On start, the program will automatically create database entries for new stations and delete ones not in the config file."}, {"post_id": 23865, "ts": "2026-07-07T01:43:32Z", "hours": 3.6336, "text": "Monthly Reports, CSVs, and a little bit of Insanity Hey guys, I have done so much, I might go insane haha! Reports? Every first of the month at 8 AM, a email will be sent out to any emails configured for them. They contain various stats such as, which stations are down, which have been down for the longest, uptime percentage, etc. Emails So I just realized that I never explained all the different emails haha. Recipients: Admin: Email(s) configured to recieve only system error emails Global Recipients: Email(s) configured to receive all emails sent by system concerning status. Report Recipients: Email(s) configured to receive monthly emails. E.g. Mesonet maintainers Station Recipients: Email(s) configured separately for each station. E.g. station owners. Email Types: Offline: Sent after a station is recorded off 3 (default) times in a row. Recovery: Sent once a station is detected to be online after being considered offline Reminder: Sent after 7 days (default) to remind of the status. Monthly Reports: Sent at the first of the month at 8 AM (default) with statistics such as which stations had outages, the station with longest, uptime percentage for each station, etc. System Errors: Sent to system admins for any errors detected, HTTP, Requests, Time, etc. CSVs All of the data is logged on a csv as well. Not much to say Insanity Something about sitting around staring at a screen doing like 5 projects on and off makes you a little crazy…on the brightside it is my birthday tomorrow. That means more coding time! ;-;"}, {"post_id": 22449, "ts": "2026-07-04T22:24:34Z", "hours": 3.1547, "text": "Monthly Reports, Maintenance mode, and Reminder Emails: Yolo! Reports? Every month (Rn configured to be the first of the month at 8 AM) a report will be sent for all of the stations with a bunch of stats such as: Total downtime Uptime Percentage of outages Table of outages Longest outage Station with most outages etc. Reminder Emails: Once a station goes down and it has not been resolved in a set amount of days, a reminder email will be resent to the owner Maintenance Mode: Once switched on, emails about status will not be sent for that weather station. Checks will still occur in the background however. In the future, I will create an FastAPI app that will let owners trigger this mode on/off for their station. Suggestions? If you guys have any other ideas, please let me know!"}, {"post_id": 21875, "ts": "2026-07-04T01:26:13Z", "hours": 2.4442, "text": "Error Protection and CSV Logging Long time no see haha! Progress Error Protection through try/excepts and error codes Error codes were creates for the failure points. Any time there is an error, it is emailed to the “admin” email. Every whenever there is an error/email sent/status the data like the station id/name, time, status, etc. is saved (appended) to a csv. All error retry logic is modifiable through the config.py."}, {"post_id": 21793, "ts": "2026-07-03T22:06:04Z", "hours": 1.4372, "text": "IT IS WORKING!!!! Oh my god man. The email notifications were a little annoying to get finished but they are working. The image is more redacted than a Call of Duty game but it is fine. Progress Recovery emails have also been made. Everytime a station is checked, it’s “stats” (such as when their last offline was etc) are updated using a seperate json file. I have mostly spent my time on bug fixing and smoothing out the app."}, {"post_id": 21730, "ts": "2026-07-03T20:26:20Z", "hours": 3.375, "text": "Start! Hey guys! This project is all about improving the experience of personal weather station (PWS) owners. It is a webscraper checking for the status of these weather stations. After it detects it has been off for a while it will email the administrator of the network as well as the owner. (This is a summary, take a look at the project page for a better explanation ;) Progress? The station are scraped and their status is recorded Json files for the current and past status as well as other things is updated/created when the program is run Email notifications (in work) Timestamps in the right timezone (config). Several stations can be checked at once And other stuff I kinda forgot ;-;"}]...
|
Title: Weather Underground Station Status Checker Title: Weather Underground Station Status Checker by @Krupam | Stardance
Devlogs:
Start! Hey guys! This project is all about improving the experience of personal weather station (PWS) owners. It is a webscraper checking for the status of these weather stations. After it detects it has been off for a while it will email the administrator of the network as well as the owner. (This is a summary, take a look at the project page for a better explanation ;) Progress? The station are scraped and their status is recorded Json files for the current and past status as well as other things is updated/created when the program is run Email notifications (in work) Timestamps in the right timezone (config). Several stations can be checked at once And other stuff I kinda forgot ;-;
IT IS WORKING!!!! Oh my god man. The email notifications were a little annoying to get finished but they are working. The image is more redacted than a Call of Duty game but it is fine. Progress Recovery emails have also been made. Everytime a station is checked, it’s “stats” (such as when their last offline was etc) are updated using a seperate json file. I have mostly spent my time on bug fixing and smoothing out the app.
Error Protection and CSV Logging Long time no see haha! Progress Error Protection through try/excepts and error codes Error codes were creates for the failure points. Any time there is an error, it is emailed to the “admin” email. Every whenever there is an error/email sent/status the data like the station id/name, time, status, etc. is saved (appended) to a csv. All error retry logic is modifiable through the config.py.
Monthly Reports, Maintenance mode, and Reminder Emails: Yolo! Reports? Every month (Rn configured to be the first of the month at 8 AM) a report will be sent for all of the stations with a bunch of stats such as: Total downtime Uptime Percentage of outages Table of outages Longest outage Station with most outages etc. Reminder Emails: Once a station goes down and it has not been resolved in a set amount of days, a reminder email will be resent to the owner Maintenance Mode: Once switched on, emails about status will not be sent for that weather station. Checks will still occur in the background however. In the future, I will create an FastAPI app that will let owners trigger this mode on/off for their station. Suggestions? If you guys have any other ideas, please let me know!
Monthly Reports, CSVs, and a little bit of Insanity Hey guys, I have done so much, I might go insane haha! Reports? Every first of the month at 8 AM, a email will be sent out to any emails configured for them. They contain various stats such as, which stations are down, which have been down for the longest, uptime percentage, etc. Emails So I just realized that I never explained all the different emails haha. Recipients: Admin: Email(s) configured to recieve only system error emails Global Recipients: Email(s) configured to receive all emails sent by system concerning status. Report Recipients: Email(s) configured to receive monthly emails. E.g. Mesonet maintainers Station Recipients: Email(s) configured separately for each station. E.g. station owners. Email Types: Offline: Sent after a station is recorded off 3 (default) times in a row. Recovery: Sent once a station is detected to be online after being considered offline Reminder: Sent after 7 days (default) to remind of the status. Monthly Reports: Sent at the first of the month at 8 AM (default) with statistics such as which stations had outages, the station with longest, uptime percentage for each station, etc. System Errors: Sent to system admins for any errors detected, HTTP, Requests, Time, etc. CSVs All of the data is logged on a csv as well. Not much to say Insanity Something about sitting around staring at a screen doing like 5 projects on and off makes you a little crazy…on the brightside it is my birthday tomorrow. That means more coding time! ;-;
SQL Database, Website Backend, Dashboard When I said a lot last time…that was nothing compared to now ;-; What am I going on about? Well, I wanted a way for station owners to be able to be able to toggle maintenance mode without the admin (whoever deploys this for their own mesonet) directly editing a json file every time. One thing led to another and now I am making a website… Website Plan: This website will run on a FastAPI backend with either Jinja2 or Htmx front-end. There will be a public “dashboard” where anyone can take a look at general station stats and current weather conditions. The weather conditions will also be made graphical with Matplotlib. Historical data will also be accessible. However on the same site, people will be able to log in. Logged in users will be able to access only certain stations they are allotted. They will have a more detailed dashboard with more stats. Certain users will be able to toggle maintenance mode and some won’t. Admin accounts will be able to see and toggle for all stations. Usernames and passwords will be hashed and saved in the database. The log in system will also make use of cookies/sessions to keep the user logged in. Planned SQLite Models users: (DONE) id username password_hash role (admin, station staff, etc) user_station_access user_id station_id can_view can_toggle_maintenance stations: id station_id is_in_maintenance is_public station_status: station_id last_status consec_offline first_offline last_conected alert_sent station_current_weather: temp dew humd wind_speed wind_gust wind_dir pressure precip_rate precip_accum uv solar Progress? I have made all the models and created basic routes. There is a CRUD (Create, Read, Update, and Delete) for the stations based on another config file. On start, the program will automatically create database entries for new stations and delete ones not in the config file.
Website Backend, JWT, and HTML Front End Ok, these dev logs keep getting exponentially longer and longer ;-; What the hell is JWT? JWT (JSON Web Token) is a way for my authenticate a user. It essentially is how I can do logins. When a user is registered, their username and hashed password is stored in the SQL database (DB). When someone would like to authenticate, their password is hashed and sent with the username. The DB check if the username and hashed password match and send back a JWT token that expires after a set time (30 mins but configurable). During this time the user would be able access their station dashboard, etc. Admin accounts have the same log in procedure. They however have the power to give each user (based on their user id in the DB) access to specific stations. This includes the ability to see the station dashboard, toggle maintenance mode, and toggle if the station is public (on our site). Backend: Added functions for creating accounts and logging in. Most functions now require either a general account or a admin account. If this is not fulfilled a 401 error is sent (Unauthorized error). As of right now, only admins can register accounts. The access to each station can be updated by a admin at any time. I did some more stuff but I honestly forgot :) HTML Front End This was honestly my favorite part so far. I started by getting the Jinja2 template system to work as well as mounting the static directory. The layout.html file allows me to change it slightly for every page. That is a bad explanation but it is a really cool system. I got the home page done (needs some text and description but thats a later me issue). I am working on getting the general station page. It will list every station and allow you to click on them to get forwarded to that stations public dashboard. Sanity Check? I am having so much fun with HTML. It gives a certain gratification that SQL can’t give. I feel very happy :D Any ideas pls let me know!
LOGIN FORMS!!! And Station Lists… Hey guys! Whats up? I’ll tell you whats up, the moon. 😅 Dad jokes aside, I am really excited to update you. Login forms…how exciting Wait wait I can explain. It is cool I swear. When you input your credentials into the form and submit it, it will check the database (DB) if you have the right ones. If you don’t you will get the invalid screen shown below (I definitely didn’t forget my own password…). But if you put in the right credentials, you will be given a access_token cookie. This cookie will let you stay logged in till the cookie expires (set for 30 mins ). Once you are logged it, it will direct you to your account dashboard and show you all the stations you have access to. (I didn’t make that one yet but shhhhh) Station List When you click on the Weather Station tab, it will show you a list of every single weather station in the network. Something else cool, whenever you hover/click a button, it will change color. Just fun for me. Save Barnegat Bay I am building this system as a idea I had for the Save Barnegat Bay (SBB) non-profit organization. I utilize their weather stations all of the time for my projects that I love giving back to their mesonet! Once I am finished building this, you will be able to access the SBB weather stations and see weather points as well as graphs and stuff. Oop can’t spoil all of my planned features
Registration Form, Posting Status, Status History Hola guys! Registration There is now a registration form! It takes in a username and password and creates a user. However this user has no permissions and the person has to contact the admin to give them permissions. (in the future, a regular base user will still be able to do more stuff, see more detailed data maybe? But I don’t want to block data based on accounts. Maybe emails of your favorite stations?) Posting Status When the status checker runs, it will send the results over HTTP post to the database (DB) to be saved. The “current” Status DB model is overwritten by new data, but if there is a change in the status in any way, the change will be saved to the Status History DB Model. Time Another tiny detail is that before the status checker would store time in local time, but I changed that to be UTC time. UTC time is now universal and I plan to display the time in the local timezone based on the browser time zone. Easter Egg I added a easter egg in the website, I wonder if someone will find it… Thanks for reading these devlogs, this is not necessarily a fancy/flashy project and it means a lot when someone does ❤️.
Working Error Pages, User Updates, Logouts, Weather Post/Weather History and a (partial) public dashboard Been a couple of days guys, here is what I have been up to: Error Pages: Whenever there is some sort of error such as 404 (not found), 401 (unauthorized), 403 (Forbidden), you will get forwarded to error pages. These pages will prompt you to return or log in, depending on the error. User Updates: Admins can know easily update usernames, passwords, roles, etc. However this is still in the API and not a webpage yet. Logouts: When you sign in, your menu bar will no longer have a sign in option (shocker) and has an option to log out. This “new” menu bar is created using jinja2 if-statements in the layout.html. Weather/Weather History: A Weather Underground Scraper (I made this for a seperate project, check it out: https://github.com/Krupamc/weather_underground_datascraper ) gathers weather data for each station (returns a null filled json if station is offline) and posts it to the API. The API stores it in the database. We can access the current weather for each station as a well as the history. The default history is 20 entries but can be extended with queries. Public Dashboard: Now this is the fun one. This pulls the current status, weather values, time (as a date and timestamp in a readable format), as well as wind direction in label format (e.g. NNE) and sends it to the public dashboard. The dashboard then takes the values and puts them in an easy format. It is not finished, I plan to have pressure, temperature, and wind widgets that change based on the current values.
Public Dashboard and dashboard widgets!!! I had a lot of fun with this… Public Dashboard This is a public webpage anyone (no need to log in) for each station, listing the current weather conditions and status in a nice gui. In here are some widgets I made by myself all in CSS and HTML. (I don’t like JS if you couldn’t tell…) These weather values include: Temperature Dew Point Humidity Precipitation Rate Precipitation Accumulation UV Index Solar Radiation Atmospheric Pressure Wind Speed Wind Gusts Wind Direction Dashboard Widgets: I made a couple of widgets that update based on the values: Temperature Pressure Wind Temperature: A small thermometer that fills up as the temperature gets higher. (I have to rescale it for Celsius) Pressure: A small barometer that changes based on the pressure. The center pressure (29.92) is the atmospheric pressure at sea level. Wind Speed: A little compass shows the cardinal through tertiary wind directions (16 directions). The current wind is represented by the blue arrow. The arrow is where the wind is coming from (how wind is properly notated) Let Me know if you guys have any other ideas, I would love to hear em!
Owner Dashboard (WIP) and Maintenance Toggle Welcome back to a episode of me going insane! :D (jk) Owner Dashboard (WIP) The owner dashboard is a dashboard that is separate from the public dashboards. You must log in to access a page called “My Stations”. This page lists all stations that your account has permission to view. The account that you are using must have the station added by a administrator (rn all of those methods are in the docs. I plan on moving them to html soon) Purpose of Owner Dashboard The owner dashboard holds some extra functionalities based on the status: Online It will show a green or red icon based on the status (along with the circle up by the units toggle) and display the exact time and status of the station. The time of status is separate from weather. If you have the permissions to do so, you can then toggle the maintenance and public modes. (Only maintenance mode has been implemented thus far) The maintenance mode stops any emails from being sent about the station Public mode will allow the station’s public dashboard to be listed on the website. Offline: Shows everything in online*. Does not show weather data Displays how many times the station has been shown to be offline. (consecutive offline) The time of last connection. First offline (this is when the station is set as offline) If an alert email was sent Let me know if you guys have any ideas!
Owner Dashboard (finished), Maintenace and Public Toggles, Dashboard Graphs, and Graph Page (WIP) A lot has happened, lets dive into it: Owner Dashboard: This dashboard may not look very different from the public dashboard but it hold a lot more features: Status widget with the status time and last status. A green check if online or a red X if not. If offline, no weather data/widgets are shown and instead a gear widget with more information is shown. This includes if a alert was sent, last time connected, first time offline, and consecutive offline checks Maintenance and Public toggles Maintenance toggle: If in maintenance mode, no emails will be sent about the status of the station but it will still be logged. Public toggle: If off, the station will not be shown in the public dashboard list. If you try to go to the url directly it will show a “Station Not available” Page. Dashboard Graphs Graphs are created using Matplotlib and show cased on both dashboards. This includes solar, precipitation, pressure, and temperature graphs. Graphing Page (and analysis) This page is currently being worked on but will allow anyone to choose the time range, variables (yes multiple!), station, and unit. I also want to have a section for analysis like regressions and so on. Lmk how this is looking so far!
#Graphing Page!!! As well as other bug fixes… Graphing Page This page is created by making a HTML form and submitting as a POST request to the same method that creates the dashboard graphs. All the graph information is a query request (the infomation after a question mark in a url, see photo). This means you can bookmark a graph to see the most recent data with your own personal preset. The user must select the station (from a list), type a title, the time range, (last __ unit), and the variables they would like. They can choose as many variables as they would like. There are also variable type presets a user can choose. It will preset everything to make the graph including the time range and title. Once a graph is generated, it will be displayed with the options to download it as a png, download the csv data, or the clear the graph. I am working on a date range next as well as the analysis page with linear regressions, t-tests, ANOVAS, etc. Bug Fixes I had a couple of friends test out the site to find some bugs, and boy did they deliver. They managed to point out some logical errors I had, and I fixed them.
A Variable Analysis Page and Graphing with a date system! Hey guys! Here is what I have been up to… Graphing Date System: As well as a “last _ ____” system (relative range), I created a version that allows me to choose “Date Range.” Date Range allows you to choose between two dates. It sounds simple but was a lot harder to code 😅. As I wrote most of the code while being really sleep deprived, take a look over at @app.get("/graph/weather/{station_id}") on the project’s github page. (I recommend using ctrl + f to find it) Variable Analysis Page: This page is pretty similar to the graphing page (see previous devlogs) where it uses a HTML form with query variables to create calculations. The user selects a weather station, variable, range mode (relative or date), inputs for that mode (hours/date, etc) and the units. Then the latest, minimum, maximum, mean, median, range, sample value (n value), and the overall trend (falling, steady, rising, insufficient data). The time will also be shown if applicable (latest value). You can then download a csv of all the data the calculations were derived from. Under that is another box showing the full time the data is collected from as well as the units Future: I still need to add a tab for more advanced analysis such as linear regressions, anovas, t-tests, etc. If you guys have any more ideas, Let me know!!!
Testing Page (Still WIP), General Bug Fixing, and Site Cleanup Yikes, I got reaaaal close to hitting the 10 hour limit for these devlogs 😅… Site Cleanup I am really proud of this one. I finally took time to go around and get most of the small detailed squared away. I got the site favicon (small icon in the web tab) and other meta data information fixed (like the .webmanifest) working. I also spent a good chunk of time creating the home page and making it look professional. General Bug Fixing I took some time to go through the website and found some tiny bugs. I also had a few of my friends test out the website (they didnt break it!!!!). Small stuff like making it easier to see the graphs, titles on the tabs, etc. Test Page This page is like the ultimate boss for me haha. I would like this page to contain linear regressions (LR), ANOVAS, and T-tests. These are scientific tests used to find statistical differences in data. (see the below screen shot for a better explanation of all of these tests. The user chooses a station, range mode, range, units, and the type of test. Then based on that test, a few options are given: LR: X Variable Y Variable Title Mode A: Choose 1 station but two time ranges (same variable) Mode B: Choose 2 stations with one time range (same variable) ANOVA: Mode a/b Three or more time ranges/station depending on mode Two ranges/station depending on mode
Testing Page Finished! (without csvs…) HTML Form Bug Fixes: Sup guys, here is what I have been up to… Testing Page: Oh man this was pretty hard. I actually had writers block but for code. I just couldn’t think of a solution. I just sat there trying to think of how to implement the system. With enough brute force however and some breaks, I did manage to get it working. What is it? This page allows the user to run scientific tests. These tests include Linear Regressions, ANOVAS, and T-Tests. Linear Regressions look for a relationship between variables. ANOVAS and T-tests determine if there a difference between groups of data (single variable). Functionality: The form will ask the user to choose a test, station, variable, unit, and time range, as well as test-specific inputs to run a test. Once the user submits the test, it will either return a graphical result (for the Linear Regression) or stats of the T-Test or ANOVA. The Tests will only make groups depending on the same time frame but different stations. (I only decided to do one for simplicity) This all works but I need to create the ability to download the csv of the data used for the tests. General Inputs: Test Type (T-test, ANOVA, Linear Regression) Range Type: (Relative or Date) Last ___ (hours, months, etc) Start and end date Units (Imperial or metric) Test Specific Inputs: When a test is chosen, test-specific inputs appear. (this happens for other forms such as graphing and analysis pages. I just forgot to mention it) The appeared inputs are then required (like the other default inputs like time, etc) but when a different test is choosen the required inputs are updated with the new ones. These include: Linear Regression: Station X Variable Y Variable Regression T-Test: Outcome Variable Station A Station B ANOVAS: Outcome Variable Station A Station B Station C HTML Form Fixes: I went through all of the Forms that have inputs that switch and make them work nicely with the backend. I make inputs that switch be required and seen at the right time.
CSV Downloads, Weather Table, Error Details on pages, and a profile indicator! Let’s jump into it! CSV Downloads: For graphing, analysis, tests, and table pages, I created CSV downloads. Graphing: Downloads raw data Analysis: Downloads analysis summary and raw data Tests: Downloads test results and raw data Weather Tables: Downloads raw data Weather Tables: In the public dashboards, there is now a table at the bottom with all data from the current day. There are quick buttons to go forward and back a day as well as a day input and go button. Profile Indicator: It is just a blank profile picture icon with your username next to it. It only shows when logged in. When clicked it sends you to the my-stations page. Error Details: If there are specific error details in the backend, they will be sent to the error page. Otherwise a generic 40X error will be show
Admin Settings Page (WIP) Settings Page: Now that the main functionality of the site is finished, I started making HTML representations of all the methods I have predefined. This includes CRUD (create, read, update, and delete) functions for several pieces of the website. Here are the ones I started to make: Reset/Update User password, username, role. Register Users Delete User Read User Assigned Stations Grant User Access to a station Revoke User Acccess to a station Modify User Access to a station. Everything uses HTLM forms and when they submit, they will return a pop up success or error message. There are a couple of other features I forgot that I made (Such happens when coding at ungodly hours) but anyone can try out the website (if I am working on it at the same time) at https://sbb.krupamlab.com
Settings Page, API Stations List Call for Scraping System Hey! Here is what I have been up to… Settings Page: This is a Admin only page (will pop up in nav bar when admin) that configures, deletes, creates, the main functionalities. This includes stations and users. After every function is run a error/success message will show with detailed intomation depending on the function. These Functions include: Modify User: Change role, username, password Register User: Create Delete User Read User Assigned Stations: Choose a station, the page will reload and show all stations the user can access. Grant User Access: Choose a user, and give them access to a station. This is view only by default Revoke Access: Remove User access to a specific station. On reload after choosing a user it will show any assigned stations Update User Access: Choose a user, on reload it wil show all available stations and when selected, will show what access it has. You then check/uncheck the access you want it to have and submit. Modify Station: Currently only allows to change station name. Create Station: Enter new id and name as well as options to be public and in maintenance mode (default off). Delete Station: Deletes station only from the current stations. Does not delete data. I need to rewrite this to make it so it stops collecting data instead. Read all Stations: Lists all stations and if they are in maintenance or not API Stations List Call I realized around 11 at night that I did something very dumb. All of the stations in the configs for the Weather and Status scrapers were hard coded values and were NOT synced with the current stations database. To combat this, I added a new column to the Stations database table. This column was called collect_active or something of the sort. I plan to migrate the delete function to turning off the collection. I then changed the scrapers to pull a new current list at every run and used that as their truth. I finished this around 3 AM last night 😭 . If you guys have any other ideas, let me know!
Some Help and ReadMe! The project is almost done! (why do I feel like I will be saying that a lot…) Some help! Today I saw interesting post on Facebook about a website someone my age built and I commented it on it asking if I could see the code cause I was curious if they used Flask, FastAPI, etc. I also posted my project and to my surprise, the poster is actually my friend’s dad (small world am I right) and he reviewed my code and left a few issues on it. He even downloaded it to update my requirements.txt. I then merged his request. Thank you for all of your help! ReadMe: I spent all of today working on the readme, you can read it here . However here is a little sneak peak: Hey! My name is Krupam, and I am a nerd. If you are reading this, you are most likely one as well. I love weather, and learning about it. Other people who love weather will create and host Personal Weather Stations (PWS) and post the data to websites like Weather Underground. I have used these stations for my own research projects. Check one out!. In my area, there is a mesonet (regional network of PWS’s) from the Save Barnegat Bay non-profit (check them out, they are awesome!). I have used plenty of their stations in my research. I was given the amazing opportunity to present my research at one of their meetings regarding their mesonet. It was eye-opening! As I listened into the meeting, they discussed one of the current issues; they could never tell when a weather station went down. The station owners would find out days after if not weeks. This program is the solution to that and more. The system is a weather-station data platform and monitoring system. The system collects data from Weather Underground (WU), turns it into usable information, and alerts station owners and administrators when a station needs attention. All data is shown on the website in a easy, user-friendly approach. This includes dashboards, graphing, analysis, scientific tests, and admin controls (accessed through JWT-based auth). The system is coded mostly in Python and there are three main systems: The weather and status scrapers, backend, and frontend website.
Robots.txt, User login error, API security, credit footer, station hardware Whats up? Robots.txt: For those who don’t know, a “robots.txt” tells scrapers and any bots where they allowed to go on your website. I only allowed them to go on public html pages. However this is only a recommendation, the big guys can do whatever they want. User Login Error: I had this error where any public accounts (or not admins) would get a error when logging in. I was searching for permissions with the wrong column in the database 😅. API Security: I made sure there were no open routes and everything was secured. Credit Footer: This was pretty cool. At the end of ever page, I added this little footer with my name and a link to the github repo. Station Hardware: I added a new column to store station hardware info. This is mainly for what weather station model it is. Ex: Davis Vantage Pro2. I am working on making the update form in the settings page allow to update this info as well as more station info.
API Email Calls, Hardware specifications, Docker? Hey guys, School started two weeks ago, so my posts will be a little delayed lol… API Email Calls: I originally hard coded my email lists for Reports, station-specific, admin, and global emails, but I wanted to unify them with the rest of the API. I spent a lot of time creating columns in SQL, endpoint CRUD, settings HTML page CRUD, as well as changing the scrapers to pull the lists and use them. Hardware specifications: I added columns in SQL to add Hardware metadata for the stations. It can be seen in all dashboards (see photo) Docker: I was thinking of creating a docker container for this setup to make deployment easier. Would that be something you guys would like to see? Let me know.
Docker and Environment Variables Hey guys! It has been a couple of days… Time Crunch: So I looked on my calendar a week ago and realized that Stardance was almost over, and thought “this is plenty of time”. Then a couple of days ago I really felt the pressure. I wanted to get this out before the program finished so I started on the final bits and deployment to turn this into a usable system. Docker: If you don’t know what docker is, count your lucky stars. Just kidding, its very cool when it works . It is a type of virtualization (similar to VMs but instead sharing the kernal) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). I have worked with docker with pre-built images and containers before and never really went into the DIY portion. This was my first intro into it and I had to do a lot of googling and the such. It was really frustrating and required quite a few head banging. NOTE: I did use AI sometimes (tried as little as I could) to get docker working. You can see me sometimes using it in my lapse recordings, but I tried to keep it closed as long as I could to stop me from using it :D. Environment Variables: I was told that hard coding my config values in a config file was a bad idea…and it makes sense. It took a bit, but once I setup environment variables, oh man did it get so much better. This also makes it a lot easier in docker to setup the container. Very happy about this. Help from a friend! I told this story a couple of weeks ago, but one of my friend’s dad found my repo and left a couple of issues on my page and these were my last two. I really gotta thank him for these ideas.
Docker Deployment (ALMOST finished) Hey guys! Docker: I am using Docker for deployment of this system to make it easy for anyone who has a weather station or network of them to showcase and monitor their own data. Docker is a type of virtualization (similar to VMs but instead sharing the kernel) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). (Yes I pulled that explanation from my last devlog lmao). I will have a tutorial in the ReadME. Within the docker stack, there are several containers with different jobs and responsibilities: Web: Hosts the FastAPI webserver. It uses a endpoint (/health) to monitor the servers responses. It is hosted on port 8000 by default (configurable in the .env file). I would forward this through Nginx or a Cloudflare tunnel to host it under your own domain. Scraper: Runs the status and weather scrapers every 15 and 5 minutes (offset by two mins) respectively through a crontab file ( scraper.crontab ). It is run using Supercronic. The scraper waits for the web server as well. Flock is used to prevent two instances of a program. DB: PostgreSQL server that holds all of the data. Weather data, users, etc. All of the other containers wait till the DB is healthy to start. Db_backup: A container created by Prodrigestivill to automate backups of Postgres databases. I have it configured to keep the last month and 14 days of backups. It saves all backups to the /opt/mesonet-backups folder. I wrote scripts in order to test restoring backups (creates test table, restores using latest backup, and deletes it), create a manual backup, and restore the last backup. Email Alerts: Fairly similar to how emails are sent in the status-scraper, it obtains admin recpients from the web sever uses enviroment vairbales to send an email. It asks for subject and text using arguments in the terminal, so the user can send emails manually to admins as well. Health-tests: Runs a couple of health based scripts on a Supercronic schedule. Monthly restore test (runs the restore test mentioned before) and a daily backup health (checks how old the backup is). Emails will be sent to admins if the restore fails or the backup is more than 26 hours old. Persistent Storage: All the containers used volumes that continued even if the containers were deleted to be updated, the data (and the backups) are fine.
Map! And Develop mode Map I used ArcGIS’s JS to create a map tab that show cases all stations that have a latitude and longitude value. I am working on getting them on the first ever scrape but you can also edit them within the settings page. There is a link that takes you to the station page as well. Develop Mode Created a toggle within the .env file. If on, the program will use the SQlite db and be able to run on VS Code for example. When it is off, it needs the PostGRESql db to function. Docker Docker is really infuriating lmao. Spent most of my time fixing tiny bugs.
Weather Emails, mobile tweaks, map zoom Soooooooooooooo close to shipping. Map Zoom: The Map will now automatically zoom based the center of the points. Humidity and Dew point data collection: The place the data was being scraped from got changed so I had to update the logic. Weather Emails: Created another CRUD for another email list. This list will get a monthly email summarizing the weather for the past 30 days for each of the stations. I created the web page for it, but need to finish cleaning it up, allowing people to sign up for the service and make the emails send automaticcally. Mobile Tweaks: The mobile version of the website did not look good. I spent a lot of time trying to fix it before I was able to get it to look like this!...
|
1792799654.0079603
|
1793404454.0079603
|
|
60085
|
Roblox Sword Game by @OrionB | Stardance
|
OrionB
|
0
|
179.43
|
0
|
[]
|
[{"post_id": 64671, "ts": "202 [{"post_id": 64671, "ts": "2026-09-09T08:12:36Z", "hours": 179.43, "text": "Working on UI and Hidden Boss Fight, also will post more screenshots of the game once its finished I don’t want to leak the concept #girlboss #gatekeep #imaguy. However a lot of time has been put into the systems of this and creating the UI and animations and sounds and makng the game fun and there are also a lot of easter eggs which I’ll actually post some of the easter eggs here."}]...
|
Title: Roblox Sword Game by @OrionB | Stardance
D Title: Roblox Sword Game by @OrionB | Stardance
Devlogs:
Working on UI and Hidden Boss Fight, also will post more screenshots of the game once its finished I don’t want to leak the concept #girlboss #gatekeep #imaguy. However a lot of time has been put into the systems of this and creating the UI and animations and sounds and makng the game fun and there are also a lot of easter eggs which I’ll actually post some of the easter eggs here....
|
1792421710.721326
|
1793026510.721326
|
|
8111
|
Poorup.io by @jeremy | Stardance
|
jeremy
|
3
|
179.0
|
2137
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-06T17:48:41Z", "hours": 135.0, "multiplier": 18.44, "payout": 1778, "blessing": "neutral", "text": "Poorup — Biggest Update to date I’ve given the project a major overhaul, from its visual identity and everything else. This is geninuly one of the best projects i have created and iam proud to announce it I first started Poorup 3 and 1/2 months ago as a project to get introcude into webdesing and since then i have created 4 more website and revesiting it really shows my growth. Of course Ai was used by even then I could really feel my growth What was challening i decide to stay on CSS, html, and js instead of transferring it into another language for a simple reason i wanted to test how far i can push these 3 languages( i was just to lazy to learn a new language) How I used AI AI WAS USED IN THIS PROJECT for debugging and coding no UI or art generation. AI was a substantial coding and debugging tool, especially for backend work, bot logic, and tricky multiplayer edge cases. I used CodeScene to identify code-health hotspots. I wrote many page-specific backend features myself, then used GPT/Codex to help debug or split some larger hotspot files into smaller modules. Ai was also used to fix bugs in the Ipad Ui I created Poorup’s frontend UI and its SVG and art assets myself. AI helped in coding but never touched art. I didn’t compose the soundtrack. I selected open-source and other openly licensed tracks; their sources and license details are in the audio credits . I also rewrote the Git history to make the repository cleaner, so the current commit log isn’t a complete record of the project’s development. Also after around the 6th or 7th devlog i turned ai traccking of as to not fraud myself hours So if needed deplete hours. What’s new in this patch UI Full ui rework of everything nothing was left out every single Ui elemt was redone by scratch, with upto 6 themse each with their own custom soundtrack and background, this was the largest wish people had wished for when they reviewed my game and iam so proud of the UI. Boards and multiplayer New 40 and Metro-52 boards, with custom visual themes. Public rooms and private rooms with shareable codes; people can join as guests. Configurable rules, including double rent, vacation cash, even building, and randomized turn order. A deeper economy system Bank loans, player-to-player loans, equity deals, and hybrid contracts, with collateral and default consequences. Sponsored purchases: one player can fund another player’s property purchase in exchange for an agreed share. Negotiating now youre able to negotiate all offers you get instead of accepting or declining on the spot you can also keep them on hold An optional stock market for all the quant bros(gamblers) casino so now youre able to gamble Social I also added a full social systems with achievements, friends inviting people to lobbys seeing match history and more, also added the option to create your own 16x16 user icon Events one of the biggest features I decided to add global events which appear under certain conditions like to many houses standing which should reference the 2008 housing crises i also added stock market crash and alot more. Also global events can also combine to create seacil ones Parlor patrol this was supposed to be a cool minigame while waiting for your friends but it doesnt work and i cant fix the bug for the life of me so you can test it out but it doesnt work correclty all svg assets for it exist", "repo": "https://github.com/jeremy341/Poorup/", "demo": "https://poorup.jeremy-d.hackclub.app/"}, {"ship_num": 2, "ts": "2026-08-11T21:30:56Z", "hours": 7.0, "multiplier": 15.34, "payout": 115, "blessing": "neutral", "text": "Project Update I didnt even notice but all the changes i did i the last patches never got shipped so this one is about the last to changes which were adding modals, creating new UI and removing AI code check it out https://poorup.jeremy-d.hackclub.app/", "repo": "https://github.com/jeremy341/Poorup/", "demo": "https://poorup.jeremy-d.hackclub.app/"}, {"ship_num": 3, "ts": "2026-06-17T14:42:48Z", "hours": 17.0, "multiplier": 14.39, "payout": 244, "blessing": "neutral", "text": "Poorup Poorup is a real-time multiplayer board game inspired by Richup(Monopoly), playable entirely in the browser What did I make? A full multiplayer board game running on a Node.js server with Socket.IO for real-time communication. The client is pure HTML, CSS, and JavaScript, no frameworks which is stupid if I look back on it . Features include: Room-based lobbies with a shareable room code Full Monopoly-style rules: buying, renting, building houses and hotels, mortgaging, and trading Live auctions with a countdown timer when a property is declined Configurable game rules per room (double rent, vacation cash, even build, auction, mortgage, randomized turn order, no rent in jail) Reconnect support — if you disconnect mid-turn, you can rejoin and resume In-game chat Automatic room cleanup when everyone leaves What was challenging? Shared states across multiple clients. Every player action, rolling dice, buying a property, placing a bid, has to be read server-side, broadcast to everyone, and reflected correctly on each client without race conditions or desync. Getting that right, especially during edge cases, took a lot of work. Edge cases in disconnects. A player disconnecting mid-auction is a different problem than disconnecting on their turn, which is different from the host disconnecting entirely. Each case needed its own handling: timers need to be cleared, pending actions need to be resolved, and remaining players need to stay in a valid game state. and i need alot of time and a bit of AI to fix that for me. Building a complete game UI with vanilla CSS. No component library, no utility framework — every modal, toggle, property card, and animation is hand-written. Honestly needed a lot of AI help here. Probally should have used a libary if I look back at it but it was fun to do it in plain CSS also for anyone wondering why the favicon is the one from vite i never deleted it and i wasnt in the mode to redesign a new one and tried to use the board map but that didnt work for some reason. What am I proud of? The architecture. The game logic lives entirely in gameLogic.js and has no knowledge of sockets or HTTP. The server in server.js wires events to logic calls and broadcasts the results. That separation made the codebase much easier to debug than it would have been otherwise but i needed AI to implement the idea i had the idea but wasnt quite able to do it. How to test it git clone https://github.com/jeremy341/Poorup.git cd Poorup npm install npm start Then open http://localhost:8080 in two separate tabs or browser windows.", "repo": "https://github.com/jeremy341/Poorup/", "demo": "https://poorup.jeremy-d.hackclub.app/"}]...
|
[{"post_id": 81740, "ts": "202 [{"post_id": 81740, "ts": "2026-10-22T09:55:56Z", "hours": 9.6928, "text": "Rework #1 Now you could be asking yourself? What have i done in the last 8 days to not post? Well Iam nearly finished with the full rework off all UI, Bug fixing and introducing new features, Chart Engine So i redid the whole system for charts and decided to build my own, because though i had one which worked it looked horrendous and really didnt fit poorup, you can see the new chart engine in the screenshot Game history I redid the whole entire game history system, because to be honest it was heavily vibed including its Ui and while cheking it, it looked like trash so I sat myself down and worked tiresly to fully redo it, and I even implemented the new chart system into it, Modals, Modals, Modals So I REDID NEARLY EVERY SINGLE MODAL IN THE GAME to provide a better User experience this took hella long and while doing it i noticed i had hackatime tracking off, because i had been working on some personal projects, hence the reason I only posted now because I lost so many hours, #Next Features Well to be honest there really arent anymore features i can add, the only thing left is fixing bugs and preparing it for the release and advertising it on reddit"}, {"post_id": 79607, "ts": "2026-10-14T18:07:25Z", "hours": 10.3072, "text": "Devlog after ship So after getting hella positive feedback regarding poorup which i highly appreciate my aim is to now make it have an even better user experience and etc. why? cause from the feedback i got, there are 3 areas I need to tackle, UI, game logic which is to complex and the User experience including rules and etc, Full redesign of the ingame lobby So after getting feedback that the board was to smallwhich was kinda expected and that the whole game is just clutered which i also assumed would happen cause all the features dont fit into the game i have done the following. I have redesigned the full ingame lobby with a new layout further inspired by richup(didnt want to do this but they have the most optimial layout) I have also redone the whole entire admin window cause to be honest it was horrondous and hard to use, and also just some small changes all around full redesign of modals so after doing the lobby i have now decided to fully redo a lot of the modal to have a better layout and etc so they are way more user friendly and acttually easy to understand, this also included cutting alot of features from certain modals because they just made them to complex and hard to use Cards and airpots this was something i was orrignally planning to release in the last ship but i just decided to ship it with this one i have finnaly added the option to buy new bank cards which you can use to get benefits like cashback of 10% on purchsees like rent payment suprise cards and other stuff, and I also added the option to use airpots to fly from one point to another and allow players to set the prices, Bots After reflecting a bit on my ai usage for the bots i decided to fully plug the whole programm into a repo which visualises it to see if it checks out with my mental map and I noticed so much slop which I would have never noticed before, this includes the whole Bot logic which i have probally never looked at cause i knew i wouldnt be able to code them. Though i probally should have cause this is the biggest slop i have ever seen and It introduced so many bugs which the ai couldnt find Next steps Right now all these changes are locally and not on github which are around +17000 lines of code and my aim is to further clean this up and fully push it with a new domain which is alredy online but will be kept hidden. here are soem before and afters, the more clutterd ones are the befores and the simplifyed ones after"}, {"post_id": 75006, "ts": "2026-09-28T20:36:43Z", "hours": 10.8294, "text": "Poorup Redesign - Devlog #11 (FUCK MY LIFE) I am geniunly so tired of this project and my life in general i was so busy in the last few days cause of school and after shool clubs. This phase was mainly about recoding the Bot engine by hand, and updating the stock market modal inside the game also added New Ui for theme chooser and music and also added more sound tracks. I also redid statistics tabs in profile by hand and added better match history tracking Bot engine To be honest to Bot engine was so much AI stuff that i genuinly didnt understand what it was build on and how that is why I decided to take some time to read and research all the papers its build on and how it works. I then rewrote large parts of it to improve it and also found mutipile bugs in the logic of how it works and how it assigns values New account and preferences tab I fully redid some parts of the accounts and prefences tab to now allow for easier choosing of themes and also worked on the music engine so the music loops and youre able to choose different music depending on the theme. #Statsics tab I redid the whole tab as I found it quite stacked with 12 boxes for statsics and decicd to now add internal tabs to make it look cleaner this was a quick 30 minute changes as I didnt change logic but just frontend Next Steps Hopefully shipping adding HCAI and testing the AI bots and further UI refinement on tablet UI and 1440px desktop cause these are 2 of the most weirdest sizes https://poorup.jeremy-d.hackclub.app/ also if anybody wants to check it our but it is nowhere near finished so dont expect anything"}, {"post_id": 73301, "ts": "2026-09-24T20:06:52Z", "hours": 28.7353, "text": "Poorup Redesign - Devlog #10 Iam aware this phase is 30 hours this is just cause i used hella AI and didnt want to count it towards my payout. this phase mainly about finishing touches running mutipile tests suits playing some games and finishing some things also fixing Ui and redoing the Ui of the Music First of all I added music for each of the 6 theme with a secondary theme which you can select under account and preferences I also made it easier to spot the different themes as they were hella hidden to be honest. Deactivation of palor patrol Though i didnt want to this I needed to deactivate palor patrol as it was simply impossible to use I checked m code in detail used and really did everything but I couldnt find the bug which makes it unplayablle so as long as I cant manage to fix it I have to deacitvate it. Next Phase pushing everything on nest setting up a piepleine so nest automatticaly pulls everything I push onto main in my repo and finnaly realsing it with thhe bots for players to use."}, {"post_id": 70576, "ts": "2026-09-19T11:55:06Z", "hours": 11.6328, "text": "Poorup Redesign - Devlog #9 this phase was mainly about adding some missing things fully balancing everything also used the new model jev from typesafe as it was a perfect fit for the task. Admin Dashboard I now added a section in the admin Dashboard fully centered around the Bots which allows for dropping in any provider and choosing the model and see the request if theyre failing or not and etc this took quite a while as I coded this myself again as I wanted to practice a bit though I still needed Ai help as Iam so trash at js Removing TOS pages As i mentioned in the last devlog i have now decided to remove the TOS pages as they were jst not good looking and not complete and not needed. Music system I decided to remove the music player and rather make it so 1 music track is there for each theme and my next step ix expanding the profile page to allow choosing another music track as 12 are available in total but only 6 are used rn. I also decided that I am going to move the Theme chooser somewhere else as people get no indicator rn to find it New Idea for the Future Also I had a great Idea which i can incoperate into this but after the next ship. Its training a custom ml model on all the matches played by people and then incoperating it in the game. Because essentialy it would be a custom AI/Bot that is able to play monopoly as good as possible new features I also added the option to download all the data cause i noticed its saved on the server and maybe smb wants to download it will then be in a json. I also added the option to add an recovery email, because my plan is to allow people to sign up without email but they still need an option to recover data if needed I also added the option to rovoke all otehr session tokens then the onnes youre logged into rn, so essentially log out of all other devices and server sessions Next steps Cleaning up Ai code and reading through it all, 1 or 2 adjustments in Ui for example the global event banner needs to be relocated or the graphs for match history need to remade. Also the ranking page needs a little redesing. The next one will be the LAST ONE cause i cant deal with stardance anymore all my projects are getting rejected for dumb reasons, so this will be the last devlog and if it does not get accepted iam relocating somewhere else."}, {"post_id": 68664, "ts": "2026-09-15T14:29:22Z", "hours": 15.3047, "text": "Poorup Redesign - Devlog #8 this phase mainly about consolidating the backend and adding a New admin only dashboard which will allow to analyze things easier for balane patches and etc in the future. This Phase was written only by hand hence the long time, normally I would use AI to speed up the process but I wanted to get some practice in. Also added legal and TOS pages Backend I found mutipile bugs such as simple Game bugs to not so simple leackage problems and other stuff which took quite some time to fix by hand and this really shows how I will probally pause using AI for coding after this project for a while Admin Dashboard I created this Dashboard so I would be allowed to pracitally analyze everything from how certain things affect the game and for example analyze them to see if they need fixes, balances or even remove them entirly. I also added things like seeing a rough strucutre of where my player base is from. If anybody is abusing the game somehow or bot traffic. Tos Pages These took quite long and were quite the hassle but I did it. though i am debating jus tdeleting them as I couldnt fill them out entirley as certain information is needed which would then make them 100% fool proof I forgot I also updated the Snow Theme and added music for each theme with a small music player in the bottom left though I just noticed I placed the icons wrong should be a quick 2 line fix Next Steps do the last fixes finnaly test the AI bots as they are fully setup but not setup do some balancing and realese it The next post should really be the last. Hopefully."}, {"post_id": 66650, "ts": "2026-09-12T14:36:54Z", "hours": 16.8883, "text": "Poorup Redesign - Devlog #7 This phase was mainly about doing a full audit over the game, fixing bugs which were still hidden inside the server and UI, and making the whole project easier to trust before the next merge. Finalising Bots, adding, themes adding new suprise features and more. Themes I decided to create 5 more themes which will fully change the look of the game, for the 5 i decided on 5 directions first of light mode, and then the 4 seasons so summer,autumm, winter, and spring. These took quite some time to create but I think they came out quite decent though they still need cleaning up Ranking Seasons I have now added ranking seasons which are 1 month each if you manage to rank on the leaderbaord at the end of the season you get a special cosmetic(newly added system) and a special Title Cosmetics I added a full cosmetics system and the ranking system so you can now get cosmetics from 2 places, either by getting them at the end of the season form the leaderboard or by getting them from achievements Card Upgrade I also now added the features to upgrade your bank account, if you pay enough money you can upgrade your card for 1000$ this gives you a card with 5% cashback which is the Spaarkasse karte(german Bank) and the nex level is the amex black card wich give you 10$ cashback and amex points which you can use for flying. Gambling UI I also decided to now give the gambling UI an animation it now has the same kind of case opening animation as CS2 so the roulette which goes form right to left. Plane station card Also made it so that you can now use the airplanes to skip things so you can fly to another station but of course you will have to pay alot and you have to pay a landing fee. If a player owns an Airpot he can decide the flying fee himeslf and the landing fee which means he could extort people if he is smart enough Quick Table I did some changes to Quick Table as it used to create a new public room every time. It now checks the live public room directory first, joins the most suitable open table, retries if somebody fills it during the join, and only creates a new Standard-40 room when no table can be joined. Private room codes are never exposed and the server still makes the final decision. Favicon I also designed a quick little favicon which is Just a P with a box around it but it looks quite good Music Candidates I am now searching for new Music for each theme so music changes with the theme Next Steps Cleaning up the UI one final time trying everything out and finally realsing the Beta and promoting it on reddit."}, {"post_id": 63820, "ts": "2026-09-07T19:51:24Z", "hours": 5.0128, "text": "Poorup Redesign - Devlog #6 This phase was mainly about adding more depth to the player interactions, improving the bot system, and making the rankings feel more alive. Deal Negotiation I redesigned the deal flow so trades, loans, equity, and hybrid deals all work in the same way. When you receive a deal, a modal appears with accept and negotiate. If you close it, the deal does not get declined and stays inside the Finance rail. Both players can now see the same deal collapsed in Finance. The receiver can negotiate, while the sender can adjust or cancel the deal. You can open a full read-only view, change the parameters, and send the new version back. The server also checks old deal IDs so an outdated modal cannot change a newer deal. Sponsored Purchases I also added sponsored purchases. If a player cannot afford a property, they can ask the table for help. Other players can reserve contributions, and once the full amount is available, the buyer accepts and is forced to buy that exact property. The money is automatically returned if the request is canceled, the property changes owner, or a player disconnects. It is not a loan and does not create equity. Bots I continued improving the AI and no-AI bots. The bots now receive more context about the board, current obligations, loans, events, opponents, future rent risk, expected cash flow, and their own previous decisions.AI bots can now also counter trades, negotiate player contracts, choose debt rescue actions, and make auction decisions. If the AI provider runs out of credits or fails, the no api key AI takes over Rankings I added recent trend indicators to the ranking rows, so you can see if a player is moving up, down, or staying flat. I also added a seasonal ranking scope based on the current calendar season. Rules Fixes I also fixed the Double GO setting so landing exactly on GO now pays the boosted amount, while simply passing GO still pays the normal amount.TestingI expanded the tests and ran long bot campaigns with auctions, loans, casino, market, global events, sponsorships, and negotiations. The latest regression suite passes and the longer 2,500-game campaign had zero stalled games. Next Steps The next major step is making the bots simulate several complete future turns and improving long-term negotiation behavior. After that I want to add deeper browser testing and seasonal ranking rewards. Also to lazy to do screenshots of new UI so you will get everything in the next devpost"}, {"post_id": 63109, "ts": "2026-09-06T18:42:52Z", "hours": 11.5353, "text": "Poorup Redesign - Devlog #5 This phase was mainly about fixing all bugs still exisitng, refactoring further with codescene and letting AI run over my code, also fixed some small missing features and simple bugs myself. Choosing Icon I noticed a bug in which because of logic I made before setting up custom icons the programm mapped custom icons people created onto persets and blocked them so for example your icon had red in it, the game decided to map it onto the red preset in the backend blocking it but showing yours in game, this came because I never rewrote this section after introducing custom icons. Ownership icon Before this change owenship on board was only shown with a simple like quadrat in the top right corner of the tile in the color you picked this is also something left over from the old preset logic. I decided to make it so It shows a smaller version of the face of the player which makes it look a lot cleaner. Missing Buttons This was mainly because I let AI write to much of my code, the finical trading tab which is centered around equity and everything missed a dropdown to choose who you send the trade to and even the button to send the trade which was a dumb oversight on my end. I also added a simple backend system for the dropdown inside that modal to only show the propertys a person owns. Bots I also continued working on the bot system though this was mainly watching tutorials and brainstorming further Next Steps Fix last bugs, fully add bot system and make sure UI looks good to release the first beta test hopefully the next post will be the last"}, {"post_id": 62110, "ts": "2026-09-05T11:15:14Z", "hours": 13.0397, "text": "Poorup Redesign - Devlog #4 This phase was mainly about setting up codescene doing a full restructuing with the help of AI and fixing bugs and adding missing features. I also added a simple, gambling and stock market system. Bots I first started with setting up the initial idea of bots so to the UI and a bit of the backend logic for bots and how they will interact with the game iam nowhere finished and I havent tried it out yet. Codescene After checking out the github studentpack again after a while I saw codescene, which is a code reviewer similar to coderabbit. I struggled a bit with the Setup but after running an analysisi I noticed how abysmall my codebase really is and how its missing structure, archtiectuer and etc, for example sepearting certain getures from game logic.js and creating their own thread for it. I also setup a full pr pipieline which I can use with my AI agents which aim will be fixing my architecture, and finding bugs before i push them. bugs I ran Qwen 3.8 flash on my pr pipileine with codescene and let it work indepnedlty to full restructer my codebase so the results are better and I have better architectural design I also let it fix any bugs it found. Bugs I found While trying out the game i found mutipile BUGS one of them affecting my secret minigame palor patrol. For some reason I was losing hearts for no appearent reason. The reason behind it was that even though UI was hidden the helicopters were still flying through. For some reason the heart bug still exists afterwards and even the AI isnt able to find out what it is so Iam completating making architecture changes to it. #Gambling I added a smile gambling system where you can bet money on a roulete on red, black, and green I didnt add any animation for it as I found it unecessary and I also made sure iam legally clear to make sth like this Stock market I created a simple stock market tab and backend which allows people to buy indexes of a property and made sure to connect it with global events so global events can affect the stock market but that is nowhere near usable. Next Steps Iam going to let my AI continue improving my codebase with codescene and continue the Stock market and afterwards add the bots."}, {"post_id": 60301, "ts": "2026-09-02T16:03:55Z", "hours": 10.9608, "text": "Poorup Redesign – Devlog #3 This phase was about expanding the social side of Poorup, adding more depth to the game, and planning future systems that make every round feel more alive. Social, Rankings, Achievements I added a complete friend system. Players can search for unique usernames, send and accept friend requests, remove or block players, report users, invite friends to rooms, and view public profiles without leaving the lobby. Profiles now include statistics such as wins, win rate, games played, average money, bankruptcies, achievements, and match history. I also added global rankings for wins, win rate, games played, achievements, and other statistics. Rankings and Social are now independent tabs instead of modals, with wider layouts that use the available screen space more effectively. Achievements now have custom pixel-art and SVG icons, rarity levels from Common to Mythical, filters, dates, categories, and clickable detail modals. Mythical achievements are extremely rare and can trigger a server-wide announcement for every player. Easter Egg I added the hidden Parlor Patrol minigame. Pressing CTRL + P on the home screen opens a secret mode where you shoot down police helicopters, planes, and drones. It includes custom explosions, animations, sounds, score tracking, and a secret achievement. Global Events Global Events are rare events that affect every player instead of only the person who landed on a tile. They can be triggered by round conditions or Surprise cards and can last several rounds. Ideas include: Housing Bubble Pop Credit Freeze Inflation Spiral Bank Run Interest Rate Shock Airport Strike Energy Crisis Tax Scandal City Election Rent Control Tourism Boom Supply Chain Breakdown Events can combine with each other, create unexpected situations, and unlock secret achievements. I also want a global-event setting that is simply on or off, while event strength and duration scale with the round length. Rules Page I added a complete Rules tab designed like a pixel-art game manual. It explains the board, movement, properties, loans, cards, achievements, global events, social features, and settings. It uses an internal book-style scroll so the main application does not become a long scrolling page. Future Systems I am also planning a casino system using virtual money, with red, black, and green bets where the odds are not equal. Another planned feature is a fictional stock market connected to properties, countries, airports, utilities, and global events. Events could crash markets, increase rent values, affect airports, or create temporary investment opportunities. I also want to add unethical and outrages bank loans with high interest, strict repayment rules, and serious consequences. Music/sound icons I also added simple music and sound icons for the buttons instead of having the music on/off text Next Steps The next phase will be making these systems work together while keeping the game balanced, and also adding AI bots which utilise AI like deepseek v4 and so on so they able to actually judge the situation and think of possible ways for them to win. The aim is to use hcai to power them. I will also add normal BOTS as a fallback if my usage runs out"}, {"post_id": 58798, "ts": "2026-08-31T11:42:39Z", "hours": 9.8108, "text": "Poorup Redesign – Devlog #2 This phase was about continuing the complete redesign of the website, deciding on a UI theme, and implementing a new feature that I had wanted from the start but was not advanced enough to create before. New UI I am very proud to announce a complete redesign of the application. I decided to fully embrace a pixelated theme, and I personally think it looks great. It is genuinely one of the best UI systems I have ever designed. New Feature I decided to expand the trading system. You can now give out loans in exchange for premiums, equity, money, and more. This allows you to create fully customizable loans, such as: I give you $200 for 30% permanent equity in this spot. This means that you have to pay 30% less rent when you land on it and gain 30% of all rent paid on that plot. This is a system I have never seen in a Monopoly game, and I wanted to implement it from the start when I first had the idea for Poorup. New Feature #2 I have also decided to take the advice I was given and implement a room system. This allows players to join and create rooms, as well as make them public or private. I also added a quick-table feature that matches you with other people who have pressed the button, allowing you to play a quick round with random players. New Feature #3 I have created a complete profile system. You can now create a profile, view your statistics, win percentage, average money, and more. You are also able to create custom 32×32 icons to use while playing the game. New Feature #4 I also decided to add sounds and an open-source soundtrack I found called Pondering the Cosmos . which i think fits my new theme perfectly but maybe iam going to change it Next Step AI Bots The next Step will be adding bots but normal bots are boring they are just glofired search engines why i want to be a bit creative. I will use hackclub ai provider and give the bot a brain by combinging them with an AI like deepseek v4 flash this means the bot will be able to check how is he performing what are the most logical steps sell buy properties and trade and if wanted even chat with the user to make a deal would anybody like that?"}, {"post_id": 57234, "ts": "2026-08-29T10:31:03Z", "hours": 1.5744, "text": "Poorup Redesign So after my last ship i read through all the reviews and have decided to continue this project even though i really didnt plan for that. So there were 3 addition people wanted. A new UI, being able to join random people, better Animations and a Dev mode to test in solo player possibly with mods. What did i do? So i first started with thinking of a new design route so i asked chatgpt for some references of a good design. I decided on making the Whole Ui pixellated similar to the Arcade style and fully redesingen the SVG witth and now iam going to go over it and adjust it to fit ours. Of course this took like around 6 hours but I use figma on desktop and the browser tracking of hackatime doesnt seem to work how do you like the new svg? Next Steps Next Steps i redesignen the Full Ui to fit this pexelated style and making sure it looks good"}, {"post_id": 14594, "ts": "2026-06-23T19:20:12Z", "hours": 5.6261, "text": "Project Update: Bug Fixes Overview This phase was all about polishing the user experience, squashing gameplay bugs, and adding new repository documentation. After getting feedback I decided to change The whole UI Dynamic Theming & UI Improvements One of the major frontend improvements in this sprint was fixing the player icon chooser button functionality in the web interface. Fully redesignen the Front-End and more. I first of all started with replacing my .root with some new colors which are greenish. I also added some simple fade in/out animations to all Popups. Another bug was that it couldn’t quite fit in a screen of the size 1980 x 1080. I fixed that by making it possible to scroll down so everything you need for the game is shown on your screen. The way i tested it is by local hosting it and then pressin F12 in the browser and then you could adjust the size of the Window which was pretty neat. Also fixed a lot more of UI bugs such as weird buttons and more but this was the important stuff. Squashing Gameplay Bugs I knocked out two major bugs in this update: Trading System Fix: There was a bug where it wasnt possible for people to only request something without giving anything or make only money transactions so I fixed this. Special Property Popups: I resolved a rendering issue with the popups for special properties, specifically the Airports and Companies (Utilities). Now, when a player interacts with these tiles, the modal correctly pulls the specific data object and displays the unique rent calculations and purchase prices. Documentation Revamp I updated the README.md to ensure the decumentation was on point for anyone cloning the repo. I refactored and renamed SHOWCASE.md to Instructions.md . This provides a much clearer, step-by-step guide on how the game operates and how to get the local server running instead of just showcasing the Repo more. Conclusion The feedback was essential and really showed me how sloppy I worked it should now work perfectly even though i couldnt test it for 4 people"}, {"post_id": 11340, "ts": "2026-06-18T15:32:39Z", "hours": 1.8406, "text": "Update: UI/UX Fixes, Auction System Fixes, and Property Manager Integration FInal This update focused on providing a better user experience and just making it less buggy Key Changes 1. UI/UX Improvements Refactored layout components to improve visual consistency. Updated navigation paths so it makes more sense for the User and is just more logical Adjusted CSS rules to improve the game across different screen sizes. 2. Auction System Fixes Addressed synchronization issues with the auction state. Fixed logical errors in bid processing and countdown timers. 3. Property Manager Integration Fixed the Property Manager feature, allowing users to track and organize their properties. Integrated the property database schema with the existing auction mechanisms. Created user views for listing and editing properties. So just new UI 4. General Bug Fixes & Stability Cleaned up left over parts of old system"}, {"post_id": 10630, "ts": "2026-06-17T14:13:23Z", "hours": 2.5769, "text": "Poorup — Production Ready Over the past few days I’ve been doing a full production-readiness pass on Poorup . Here’s what I worked on: Bug fixes — Fixed auction edge cases where a disconnecting player would leave a ghost bid, locking the game Memory leak prevention — Added a garbage collector on the server to clean up empty rooms after 10 minutes UI polish — Fixed text cut-off in buttons and settings toggles, improved layout consistency across screen sizes Layout centering — The game board is now properly centered vertically and horizontally in the viewport Accessibility — Added focus-visible styles for keyboard navigation New setting — Exposed the “Double rent” toggle in the UI (the rule already existed in the engine) Code quality — Added JSDoc comments to core server classes, removed dead code The game is now polished and stable. Im shipping it"}, {"post_id": 8803, "ts": "2026-06-14T16:57:35Z", "hours": 0.465, "text": "Overview Today I worked on the front end an am basically finished with the easy stuff Iam now going to add the player icon and etc Front End I designed my front end and i think i can say that I am pretty good at basic JS/HTML/CSS and this project teached me alot Iam probally going to wrap it up in the next 2 post and focus on smth else. Monopoly repo After resarching a bit i found another open source monopoly game and my plan is now to copy some backend logic from it but i need to adjust it because his game is made to be playable localy and mine online so it will take same adjustment #Backend I added a Room system with the help of mutipile videos in which a random room code is generated and the server saves the generated room code making it possible for another use to insert it. The code will be if the round was ended."}, {"post_id": 8249, "ts": "2026-06-13T18:30:59Z", "hours": 2.8419, "text": "Overview Over the last few days, I’ve been triying to refactor my project, but i realised something I killed it i refactored it so often that i lost sight of the real goal and will proablly start from scratch restarting it from 0 i designed and svg file but just couldnt implement the right way. Cleaning the SVG My biggest headache was the game board. I designed a beautiful, detailed map in Figma, but exporting it as an SVG just made things difficult i tried making i clickable but i didnt know how to and i found no totorials regarding this so i will probally just create a board using html and css or maybe look for solution using ai Current System Status At the moment i have decided to refractor to vue by advice of some friends and ai because it makes the backend easier but i will proablly change back, because iam realising Iam making the project more complex than it has to be also. Conclusion I just wasted time trying to learn new stuff an refractoring and trying to not use ai. I would like for some adivice which ai I should use and if I should stick with vue or stay with or change back to default also this made me reflect on what kind of perfectionist iam an I will probally wrap up this project in the next few days because I realised front end is not for me I will continue learning it but will soon work on either python or C project after. I will just add the missing features with Ai"}, {"post_id": 6430, "ts": "2026-06-10T20:16:01Z", "hours": 0.6117, "text": "#Overview So today i didnt really code just refactored again and went back to css and decided to design all design elements in figma. It was pretty easy and II am now qustoning why i didnt do that instead also i only copied these 2. I will make my own streets afterwards and i also decided to redesign the website because it realy just a copy and i dont want to be sued but the board will probally look the same just different countries and maybe prices need to look for balancing and how it is normally in monopoly. But this probally going to take 2 to 3 days cause i really dont got any time in the next few days."}, {"post_id": 5789, "ts": "2026-06-09T18:22:00Z", "hours": 0.7531, "text": "Project Update: The Great Refactor & React Integration 📋 Overview Damn this looks trash just a small update and i jsut noticed tailwind actaully looks like trash are there any alternatives because i didnt expect it to look this bad in comparison to before and yes i do know its looks aigenrerated but i did myslef also tailwind is pretty easy if you get the hang of it just looks trash maybe going to watch some tuts cause i cant upload the final product like this."}, {"post_id": 5743, "ts": "2026-06-09T17:20:02Z", "hours": 1.3414, "text": "Overview This phase was a major point for the project. After successfully implementing the lobby chat and the 11x11 Monopoly board using Vanilla JS and CSS Grid, I realized that managing the game states (turns, money, properties, transactions) in Vanilla JS was going to lead to unmanageable spaghetti code and was way to hard. To keep the project clean and professional, I decided to perform a complete “hard reset” and refactor the entire frontend into a modern React Single Page Application (SPA) utilizing Tailwind CSS v4 [1.1.1, 1.1.8]. I always though about using it but found it weird and dififult for a beginer The Great Redesign Instead of keeping duplicate file structures or nesting my React app in a subfolder, I decided to do a complete wipe of the repository and initialize Vite directly at the root of my Poorup folder [1.1.1]. My backend directory ( server/ ) with the working Socket.io logic stays at the root level, sitting side-by-side with my brand-new React source directory ( src/ ).Because i didnt want to rewrite that all Tailwind v4 & Vite Setup (React Redesign - Lab 1) I verified that the setup is 100% correct by creating a basic functional component in src/App.jsx and rendering a test heading styled in large, bold, violet text using Tailwind v4 utility classes [1.1.8]. It compiled instantly and loaded perfectly in the browser. Next Steps Now that the modern React + Tailwind ecosystem is up and running at the root, I am starting Lab Challenge 2 (React Redesign) . I’ll be creating a dedicated <LandingScreen /> component, managing the nickname input using React useState hooks, and connecting Socket.io to React to emit player connection data back to the server [1.1.1, 1.2.6]. You know lab challenges for this i will watch some more videos leanr more js and learn react if possible Conclusion Deciding to start over from a blank folder was tough, but it was absolutely necessary. The codebase feels incredibly clean and changing to React will save me massive amounts of time as I start building out the actual Monopoly gameplay. But i now learned alot in the time i decided to atleast built the lobby and board in vanilla js,css and html. Also anybody knows an ki which is good in front end because i just realised iam trash in front end and ki is too"}, {"post_id": 5131, "ts": "2026-06-08T20:23:58Z", "hours": 1.7286, "text": "Overview This phase was important even though it was short. I transitioned from basic static mockups to building a fully functional, real-time multiplayer lobby system. I resolved tricky logical bugs and fought port conflicts, I also expanded my knowledge on js and am probally going to need to take a break to really learn all of js and will soon watch a 22 hour tut. Fixing the SPA Screen Switch (Lab 9) I started by tackling the dynamic transition from the login screen ( #landing-screen ) to the lobby screen ( #lobby-screen ). Space in HTML ID: I accidentally wrote id=\"landing screen\" (with a space) in my HTML, which broke my JavaScript’s querySelector because IDs cannot have spaces. Once I replaced the space with a dash ( id=\"landing-screen\" ) Now it works perfectly fine. Port Conflicts Right after getting the transitions working, my local server crashed on Port 3000. My terminal crashed and restored its history, leaving a Node process running in the background and locking the port i still dont know why it does that just looked on reddit and youtube. To easily bypass this without fighting Windows process managers, I updated my server.js and local client connection to run on Port 3005 . It started up instantly. Designing the 3-Column Lobby (Lab 10) With the screen switching working, I redesigned the lobby HTML to match the responsive 3-column layout of Richup.io [1]. I used Flexbox ( flex: 1 and flex: 2 for the center) to align: Left Column: A placeholder invite link input and a scrollable chat area [1]. Center Column: The player greeting, token color picker, and “Join Game” button [1]. Right Column: Game settings (dropdowns for starting cash) [1]. Structuring this required a bit of tweaking but not to hard. Interactive Color Picker & Socket Events (Lab 11) Next, I tackled the token selection grid [1]. I styled four distinct color circles (Red, Blue, Green, Yellow) in CSS and set up a .selected class that applies a thick white border and a glowing shadow. In client.js , I wrote a forEach loop that listens for clicks on each circle, removes the .selected class from all others, adds it to the active circle, and stores the selection in a global variable. On the server side, I set up a 'join-room' socket listener. Now, when a player selects a color and clicks “Join Game”, the client emits the color choice, and the backend successfully receives and logs it in the terminal [1]. Server-Side Multiplayer Sync (Lab 12) The most exciting part and hard part today was implementing real-time state synchronization. I declared a global activePlayers dictionary on the server to keep track of active sessions. When a user logs in, they are registered in the dictionary. When they choose a color and click “Join Game”, their color is updated, and the server broadcasts the entire updated list to all active clients via io.emit(\"update-players\") [1]. On the client side, I wrote a listener that clears out the #player-list and dynamically rebuilds it, coloring each player’s username text to match their selected token color. I also handled the 'disconnect' socket event to delete players from the dictionary when they close it. You can see the messaged in the terminal and yes it is antigravity but i dont use the ai and have only used it to refractor my notes, so i dont even have tokens anymore cause of the amount of notes i had. So i also decided i probally need to expand my file directory and iam thinking of using tailwind css or just using css and making custom icons using favicons and etc by using figma also i got approved for the Student github :)."}, {"post_id": 4397, "ts": "2026-06-07T18:32:25Z", "hours": 3.6853, "text": "Overview Today was massive for Poorup. I officially made the first steps into the website, creating the backend for the hompage and creating the CSS.. Transitioning From HTML to CSS I officially finished the basic HTML path on freeCodeCamp! It feels great to have the basic foundation down. I am still missing a lot of depth in semantic HTML and more advanced stuff, but I have enough of experienc to now build on it. I just need to learn some more js and CSS. I then watched some video regarding CSS and worked on it. I realised that CSS is really simple but involes alot of googling to find certain functions . I did one rooky mistake which was having the css file not in the right folder so it wasnt loading correctly and i was quite suprised Backend & Real-Time Socket.io Integration This is where the real engineering started today. Since Poorup is a real-time multiplayer board game, I can’t just use standard HTTP requests where the browser has to reload every time a player moves. I needed a permanent, open connection between the browser and the server. I set up a Node.js server with Express in server/server.js to serve my static folder. Then, I integrated Socket.io: Express Server: Serving the public folder on http://localhost:3000 . Socket.io Setup: Wrapped the Express app in an HTTP server and configured the connection listeners. Client-Side JS: Wrote client.js to capture input data and handle form events. The Struggle: I ran into a bug where clicking “Play” triggered the server connection even when the username field was completely empty, which bypassed my HTML required attribute. After digging into my event listeners, I realized I was listening to the click event on the button instead of the submit event on the form . Since the browser’s native validation only checks fields during a form submission, the click listener was bypassing it. Switching my listener to form.addEventListener(\"submit\") fixed the empty-name validation instantly. When I run node server/server.js now and type a name in the browser, the server terminal immediately logs the connection and prints the player’s name in real-time. Next Steps & Screen Switching Now that the backend is running and successfully communicating with the client, my next step is handling the UI transitions. Since we don’t want a full page reload (which would kill the WebSocket connection), I am working on setting up a Single Page Application (SPA) structure ,aksed ki what to do next by usign my earlier stated Lab approach in which i dont get code but how to do stuff and have to implement it. I am currently working on Lab Challenge 9 , where I will be wrapping the login screen in a #landing-screen div and the lobby in a #lobby-screen div. I’ll use JS to dynamically swap the .hidden class as soon as the server acknowledges that a player has successfully joined. Conclusion Overall, this phase was a huge step up from just writing static tags. I’m taking active notes on everything which you will later find in a second repo so you can build it your own with all the Lab challenges. I find it to be quite rewarding but now i have to lock in for school cause i got a vocabulary test in 2 days. I will probally upload a demo soon an do some major changes to color, theme, name and etc for copyright reasons"}, {"post_id": 3686, "ts": "2026-06-06T18:51:12Z", "hours": 2.2747, "text": "Stardance Progress Log: Poorup Development Current Progress Learning Path: Almost completed the Basic HTML section on freeCodeCamp. Note-taking: Iam taking personal notes on semantic HTML, document structures, tags, and form elements. My Learning Methodology (AI as a Mentor) To make sure I actually understand every line of code I write, I am using a strict, self-guided approach to learning: First of all i have strictly said to the ai to never write code for me and never give me the answer and just show me how i could achieve it. Also the ai acts strictly as a mentor. It analyzes my goals and designs custom “Lab Challenges” formatted exactly like freeCodeCamp exercises (with Objectives, User Stories, and Test suites). Because i found this to be quite efective. Also i decided to install the live preview extenstion to see my code in person and debug it easiear. What I’ve Built So Far Landing Page Structure: Created a solid textual game menu and lobby framework in public/index.html using headings ( h1 , h2 ), paragraphs, an unordered list for features, and an ordered list for instructions. Interactive Elements: Added call-to-action buttons for joining and creating lobbies. Next Steps Currently working on Lab Challenge 2 given by the ai: The Player Registration Form to practice form validation, input types (text, radio, checkbox), and connecting labels with inputs via attributes. Once HTML basics are solid, I will start exploring basic CSS styling."}, {"post_id": 2926, "ts": "2026-06-05T20:35:05Z", "hours": 0.7811, "text": "I have now started with creating the Github and also learning some HTML with free Code Camp. I also decided to take some notes in a md file reading through the guides"}]...
|
Title: Poorup.io by @jeremy | Stardance
Devlogs:
Title: Poorup.io by @jeremy | Stardance
Devlogs:
I have now started with creating the Github and also learning some HTML with free Code Camp. I also decided to take some notes in a md file reading through the guides
Stardance Progress Log: Poorup Development Current Progress Learning Path: Almost completed the Basic HTML section on freeCodeCamp. Note-taking: Iam taking personal notes on semantic HTML, document structures, tags, and form elements. My Learning Methodology (AI as a Mentor) To make sure I actually understand every line of code I write, I am using a strict, self-guided approach to learning: First of all i have strictly said to the ai to never write code for me and never give me the answer and just show me how i could achieve it. Also the ai acts strictly as a mentor. It analyzes my goals and designs custom “Lab Challenges” formatted exactly like freeCodeCamp exercises (with Objectives, User Stories, and Test suites). Because i found this to be quite efective. Also i decided to install the live preview extenstion to see my code in person and debug it easiear. What I’ve Built So Far Landing Page Structure: Created a solid textual game menu and lobby framework in public/index.html using headings ( h1 , h2 ), paragraphs, an unordered list for features, and an ordered list for instructions. Interactive Elements: Added call-to-action buttons for joining and creating lobbies. Next Steps Currently working on Lab Challenge 2 given by the ai: The Player Registration Form to practice form validation, input types (text, radio, checkbox), and connecting labels with inputs via attributes. Once HTML basics are solid, I will start exploring basic CSS styling.
Overview Today was massive for Poorup. I officially made the first steps into the website, creating the backend for the hompage and creating the CSS.. Transitioning From HTML to CSS I officially finished the basic HTML path on freeCodeCamp! It feels great to have the basic foundation down. I am still missing a lot of depth in semantic HTML and more advanced stuff, but I have enough of experienc to now build on it. I just need to learn some more js and CSS. I then watched some video regarding CSS and worked on it. I realised that CSS is really simple but involes alot of googling to find certain functions . I did one rooky mistake which was having the css file not in the right folder so it wasnt loading correctly and i was quite suprised Backend & Real-Time Socket.io Integration This is where the real engineering started today. Since Poorup is a real-time multiplayer board game, I can’t just use standard HTTP requests where the browser has to reload every time a player moves. I needed a permanent, open connection between the browser and the server. I set up a Node.js server with Express in server/server.js to serve my static folder. Then, I integrated Socket.io: Express Server: Serving the public folder on http://localhost:3000 . Socket.io Setup: Wrapped the Express app in an HTTP server and configured the connection listeners. Client-Side JS: Wrote client.js to capture input data and handle form events. The Struggle: I ran into a bug where clicking “Play” triggered the server connection even when the username field was completely empty, which bypassed my HTML required attribute. After digging into my event listeners, I realized I was listening to the click event on the button instead of the submit event on the form . Since the browser’s native validation only checks fields during a form submission, the click listener was bypassing it. Switching my listener to form.addEventListener("submit") fixed the empty-name validation instantly. When I run node server/server.js now and type a name in the browser, the server terminal immediately logs the connection and prints the player’s name in real-time. Next Steps & Screen Switching Now that the backend is running and successfully communicating with the client, my next step is handling the UI transitions. Since we don’t want a full page reload (which would kill the WebSocket connection), I am working on setting up a Single Page Application (SPA) structure ,aksed ki what to do next by usign my earlier stated Lab approach in which i dont get code but how to do stuff and have to implement it. I am currently working on Lab Challenge 9 , where I will be wrapping the login screen in a #landing-screen div and the lobby in a #lobby-screen div. I’ll use JS to dynamically swap the .hidden class as soon as the server acknowledges that a player has successfully joined. Conclusion Overall, this phase was a huge step up from just writing static tags. I’m taking active notes on everything which you will later find in a second repo so you can build it your own with all the Lab challenges. I find it to be quite rewarding but now i have to lock in for school cause i got a vocabulary test in 2 days. I will probally upload a demo soon an do some major changes to color, theme, name and etc for copyright reasons
Overview This phase was important even though it was short. I transitioned from basic static mockups to building a fully functional, real-time multiplayer lobby system. I resolved tricky logical bugs and fought port conflicts, I also expanded my knowledge on js and am probally going to need to take a break to really learn all of js and will soon watch a 22 hour tut. Fixing the SPA Screen Switch (Lab 9) I started by tackling the dynamic transition from the login screen ( #landing-screen ) to the lobby screen ( #lobby-screen ). Space in HTML ID: I accidentally wrote id="landing screen" (with a space) in my HTML, which broke my JavaScript’s querySelector because IDs cannot have spaces. Once I replaced the space with a dash ( id="landing-screen" ) Now it works perfectly fine. Port Conflicts Right after getting the transitions working, my local server crashed on Port 3000. My terminal crashed and restored its history, leaving a Node process running in the background and locking the port i still dont know why it does that just looked on reddit and youtube. To easily bypass this without fighting Windows process managers, I updated my server.js and local client connection to run on Port 3005 . It started up instantly. Designing the 3-Column Lobby (Lab 10) With the screen switching working, I redesigned the lobby HTML to match the responsive 3-column layout of Richup.io [1]. I used Flexbox ( flex: 1 and flex: 2 for the center) to align: Left Column: A placeholder invite link input and a scrollable chat area [1]. Center Column: The player greeting, token color picker, and “Join Game” button [1]. Right Column: Game settings (dropdowns for starting cash) [1]. Structuring this required a bit of tweaking but not to hard. Interactive Color Picker & Socket Events (Lab 11) Next, I tackled the token selection grid [1]. I styled four distinct color circles (Red, Blue, Green, Yellow) in CSS and set up a .selected class that applies a thick white border and a glowing shadow. In client.js , I wrote a forEach loop that listens for clicks on each circle, removes the .selected class from all others, adds it to the active circle, and stores the selection in a global variable. On the server side, I set up a 'join-room' socket listener. Now, when a player selects a color and clicks “Join Game”, the client emits the color choice, and the backend successfully receives and logs it in the terminal [1]. Server-Side Multiplayer Sync (Lab 12) The most exciting part and hard part today was implementing real-time state synchronization. I declared a global activePlayers dictionary on the server to keep track of active sessions. When a user logs in, they are registered in the dictionary. When they choose a color and click “Join Game”, their color is updated, and the server broadcasts the entire updated list to all active clients via io.emit("update-players") [1]. On the client side, I wrote a listener that clears out the #player-list and dynamically rebuilds it, coloring each player’s username text to match their selected token color. I also handled the 'disconnect' socket event to delete players from the dictionary when they close it. You can see the messaged in the terminal and yes it is antigravity but i dont use the ai and have only used it to refractor my notes, so i dont even have tokens anymore cause of the amount of notes i had. So i also decided i probally need to expand my file directory and iam thinking of using tailwind css or just using css and making custom icons using favicons and etc by using figma also i got approved for the Student github :).
Overview This phase was a major point for the project. After successfully implementing the lobby chat and the 11x11 Monopoly board using Vanilla JS and CSS Grid, I realized that managing the game states (turns, money, properties, transactions) in Vanilla JS was going to lead to unmanageable spaghetti code and was way to hard. To keep the project clean and professional, I decided to perform a complete “hard reset” and refactor the entire frontend into a modern React Single Page Application (SPA) utilizing Tailwind CSS v4 [1.1.1, 1.1.8]. I always though about using it but found it weird and dififult for a beginer The Great Redesign Instead of keeping duplicate file structures or nesting my React app in a subfolder, I decided to do a complete wipe of the repository and initialize Vite directly at the root of my Poorup folder [1.1.1]. My backend directory ( server/ ) with the working Socket.io logic stays at the root level, sitting side-by-side with my brand-new React source directory ( src/ ).Because i didnt want to rewrite that all Tailwind v4 & Vite Setup (React Redesign - Lab 1) I verified that the setup is 100% correct by creating a basic functional component in src/App.jsx and rendering a test heading styled in large, bold, violet text using Tailwind v4 utility classes [1.1.8]. It compiled instantly and loaded perfectly in the browser. Next Steps Now that the modern React + Tailwind ecosystem is up and running at the root, I am starting Lab Challenge 2 (React Redesign) . I’ll be creating a dedicated <LandingScreen /> component, managing the nickname input using React useState hooks, and connecting Socket.io to React to emit player connection data back to the server [1.1.1, 1.2.6]. You know lab challenges for this i will watch some more videos leanr more js and learn react if possible Conclusion Deciding to start over from a blank folder was tough, but it was absolutely necessary. The codebase feels incredibly clean and changing to React will save me massive amounts of time as I start building out the actual Monopoly gameplay. But i now learned alot in the time i decided to atleast built the lobby and board in vanilla js,css and html. Also anybody knows an ki which is good in front end because i just realised iam trash in front end and ki is too
Project Update: The Great Refactor & React Integration 📋 Overview Damn this looks trash just a small update and i jsut noticed tailwind actaully looks like trash are there any alternatives because i didnt expect it to look this bad in comparison to before and yes i do know its looks aigenrerated but i did myslef also tailwind is pretty easy if you get the hang of it just looks trash maybe going to watch some tuts cause i cant upload the final product like this.
#Overview So today i didnt really code just refactored again and went back to css and decided to design all design elements in figma. It was pretty easy and II am now qustoning why i didnt do that instead also i only copied these 2. I will make my own streets afterwards and i also decided to redesign the website because it realy just a copy and i dont want to be sued but the board will probally look the same just different countries and maybe prices need to look for balancing and how it is normally in monopoly. But this probally going to take 2 to 3 days cause i really dont got any time in the next few days.
Overview Over the last few days, I’ve been triying to refactor my project, but i realised something I killed it i refactored it so often that i lost sight of the real goal and will proablly start from scratch restarting it from 0 i designed and svg file but just couldnt implement the right way. Cleaning the SVG My biggest headache was the game board. I designed a beautiful, detailed map in Figma, but exporting it as an SVG just made things difficult i tried making i clickable but i didnt know how to and i found no totorials regarding this so i will probally just create a board using html and css or maybe look for solution using ai Current System Status At the moment i have decided to refractor to vue by advice of some friends and ai because it makes the backend easier but i will proablly change back, because iam realising Iam making the project more complex than it has to be also. Conclusion I just wasted time trying to learn new stuff an refractoring and trying to not use ai. I would like for some adivice which ai I should use and if I should stick with vue or stay with or change back to default also this made me reflect on what kind of perfectionist iam an I will probally wrap up this project in the next few days because I realised front end is not for me I will continue learning it but will soon work on either python or C project after. I will just add the missing features with Ai
Overview Today I worked on the front end an am basically finished with the easy stuff Iam now going to add the player icon and etc Front End I designed my front end and i think i can say that I am pretty good at basic JS/HTML/CSS and this project teached me alot Iam probally going to wrap it up in the next 2 post and focus on smth else. Monopoly repo After resarching a bit i found another open source monopoly game and my plan is now to copy some backend logic from it but i need to adjust it because his game is made to be playable localy and mine online so it will take same adjustment #Backend I added a Room system with the help of mutipile videos in which a random room code is generated and the server saves the generated room code making it possible for another use to insert it. The code will be if the round was ended.
Poorup — Production Ready Over the past few days I’ve been doing a full production-readiness pass on Poorup . Here’s what I worked on: Bug fixes — Fixed auction edge cases where a disconnecting player would leave a ghost bid, locking the game Memory leak prevention — Added a garbage collector on the server to clean up empty rooms after 10 minutes UI polish — Fixed text cut-off in buttons and settings toggles, improved layout consistency across screen sizes Layout centering — The game board is now properly centered vertically and horizontally in the viewport Accessibility — Added focus-visible styles for keyboard navigation New setting — Exposed the “Double rent” toggle in the UI (the rule already existed in the engine) Code quality — Added JSDoc comments to core server classes, removed dead code The game is now polished and stable. Im shipping it
Update: UI/UX Fixes, Auction System Fixes, and Property Manager Integration FInal This update focused on providing a better user experience and just making it less buggy Key Changes 1. UI/UX Improvements Refactored layout components to improve visual consistency. Updated navigation paths so it makes more sense for the User and is just more logical Adjusted CSS rules to improve the game across different screen sizes. 2. Auction System Fixes Addressed synchronization issues with the auction state. Fixed logical errors in bid processing and countdown timers. 3. Property Manager Integration Fixed the Property Manager feature, allowing users to track and organize their properties. Integrated the property database schema with the existing auction mechanisms. Created user views for listing and editing properties. So just new UI 4. General Bug Fixes & Stability Cleaned up left over parts of old system
Project Update: Bug Fixes Overview This phase was all about polishing the user experience, squashing gameplay bugs, and adding new repository documentation. After getting feedback I decided to change The whole UI Dynamic Theming & UI Improvements One of the major frontend improvements in this sprint was fixing the player icon chooser button functionality in the web interface. Fully redesignen the Front-End and more. I first of all started with replacing my .root with some new colors which are greenish. I also added some simple fade in/out animations to all Popups. Another bug was that it couldn’t quite fit in a screen of the size 1980 x 1080. I fixed that by making it possible to scroll down so everything you need for the game is shown on your screen. The way i tested it is by local hosting it and then pressin F12 in the browser and then you could adjust the size of the Window which was pretty neat. Also fixed a lot more of UI bugs such as weird buttons and more but this was the important stuff. Squashing Gameplay Bugs I knocked out two major bugs in this update: Trading System Fix: There was a bug where it wasnt possible for people to only request something without giving anything or make only money transactions so I fixed this. Special Property Popups: I resolved a rendering issue with the popups for special properties, specifically the Airports and Companies (Utilities). Now, when a player interacts with these tiles, the modal correctly pulls the specific data object and displays the unique rent calculations and purchase prices. Documentation Revamp I updated the README.md to ensure the decumentation was on point for anyone cloning the repo. I refactored and renamed SHOWCASE.md to Instructions.md . This provides a much clearer, step-by-step guide on how the game operates and how to get the local server running instead of just showcasing the Repo more. Conclusion The feedback was essential and really showed me how sloppy I worked it should now work perfectly even though i couldnt test it for 4 people
Poorup Redesign So after my last ship i read through all the reviews and have decided to continue this project even though i really didnt plan for that. So there were 3 addition people wanted. A new UI, being able to join random people, better Animations and a Dev mode to test in solo player possibly with mods. What did i do? So i first started with thinking of a new design route so i asked chatgpt for some references of a good design. I decided on making the Whole Ui pixellated similar to the Arcade style and fully redesingen the SVG witth and now iam going to go over it and adjust it to fit ours. Of course this took like around 6 hours but I use figma on desktop and the browser tracking of hackatime doesnt seem to work how do you like the new svg? Next Steps Next Steps i redesignen the Full Ui to fit this pexelated style and making sure it looks good
Poorup Redesign – Devlog #2 This phase was about continuing the complete redesign of the website, deciding on a UI theme, and implementing a new feature that I had wanted from the start but was not advanced enough to create before. New UI I am very proud to announce a complete redesign of the application. I decided to fully embrace a pixelated theme, and I personally think it looks great. It is genuinely one of the best UI systems I have ever designed. New Feature I decided to expand the trading system. You can now give out loans in exchange for premiums, equity, money, and more. This allows you to create fully customizable loans, such as: I give you $200 for 30% permanent equity in this spot. This means that you have to pay 30% less rent when you land on it and gain 30% of all rent paid on that plot. This is a system I have never seen in a Monopoly game, and I wanted to implement it from the start when I first had the idea for Poorup. New Feature #2 I have also decided to take the advice I was given and implement a room system. This allows players to join and create rooms, as well as make them public or private. I also added a quick-table feature that matches you with other people who have pressed the button, allowing you to play a quick round with random players. New Feature #3 I have created a complete profile system. You can now create a profile, view your statistics, win percentage, average money, and more. You are also able to create custom 32×32 icons to use while playing the game. New Feature #4 I also decided to add sounds and an open-source soundtrack I found called Pondering the Cosmos . which i think fits my new theme perfectly but maybe iam going to change it Next Step AI Bots The next Step will be adding bots but normal bots are boring they are just glofired search engines why i want to be a bit creative. I will use hackclub ai provider and give the bot a brain by combinging them with an AI like deepseek v4 flash this means the bot will be able to check how is he performing what are the most logical steps sell buy properties and trade and if wanted even chat with the user to make a deal would anybody like that?
Poorup Redesign – Devlog #3 This phase was about expanding the social side of Poorup, adding more depth to the game, and planning future systems that make every round feel more alive. Social, Rankings, Achievements I added a complete friend system. Players can search for unique usernames, send and accept friend requests, remove or block players, report users, invite friends to rooms, and view public profiles without leaving the lobby. Profiles now include statistics such as wins, win rate, games played, average money, bankruptcies, achievements, and match history. I also added global rankings for wins, win rate, games played, achievements, and other statistics. Rankings and Social are now independent tabs instead of modals, with wider layouts that use the available screen space more effectively. Achievements now have custom pixel-art and SVG icons, rarity levels from Common to Mythical, filters, dates, categories, and clickable detail modals. Mythical achievements are extremely rare and can trigger a server-wide announcement for every player. Easter Egg I added the hidden Parlor Patrol minigame. Pressing CTRL + P on the home screen opens a secret mode where you shoot down police helicopters, planes, and drones. It includes custom explosions, animations, sounds, score tracking, and a secret achievement. Global Events Global Events are rare events that affect every player instead of only the person who landed on a tile. They can be triggered by round conditions or Surprise cards and can last several rounds. Ideas include: Housing Bubble Pop Credit Freeze Inflation Spiral Bank Run Interest Rate Shock Airport Strike Energy Crisis Tax Scandal City Election Rent Control Tourism Boom Supply Chain Breakdown Events can combine with each other, create unexpected situations, and unlock secret achievements. I also want a global-event setting that is simply on or off, while event strength and duration scale with the round length. Rules Page I added a complete Rules tab designed like a pixel-art game manual. It explains the board, movement, properties, loans, cards, achievements, global events, social features, and settings. It uses an internal book-style scroll so the main application does not become a long scrolling page. Future Systems I am also planning a casino system using virtual money, with red, black, and green bets where the odds are not equal. Another planned feature is a fictional stock market connected to properties, countries, airports, utilities, and global events. Events could crash markets, increase rent values, affect airports, or create temporary investment opportunities. I also want to add unethical and outrages bank loans with high interest, strict repayment rules, and serious consequences. Music/sound icons I also added simple music and sound icons for the buttons instead of having the music on/off text Next Steps The next phase will be making these systems work together while keeping the game balanced, and also adding AI bots which utilise AI like deepseek v4 and so on so they able to actually judge the situation and think of possible ways for them to win. The aim is to use hcai to power them. I will also add normal BOTS as a fallback if my usage runs out
Poorup Redesign - Devlog #4 This phase was mainly about setting up codescene doing a full restructuing with the help of AI and fixing bugs and adding missing features. I also added a simple, gambling and stock market system. Bots I first started with setting up the initial idea of bots so to the UI and a bit of the backend logic for bots and how they will interact with the game iam nowhere finished and I havent tried it out yet. Codescene After checking out the github studentpack again after a while I saw codescene, which is a code reviewer similar to coderabbit. I struggled a bit with the Setup but after running an analysisi I noticed how abysmall my codebase really is and how its missing structure, archtiectuer and etc, for example sepearting certain getures from game logic.js and creating their own thread for it. I also setup a full pr pipieline which I can use with my AI agents which aim will be fixing my architecture, and finding bugs before i push them. bugs I ran Qwen 3.8 flash on my pr pipileine with codescene and let it work indepnedlty to full restructer my codebase so the results are better and I have better architectural design I also let it fix any bugs it found. Bugs I found While trying out the game i found mutipile BUGS one of them affecting my secret minigame palor patrol. For some reason I was losing hearts for no appearent reason. The reason behind it was that even though UI was hidden the helicopters were still flying through. For some reason the heart bug still exists afterwards and even the AI isnt able to find out what it is so Iam completating making architecture changes to it. #Gambling I added a smile gambling system where you can bet money on a roulete on red, black, and green I didnt add any animation for it as I found it unecessary and I also made sure iam legally clear to make sth like this Stock market I created a simple stock market tab and backend which allows people to buy indexes of a property and made sure to connect it with global events so global events can affect the stock market but that is nowhere near usable. Next Steps Iam going to let my AI continue improving my codebase with codescene and continue the Stock market and afterwards add the bots.
Poorup Redesign - Devlog #5 This phase was mainly about fixing all bugs still exisitng, refactoring further with codescene and letting AI run over my code, also fixed some small missing features and simple bugs myself. Choosing Icon I noticed a bug in which because of logic I made before setting up custom icons the programm mapped custom icons people created onto persets and blocked them so for example your icon had red in it, the game decided to map it onto the red preset in the backend blocking it but showing yours in game, this came because I never rewrote this section after introducing custom icons. Ownership icon Before this change owenship on board was only shown with a simple like quadrat in the top right corner of the tile in the color you picked this is also something left over from the old preset logic. I decided to make it so It shows a smaller version of the face of the player which makes it look a lot cleaner. Missing Buttons This was mainly because I let AI write to much of my code, the finical trading tab which is centered around equity and everything missed a dropdown to choose who you send the trade to and even the button to send the trade which was a dumb oversight on my end. I also added a simple backend system for the dropdown inside that modal to only show the propertys a person owns. Bots I also continued working on the bot system though this was mainly watching tutorials and brainstorming further Next Steps Fix last bugs, fully add bot system and make sure UI looks good to release the first beta test hopefully the next post will be the last
Poorup Redesign - Devlog #6 This phase was mainly about adding more depth to the player interactions, improving the bot system, and making the rankings feel more alive. Deal Negotiation I redesigned the deal flow so trades, loans, equity, and hybrid deals all work in the same way. When you receive a deal, a modal appears with accept and negotiate. If you close it, the deal does not get declined and stays inside the Finance rail. Both players can now see the same deal collapsed in Finance. The receiver can negotiate, while the sender can adjust or cancel the deal. You can open a full read-only view, change the parameters, and send the new version back. The server also checks old deal IDs so an outdated modal cannot change a newer deal. Sponsored Purchases I also added sponsored purchases. If a player cannot afford a property, they can ask the table for help. Other players can reserve contributions, and once the full amount is available, the buyer accepts and is forced to buy that exact property. The money is automatically returned if the request is canceled, the property changes owner, or a player disconnects. It is not a loan and does not create equity. Bots I continued improving the AI and no-AI bots. The bots now receive more context about the board, current obligations, loans, events, opponents, future rent risk, expected cash flow, and their own previous decisions.AI bots can now also counter trades, negotiate player contracts, choose debt rescue actions, and make auction decisions. If the AI provider runs out of credits or fails, the no api key AI takes over Rankings I added recent trend indicators to the ranking rows, so you can see if a player is moving up, down, or staying flat. I also added a seasonal ranking scope based on the current calendar season. Rules Fixes I also fixed the Double GO setting so landing exactly on GO now pays the boosted amount, while simply passing GO still pays the normal amount.TestingI expanded the tests and ran long bot campaigns with auctions, loans, casino, market, global events, sponsorships, and negotiations. The latest regression suite passes and the longer 2,500-game campaign had zero stalled games. Next Steps The next major step is making the bots simulate several complete future turns and improving long-term negotiation behavior. After that I want to add deeper browser testing and seasonal ranking rewards. Also to lazy to do screenshots of new UI so you will get everything in the next devpost
Poorup Redesign - Devlog #7 This phase was mainly about doing a full audit over the game, fixing bugs which were still hidden inside the server and UI, and making the whole project easier to trust before the next merge. Finalising Bots, adding, themes adding new suprise features and more. Themes I decided to create 5 more themes which will fully change the look of the game, for the 5 i decided on 5 directions first of light mode, and then the 4 seasons so summer,autumm, winter, and spring. These took quite some time to create but I think they came out quite decent though they still need cleaning up Ranking Seasons I have now added ranking seasons which are 1 month each if you manage to rank on the leaderbaord at the end of the season you get a special cosmetic(newly added system) and a special Title Cosmetics I added a full cosmetics system and the ranking system so you can now get cosmetics from 2 places, either by getting them at the end of the season form the leaderboard or by getting them from achievements Card Upgrade I also now added the features to upgrade your bank account, if you pay enough money you can upgrade your card for 1000$ this gives you a card with 5% cashback which is the Spaarkasse karte(german Bank) and the nex level is the amex black card wich give you 10$ cashback and amex points which you can use for flying. Gambling UI I also decided to now give the gambling UI an animation it now has the same kind of case opening animation as CS2 so the roulette which goes form right to left. Plane station card Also made it so that you can now use the airplanes to skip things so you can fly to another station but of course you will have to pay alot and you have to pay a landing fee. If a player owns an Airpot he can decide the flying fee himeslf and the landing fee which means he could extort people if he is smart enough Quick Table I did some changes to Quick Table as it used to create a new public room every time. It now checks the live public room directory first, joins the most suitable open table, retries if somebody fills it during the join, and only creates a new Standard-40 room when no table can be joined. Private room codes are never exposed and the server still makes the final decision. Favicon I also designed a quick little favicon which is Just a P with a box around it but it looks quite good Music Candidates I am now searching for new Music for each theme so music changes with the theme Next Steps Cleaning up the UI one final time trying everything out and finally realsing the Beta and promoting it on reddit.
Poorup Redesign - Devlog #8 this phase mainly about consolidating the backend and adding a New admin only dashboard which will allow to analyze things easier for balane patches and etc in the future. This Phase was written only by hand hence the long time, normally I would use AI to speed up the process but I wanted to get some practice in. Also added legal and TOS pages Backend I found mutipile bugs such as simple Game bugs to not so simple leackage problems and other stuff which took quite some time to fix by hand and this really shows how I will probally pause using AI for coding after this project for a while Admin Dashboard I created this Dashboard so I would be allowed to pracitally analyze everything from how certain things affect the game and for example analyze them to see if they need fixes, balances or even remove them entirly. I also added things like seeing a rough strucutre of where my player base is from. If anybody is abusing the game somehow or bot traffic. Tos Pages These took quite long and were quite the hassle but I did it. though i am debating jus tdeleting them as I couldnt fill them out entirley as certain information is needed which would then make them 100% fool proof I forgot I also updated the Snow Theme and added music for each theme with a small music player in the bottom left though I just noticed I placed the icons wrong should be a quick 2 line fix Next Steps do the last fixes finnaly test the AI bots as they are fully setup but not setup do some balancing and realese it The next post should really be the last. Hopefully.
Poorup Redesign - Devlog #9 this phase was mainly about adding some missing things fully balancing everything also used the new model jev from typesafe as it was a perfect fit for the task. Admin Dashboard I now added a section in the admin Dashboard fully centered around the Bots which allows for dropping in any provider and choosing the model and see the request if theyre failing or not and etc this took quite a while as I coded this myself again as I wanted to practice a bit though I still needed Ai help as Iam so trash at js Removing TOS pages As i mentioned in the last devlog i have now decided to remove the TOS pages as they were jst not good looking and not complete and not needed. Music system I decided to remove the music player and rather make it so 1 music track is there for each theme and my next step ix expanding the profile page to allow choosing another music track as 12 are available in total but only 6 are used rn. I also decided that I am going to move the Theme chooser somewhere else as people get no indicator rn to find it New Idea for the Future Also I had a great Idea which i can incoperate into this but after the next ship. Its training a custom ml model on all the matches played by people and then incoperating it in the game. Because essentialy it would be a custom AI/Bot that is able to play monopoly as good as possible new features I also added the option to download all the data cause i noticed its saved on the server and maybe smb wants to download it will then be in a json. I also added the option to add an recovery email, because my plan is to allow people to sign up without email but they still need an option to recover data if needed I also added the option to rovoke all otehr session tokens then the onnes youre logged into rn, so essentially log out of all other devices and server sessions Next steps Cleaning up Ai code and reading through it all, 1 or 2 adjustments in Ui for example the global event banner needs to be relocated or the graphs for match history need to remade. Also the ranking page needs a little redesing. The next one will be the LAST ONE cause i cant deal with stardance anymore all my projects are getting rejected for dumb reasons, so this will be the last devlog and if it does not get accepted iam relocating somewhere else.
Poorup Redesign - Devlog #10 Iam aware this phase is 30 hours this is just cause i used hella AI and didnt want to count it towards my payout. this phase mainly about finishing touches running mutipile tests suits playing some games and finishing some things also fixing Ui and redoing the Ui of the Music First of all I added music for each of the 6 theme with a secondary theme which you can select under account and preferences I also made it easier to spot the different themes as they were hella hidden to be honest. Deactivation of palor patrol Though i didnt want to this I needed to deactivate palor patrol as it was simply impossible to use I checked m code in detail used and really did everything but I couldnt find the bug which makes it unplayablle so as long as I cant manage to fix it I have to deacitvate it. Next Phase pushing everything on nest setting up a piepleine so nest automatticaly pulls everything I push onto main in my repo and finnaly realsing it with thhe bots for players to use.
Poorup Redesign - Devlog #11 (FUCK MY LIFE) I am geniunly so tired of this project and my life in general i was so busy in the last few days cause of school and after shool clubs. This phase was mainly about recoding the Bot engine by hand, and updating the stock market modal inside the game also added New Ui for theme chooser and music and also added more sound tracks. I also redid statistics tabs in profile by hand and added better match history tracking Bot engine To be honest to Bot engine was so much AI stuff that i genuinly didnt understand what it was build on and how that is why I decided to take some time to read and research all the papers its build on and how it works. I then rewrote large parts of it to improve it and also found mutipile bugs in the logic of how it works and how it assigns values New account and preferences tab I fully redid some parts of the accounts and prefences tab to now allow for easier choosing of themes and also worked on the music engine so the music loops and youre able to choose different music depending on the theme. #Statsics tab I redid the whole tab as I found it quite stacked with 12 boxes for statsics and decicd to now add internal tabs to make it look cleaner this was a quick 30 minute changes as I didnt change logic but just frontend Next Steps Hopefully shipping adding HCAI and testing the AI bots and further UI refinement on tablet UI and 1440px desktop cause these are 2 of the most weirdest sizes https://poorup.jeremy-d.hackclub.app/ also if anybody wants to check it our but it is nowhere near finished so dont expect anything
Devlog after ship So after getting hella positive feedback regarding poorup which i highly appreciate my aim is to now make it have an even better user experience and etc. why? cause from the feedback i got, there are 3 areas I need to tackle, UI, game logic which is to complex and the User experience including rules and etc, Full redesign of the ingame lobby So after getting feedback that the board was to smallwhich was kinda expected and that the whole game is just clutered which i also assumed would happen cause all the features dont fit into the game i have done the following. I have redesigned the full ingame lobby with a new layout further inspired by richup(didnt want to do this but they have the most optimial layout) I have also redone the whole entire admin window cause to be honest it was horrondous and hard to use, and also just some small changes all around full redesign of modals so after doing the lobby i have now decided to fully redo a lot of the modal to have a better layout and etc so they are way more user friendly and acttually easy to understand, this also included cutting alot of features from certain modals because they just made them to complex and hard to use Cards and airpots this was something i was orrignally planning to release in the last ship but i just decided to ship it with this one i have finnaly added the option to buy new bank cards which you can use to get benefits like cashback of 10% on purchsees like rent payment suprise cards and other stuff, and I also added the option to use airpots to fly from one point to another and allow players to set the prices, Bots After reflecting a bit on my ai usage for the bots i decided to fully plug the whole programm into a repo which visualises it to see if it checks out with my mental map and I noticed so much slop which I would have never noticed before, this includes the whole Bot logic which i have probally never looked at cause i knew i wouldnt be able to code them. Though i probally should have cause this is the biggest slop i have ever seen and It introduced so many bugs which the ai couldnt find Next steps Right now all these changes are locally and not on github which are around +17000 lines of code and my aim is to further clean this up and fully push it with a new domain which is alredy online but will be kept hidden. here are soem before and afters, the more clutterd ones are the befores and the simplifyed ones after
Rework #1 Now you could be asking yourself? What have i done in the last 8 days to not post? Well Iam nearly finished with the full rework off all UI, Bug fixing and introducing new features, Chart Engine So i redid the whole system for charts and decided to build my own, because though i had one which worked it looked horrendous and really didnt fit poorup, you can see the new chart engine in the screenshot Game history I redid the whole entire game history system, because to be honest it was heavily vibed including its Ui and while cheking it, it looked like trash so I sat myself down and worked tiresly to fully redo it, and I even implemented the new chart system into it, Modals, Modals, Modals So I REDID NEARLY EVERY SINGLE MODAL IN THE GAME to provide a better User experience this took hella long and while doing it i noticed i had hackatime tracking off, because i had been working on some personal projects, hence the reason I only posted now because I lost so many hours, #Next Features Well to be honest there really arent anymore features i can add, the only thing left is fixing bugs and preparing it for the release and advertising it on reddit
Ships:
Poorup Poorup is a real-time multiplayer board game inspired by Richup(Monopoly), playable entirely in the browser What did I make? A full multiplayer board game running on a Node.js server with Socket.IO for real-time communication. The client is pure HTML, CSS, and JavaScript, no frameworks which is stupid if I look back on it . Features include: Room-based lobbies with a shareable room code Full Monopoly-style rules: buying, renting, building houses and hotels, mortgaging, and trading Live auctions with a countdown timer when a property is declined Configurable game rules per room (double rent, vacation cash, even build, auction, mortgage, randomized turn order, no rent in jail) Reconnect support — if you disconnect mid-turn, you can rejoin and resume In-game chat Automatic room cleanup when everyone leaves What was challenging? Shared states across multiple clients. Every player action, rolling dice, buying a property, placing a bid, has to be read server-side, broadcast to everyone, and reflected correctly on each client without race conditions or desync. Getting that right, especially during edge cases, took a lot of work. Edge cases in disconnects. A player disconnecting mid-auction is a different problem than disconnecting on their turn, which is different from the host disconnecting entirely. Each case needed its own handling: timers need to be cleared, pending actions need to be resolved, and remaining players need to stay in a valid game state. and i need alot of time and a bit of AI to fix that for me. Building a complete game UI with vanilla CSS. No component library, no utility framework — every modal, toggle, property card, and animation is hand-written. Honestly needed a lot of AI help here. Probally should have used a libary if I look back at it but it was fun to do it in plain CSS also for anyone wondering why the favicon is the one from vite i never deleted it and i wasnt in the mode to redesign a new one and tried to use the board map but that didnt work for some reason. What am I proud of? The architecture. The game logic lives entirely in gameLogic.js and has no knowledge of sockets or HTTP. The server in server.js wires events to logic calls and broadcasts the results. That separation made the codebase much easier to debug than it would have been otherwise but i needed AI to implement the idea i had the idea but wasnt quite able to do it. How to test it git clone https://github.com/jeremy341/Poorup.git cd Poorup npm install npm start Then open http://localhost:8080 in two separate tabs or browser windows.
Project Update I didnt even notice but all the changes i did i the last patches never got shipped so this one is about the last to changes which were adding modals, creating new UI and removing AI code check it out https://poorup.jeremy-d.hackclub.app/
Poorup — Biggest Update to date I’ve given the project a major overhaul, from its visual identity and everything else. This is geninuly one of the best projects i have created and iam proud to announce it I first started Poorup 3 and 1/2 months ago as a project to get introcude into webdesing and since then i have created 4 more website and revesiting it really shows my growth. Of course Ai was used by even then I could really feel my growth What was challening i decide to stay on CSS, html, and js instead of transferring it into another language for a simple reason i wanted to test how far i can push these 3 languages( i was just to lazy to learn a new language) How I used AI AI WAS USED IN THIS PROJECT for debugging and coding no UI or art generation. AI was a substantial coding and debugging tool, especially for backend work, bot logic, and tricky multiplayer edge cases. I used CodeScene to identify code-health hotspots. I wrote many page-specific backend features myself, then used GPT/Codex to help debug or split some larger hotspot files into smaller modules. Ai was also used to fix bugs in the Ipad Ui I created Poorup’s frontend UI and its SVG and art assets myself. AI helped in coding but never touched art. I didn’t compose the soundtrack. I selected open-source and other openly licensed tracks; their sources and license details are in the audio credits . I also rewrote the Git history to make the repository cleaner, so the current commit log isn’t a complete record of the project’s development. Also after around the 6th or 7th devlog i turned ai traccking of as to not fraud myself hours So if needed deplete hours. What’s new in this patch UI Full ui rework of everything nothing was left out every single Ui elemt was redone by scratch, with upto 6 themse each with their own custom soundtrack and background, this was the largest wish people had wished for when they reviewed my game and iam so proud of the UI. Boards and multiplayer New 40 and Metro-52 boards, with custom visual themes. Public rooms and private rooms with shareable codes; people can join as guests. Configurable rules, including double rent, vacation cash, even building, and randomized turn order. A deeper economy system Bank loans, player-to-player loans, equity deals, and hybrid contracts, with collateral and default consequences. Sponsored purchases: one player can fund another player’s property purchase in exchange for an agreed share. Negotiating now youre able to negotiate all offers you get instead of accepting or declining on the spot you can also keep them on hold An optional stock market for all the quant bros(gamblers) casino so now youre able to gamble Social I also added a full social systems with achievements, friends inviting people to lobbys seeing match history and more, also added the option to create your own 16x16 user icon Events one of the biggest features I decided to add global events which appear under certain conditions like to many houses standing which should reference the 2008 housing crises i also added stock market crash and alot more. Also global events can also combine to create seacil ones Parlor patrol this was supposed to be a cool minigame while waiting for your friends but it doesnt work and i cant fix the bug for the life of me so you can test it out but it doesnt work correclty all svg assets for it exist...
|
1792997704.104603
|
1793084104.104603
|
|
15657
|
Telemetry LMU by @Karlito | Stardance
|
Karlito
|
1
|
178.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:45:37Z", "hours": 178.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust", "repo": "https://github.com/Karlito05/TelemetryLMU", "demo": "https://github.com/Karlito05/TelemetryLMU/releases/tag/v1.0.1"}]...
|
[{"post_id": 71364, "ts": "202 [{"post_id": 71364, "ts": "2026-09-20T18:08:56Z", "hours": 1.2894, "text": "Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day."}, {"post_id": 71172, "ts": "2026-09-20T12:02:04Z", "hours": 7.2817, "text": "Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!"}, {"post_id": 70125, "ts": "2026-09-18T14:50:07Z", "hours": 4.7625, "text": "Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index."}, {"post_id": 68694, "ts": "2026-09-15T15:37:09Z", "hours": 9.5181, "text": "Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)"}, {"post_id": 66482, "ts": "2026-09-12T10:09:34Z", "hours": 5.3067, "text": "Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!"}, {"post_id": 65936, "ts": "2026-09-11T12:33:33Z", "hours": 6.7664, "text": "Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!"}, {"post_id": 63016, "ts": "2026-09-06T16:07:27Z", "hours": 7.12, "text": "Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!"}, {"post_id": 61727, "ts": "2026-09-04T19:26:10Z", "hours": 9.5394, "text": "Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»"}, {"post_id": 60204, "ts": "2026-09-02T13:06:23Z", "hours": 9.4931, "text": "Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!"}, {"post_id": 57444, "ts": "2026-08-29T16:23:51Z", "hours": 8.955, "text": "Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)"}, {"post_id": 55542, "ts": "2026-08-27T13:46:52Z", "hours": 8.0039, "text": "Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature."}, {"post_id": 54543, "ts": "2026-08-25T15:54:21Z", "hours": 4.4164, "text": "Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!"}, {"post_id": 53875, "ts": "2026-08-24T16:07:03Z", "hours": 6.4811, "text": "Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now."}, {"post_id": 51324, "ts": "2026-08-20T22:11:51Z", "hours": 5.83, "text": "Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!"}, {"post_id": 48473, "ts": "2026-08-16T20:40:29Z", "hours": 6.3456, "text": "Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D"}, {"post_id": 46562, "ts": "2026-08-13T21:40:19Z", "hours": 2.9933, "text": "Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD"}, {"post_id": 46009, "ts": "2026-08-12T21:29:42Z", "hours": 2.5956, "text": "Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️"}, {"post_id": 45715, "ts": "2026-08-12T11:49:22Z", "hours": 2.1014, "text": "Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do."}, {"post_id": 45217, "ts": "2026-08-11T15:31:51Z", "hours": 9.4839, "text": "Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages."}, {"post_id": 23759, "ts": "2026-07-06T21:48:28Z", "hours": 10.0158, "text": "Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!"}, {"post_id": 22818, "ts": "2026-07-05T12:34:46Z", "hours": 6.9447, "text": "Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:"}, {"post_id": 20110, "ts": "2026-07-01T17:12:04Z", "hours": 9.2647, "text": "Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)"}, {"post_id": 17764, "ts": "2026-06-28T18:11:51Z", "hours": 6.7406, "text": "DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX."}, {"post_id": 12606, "ts": "2026-06-20T16:24:29Z", "hours": 9.7894, "text": "DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look."}, {"post_id": 10767, "ts": "2026-06-17T17:54:53Z", "hours": 4.4767, "text": "DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)"}, {"post_id": 8829, "ts": "2026-06-14T18:01:40Z", "hours": 5.2161, "text": "DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being."}, {"post_id": 8235, "ts": "2026-06-13T18:14:25Z", "hours": 4.1997, "text": "DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)"}, {"post_id": 6907, "ts": "2026-06-11T16:08:05Z", "hours": 2.7908, "text": "DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D"}, {"post_id": 6797, "ts": "2026-06-11T12:14:18Z", "hours": 0.4275, "text": "DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!"}]...
|
Title: Telemetry LMU by @Karlito | Stardance
Devl Title: Telemetry LMU by @Karlito | Stardance
Devlogs:
DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!
DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D
DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)
DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being.
DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)
DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look.
DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX.
Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)
Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:
Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!
Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages.
Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do.
Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️
Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD
Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D
Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!
Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now.
Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!
Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature.
Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)
Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!
Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»
Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!
Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!
Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!
Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)
Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index.
Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!
Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day.
Ships:
Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust...
|
1792856986.9583683
|
1792943386.9583683
|
|
12747
|
Hack-A-Gent by @to_aarav_g | Stardance
|
to_aarav_g
|
1
|
177.01
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T13:09:15Z", "hours": 141.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? Hack-A-Gent — an AI coding agent that can plan, write, test and fix code for a hackathon project. What was challenging? Getting the agent to fix its own mistakes without breaking existing code. Cross-file dependencies and keeping shared code safe were probably the hardest parts. What are you proud of? I got it to go beyond just generating code and actually test and repair what it creates. How do I run it? Clone the repo, run npm install , create a .env with your Gemini API key, then run npm run dev . Start with a small coding task and let the agent work through it.", "repo": "https://github.com/Theuser1211/Hack-A-Gent", "demo": "https://github.com/Theuser1211/Hack-A-Gent/releases/"}]...
|
[{"post_id": 77987, "ts": "202 [{"post_id": 77987, "ts": "2026-10-09T03:55:17Z", "hours": 3.6219, "text": "Greeting! I have made 1 bid decision and ported the whole hag to python scipt using external libraries instead of building every agent myself. But for this we need gemini-cli configured with a paid account(which I dont have!). Sad, but I am happy rest all of hag works without any issues"}, {"post_id": 76687, "ts": "2026-10-04T10:37:59Z", "hours": 3.055, "text": "Got 208/208 tests to pass. Also I have implemented the providor for LLM as Gemini(Primary) -> Openrouter -> NVIDIA. So that maximum success rates can be achived. Also for anyone to test out HAG, just use README.md from github to install HAG, then setup up your API keys in the .env (don’t worry it’s all local), and you are ready to go."}, {"post_id": 76124, "ts": "2026-10-02T12:50:50Z", "hours": 3.5364, "text": "Heyyy, I have updated my README.md and also fixed my failing tests by now. I guess I am ready to ship Hack-A-Gent for Ship#1"}, {"post_id": 75504, "ts": "2026-09-30T09:17:25Z", "hours": 25.7925, "text": "I have realised that using NVIDIA NIMS is the issue, my app is almost working. , but the providors is failing at this point. I will try using gemini and openrouter to chek if it will work or not. I guess I will not be able to. And I also need to update my README.md for some reason it looks like AI written, I will write it in a funny way now."}, {"post_id": 72689, "ts": "2026-09-23T14:43:47Z", "hours": 20.6364, "text": "Fixed a pretty annoying bug today. HAG can now actually reach Nemotron during auto-repair after NVIDIA 503s. One step closer to a full successful run."}, {"post_id": 42039, "ts": "2026-08-06T16:28:40Z", "hours": 8.8503, "text": "Major progress today! I completed the Phase 1 stabilization of Hack-A-Gent by resolving all remaining test and build issues (1721/1721 tests passing, clean TypeScript build). I also performed a deep forensic investigation into the AI generation pipeline and discovered a critical issue where the router was rejecting recoverable LLM responses before they reached the JSON extraction layer. With the core architecture now stable, the focus shifts to eliminating unnecessary template fallbacks and improving the quality of AI-generated hackathon projects."}, {"post_id": 41361, "ts": "2026-08-05T15:03:39Z", "hours": 13.7719, "text": "Today’s work focused on stabilizing Hack-A-Gent for a production-ready release. I fixed the Improvement Pass so it now completes the full critique -> patch -> build -> judge cycle with measurable score improvements, strengthened template fallback generation with complete project scaffolding and improved styling, added automatic generation of deployment assets like LICENSE and vercel.json, and implemented comprehensive child-process lifecycle management to ensure the CLI exits cleanly after execution. I also streamlined the interview flow by removing unnecessary prompts, improved validation, and verified the project with a clean TypeScript build and extensive unit and feature test coverage."}, {"post_id": 39997, "ts": "2026-08-03T10:51:49Z", "hours": 8.8792, "text": "This is session I added a better parser so I get almost 99% accuracy and also made many improvements in the code generation. Almost done and drained out from all this"}, {"post_id": 39011, "ts": "2026-08-01T17:39:57Z", "hours": 14.4528, "text": "Spent this session improving Hack-A-Gent’s reliability and generation pipeline. Fixed a major architectural issue where generated apps were being overwritten by fallback templates, allowing AI-generated pages to be preserved correctly. Also resolved several runtime and build issues, improved validation, and verified the full pipeline by generating, building, and running a real hackathon project successfully. The next focus is improving project quality so the generated apps are more original, context-aware, and competitive in real hackathons."}, {"post_id": 35101, "ts": "2026-07-26T09:58:01Z", "hours": 11.1589, "text": "Today was mostly about making Hack-A-Gent more reliable instead of adding new features. I finally tracked down a long-standing parser issue that turned out to be an architectural problem: the CLI and the analysis pipeline were using two completely different parsers. I merged everything into a single parser, updated the production build to include it, and verified that all parser regression tests and the full test suite still pass. After that, I confirmed the CLI now extracts real judging criteria like Impact and Innovation instead of mistakenly treating navigation links as judging criteria. With parsing in a much better place, I shifted focus toward hardening the overall pipeline by planning phased reliability work around generation, auto-repair, validation, and recovery so the goal is no longer just generating code, but consistently producing projects that typecheck, build, run, and are ready for submission."}, {"post_id": 33322, "ts": "2026-07-23T04:04:01Z", "hours": 8.9597, "text": "This week I focused on making Hack-A-Gent stable and release-ready instead of adding new features. I cleaned up dead code, removed unused files, improved CLI logging and error messages, and verified the project with a full build and test pass. The CLI now parses real hackathon pages, plans projects, and gracefully falls back when AI providers are unavailable. I also ran end-to-end tests on real hackathon URLs to identify the final issues before release. The remaining work is improving template fallback and validation so every generated project is immediately usable, bringing Hack-A-Gent closer to its first stable release."}, {"post_id": 27158, "ts": "2026-07-12T13:41:30Z", "hours": 6.4664, "text": "Might be on final stages, making sure the agent doesn’t blows up in users hands. Taking time but needs to be done, Hope I can ship it by this week"}, {"post_id": 26029, "ts": "2026-07-10T16:39:54Z", "hours": 22.7653, "text": "Spent today improving Hack-A-Gent’s long-term direction instead of just fixing bugs. I mapped out a roadmap to turn it into a real Devpost hackathon agent, including a hackathon qualification engine, real Devpost benchmark suite, autonomous repair loop, browser validation, and organizational learning. Also audited the current architecture to identify what already exists, what needs refactoring, and what should be built next before writing more code."}, {"post_id": 21958, "ts": "2026-07-04T05:04:47Z", "hours": 25.1944, "text": "Hack-A-Gent I built Hack-A-Gent , a CLI-based AI agent that helps developers turn a Devpost hackathon challenge into a working project in minutes. Simply paste a Devpost competition URL into the terminal, and Hack-A-Gent analyzes the challenge, extracts the judging criteria and submission requirements, plans an appropriate architecture, and generates a production-ready project scaffold. You bring your own LLM API key (Anthropic, OpenAI, Google Gemini, NVIDIA NIMs, Ollama, and more), and Hack-A-Gent orchestrates the rest—from understanding the hackathon prompt to generating code, documentation, and a submission-ready starting point. The goal isn’t to replace developers, but to eliminate the repetitive setup work so builders can spend more time refining their ideas, polishing their projects, and creating a great demo."}]...
|
Title: Hack-A-Gent by @to_aarav_g | Stardance
Dev Title: Hack-A-Gent by @to_aarav_g | Stardance
Devlogs:
Hack-A-Gent I built Hack-A-Gent , a CLI-based AI agent that helps developers turn a Devpost hackathon challenge into a working project in minutes. Simply paste a Devpost competition URL into the terminal, and Hack-A-Gent analyzes the challenge, extracts the judging criteria and submission requirements, plans an appropriate architecture, and generates a production-ready project scaffold. You bring your own LLM API key (Anthropic, OpenAI, Google Gemini, NVIDIA NIMs, Ollama, and more), and Hack-A-Gent orchestrates the rest—from understanding the hackathon prompt to generating code, documentation, and a submission-ready starting point. The goal isn’t to replace developers, but to eliminate the repetitive setup work so builders can spend more time refining their ideas, polishing their projects, and creating a great demo.
Spent today improving Hack-A-Gent’s long-term direction instead of just fixing bugs. I mapped out a roadmap to turn it into a real Devpost hackathon agent, including a hackathon qualification engine, real Devpost benchmark suite, autonomous repair loop, browser validation, and organizational learning. Also audited the current architecture to identify what already exists, what needs refactoring, and what should be built next before writing more code.
Might be on final stages, making sure the agent doesn’t blows up in users hands. Taking time but needs to be done, Hope I can ship it by this week
This week I focused on making Hack-A-Gent stable and release-ready instead of adding new features. I cleaned up dead code, removed unused files, improved CLI logging and error messages, and verified the project with a full build and test pass. The CLI now parses real hackathon pages, plans projects, and gracefully falls back when AI providers are unavailable. I also ran end-to-end tests on real hackathon URLs to identify the final issues before release. The remaining work is improving template fallback and validation so every generated project is immediately usable, bringing Hack-A-Gent closer to its first stable release.
Today was mostly about making Hack-A-Gent more reliable instead of adding new features. I finally tracked down a long-standing parser issue that turned out to be an architectural problem: the CLI and the analysis pipeline were using two completely different parsers. I merged everything into a single parser, updated the production build to include it, and verified that all parser regression tests and the full test suite still pass. After that, I confirmed the CLI now extracts real judging criteria like Impact and Innovation instead of mistakenly treating navigation links as judging criteria. With parsing in a much better place, I shifted focus toward hardening the overall pipeline by planning phased reliability work around generation, auto-repair, validation, and recovery so the goal is no longer just generating code, but consistently producing projects that typecheck, build, run, and are ready for submission.
Spent this session improving Hack-A-Gent’s reliability and generation pipeline. Fixed a major architectural issue where generated apps were being overwritten by fallback templates, allowing AI-generated pages to be preserved correctly. Also resolved several runtime and build issues, improved validation, and verified the full pipeline by generating, building, and running a real hackathon project successfully. The next focus is improving project quality so the generated apps are more original, context-aware, and competitive in real hackathons.
This is session I added a better parser so I get almost 99% accuracy and also made many improvements in the code generation. Almost done and drained out from all this
Today’s work focused on stabilizing Hack-A-Gent for a production-ready release. I fixed the Improvement Pass so it now completes the full critique -> patch -> build -> judge cycle with measurable score improvements, strengthened template fallback generation with complete project scaffolding and improved styling, added automatic generation of deployment assets like LICENSE and vercel.json, and implemented comprehensive child-process lifecycle management to ensure the CLI exits cleanly after execution. I also streamlined the interview flow by removing unnecessary prompts, improved validation, and verified the project with a clean TypeScript build and extensive unit and feature test coverage.
Major progress today! I completed the Phase 1 stabilization of Hack-A-Gent by resolving all remaining test and build issues (1721/1721 tests passing, clean TypeScript build). I also performed a deep forensic investigation into the AI generation pipeline and discovered a critical issue where the router was rejecting recoverable LLM responses before they reached the JSON extraction layer. With the core architecture now stable, the focus shifts to eliminating unnecessary template fallbacks and improving the quality of AI-generated hackathon projects.
Fixed a pretty annoying bug today. HAG can now actually reach Nemotron during auto-repair after NVIDIA 503s. One step closer to a full successful run.
I have realised that using NVIDIA NIMS is the issue, my app is almost working. , but the providors is failing at this point. I will try using gemini and openrouter to chek if it will work or not. I guess I will not be able to. And I also need to update my README.md for some reason it looks like AI written, I will write it in a funny way now.
Heyyy, I have updated my README.md and also fixed my failing tests by now. I guess I am ready to ship Hack-A-Gent for Ship#1
Got 208/208 tests to pass. Also I have implemented the providor for LLM as Gemini(Primary) -> Openrouter -> NVIDIA. So that maximum success rates can be achived. Also for anyone to test out HAG, just use README.md from github to install HAG, then setup up your API keys in the .env (don’t worry it’s all local), and you are ready to go.
Greeting! I have made 1 bid decision and ported the whole hag to python scipt using external libraries instead of building every agent myself. But for this we need gemini-cli configured with a paid account(which I dont have!). Sad, but I am happy rest all of hag works without any issues
Ships:
What did you make? Hack-A-Gent — an AI coding agent that can plan, write, test and fix code for a hackathon project. What was challenging? Getting the agent to fix its own mistakes without breaking existing code. Cross-file dependencies and keeping shared code safe were probably the hardest parts. What are you proud of? I got it to go beyond just generating code and actually test and repair what it creates. How do I run it? Clone the repo, run npm install , create a .env with your Gemini API key, then run npm run dev . Start with a small coding task and let the agent work through it....
|
1792856879.2042353
|
1792943279.2042353
|
|
3602
|
3d gdot fps game by @jonathanwillner | Stardance
|
jonathanwillner
|
2
|
175.0
|
676
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T19:46:46Z", "hours": 36.0, "multiplier": 4.42, "payout": 81, "blessing": "cursed", "text": "Its a 3d fps made in Godot with a level that has interactable ncps because i lost the plot . It was fairly challenging since i have never used Godot but I’m proud of it. Even if there were times where this project made me want to yeet my computer out the second story window of my house and then follow after it but it was \"fun\" and \"rewording\" to get it work I hope you enjoy", "repo": "https://github.com/jonwill12/3d-hackclub-game", "demo": "https://jonwill12.itch.io/hackclub3dgame"}, {"ship_num": 2, "ts": "2026-06-17T15:18:07Z", "hours": 139.0, "multiplier": 7.24, "payout": 595, "blessing": "neutral", "text": "Its a 3d fps in godot it was fairly challenging since iv never used godot but I’m somewhat proud of it", "repo": "https://github.com/jonwill12/3d-hackclub-game", "demo": "https://jonwill12.itch.io/hackclub3dgame"}]...
|
[{"post_id": 29693, "ts": "202 [{"post_id": 29693, "ts": "2026-07-16T19:35:42Z", "hours": 6.0, "text": "i worked on getting the death and health system working cus thay broke agian than i adden the new level to the level select and fixed some bugs"}, {"post_id": 27389, "ts": "2026-07-12T22:22:55Z", "hours": 7.0, "text": "Dev Log: Fixing NPC Door Navigation IssueProblemWhile testing the new NPC AI system, I noticed that enemies were able to find the correct path using the NavigationAgent3D, but they would get stuck when trying to walk through doors.The NPC was not failing to find a path. The navigation debug showed:Navigation map was readyPath count was validThe NPC had a target positionThis meant the problem was not with the NavigationAgent3D or the navigation mesh.InvestigationI tested multiple possible causes:Rebuilt the navigation meshChecked NavigationAgent3D settingsChecked the NPC movement codeChecked collision sizesChecked the NPC pathingAfter debugging, I found that the issue was caused by collision layers.The NPC and the door were using the same collision layer, causing the NPC’s collision body to interfere with the door collision. The navigation system could see a valid path through the door, but the physics engine was stopping the NPC from moving through it.SolutionI separated the collision layers so the NPC and the door no longer incorrectly blocked each other.After changing the collision settings:NPCs could correctly enter and leave housesNavigation paths continued workingDoors no longer trapped enemiesMultiple NPCs could navigate the level correctlyNew Level ProgressI the Current AI Features The NPC system now includes: NavigationAgent3D pathfinding Enemy chasing and a behavior Anger system based on player messages that NPC can respond to in the chat UIMultiple NPC support with name targeting i agian cant uplode a video"}, {"post_id": 26292, "ts": "2026-07-11T00:27:50Z", "hours": 8.0, "text": "devlog Building the Next Level Today I made more progresson the game by adding a new AI npc and started working on a brand-new level. First,I fixed several bugs with command handling and NPC responses, Then I startedbuilding the new level for the game and began creating and placing some simplehouses around the map to make the environment feel more realistic. Then I plannedout where the NPCs and points of interest will be located inside and around thehouses. The Next Step is to Finish building the houses and add moreenvironmental details, create interiors so players can explore inside thebuildings, and add the NPCs so they can interact with the player as well as continuingto improve the AI so the npcs react naturally to what the player says and does,and keep testing and fixing bugs as development continues. and AI Improvements & New Dialogue System witch was focused on improving the AI and laying the groundwork for more immersive NPC interactions. AI Improvements Continued working on the enemy AI that reacts to what the player says. Improved the NPC anger system and fixed navmesh i can only add one video tho"}, {"post_id": 24290, "ts": "2026-07-07T19:16:19Z", "hours": 0.0, "text": "i have given up on getting the stt to work cause the auido godot outputs is to hard for stt models to understand so im just going to do a text box"}, {"post_id": 23581, "ts": "2026-07-06T16:53:27Z", "hours": 2.0, "text": "i cant do a video because it will casue a feedback loop Today I finally got a working voice-controlled AI system inside my Godot project. The goal was to let the player speak naturally to NPCs and have the game react in real time. First I set up a full voice pipeline: with a Microphone input capture inside Godot Real-time voice detection using audio thresholds Automatic recording when the player starts speaking Silence detection to stop recording Exporting audio chunks as .wav files Sending audio to Whisper (whisper.cpp) locally Receiving transcribed text for game logic This allows players to literally talk to the game than i added the audio improvements At first, the audio was messy and hard for Whisper to understand. The main issues were Muddy frequencies, Missing clarity in speech , and Some words being cut off at the start To fix this, I added audio processing directly in Godot: using a Compressor to balanced loud/quiet parts of speech and a band-Pass Filter to removed low rumble + high noise and Improve microphone sensitivity tuning. After these changes, the speech became much cleaner and Whisper started producing more accurate transcriptions."}, {"post_id": 23033, "ts": "2026-07-05T19:25:46Z", "hours": 2.0, "text": "made jumping work smother and am starting on ai thingy that when you say something reacts to what you said so if you say something mean it attacts and you can give it camands like go over thare or get me that item ect"}, {"post_id": 22404, "ts": "2026-07-04T21:24:43Z", "hours": 3.0, "text": "the game isnt as laggy as it lookes in the video my wifi is just buns Today I revamped my enemy’s navigation system and got the NavAgent working properly again after a lot of debugging. Before this update, the enemies would either get stuck on walls or fail to properly detect paths, which made the AI feel broken and inconsistent during gameplay. The main issue came from how the that i wasn’t using a NavigationAgent3D and instead just making the enemy go to the player one issue i ran into was how velocity was handled in the enemy movement code. Once I corrected the movement logic to properly use get_next_path_position () and only apply navigation to the X/Z axis while keeping gravity separate and added the floor walls and barrel nodes to the nav region the enemies started moving smoothly again and actually path around obstacles instead of bumping into them. After fixing the movement system, I also cleaned up the enemy AI script to make it more stable. The enemy now: Finds the player using groups Uses NavigationAgent3D to calculate paths Chases the player correctly around walls Maintains gravity properly while moving Attacks when close to the player This made the enemy feel way more alive and less “robotic,” since it can now properly navigate the level instead of just walking into geometry. Overall, this was a big improvement to the AI system and a solid step toward making the enemies feel more intelligent and fun to fight. I also fixed an issue where if you were touching the enemy and shot it you would get damaged and not the enemy."}, {"post_id": 21878, "ts": "2026-07-04T01:40:33Z", "hours": 5.0, "text": "also it was 2 hours and 50 minets idk why it says 5 hours and 55 minutes it may have been something else as well. This update was all about adding the fps arms and getting them to work in my game Aswell as redoing the player health and death systems. I had to redo the health system, so I made it into a more proper system that tracks the player’s health and detects when it reaches zero. Once the player’s healthreaches zero, they die, and the game displays the dedicated death screen instead of just leaving the player in the world. Getting this working was notas simple as I expected. I ran into several issues while connecting the player script to the death screen. At first, Godot could not find the custom health class because I had the wrong type name. After fixing that, I ran into errors where the death screen function expected different arguments than I was providing. Later, I hit another problem where the game tried to call the deathscreen on a null instance because the node reference was not set correctly. Each error pointed me toward another part of the system that needed attention. Once I fixed the node references and cleaned up the function calls, the deathscreen finally appeared correctly when the player’s health reached zero. Although it took several debugging sessions with chat gpt I know I used ai sue me I had no idea what I was doing and now I kind of know what I am doing, I nowhave a much more reliable player death system. my recodeing software dosnt recod the game aprently i cant add video"}, {"post_id": 10658, "ts": "2026-06-17T14:53:44Z", "hours": 1.0, "text": "finished fixing it made it ready to ship"}, {"post_id": 10389, "ts": "2026-06-17T02:16:51Z", "hours": 5.0, "text": "i added the tutorial, made the level select work as well as added the finishing touches to the game, because I’m taking a break because this game is bad for my mental and physical health. I haven’t slept in 5 days and I haven’t had a good sleep in 2 weeks, not because of the game, but it’s not helping"}, {"post_id": 9293, "ts": "2026-06-15T16:42:06Z", "hours": 15.0, "text": "At first, I created a UI using standard Button nodes and tried to assign images using level data. However, I ran into multiple issues where: • Images were not appearing at all • Buttons were scaling too large inside the GridContainer • Size settings like custom_minimum_size were being ignored • Some invalid properties (like icon_max_width) caused errors After debugging, I found that I could overrides manual sizing along size flags are properly configured. Now the level select system successfully generates buttons dynamically from an array of level data, including: • Level name • Level image icon • Locked/unlocked state • Scene loading when clicked and made a new level"}, {"post_id": 8992, "ts": "2026-06-15T00:00:02Z", "hours": 5.0, "text": "working on finishing touches and my hack time broke yaaaaaaaa"}, {"post_id": 8504, "ts": "2026-06-14T04:16:19Z", "hours": 37.0, "text": "i loki forgot to make a devlog yesterday i fixed the guns had a midlife crisis about whare i want to go with the game next added objectives and recoded the enimy and player and now im going to take a nap"}, {"post_id": 6953, "ts": "2026-06-11T17:42:07Z", "hours": 13.0, "text": "made new light system added FPS multiplayer template multIplayer and they’re back no oh god noooooooooooooooooooooooooooooooooooo not again"}, {"post_id": 5906, "ts": "2026-06-09T21:39:21Z", "hours": 16.0, "text": "made animation for enemy and rewrote entire code because gdot decided it wanted me to"}, {"post_id": 4961, "ts": "2026-06-08T16:30:38Z", "hours": 17.0, "text": "i fixed the guns and the enemy cus he stoped working"}, {"post_id": 4453, "ts": "2026-06-07T19:35:09Z", "hours": 1.0, "text": "trying to fix what ever the fuck this shit is no luck so far"}, {"post_id": 3911, "ts": "2026-06-07T00:51:38Z", "hours": 1.0, "text": "lo key i give up"}, {"post_id": 3871, "ts": "2026-06-06T23:12:55Z", "hours": 2.0, "text": "added guns and death"}, {"post_id": 3667, "ts": "2026-06-06T18:26:28Z", "hours": 17.0, "text": "game got corrupted had to start over :("}, {"post_id": 1778, "ts": "2026-06-03T23:43:28Z", "hours": 2.0, "text": "adding enemy"}, {"post_id": 1113, "ts": "2026-06-02T22:51:41Z", "hours": 1.0, "text": "learning gdot"}]...
|
Title: 3d gdot fps game by @jonathanwillner | Star Title: 3d gdot fps game by @jonathanwillner | Stardance
Devlogs:
learning gdot
adding enemy
game got corrupted had to start over :(
added guns and death
lo key i give up
trying to fix what ever the fuck this shit is no luck so far
i fixed the guns and the enemy cus he stoped working
made animation for enemy and rewrote entire code because gdot decided it wanted me to
made new light system added FPS multiplayer template multIplayer and they’re back no oh god noooooooooooooooooooooooooooooooooooo not again
i loki forgot to make a devlog yesterday i fixed the guns had a midlife crisis about whare i want to go with the game next added objectives and recoded the enimy and player and now im going to take a nap
working on finishing touches and my hack time broke yaaaaaaaa
At first, I created a UI using standard Button nodes and tried to assign images using level data. However, I ran into multiple issues where: • Images were not appearing at all • Buttons were scaling too large inside the GridContainer • Size settings like custom_minimum_size were being ignored • Some invalid properties (like icon_max_width) caused errors After debugging, I found that I could overrides manual sizing along size flags are properly configured. Now the level select system successfully generates buttons dynamically from an array of level data, including: • Level name • Level image icon • Locked/unlocked state • Scene loading when clicked and made a new level
i added the tutorial, made the level select work as well as added the finishing touches to the game, because I’m taking a break because this game is bad for my mental and physical health. I haven’t slept in 5 days and I haven’t had a good sleep in 2 weeks, not because of the game, but it’s not helping
finished fixing it made it ready to ship
also it was 2 hours and 50 minets idk why it says 5 hours and 55 minutes it may have been something else as well. This update was all about adding the fps arms and getting them to work in my game Aswell as redoing the player health and death systems. I had to redo the health system, so I made it into a more proper system that tracks the player’s health and detects when it reaches zero. Once the player’s healthreaches zero, they die, and the game displays the dedicated death screen instead of just leaving the player in the world. Getting this working was notas simple as I expected. I ran into several issues while connecting the player script to the death screen. At first, Godot could not find the custom health class because I had the wrong type name. After fixing that, I ran into errors where the death screen function expected different arguments than I was providing. Later, I hit another problem where the game tried to call the deathscreen on a null instance because the node reference was not set correctly. Each error pointed me toward another part of the system that needed attention. Once I fixed the node references and cleaned up the function calls, the deathscreen finally appeared correctly when the player’s health reached zero. Although it took several debugging sessions with chat gpt I know I used ai sue me I had no idea what I was doing and now I kind of know what I am doing, I nowhave a much more reliable player death system. my recodeing software dosnt recod the game aprently i cant add video
the game isnt as laggy as it lookes in the video my wifi is just buns Today I revamped my enemy’s navigation system and got the NavAgent working properly again after a lot of debugging. Before this update, the enemies would either get stuck on walls or fail to properly detect paths, which made the AI feel broken and inconsistent during gameplay. The main issue came from how the that i wasn’t using a NavigationAgent3D and instead just making the enemy go to the player one issue i ran into was how velocity was handled in the enemy movement code. Once I corrected the movement logic to properly use get_next_path_position () and only apply navigation to the X/Z axis while keeping gravity separate and added the floor walls and barrel nodes to the nav region the enemies started moving smoothly again and actually path around obstacles instead of bumping into them. After fixing the movement system, I also cleaned up the enemy AI script to make it more stable. The enemy now: Finds the player using groups Uses NavigationAgent3D to calculate paths Chases the player correctly around walls Maintains gravity properly while moving Attacks when close to the player This made the enemy feel way more alive and less “robotic,” since it can now properly navigate the level instead of just walking into geometry. Overall, this was a big improvement to the AI system and a solid step toward making the enemies feel more intelligent and fun to fight. I also fixed an issue where if you were touching the enemy and shot it you would get damaged and not the enemy.
made jumping work smother and am starting on ai thingy that when you say something reacts to what you said so if you say something mean it attacts and you can give it camands like go over thare or get me that item ect
i cant do a video because it will casue a feedback loop Today I finally got a working voice-controlled AI system inside my Godot project. The goal was to let the player speak naturally to NPCs and have the game react in real time. First I set up a full voice pipeline: with a Microphone input capture inside Godot Real-time voice detection using audio thresholds Automatic recording when the player starts speaking Silence detection to stop recording Exporting audio chunks as .wav files Sending audio to Whisper (whisper.cpp) locally Receiving transcribed text for game logic This allows players to literally talk to the game than i added the audio improvements At first, the audio was messy and hard for Whisper to understand. The main issues were Muddy frequencies, Missing clarity in speech , and Some words being cut off at the start To fix this, I added audio processing directly in Godot: using a Compressor to balanced loud/quiet parts of speech and a band-Pass Filter to removed low rumble + high noise and Improve microphone sensitivity tuning. After these changes, the speech became much cleaner and Whisper started producing more accurate transcriptions.
i have given up on getting the stt to work cause the auido godot outputs is to hard for stt models to understand so im just going to do a text box
devlog Building the Next Level Today I made more progresson the game by adding a new AI npc and started working on a brand-new level. First,I fixed several bugs with command handling and NPC responses, Then I startedbuilding the new level for the game and began creating and placing some simplehouses around the map to make the environment feel more realistic. Then I plannedout where the NPCs and points of interest will be located inside and around thehouses. The Next Step is to Finish building the houses and add moreenvironmental details, create interiors so players can explore inside thebuildings, and add the NPCs so they can interact with the player as well as continuingto improve the AI so the npcs react naturally to what the player says and does,and keep testing and fixing bugs as development continues. and AI Improvements & New Dialogue System witch was focused on improving the AI and laying the groundwork for more immersive NPC interactions. AI Improvements Continued working on the enemy AI that reacts to what the player says. Improved the NPC anger system and fixed navmesh i can only add one video tho
Dev Log: Fixing NPC Door Navigation IssueProblemWhile testing the new NPC AI system, I noticed that enemies were able to find the correct path using the NavigationAgent3D, but they would get stuck when trying to walk through doors.The NPC was not failing to find a path. The navigation debug showed:Navigation map was readyPath count was validThe NPC had a target positionThis meant the problem was not with the NavigationAgent3D or the navigation mesh.InvestigationI tested multiple possible causes:Rebuilt the navigation meshChecked NavigationAgent3D settingsChecked the NPC movement codeChecked collision sizesChecked the NPC pathingAfter debugging, I found that the issue was caused by collision layers.The NPC and the door were using the same collision layer, causing the NPC’s collision body to interfere with the door collision. The navigation system could see a valid path through the door, but the physics engine was stopping the NPC from moving through it.SolutionI separated the collision layers so the NPC and the door no longer incorrectly blocked each other.After changing the collision settings:NPCs could correctly enter and leave housesNavigation paths continued workingDoors no longer trapped enemiesMultiple NPCs could navigate the level correctlyNew Level ProgressI the Current AI Features The NPC system now includes: NavigationAgent3D pathfinding Enemy chasing and a behavior Anger system based on player messages that NPC can respond to in the chat UIMultiple NPC support with name targeting i agian cant uplode a video
i worked on getting the death and health system working cus thay broke agian than i adden the new level to the level select and fixed some bugs
Ships:
Its a 3d fps in godot it was fairly challenging since iv never used godot but I’m somewhat proud of it
Its a 3d fps made in Godot with a level that has interactable ncps because i lost the plot . It was fairly challenging since i have never used Godot but I’m proud of it. Even if there were times where this project made me want to yeet my computer out the second story window of my house and then follow after it but it was "fun" and "rewording" to get it work I hope you enjoy...
|
1792878850.189505
|
1793742850.189505
|
|
12178
|
Reclaim - A 3D extraction tower defence by @andrew Reclaim - A 3D extraction tower defence by @andrewp_silker | Stardance...
|
andrewp_silker
|
0
|
174.24
|
0
|
[]
|
[{"post_id": 76367, "ts": "202 [{"post_id": 76367, "ts": "2026-10-03T10:01:44Z", "hours": 4.7403, "text": "Devlog 🐟 (its str(2) + str(2)) Hope you all are having wonderful time making cool stuff we dont got long till the end of Stardance. Thing 1 added a top down building mode to make building easier or im just to lazy to add council auth values. Comes with cool 2D shader Thing 2 finilized how the council auth upgrades work they start at 0 then go up. need to all all the values for other authorisatoin levels apart from ship tier. Thing 3 SHIPING ON THE 17TH of oct."}, {"post_id": 75517, "ts": "2026-09-30T10:39:00Z", "hours": 7.2031, "text": "# Devlog #whats 9 + 10? DID HE SHIP. NO HE DIDN’T. What is he doing he dosn’t even know (i do). i know i said id ship but like its not ready… sorry THIS is a promise I WILL SHIP AFTER TUTORAL IS DONE. please stay everyone : P Thing 1 95% implementation of council auth Thing 2 fixed alot of scripts using my custom made script fix skill. its a skill that checks code for conventions, bugs, formatting issues and fixes them**. Purely used as a debugging tool and i will change my project information. Thing 3 Re designed turret and base placement to use one mode and not multiple as it confuses people. Cool Thing if you want to play test comment “GIVE IT TO ME :]” Also this project is now going to be assisted by ai as my school assignment is over and I need to get it done as well as keep my code robust though I dont have the time to read and consider my code in abstract ways."}, {"post_id": 73071, "ts": "2026-09-24T10:05:44Z", "hours": 10.7569, "text": "Devlog #20 Sup everyone hope you are a buku buku and not the other. There have been some interesting changes. Thing one Persistent storage fully works saving settings stored items and other important game values. Thing TWO COUNCIL AUTHORISATION This has taken way to long to get done. designed the full UI and made some icons images below. IM GOING TO SHIP 160 hours : ). Making assets also takes a long time and other stuff so i probably have at least 200."}, {"post_id": 69553, "ts": "2026-09-17T09:33:29Z", "hours": 6.3356, "text": "Dev log #19 EXAM MOCKS ARE OVER : ) Almost done with the pause menu. I’m going to ship this Saturday I swear. Completely changed the camera system to account for double axis collision with spring arms with lerping (not larping) the camera position to markers for smooth camera movement. I need to lock in now how about you?"}, {"post_id": 61401, "ts": "2026-09-04T09:14:54Z", "hours": 6.3886, "text": "Devlog #18 I am so back we are locked in everyone that in reading this WE are locked in. Brand new queueing system, full remote island enemy spawning pattern. ZERO balencing there are still a lot of issues but expect me to put in a lot of hours when im suppose to be studying for exams Love you all and the song im listening to right now is “Better Off Alone - Mckyyy” Thing 2 Major refactor to the building logic because I was just looking at the build_handeling function and it was like 140 lines so i put it into a bunch of helper functions. My OCD/perfectionism goes hard. like m… calm down i don’t know why I am literally. Thing 3 Yea I know i said I’d ship b4 but i need to get the council authorization done hopefully in the next week. GG all I am feeling unnecessary ecstatic bout to do a front lever."}, {"post_id": 58518, "ts": "2026-08-30T23:08:28Z", "hours": 15.7625, "text": "Devlog #17 Small changes to the wave mechanics, new recipe pinning, starting to work on tutorial"}, {"post_id": 45672, "ts": "2026-08-12T09:49:11Z", "hours": 8.3053, "text": "devlog #16 Completely changed spawning mechanics to be extremely customizable, added pickup notifications in the bottom right, added 4 other types of enemies. next work on Wave/Run ui and Tutorial and council authorization. also played around with some ai generated textures. all code is written by me not assets."}, {"post_id": 43867, "ts": "2026-08-09T09:56:31Z", "hours": 2.6447, "text": "Devlog #15 Just push a playable ish version to the itch page please brutally critque it in the comment section if you are bothered. then after i pushed it made alot of the item assets. tweaked some spawning and then pushed it back to itch. I will ship this MVP and start a new project. did hella bug fix’s and code robustness (is that even a word) What you can do walk around, shoot enemies, craft, extract, build up ship storage, access all craftable items in the game What you can’t do the game dosn’t save or load any persistant data but there will be in the future, drop down to the sector with ship resources. Future plans Add saveing and loading, deploy UI, Tutorial, Council Authroisatoin (persistant upgrades), modules, revamp enemy spawning logic, and more here is the itch link https://silverkeybord.itch.io/reclaim tutorial drop down to the sector, kill enemies, get one plate, craft 2 basic material, craft one single turret then get more."}, {"post_id": 42558, "ts": "2026-08-07T11:42:37Z", "hours": 16.1831, "text": "Devlog 13, 14# omg i forgot to post devlog 13 so this is kinda both. a lot of polishing done to gameplay and implementing animations to make the game more fun. making it easier to start with lower enemy health. shield fix’s, extraction preset are fully working and items are now taken back to the ship. just a little more balencing and ill have a playable base game posted on itch for devlog 15# wooo. not bothered to record a video of the animations in this devlog here is a screen shot though"}, {"post_id": 38804, "ts": "2026-08-01T11:20:55Z", "hours": 9.675, "text": "Devlog #12 – Extraction UI mostly implemented just need to work on the preset buttons. but it looks really nice. the sector shield got a shader and the extraction UI animation works. somthing is currenly broken. planning to have a fully working mvp by next week should be able to ship : )."}, {"post_id": 36921, "ts": "2026-07-29T10:06:11Z", "hours": 3.6575, "text": "Devlog #11. i dont know how to write on new lines when i press enter it dosn’t do anything so thats why this is all on one line can somone tell me how to format these post thanks. working on extraction ui. just added the changing colors to the extraction limit bar in the middle the left screen shot is in figma and then i put it into godot. i probably have like 4 hours of planning and iterating on the design of the extraction UI so thats why this dev log only has 3 hours. idk what im typing so yea. have a nice day."}, {"post_id": 33688, "ts": "2026-07-23T20:14:01Z", "hours": 8.4569, "text": "Devlog - 10# I have been working on polishing up the code making it a lot more robust. added shield, health, changed crafting ui to be less cluttered, an amazing looking health bar that works, forced extraction and damage numbers."}, {"post_id": 31141, "ts": "2026-07-19T09:46:12Z", "hours": 4.0261, "text": "DEVLOG #9 – Shield added, shield health added and the building selectoin is finally fully working took me way to long. need to lock in on this project bc i dont got that much time. this is like dev long 9???"}, {"post_id": 30061, "ts": "2026-07-17T10:37:54Z", "hours": 7.5172, "text": "Global scrip refactor new Helperfunctions scrips with static functions. polishing the build selectoin UI not finished but its going not smoothly taking way to long i need to lock in bc this is killing me"}, {"post_id": 26941, "ts": "2026-07-12T00:55:28Z", "hours": 10.3906, "text": "made the scrolling selection for changing builds, some optimizations, added another turret, critical damage, and build plate foundations"}, {"post_id": 19915, "ts": "2026-07-01T10:59:42Z", "hours": 16.7642, "text": "Crafting is fully working now working on polishing the item tips, extraction/deploying limits, Build selection and better visibility of system status. Feed back on the UI would be greatly appreciated"}, {"post_id": 15577, "ts": "2026-06-25T10:31:47Z", "hours": 5.7419, "text": "crafting system is 80% complete just need to call a check for all inventory slots and requirements for when something is crafted."}, {"post_id": 14978, "ts": "2026-06-24T10:11:05Z", "hours": 11.9461, "text": "creating a inventory, crafting, and implementing sounds took way to long. I ain’t explaining all my code it took 12 hours"}, {"post_id": 12461, "ts": "2026-06-20T10:51:07Z", "hours": 7.4831, "text": "refactored drops, did like 3 hours of planning game lore, drops reasons, market logic, fleshed out all future drops, started designing crafting system."}, {"post_id": 9087, "ts": "2026-06-15T05:51:37Z", "hours": 9.3872, "text": "fixed some bugs and improved structure for future development. starting to work on inventory, sounds, and basic modles."}, {"post_id": 4729, "ts": "2026-06-08T05:14:51Z", "hours": 0.8747, "text": "finished basic prototyping and MVP components"}]...
|
Title: Reclaim - A 3D extraction tower defence by Title: Reclaim - A 3D extraction tower defence by @andrewp_silker | Stardance
Devlogs:
finished basic prototyping and MVP components
fixed some bugs and improved structure for future development. starting to work on inventory, sounds, and basic modles.
refactored drops, did like 3 hours of planning game lore, drops reasons, market logic, fleshed out all future drops, started designing crafting system.
creating a inventory, crafting, and implementing sounds took way to long. I ain’t explaining all my code it took 12 hours
crafting system is 80% complete just need to call a check for all inventory slots and requirements for when something is crafted.
Crafting is fully working now working on polishing the item tips, extraction/deploying limits, Build selection and better visibility of system status. Feed back on the UI would be greatly appreciated
made the scrolling selection for changing builds, some optimizations, added another turret, critical damage, and build plate foundations
Global scrip refactor new Helperfunctions scrips with static functions. polishing the build selectoin UI not finished but its going not smoothly taking way to long i need to lock in bc this is killing me
DEVLOG #9 – Shield added, shield health added and the building selectoin is finally fully working took me way to long. need to lock in on this project bc i dont got that much time. this is like dev long 9???
Devlog - 10# I have been working on polishing up the code making it a lot more robust. added shield, health, changed crafting ui to be less cluttered, an amazing looking health bar that works, forced extraction and damage numbers.
Devlog #11. i dont know how to write on new lines when i press enter it dosn’t do anything so thats why this is all on one line can somone tell me how to format these post thanks. working on extraction ui. just added the changing colors to the extraction limit bar in the middle the left screen shot is in figma and then i put it into godot. i probably have like 4 hours of planning and iterating on the design of the extraction UI so thats why this dev log only has 3 hours. idk what im typing so yea. have a nice day.
Devlog #12 – Extraction UI mostly implemented just need to work on the preset buttons. but it looks really nice. the sector shield got a shader and the extraction UI animation works. somthing is currenly broken. planning to have a fully working mvp by next week should be able to ship : ).
Devlog 13, 14# omg i forgot to post devlog 13 so this is kinda both. a lot of polishing done to gameplay and implementing animations to make the game more fun. making it easier to start with lower enemy health. shield fix’s, extraction preset are fully working and items are now taken back to the ship. just a little more balencing and ill have a playable base game posted on itch for devlog 15# wooo. not bothered to record a video of the animations in this devlog here is a screen shot though
Devlog #15 Just push a playable ish version to the itch page please brutally critque it in the comment section if you are bothered. then after i pushed it made alot of the item assets. tweaked some spawning and then pushed it back to itch. I will ship this MVP and start a new project. did hella bug fix’s and code robustness (is that even a word) What you can do walk around, shoot enemies, craft, extract, build up ship storage, access all craftable items in the game What you can’t do the game dosn’t save or load any persistant data but there will be in the future, drop down to the sector with ship resources. Future plans Add saveing and loading, deploy UI, Tutorial, Council Authroisatoin (persistant upgrades), modules, revamp enemy spawning logic, and more here is the itch link https://silverkeybord.itch.io/reclaim tutorial drop down to the sector, kill enemies, get one plate, craft 2 basic material, craft one single turret then get more.
devlog #16 Completely changed spawning mechanics to be extremely customizable, added pickup notifications in the bottom right, added 4 other types of enemies. next work on Wave/Run ui and Tutorial and council authorization. also played around with some ai generated textures. all code is written by me not assets.
Devlog #17 Small changes to the wave mechanics, new recipe pinning, starting to work on tutorial
Devlog #18 I am so back we are locked in everyone that in reading this WE are locked in. Brand new queueing system, full remote island enemy spawning pattern. ZERO balencing there are still a lot of issues but expect me to put in a lot of hours when im suppose to be studying for exams Love you all and the song im listening to right now is “Better Off Alone - Mckyyy” Thing 2 Major refactor to the building logic because I was just looking at the build_handeling function and it was like 140 lines so i put it into a bunch of helper functions. My OCD/perfectionism goes hard. like m… calm down i don’t know why I am literally. Thing 3 Yea I know i said I’d ship b4 but i need to get the council authorization done hopefully in the next week. GG all I am feeling unnecessary ecstatic bout to do a front lever.
Dev log #19 EXAM MOCKS ARE OVER : ) Almost done with the pause menu. I’m going to ship this Saturday I swear. Completely changed the camera system to account for double axis collision with spring arms with lerping (not larping) the camera position to markers for smooth camera movement. I need to lock in now how about you?
Devlog #20 Sup everyone hope you are a buku buku and not the other. There have been some interesting changes. Thing one Persistent storage fully works saving settings stored items and other important game values. Thing TWO COUNCIL AUTHORISATION This has taken way to long to get done. designed the full UI and made some icons images below. IM GOING TO SHIP 160 hours : ). Making assets also takes a long time and other stuff so i probably have at least 200.
# Devlog #whats 9 + 10? DID HE SHIP. NO HE DIDN’T. What is he doing he dosn’t even know (i do). i know i said id ship but like its not ready… sorry THIS is a promise I WILL SHIP AFTER TUTORAL IS DONE. please stay everyone : P Thing 1 95% implementation of council auth Thing 2 fixed alot of scripts using my custom made script fix skill. its a skill that checks code for conventions, bugs, formatting issues and fixes them**. Purely used as a debugging tool and i will change my project information. Thing 3 Re designed turret and base placement to use one mode and not multiple as it confuses people. Cool Thing if you want to play test comment “GIVE IT TO ME :]” Also this project is now going to be assisted by ai as my school assignment is over and I need to get it done as well as keep my code robust though I dont have the time to read and consider my code in abstract ways.
Devlog 🐟 (its str(2) + str(2)) Hope you all are having wonderful time making cool stuff we dont got long till the end of Stardance. Thing 1 added a top down building mode to make building easier or im just to lazy to add council auth values. Comes with cool 2D shader Thing 2 finilized how the council auth upgrades work they start at 0 then go up. need to all all the values for other authorisatoin levels apart from ship tier. Thing 3 SHIPING ON THE 17TH of oct....
|
1792702083.5406353
|
1793306883.5406353
|
|
21987
|
off-road autonomous robot by @leila | Stardance
|
leila
|
0
|
173.99
|
0
|
[]
|
[{"post_id": 79978, "ts": "202 [{"post_id": 79978, "ts": "2026-08-13T00:00:00Z", "hours": 7.0, "text": "ok so from here on we just started placing the robots at different places trying to show what they could do if the washboard didnt always destroy their runs Exhibition 1: Team Big Fish and THE HILL … for our first exhibition, the other team set up the robot before the hill and took some stabs and speeding their way over it. in the end, none of the attempts made it, but i have video of the third one where they got so close that one of the wheels drove onto the other side of the hill and kept the robot there, until their driver let go of the throttle and let it down. it was super cool!! Exhibition 2: Team 10 and THE HOOK finally it was time for my teammates magnum opus of the past two weeks to be revealed and truly tested, and that of course was THE CLIMB!!!! and by the climb i mean a big pink plastic hook on the end of a measuring tape roll taken out of its case that we lovingly call “the bomb” (because it WILL explode if not handled properly). like i said a while ago though, the climb didnt have enough force to pull up the robot, but thats fine! theres still partial points for hooking, so all this exhibition really was was the hook rising at an almost comedically slow pace, before i carefully drove the robot over to the bar (as to not fold over the tape from the velocity) and gingerly brought the hook down on it. and everybody clapped! Exhibition 3: Team Big Fish and THE DUNK aka they used their shooter. it was super cool actually! they have a whole system with conveyor belt squeezing balls forward from above a slanted metal sheet, with flywheels at the end that can block balls for storage purposes until the gate is opened and the conveyor belts are forwarded to shoot them! it was suprisingly good and consistent, shooting from behind the second-to-last line. i wish we could do that… its okay they dont have a climb so we’re better and that was pretty much it! this experience has been so incredibly helpful for my learning and for me in general, and it really was(😢) one of the most fun times of my life. i dont even think i could near catalogue how much fun i had and how many things i learned. i really cant put it into words. thank you lucas, carlos, jade, maanya, patrick, alfonso, and trina for making this what it was, and of course thank you big zrl for sponsoring my attendance. if you’re reviewing this project, i recommend looking at devlogs further down if you’re missing context. the photos should hopefully help see the progression as well (if i can get those uploaded…) i leave you with 3 photos: the state of the robot right before i turned it off for the last time, the absolute state of our whiteboard after we used for brainstorming, and a last minute photo of the hallway i knew i would never walk again. happy hack clubbing!"}, {"post_id": 79977, "ts": "2026-08-12T00:00:00Z", "hours": 7.0, "text": "ladies, gentlemen, and my beautiful enbies * ITS TIME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *(ok so i admit this entry was written days later cause i had to go to school next day so my memory is foggy but! its still cool :3) basically the first half of the day (before everyone came in) was spent finalizing somethings we’d waved off earlier, like cable management and wiring in general, especially the motor wires were dangerously close to the suspension rods and a bunch of other things like that power and attaching the battery, since we really needed to keep the batteries charged properly to prevent the pi being underpowered and the battery needed to be held on with something a little less flimsy than straight up velcro 😭 THE GOD DAMN SET SCREWS HOLY TUNA THESE THINGS WILL NOT STAY TIGHT NO MATTER WHAT WE ARE NEVER GOING UP THAT HILL AGAIN ISTG (subtle foreshadowing) keeping the kill switch always accessible from the top and attaching it with a little more than tape and prayers making sure the wheels are attached properly and wont jut out weirdly as it has in the past, throwing the driving off balance as it getting the climb to actually work which is lowk a lost cause but we ball praying theres something we can do about the intake situation 😭🙏 among much more of course, the time eventually came when people started arriving (like alfonso, shoutout my goat) including a whole lot of parents. we started by showing them our robots as we made some final tweaks, like making sure the pi wouldnt fall off of our beautiful, incredibly complex attachment scheme (velcro mounting strips) until it finally happened… COMPETITION START‼️ so the way this ended up going is that each team alternated runs, usually getting progressively further (keyword usually …) Run 1: Team Big Fish (not us) their first run didn’t go too bad!! their ball intake was suprisingly functional (and by suprisingly i mean at all) (better than us tho) and they were almost able to get around the cones autonomously without hitting one! however, when it came to the washboard, it didnt really work out… their bot very quickly got stuck on a pipe and was ill equipped to unstuck itself, ending the first run. Run 2: Team 10 (US!!!!!!!!‼️!!!!!) also not too bad somehow!!!!!!!!!! of course there was no ball intake so we just drove over them, but we were able to slowly but surely get past the slalom with wide margins and very very slow turns in place. as for the washboard though, our run wasnt much better… i took the robot off of the ramp at the start rather fast, making sure to turn up the throttle limit in the hopes it would get us over a few obstacles. spoiler alert: it didnt. we pretty quickly just crashed into a full cinder block, bending the sheet metal base and unsurprisingly making it hard to continue the run! but whatever it was not too bad for a first attempt Run 3: Team Big Fish this one was probably their best! the ball intake was great, and they were able to carry them all through a perfect no-hit slalom! unfortunately, a similar fate to last time met them at the washboard. third times the charm hopefully… Run 4: Team 10 although the robot was slightly banged up now, it was still totally good to go! this slalom attempt was not nearly as graceful, and that certainly applies to the washboard too: i turned up the throttle limit more on the ramp and really just sent it, only to get stuck on top of that cinderblock instead of past it. fun stuff!"}, {"post_id": 79976, "ts": "2026-08-11T00:00:00Z", "hours": 7.0, "text": "and i call it frickmas cause THE COMPETITIONS TOMORROW OMG OMG OMG OMG OK SO here’s what on the agenda: making sure the set screws dont destroy themselves on the field getting the climb attached and making sure it maintains enough torque to actually pull the robot figuring out some sort of system for intake lining up all the suspension to prevent it from getting stuck, damaging the metal, or crapping out on the washboard section making sure the pi mount, buck converter, code, suspension actuation, and every other subsystem actually work testing!!! lots of testing of all of everything!!!!!!! for the first one, my partner had already spent so long on the set screws so some testing was all it took to see that they were fine, and that was enough cause they were not really going to get any better. my other partner finally got around to actually finishing up the climb and attaching it to the front of the bot. good news: it hooks! bad news: it doesn’t even remotely pull back! luckily, the rules still gove points for hook but no lift, so we decided to leave it there since his effort could be best spent elsewhere with this little time left the intake system was determined to be pretty much a dud by the end of the day, cause of course cardboard couldn’t really carry anything, and we didn’t have time to design something better since the last system fully failed lining up the suspension was pretty easy, just took a bit of manual adjustment and a good amount of testing on the field each of these were kind of annoying to address but i have a feeling itll be rather important at the end of the day (which is basically how long until handling all the wiring and subsystems took us) lastly for the testing, we just drove like a bunch of times! honestly the runs went like okayish ig, we rarely made it past the washboard and of course NEVER made it over the hill ever since we did it first a couple weeks ago. otherwise though, the robot was stable the entire time and didnt have any weird glitches or hardware malfunctions (thank god we taped down the battery this time) so we were good(ish) to go! below is basically what our final robot is gonna look like (minus the climb)"}, {"post_id": 79974, "ts": "2026-08-10T00:00:00Z", "hours": 7.0, "text": "OKAY it is time to get down to business we do NOT have much time. first order of business was looking at the TPU wheels reflect printed! they had come in while i was gone, and compared to our flywheels they were actually suprisingly good (although they lowk had their heads blown shmoove off (the tops were weirdly disconnected and ripped off)). most of all, our wheels were much too stiff and theirs were relatively soft, so we decided to go with theirs. we’d also gotten metal parts back from lucas; unfortunately, lucas’ parts were cut kinda incorrectly and for whatever reason the machine shop didn’t make them!! so, i spent today primarily trying to figure out how to do intake while one partner was working on (OF COURSE) retightening and loctite-ing the set screws and the other partner was working on finishing/testing the climb with a smaller motor he bought online over my hiatus. and by figuring out the intake, i mean taping a cardboard box to the bottom of the robot and letting it flap down while desperately PRAYING that the balls go in. i was also driving around a bunch trying to figure out why the robot was still really struggling to take turns, especially on the foam. eventually i had the insight that the friction on the wheels was simply too much, and Lucas came up with the idea of wrapping tape around the wheels to reduce it!! after that it was insane how well it drove and took turns, especially off of the foam floor. i lowk drove it around for like 45 mins straight it was so insanely fun to see something we made acting like a real machine, cause it was driving at a quality i could actually expect in like a real product! it was so cool and gratifying :3 of course i forgot to get a picture of video of it, which i have a feeling im gonna regret…"}, {"post_id": 79971, "ts": "2026-08-04T00:00:00Z", "hours": 7.0, "text": "okay so like i said last entry ill be leaving for three days, which means that i had to finish up some things today! i decided at this point that we were not going to able to mount a plate in the front for the intake (rip that idea and the whole bunch of filament we wasted on it 😭) so i spent the entire day pivoting on that idea and making the articulated suspension!!!! this was a really cool idea i talked with carlos about for like an hour, although we were thinking about only servos for suspension. this time around, i modified those servo mounts to place the head of of the edge of the main plate and used a bit of kevlar string Trina donated (ty Trina!) and tied it to the servo head and around the wheels hub. this means that when the servo is drawn up, the string pulls on the wheel, compresses the spring, and brings the robot down. for context, there is an 8 inch height requirement* that we had yet to succesfully get under. by that i mean the robot was like 11in. so, to get around that, these servo mounts could effectively deactivate the suspension at will, not only making driving more stable in the ball collection phase, but also actually getting under the height requirement! (since it was only a starting height requirement, we were allowed to expand after) anyways i made one mount, tested it, it didnt fully work, designed another and printed two of them, codexed while that was printing, tested one (it worked perfectly), printed 2 more, codexed the code for different states and positions for the servos and configuration stuff ofc, assembled the rest, tested all 4 of them out at the same time, actually tied good knots, and it was done by the end of the day!! im really proud of finishing this subsytem in one day before i left, it was suprisingly fun to see the robot dancing and doing pushups as it drove. and honestly, i think today really gave me that feeling of how incredible it is to see something like this just come to life, the way i feel when i make progress on a good coding project. i lowk want a 3d printer now… maybe that radish jam money could really come in handy……."}, {"post_id": 79970, "ts": "2026-08-03T00:00:00Z", "hours": 7.0, "text": "i am gonna be gone wednesday, thursday, and friday this week due to my schools orientation happening right before CalTech’s WiSTEM (which i am indeed going to :3), both of which are on weekdays. thus, with the intake challenge pushed even further to this wednesday (marking a full week delay), i will need to spend some time getting our existing systems to a good place and helping my partners with whatever they need over today and tomorrow before im gone. that being said, we did very little locking in today (hence calling it the dawn) because we had both a speaker and a tour!! Will Heltsley, former VP of Propulsion of SpaceX and an insanely knowledgable engineer, talked to us about different engineering concepts and some strategies for finding a stable job and a community of like-minded nerds that are fun to work beside. i asked a few questions about working with teams (because this program has shown me that it’ll be a very valuable skill to learn), especially since Will has done everything from working on a 3-person team to managing a group of 350 engineers. he was really helpful!! we also got to tour another startup, Forge Atomics, and it was awesome to see the inner workings of a company that is just getting of the ground! they had a really cool concept and i loved their mission, which in talking to one of the co-founders (Rex the goat) i learned was one of the most important things in finding a team that is going to work well: your missions need to align. also i learned from both mentors that, unless you plan on doing something research heavy like quantum computing, you should NOT get a PhD. guess what i want to do!"}, {"post_id": 79969, "ts": "2026-07-31T00:00:00Z", "hours": 7.0, "text": "okay this day was an experience fs. the start of the day was relatively normal, i was working a bit on ball detection while my partners assembled the intake/outtake thingy, and all of a sudden the pi turns off . this happened before when the power draw was low and peripherals were connected, so i just took out the camera and turned it on. yup, works fine. ok so lets plug the camera in while its on and it turns off . odd, looks like its probably some random bug or connection issue, so i just unplugged it, reseated it, and restarted the Pi. and it doesnt even turn on. ok, well theres another port. idk whats going on, but maybe thatll fix it? nothing. theres spare cables, lets try those ig? nope. ok what the hell the camera must be broken, so lets try a spare camera. doesnt turn on. ok what the actual ****???? lets try it on their robot and then theirs doesnt turn on either . at this point i am positively destroyed and fuming, luckily we have some very good food coming from a place nearby called the melt, so hopefully having a nice gooey cheesesteak can help me calm down, lock in, and figure out whats going on. big mistake. an hour passes. the adults have put on a movie, a fast and furious movie. you dont feel delirious, nor subdued, but simply off. its almost as if you are both more aware of your environment and slowly less aware of yourself. an hour passes. the car noises are still going. focus was a lost cause. one adult is stretching on the floor. the other is sitting at a table, still watching. you’re on the floor too. you’re not getting anything done. it was a lost cause anyways. an hour passes. carlos is sleeping on the slanted wooden plank of the hill. jade is lying on the floor and staring straight up. somehow your partner is locked in. the car noises continue. you are two inches away from meeting God, before you start laughing. shes laughing too, as well as your partner. presumably at carlos. sanity was a lost cause, and you lost it four and a half hours ago. cant believe its somehow 3:30. long story short, we slowly went insane with tokyo drift in the background as i pulled my hair out from the pi frying our cameras and the movie making it hard to focus, while one of my partners locked in to an unprecedented level, one just watched the movie casually, and the rest of us went crazy for no particular reason at all. this was a wild day (hence why im writing this the day after) never eating at the melt again bruh 😭"}, {"post_id": 79968, "ts": "2026-07-30T00:00:00Z", "hours": 7.0, "text": "I FORGOT TO PUT THE PRINT PLATE IN THE PRINTER YESTERDAY GOD DAMN IT 😭😭😭😭😭 its fine. ok so today was generally pretty mundane BUT!!! WE DROVE UP THE HILL LITERALLY ONCE!!!!! just on a whim my partner decided to go full power up the hill after my other partner had just loctited every set screw to see if we could make it, and we did!!!!!!!!!!!!!!!!!!!!!! …….unfortunately……… nobody filmed it…………………………….. -# god damn it…………………………. it was really cool though! i think it represents that we’re really nearing a functionally useful robot and that were actually overcoming the challenges that have plagued us for like weeks anyways heres a picture of our bot looking super duper cool"}, {"post_id": 79967, "ts": "2026-07-29T00:00:00Z", "hours": 7.0, "text": "so my GOATED teammate whose shall not be named figured out the TPU problem: the printer just wasnt strong enough to feed it in! i honestly have some doubt that that was THE problem, considering how easy the solution is (just unspool a bunch of filament onto the ground), but whatever we ball‼️ anyways the first third of today was spent working on that servo mount and arms CAD file i mentioned before as my partners finished up cutting the shafts and legs for the new tensioners. i also got the tensioners printed, but that was pretty quick since its just a few ~1x0.5” pieces the second third was spent doing the assembly for all the pieces, since we had to take apart each leg completely, and then go down the assembly line to put it together. i was responsible for putting on the tensioners and then the motors with these really handy alligator clips Carlos graciously gave us that allowed me to get short screws into holes that were far into the leg. then, once the motor is attached, my partner would attach the wheel and get the belt on there. i think he used some like dark magic cause the belt was really hard to get on before it was tensioned, idek how he did it now… my other partner would then put on the insert, bearings, and shaft for attaching the leg to the chassis. once we were done, we all spent some time getting the legs on the chassis but we didnt finish. i rushed to start the flywheel TPU print we designed a while ago before we left and spent the rest of the day on… THE SPACE X TOUR!!!!!!!!!!!!!!!!!!!!!!!!!! we got to go to spacex and have a little tour with one of patricks friends!!!!!!!!!! it was really really really cool, the facility was huge and we such a bunch of fuel tanks, satellites, an engine actively being built, and a phased antenna array. that last thing nerdsniped me so hard, and because Simon (one of our “tour guides”) was an engineer that worked on the Starlink user terminals (which also had the same type of antenna array as the Starlink satellites) i was able to ask a bunch of questions about it. apparently, they both have a bunch of antenna put together and arranged such that, by controlling the phase of the signal coming through each of the ~50 antennae, can focus on a narrow beam of EMF waves and effectively filter out signal to only a specific Starlink satellite in the sky. super cool!!!! no photo(s) cause we weren’t allowed to take any but its chill"}, {"post_id": 79966, "ts": "2026-07-28T00:00:00Z", "hours": 7.0, "text": "the TPU arrived! guess what though: it lowk doesnt work with the X1c (our printer)!!!!!!! we refined the design for the flywheel a bit, but after figuring out the TPU settings in the printer, our test prints didn’t work at all. at some point, it just seems to run out of filament (usually before the first layer finishes) and leaves these dots of plastic where its supposed to be entirely filled in. no TPU ig!! my teammates spent most of the day figuring out where to cut holes for the tensioner and then actually drilling those holes for the eventual assembly (prob tomorrow). it looked really sucky cause the hacksaw is time-consuming and lowk rather annoying, especially when we need to cut 3 shafts into like 12 pieces, so thank you teammates that was very nice 🙏 i spent the whole rest of the day on the CAD for the articulated arms that we’re gonna have in front and on top of the entire robot, and i designed a servo mount that’ll keep the servos attached to the robot at the exact height we need them to be to make a plate that hits the ground, settles at a nice angle, holds the flywheels, and all the while still fits on the print bed. i tried to print one of those mounts but after like 5 prints that failed on the first layer, the only succesful print ran out of filament on the second to last layer 😭 its lowk chill though cause it looks kinda cool so im gonna keep it attached is the lowk awesome lowk cooked servo mount that i lowk made and printed lowk"}, {"post_id": 79965, "ts": "2026-07-27T00:00:00Z", "hours": 7.0, "text": "GUESS WHAT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! the belt is skipping. turns out the belt needs to be tensioned to not yknow skip horribly. any real torque that the wheel experiences back on it, including the torque inherently present in turning with tank drive (which is really high cause we have really grippy wheels and their laid out in a rectangle), makes the belt slip on the teeth and not drive the tire at all, leaving the motor spinning but the robot not moving. basically, we’re gonna need a tensioner to slot into the legs. in other news, we still have to get intake/outtake working by friday hopefully. i’ve ordered TPU filament online and got on of my teammates to start on a design for a flywheel that has a PLA hub and TPU tire, maybe we’ll print it tomorrow? although one good thing about this is that the robot looks super cool awesome now (source: see below)"}, {"post_id": 79964, "ts": "2026-07-24T00:00:00Z", "hours": 7.0, "text": "the parts came! literally all of today was spent assembling the drive system as my partners were drilling the holes and cutting the shafts for the wheels, pivots, and spring dowels. we’ve unfortunately found out that the belt drives skip kind of a lot, so hopefully this doesn’t cause issues with driving under torque when we get to that… (i swear if this is foreshadowing) we also went out to Reflect Orbital today!! seeing the mirrors was incredibly cool, and the material they made it out of felt really interesting. something about its very small thickness (2.8 microns!!) made it feel like it was barely on your finger if you weren’t looking at it. In addition, I talked to one of the software engineers (shoutout Alfonso) about how they get the software done, including things like: Double buffering updates (seemingly called ABing) to make sure that no update permanently breaks the system Using the Yocto project to make a custom Linux kernel for their embedded systems Monolithic applications vs. a more service based approach that also goes hand in hand with… Error handling and making sure that something like an illegal instruction won’t crash your expensive space satellite Testing with the ground-sat (all of the components on the real satellite connected together on a table in a room) and an approach that involves uploading the changed code to the ground-sat every night and running a whole test suite to make sure none of the changes broke anything and that they (hopefully) achieved what they were written for overall it was pretty damn cool you should check out Reflect :3 below is one of the legs, and as you can see theres a whole belt going from the motor to the wheel!"}, {"post_id": 79963, "ts": "2026-07-23T00:00:00Z", "hours": 7.0, "text": "guess what THE BEARINGS AND SHAFTS GOT DELAYED!!!! YAAAAAAAAAAAYYYYY its fine. we spent today CADing and printing new designs for both the leg inserts and one piece of the rod-ends, and i think they’re in a pretty good place (for not having the actual components needed). I also did some testing with the ball/cone detection and came to the conclusion that it simply sucks and just isn’t good enough, so I got Codex to give me suggestions for an overhaul and I picked which approach would be the best to go for. The demo it produced for me using new shape detection and differentiating objects from its surroundings (in camera space) was so bad that I’ve decided on a completely different approach altogether: ML!! I got it to do another overhaul that would add a mode to the existing code that allowed camera snapshots to be taken and put in a folder with a press of a button on the controller. Then, it made a tool that could be run on my laptop that would bring the images up one by one, I would mark balls and cones on there, and then that data would be used to train an ONNX model (with ROCM acceleration on my Radeon 890M iGPU, of course) that could then be uploaded onto the Pi and ran as the new detection backend!! we’ll see if it works, cause I did all this at the end of the day and had no time to gather training data (of course i came up with this after two days of having very little to do)."}, {"post_id": 79949, "ts": "2026-07-22T00:00:00Z", "hours": 8.0169, "text": "7/21 - EVERYTHING GOT DELAYED VERY BAD NEWS: every single thing we needed to order for the drive train and suspension got delayed by a day 😭 anyways completely unrelated but the second competition is being moved to thursday, cause we cant drive through the course with literally 0 suspension the first 2 hours of today was spent rushing out an onshape sketch to get our metal legs cut by Lucas cause he (reasonably enough) wanted the drawing by 11 before he left the shop. i had to remember how to do drawings, with a lottt of help from carlos. unfortunately, i forgot the holes for the spring on the top so we’ll have to figure that eventually. i also forgot to put holes that would make screwing in the motor remotely possible but lucas the GOAT put those in for us. could not appreciate it more we might be lowk cooked now, cause the bearings say they’re gonna arrive thursday night so we may not even have the robot driving again until next week 😭😭 that being said we ball‼️ also ill be posting a devlog every weekday now cause i need to journal every day anyways attached below are 2 of the legs we got cut with the motors on them"}, {"post_id": 79948, "ts": "2026-07-22T00:00:00Z", "hours": 0.5692, "text": "7/22 - not much we can do about it much of today was spent moping about how everything would be arriving tonight (and of course the belts are arriving tomorrow night, one of the parts that is literally necessary to drive the thing at all). so much of today was spent just trying to design, cad, and otherwise figure out details for the legs before we actually had the components necessary to make them. i spent some time with one of my teammates figuring out where specifically the springs for the legs are gonna go, and he made a quick 3d printed rod-end that’ll hold in the shaft that acts as the spring dowel. we also planned out where we could put the legs’ pivot point on the chassis and just generally planned every element of assembly that we could. this also involved figuring out last second that i had no idea how we were gonna mount the springs and chassis on the leg at all and that my teammates didn’t know too much either, but its cool we figured it out and started the print by the end of the day 👍 attached: us figuring out where we’re gonna mount both the leg and the spring on the chassis and me drawing the top view of all the drive train stuff going on inside the leg (ignore my horrible handwriting its the board i swear)"}, {"post_id": 79960, "ts": "2026-07-20T00:00:00Z", "hours": 7.0, "text": "almost all of today was spent discussing and weighing different suspension designs and drive train implementations, culminating us in finally buying some parts and basically finishing out our $1000 budget from the start of the program to the end of this week. we settled on the 4 independent legs early, so the options were between: mounting the motor on the chassis on the same pivot point as the leg itself mounting the motor on the chassis and using a u-joint articulated axle mounting the motor high up on the leg and using a belt drive eventually we arrived on that last option because the other ones didnt really pose a benefit that was worth the complexity they would introduce (especially the first one) towards the end of the day, we ordered all the parts we needed to install it hopefully over tomorrow and wednesday also! we finished printing the finalized(…) wheel design so now we have four rigidly attached and bead-locked wheels+tires!! turns out the robot is like significantly faster than we thought so uhhh throttle limit is gonna have to be pretty low for a bit. below is a sample of our mad drawings (mostly mine 😭) trying to figure out how the hell this thing is gonna work"}, {"post_id": 79959, "ts": "2026-07-17T00:00:00Z", "hours": 7.0, "text": "my day was spent entirely on programming two things: the controls - i (codex) spent a bunch of time setting up: the tank controls to individually drive each motor making the motor channels and configuration set in environment variables, and making a shell script that loads those environment variables from a shell script, enters the py venv, and runs the program adding different modes/states to the program and a radial menu to switch between them (all in a TUI by the way) adding a throttle limit and button presses to change it on the fly adding a button to start driving and making it so that every unrecognized button press stops it as a safety measure it wasnt alllll codex tho, i came up with the all ideas for these and usually gave rather specific details for how i wanted them implemented i also worked on the ball detection , which mostly involved sitting down and just adjusting parameters until the detection was like maybe almost passable, adding (asking codex to) add new parameters when the existing ones didn’t encompass the mistaks the detector was making. needless to say this lowk took a while but we’re in a good place rn i think!!! we have a moving robot with some kinda maybe working ball detection, which is like half of the first phase (the easiest part). so were slightly cooked but still yay it works!!"}, {"post_id": 79958, "ts": "2026-07-16T00:00:00Z", "hours": 7.0, "text": "ok sooooo turned out the wheels actually highkey sucked. the shaft was circular, so of course the motor didn’t rotate it well (its a d-shaft motor so its shaft output has a chunk taken out of it), but even once we added the d-shaft it just turned the hole circular by itself anyways 😭 luckily Lucas told us about these things called shaft hubs that dig in to the shaft with set screws and provide screw holes perpendicular to the shaft that can be a lot better at transferring the rotational power without yknow slipping. so we bought those on amazon ofc! but still the assembly went really well!! all the ports worked together, including the motor holes on the legs, and we were able to put the pi on top and connect all the electronics, eventually getting the motors actually moving while in the air by the end of the day! (with a lot lot of codexing ofc) this is what the robot btw!! its super duper duper cool isnt it :3"}, {"post_id": 79957, "ts": "2026-07-15T00:00:00Z", "hours": 7.0, "text": "by that i mean we cut holes in a cardboard box, screwed the motors into them, stuck the wheels on, and codexed like no tomorrow until the motors somehow worked (THANK YOU SO MUCH LUCAS and also gpt luna), but our stupid dingy two-wheeled cardboard box actually moved! baby steps i swear ok but more important we’ve actually designed a metal base for the robot!! its literally a flat metal sheet with holes cut in it + 2 bent sheet metal pieces with motor holes cut out in them but! we learned about onshape a bunch more, the process of sheet metal modeling, and especially how to work with a machine shop. you heard that right, we’re getting our parts sent to a machine shop!!!! im really excited to see this piece come to life after we bumbled around on an onshape tab for like 3 hours trying to design it, i have a feeling its gonna be really cool. oh also were getting it tomorrow afternoon yay!!!! attached is that slightly cooked “robot”"}, {"post_id": 79956, "ts": "2026-07-14T00:00:00Z", "hours": 7.0, "text": "luckily the tires were able to arrive this morning, so Jade (one of the adults at the program) brought them in and we got to designing + 3d printing wheels for them! luckily we have full access to a bambu lab x1 carbon here, so we took some lessons from Carlos (one of the mentors) in Onshape and tried to design a preliminary wheel. of course it didnt fit cause we have no idea how to use calipers seemingly, but the second attempt actually worked pretty well! you could try to turn the tire and stop the wheel, and it wouldnt move unless you put a lot of force. we left a shaft hole in it ofc so we can put it on the motors when we recieve them tomorrow. very awesome very cool!!"}, {"post_id": 79950, "ts": "2026-07-14T00:00:00Z", "hours": 4.4017, "text": "so i may have forgotten to make a project when we started this a week ago but! the motors and camera are all connected successfully to the pi and it has a gh repo set up with a Codex’d ball/cone detector that automatically drives the motors (or manually with a usb xbox controller clone). all we need now is for the sheet metal chassis we designed friday to arrive and the bidirectional ESCs we ordered to replace the small and kinda inconsistent generic ESCs we have now"}, {"post_id": 79955, "ts": "2026-07-13T00:00:00Z", "hours": 7.0, "text": "we’ve finally formed our real groups! i got placed with two dudes, one my age and the other surprisingly young for the caliber of challenge we had ahead we also got $1000 to spend at our discretion for the next two weeks!!!!!🤑!!!!!!! we immediately made an amazon account and ordered some fundamental stuff, like: a controller! i just bought a cheap usb xbox controller clone, since we dont really need quality but we do need a reliable connection that works on startup. most importantly, motors!!!! this took a lot lot lot of deliberation (the whole day basically) and talking to our motors, but we eventually decided on these Maxynos planetary gear motors cause they have really good torque, theyre not too expensive, and we can easily buy some ESCs to connect to them. speaking off… ESCs and power distribution cables: this constisted of the motor speed controllers that were very specifically bought for their XT60 plugs, and then 3 splitter cables (2 2-way and 1 3-way) to distribute the power to each of the 4 motors and the pi as well. battery: at the advice of Lucas, one of our mentors who clearly knows a lot about projects like this, recommended Spektrum smart batteries so we bought a few of those + a brand smart charger for both teams 5V converter: to feed battery power to the Pi without literally kabooming it up (and to connect it in the first place). tires: we spent a lot of time on this decision! once again, lucas came in clutch suggesting rc car crawlers wheels because they have a lot of friction but also are very bendy. plus they have listed dimensions and a lip to attach a “bead-locked” wheel to, so we can just design our own wheel and put it in once it arrives and that was the day! whole lot of money spent for sure but its fineeeeeee (probably) (hopefully)"}, {"post_id": 79954, "ts": "2026-07-10T00:00:00Z", "hours": 7.0, "text": "one of my partners had already been working on a ball detection demo over the last couple of days that worked with their laptop camera, so i (Codex) took some time to add a picamera2 backend along with the existing opencv2 one and getting the code actually uploaded to the pi. there were a bunch of issues with libraries and venvs and maintaining stable input and output to and from the pi, but eventually we got some kind of a demo working. we had to plug in the pi’s power supply in the corner of the room and partially covered by like 20 chairs, but the ball detection kind of almost maybe worked a bit! one problem was that they made the program assuming manual mouse input for initially cataloging the different colored balls under those lighting conditions, but that had to be removed because there was no good way to have mouse input and realtime monitor output for the pi *and we certainly wouldn’t have that on the course itself)"}, {"post_id": 79953, "ts": "2026-07-09T00:00:00Z", "hours": 7.0, "text": "the start of the day was spent with all of us drawing our ideas for how we’d design a robot that could complete the course and then discussing what we drew, which was pretty helpful since i changed my design a few times based on what other people drew. i spent some time trying to get the IMX708 camera they bought to connect, which of course took the entire day 😭 the problem was that i was plugging it into port zero but the line in /boot/firmware/config.txt was dtoverlay=imx708 . of course it was supposed to be include cam0 to specify it was plugged into port 0 and not the apparent default of port 1(?!?). but whatever, i got the camera plugged in and showing stills by the end of the day"}, {"post_id": 79952, "ts": "2026-07-08T00:00:00Z", "hours": 7.0, "text": "finished setting up the Pis (finally), despite the train of issues that tried to stop us: the first problem was that the college wifi required sign in, so setting it up headless wasnt working. i tried to use lynx , but the website required js on its sign-in page(??) so i couldnt do that. i tried to use my tether (basically a hotspot but without hotspot data) but wpa_supplicant wasn’t authenticating properly. i tried to use my real hotspot, but the wifi didn’t work with that either. on a whim i switched to 2.4GHz and WPA2 and it worked magically? of course rpi connect still didn’t work and ssh wasn’t allowed over my hotspot for some reason so i just had them buy us a monitor, reformatted with a desktop installed, and plugged in a usb mouse and keyboard to authenticate manually. of course ssh is blocked on the school wifi (what im using now), but rpi connect works enough. that was pretty much the entire day though, the only other thing i did was getting a git repository set up on the pi"}, {"post_id": 79951, "ts": "2026-07-07T00:00:00Z", "hours": 7.0, "text": "we met each other, got a look at the course, and all drove the RC car through it one at a time. we also made accounts and signed up for Onshape and ChatGPT Plus, then Patrick showed us how to use Codex since that’s how we’ll be “coding” the entire project. another classmate and i then proceeded to spend the rest of the day setting up the Raspberry Pis that we’re going to use as our robots’ brains (we didn’t finish that day) attaached is a picture of that rc car"}]...
|
Title: off-road autonomous robot by @leila | Stard Title: off-road autonomous robot by @leila | Stardance
Devlogs:
we met each other, got a look at the course, and all drove the RC car through it one at a time. we also made accounts and signed up for Onshape and ChatGPT Plus, then Patrick showed us how to use Codex since that’s how we’ll be “coding” the entire project. another classmate and i then proceeded to spend the rest of the day setting up the Raspberry Pis that we’re going to use as our robots’ brains (we didn’t finish that day) attaached is a picture of that rc car
finished setting up the Pis (finally), despite the train of issues that tried to stop us: the first problem was that the college wifi required sign in, so setting it up headless wasnt working. i tried to use lynx , but the website required js on its sign-in page(??) so i couldnt do that. i tried to use my tether (basically a hotspot but without hotspot data) but wpa_supplicant wasn’t authenticating properly. i tried to use my real hotspot, but the wifi didn’t work with that either. on a whim i switched to 2.4GHz and WPA2 and it worked magically? of course rpi connect still didn’t work and ssh wasn’t allowed over my hotspot for some reason so i just had them buy us a monitor, reformatted with a desktop installed, and plugged in a usb mouse and keyboard to authenticate manually. of course ssh is blocked on the school wifi (what im using now), but rpi connect works enough. that was pretty much the entire day though, the only other thing i did was getting a git repository set up on the pi
the start of the day was spent with all of us drawing our ideas for how we’d design a robot that could complete the course and then discussing what we drew, which was pretty helpful since i changed my design a few times based on what other people drew. i spent some time trying to get the IMX708 camera they bought to connect, which of course took the entire day 😭 the problem was that i was plugging it into port zero but the line in /boot/firmware/config.txt was dtoverlay=imx708 . of course it was supposed to be include cam0 to specify it was plugged into port 0 and not the apparent default of port 1(?!?). but whatever, i got the camera plugged in and showing stills by the end of the day
one of my partners had already been working on a ball detection demo over the last couple of days that worked with their laptop camera, so i (Codex) took some time to add a picamera2 backend along with the existing opencv2 one and getting the code actually uploaded to the pi. there were a bunch of issues with libraries and venvs and maintaining stable input and output to and from the pi, but eventually we got some kind of a demo working. we had to plug in the pi’s power supply in the corner of the room and partially covered by like 20 chairs, but the ball detection kind of almost maybe worked a bit! one problem was that they made the program assuming manual mouse input for initially cataloging the different colored balls under those lighting conditions, but that had to be removed because there was no good way to have mouse input and realtime monitor output for the pi *and we certainly wouldn’t have that on the course itself)
we’ve finally formed our real groups! i got placed with two dudes, one my age and the other surprisingly young for the caliber of challenge we had ahead we also got $1000 to spend at our discretion for the next two weeks!!!!!🤑!!!!!!! we immediately made an amazon account and ordered some fundamental stuff, like: a controller! i just bought a cheap usb xbox controller clone, since we dont really need quality but we do need a reliable connection that works on startup. most importantly, motors!!!! this took a lot lot lot of deliberation (the whole day basically) and talking to our motors, but we eventually decided on these Maxynos planetary gear motors cause they have really good torque, theyre not too expensive, and we can easily buy some ESCs to connect to them. speaking off… ESCs and power distribution cables: this constisted of the motor speed controllers that were very specifically bought for their XT60 plugs, and then 3 splitter cables (2 2-way and 1 3-way) to distribute the power to each of the 4 motors and the pi as well. battery: at the advice of Lucas, one of our mentors who clearly knows a lot about projects like this, recommended Spektrum smart batteries so we bought a few of those + a brand smart charger for both teams 5V converter: to feed battery power to the Pi without literally kabooming it up (and to connect it in the first place). tires: we spent a lot of time on this decision! once again, lucas came in clutch suggesting rc car crawlers wheels because they have a lot of friction but also are very bendy. plus they have listed dimensions and a lip to attach a “bead-locked” wheel to, so we can just design our own wheel and put it in once it arrives and that was the day! whole lot of money spent for sure but its fineeeeeee (probably) (hopefully)
so i may have forgotten to make a project when we started this a week ago but! the motors and camera are all connected successfully to the pi and it has a gh repo set up with a Codex’d ball/cone detector that automatically drives the motors (or manually with a usb xbox controller clone). all we need now is for the sheet metal chassis we designed friday to arrive and the bidirectional ESCs we ordered to replace the small and kinda inconsistent generic ESCs we have now
luckily the tires were able to arrive this morning, so Jade (one of the adults at the program) brought them in and we got to designing + 3d printing wheels for them! luckily we have full access to a bambu lab x1 carbon here, so we took some lessons from Carlos (one of the mentors) in Onshape and tried to design a preliminary wheel. of course it didnt fit cause we have no idea how to use calipers seemingly, but the second attempt actually worked pretty well! you could try to turn the tire and stop the wheel, and it wouldnt move unless you put a lot of force. we left a shaft hole in it ofc so we can put it on the motors when we recieve them tomorrow. very awesome very cool!!
by that i mean we cut holes in a cardboard box, screwed the motors into them, stuck the wheels on, and codexed like no tomorrow until the motors somehow worked (THANK YOU SO MUCH LUCAS and also gpt luna), but our stupid dingy two-wheeled cardboard box actually moved! baby steps i swear ok but more important we’ve actually designed a metal base for the robot!! its literally a flat metal sheet with holes cut in it + 2 bent sheet metal pieces with motor holes cut out in them but! we learned about onshape a bunch more, the process of sheet metal modeling, and especially how to work with a machine shop. you heard that right, we’re getting our parts sent to a machine shop!!!! im really excited to see this piece come to life after we bumbled around on an onshape tab for like 3 hours trying to design it, i have a feeling its gonna be really cool. oh also were getting it tomorrow afternoon yay!!!! attached is that slightly cooked “robot”
ok sooooo turned out the wheels actually highkey sucked. the shaft was circular, so of course the motor didn’t rotate it well (its a d-shaft motor so its shaft output has a chunk taken out of it), but even once we added the d-shaft it just turned the hole circular by itself anyways 😭 luckily Lucas told us about these things called shaft hubs that dig in to the shaft with set screws and provide screw holes perpendicular to the shaft that can be a lot better at transferring the rotational power without yknow slipping. so we bought those on amazon ofc! but still the assembly went really well!! all the ports worked together, including the motor holes on the legs, and we were able to put the pi on top and connect all the electronics, eventually getting the motors actually moving while in the air by the end of the day! (with a lot lot of codexing ofc) this is what the robot btw!! its super duper duper cool isnt it :3
my day was spent entirely on programming two things: the controls - i (codex) spent a bunch of time setting up: the tank controls to individually drive each motor making the motor channels and configuration set in environment variables, and making a shell script that loads those environment variables from a shell script, enters the py venv, and runs the program adding different modes/states to the program and a radial menu to switch between them (all in a TUI by the way) adding a throttle limit and button presses to change it on the fly adding a button to start driving and making it so that every unrecognized button press stops it as a safety measure it wasnt alllll codex tho, i came up with the all ideas for these and usually gave rather specific details for how i wanted them implemented i also worked on the ball detection , which mostly involved sitting down and just adjusting parameters until the detection was like maybe almost passable, adding (asking codex to) add new parameters when the existing ones didn’t encompass the mistaks the detector was making. needless to say this lowk took a while but we’re in a good place rn i think!!! we have a moving robot with some kinda maybe working ball detection, which is like half of the first phase (the easiest part). so were slightly cooked but still yay it works!!
almost all of today was spent discussing and weighing different suspension designs and drive train implementations, culminating us in finally buying some parts and basically finishing out our $1000 budget from the start of the program to the end of this week. we settled on the 4 independent legs early, so the options were between: mounting the motor on the chassis on the same pivot point as the leg itself mounting the motor on the chassis and using a u-joint articulated axle mounting the motor high up on the leg and using a belt drive eventually we arrived on that last option because the other ones didnt really pose a benefit that was worth the complexity they would introduce (especially the first one) towards the end of the day, we ordered all the parts we needed to install it hopefully over tomorrow and wednesday also! we finished printing the finalized(…) wheel design so now we have four rigidly attached and bead-locked wheels+tires!! turns out the robot is like significantly faster than we thought so uhhh throttle limit is gonna have to be pretty low for a bit. below is a sample of our mad drawings (mostly mine 😭) trying to figure out how the hell this thing is gonna work
7/22 - not much we can do about it much of today was spent moping about how everything would be arriving tonight (and of course the belts are arriving tomorrow night, one of the parts that is literally necessary to drive the thing at all). so much of today was spent just trying to design, cad, and otherwise figure out details for the legs before we actually had the components necessary to make them. i spent some time with one of my teammates figuring out where specifically the springs for the legs are gonna go, and he made a quick 3d printed rod-end that’ll hold in the shaft that acts as the spring dowel. we also planned out where we could put the legs’ pivot point on the chassis and just generally planned every element of assembly that we could. this also involved figuring out last second that i had no idea how we were gonna mount the springs and chassis on the leg at all and that my teammates didn’t know too much either, but its cool we figured it out and started the print by the end of the day 👍 attached: us figuring out where we’re gonna mount both the leg and the spring on the chassis and me drawing the top view of all the drive train stuff going on inside the leg (ignore my horrible handwriting its the board i swear)
7/21 - EVERYTHING GOT DELAYED VERY BAD NEWS: every single thing we needed to order for the drive train and suspension got delayed by a day 😭 anyways completely unrelated but the second competition is being moved to thursday, cause we cant drive through the course with literally 0 suspension the first 2 hours of today was spent rushing out an onshape sketch to get our metal legs cut by Lucas cause he (reasonably enough) wanted the drawing by 11 before he left the shop. i had to remember how to do drawings, with a lottt of help from carlos. unfortunately, i forgot the holes for the spring on the top so we’ll have to figure that eventually. i also forgot to put holes that would make screwing in the motor remotely possible but lucas the GOAT put those in for us. could not appreciate it more we might be lowk cooked now, cause the bearings say they’re gonna arrive thursday night so we may not even have the robot driving again until next week 😭😭 that being said we ball‼️ also ill be posting a devlog every weekday now cause i need to journal every day anyways attached below are 2 of the legs we got cut with the motors on them
guess what THE BEARINGS AND SHAFTS GOT DELAYED!!!! YAAAAAAAAAAAYYYYY its fine. we spent today CADing and printing new designs for both the leg inserts and one piece of the rod-ends, and i think they’re in a pretty good place (for not having the actual components needed). I also did some testing with the ball/cone detection and came to the conclusion that it simply sucks and just isn’t good enough, so I got Codex to give me suggestions for an overhaul and I picked which approach would be the best to go for. The demo it produced for me using new shape detection and differentiating objects from its surroundings (in camera space) was so bad that I’ve decided on a completely different approach altogether: ML!! I got it to do another overhaul that would add a mode to the existing code that allowed camera snapshots to be taken and put in a folder with a press of a button on the controller. Then, it made a tool that could be run on my laptop that would bring the images up one by one, I would mark balls and cones on there, and then that data would be used to train an ONNX model (with ROCM acceleration on my Radeon 890M iGPU, of course) that could then be uploaded onto the Pi and ran as the new detection backend!! we’ll see if it works, cause I did all this at the end of the day and had no time to gather training data (of course i came up with this after two days of having very little to do).
the parts came! literally all of today was spent assembling the drive system as my partners were drilling the holes and cutting the shafts for the wheels, pivots, and spring dowels. we’ve unfortunately found out that the belt drives skip kind of a lot, so hopefully this doesn’t cause issues with driving under torque when we get to that… (i swear if this is foreshadowing) we also went out to Reflect Orbital today!! seeing the mirrors was incredibly cool, and the material they made it out of felt really interesting. something about its very small thickness (2.8 microns!!) made it feel like it was barely on your finger if you weren’t looking at it. In addition, I talked to one of the software engineers (shoutout Alfonso) about how they get the software done, including things like: Double buffering updates (seemingly called ABing) to make sure that no update permanently breaks the system Using the Yocto project to make a custom Linux kernel for their embedded systems Monolithic applications vs. a more service based approach that also goes hand in hand with… Error handling and making sure that something like an illegal instruction won’t crash your expensive space satellite Testing with the ground-sat (all of the components on the real satellite connected together on a table in a room) and an approach that involves uploading the changed code to the ground-sat every night and running a whole test suite to make sure none of the changes broke anything and that they (hopefully) achieved what they were written for overall it was pretty damn cool you should check out Reflect :3 below is one of the legs, and as you can see theres a whole belt going from the motor to the wheel!
GUESS WHAT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! the belt is skipping. turns out the belt needs to be tensioned to not yknow skip horribly. any real torque that the wheel experiences back on it, including the torque inherently present in turning with tank drive (which is really high cause we have really grippy wheels and their laid out in a rectangle), makes the belt slip on the teeth and not drive the tire at all, leaving the motor spinning but the robot not moving. basically, we’re gonna need a tensioner to slot into the legs. in other news, we still have to get intake/outtake working by friday hopefully. i’ve ordered TPU filament online and got on of my teammates to start on a design for a flywheel that has a PLA hub and TPU tire, maybe we’ll print it tomorrow? although one good thing about this is that the robot looks super cool awesome now (source: see below)
the TPU arrived! guess what though: it lowk doesnt work with the X1c (our printer)!!!!!!! we refined the design for the flywheel a bit, but after figuring out the TPU settings in the printer, our test prints didn’t work at all. at some point, it just seems to run out of filament (usually before the first layer finishes) and leaves these dots of plastic where its supposed to be entirely filled in. no TPU ig!! my teammates spent most of the day figuring out where to cut holes for the tensioner and then actually drilling those holes for the eventual assembly (prob tomorrow). it looked really sucky cause the hacksaw is time-consuming and lowk rather annoying, especially when we need to cut 3 shafts into like 12 pieces, so thank you teammates that was very nice 🙏 i spent the whole rest of the day on the CAD for the articulated arms that we’re gonna have in front and on top of the entire robot, and i designed a servo mount that’ll keep the servos attached to the robot at the exact height we need them to be to make a plate that hits the ground, settles at a nice angle, holds the flywheels, and all the while still fits on the print bed. i tried to print one of those mounts but after like 5 prints that failed on the first layer, the only succesful print ran out of filament on the second to last layer 😭 its lowk chill though cause it looks kinda cool so im gonna keep it attached is the lowk awesome lowk cooked servo mount that i lowk made and printed lowk
so my GOATED teammate whose shall not be named figured out the TPU problem: the printer just wasnt strong enough to feed it in! i honestly have some doubt that that was THE problem, considering how easy the solution is (just unspool a bunch of filament onto the ground), but whatever we ball‼️ anyways the first third of today was spent working on that servo mount and arms CAD file i mentioned before as my partners finished up cutting the shafts and legs for the new tensioners. i also got the tensioners printed, but that was pretty quick since its just a few ~1x0.5” pieces the second third was spent doing the assembly for all the pieces, since we had to take apart each leg completely, and then go down the assembly line to put it together. i was responsible for putting on the tensioners and then the motors with these really handy alligator clips Carlos graciously gave us that allowed me to get short screws into holes that were far into the leg. then, once the motor is attached, my partner would attach the wheel and get the belt on there. i think he used some like dark magic cause the belt was really hard to get on before it was tensioned, idek how he did it now… my other partner would then put on the insert, bearings, and shaft for attaching the leg to the chassis. once we were done, we all spent some time getting the legs on the chassis but we didnt finish. i rushed to start the flywheel TPU print we designed a while ago before we left and spent the rest of the day on… THE SPACE X TOUR!!!!!!!!!!!!!!!!!!!!!!!!!! we got to go to spacex and have a little tour with one of patricks friends!!!!!!!!!! it was really really really cool, the facility was huge and we such a bunch of fuel tanks, satellites, an engine actively being built, and a phased antenna array. that last thing nerdsniped me so hard, and because Simon (one of our “tour guides”) was an engineer that worked on the Starlink user terminals (which also had the same type of antenna array as the Starlink satellites) i was able to ask a bunch of questions about it. apparently, they both have a bunch of antenna put together and arranged such that, by controlling the phase of the signal coming through each of the ~50 antennae, can focus on a narrow beam of EMF waves and effectively filter out signal to only a specific Starlink satellite in the sky. super cool!!!! no photo(s) cause we weren’t allowed to take any but its chill
I FORGOT TO PUT THE PRINT PLATE IN THE PRINTER YESTERDAY GOD DAMN IT 😭😭😭😭😭 its fine. ok so today was generally pretty mundane BUT!!! WE DROVE UP THE HILL LITERALLY ONCE!!!!! just on a whim my partner decided to go full power up the hill after my other partner had just loctited every set screw to see if we could make it, and we did!!!!!!!!!!!!!!!!!!!!!! …….unfortunately……… nobody filmed it…………………………….. -# god damn it…………………………. it was really cool though! i think it represents that we’re really nearing a functionally useful robot and that were actually overcoming the challenges that have plagued us for like weeks anyways heres a picture of our bot looking super duper cool
okay this day was an experience fs. the start of the day was relatively normal, i was working a bit on ball detection while my partners assembled the intake/outtake thingy, and all of a sudden the pi turns off . this happened before when the power draw was low and peripherals were connected, so i just took out the camera and turned it on. yup, works fine. ok so lets plug the camera in while its on and it turns off . odd, looks like its probably some random bug or connection issue, so i just unplugged it, reseated it, and restarted the Pi. and it doesnt even turn on. ok, well theres another port. idk whats going on, but maybe thatll fix it? nothing. theres spare cables, lets try those ig? nope. ok what the hell the camera must be broken, so lets try a spare camera. doesnt turn on. ok what the actual ****???? lets try it on their robot and then theirs doesnt turn on either . at this point i am positively destroyed and fuming, luckily we have some very good food coming from a place nearby called the melt, so hopefully having a nice gooey cheesesteak can help me calm down, lock in, and figure out whats going on. big mistake. an hour passes. the adults have put on a movie, a fast and furious movie. you dont feel delirious, nor subdued, but simply off. its almost as if you are both more aware of your environment and slowly less aware of yourself. an hour passes. the car noises are still going. focus was a lost cause. one adult is stretching on the floor. the other is sitting at a table, still watching. you’re on the floor too. you’re not getting anything done. it was a lost cause anyways. an hour passes. carlos is sleeping on the slanted wooden plank of the hill. jade is lying on the floor and staring straight up. somehow your partner is locked in. the car noises continue. you are two inches away from meeting God, before you start laughing. shes laughing too, as well as your partner. presumably at carlos. sanity was a lost cause, and you lost it four and a half hours ago. cant believe its somehow 3:30. long story short, we slowly went insane with tokyo drift in the background as i pulled my hair out from the pi frying our cameras and the movie making it hard to focus, while one of my partners locked in to an unprecedented level, one just watched the movie casually, and the rest of us went crazy for no particular reason at all. this was a wild day (hence why im writing this the day after) never eating at the melt again bruh 😭
i am gonna be gone wednesday, thursday, and friday this week due to my schools orientation happening right before CalTech’s WiSTEM (which i am indeed going to :3), both of which are on weekdays. thus, with the intake challenge pushed even further to this wednesday (marking a full week delay), i will need to spend some time getting our existing systems to a good place and helping my partners with whatever they need over today and tomorrow before im gone. that being said, we did very little locking in today (hence calling it the dawn) because we had both a speaker and a tour!! Will Heltsley, former VP of Propulsion of SpaceX and an insanely knowledgable engineer, talked to us about different engineering concepts and some strategies for finding a stable job and a community of like-minded nerds that are fun to work beside. i asked a few questions about working with teams (because this program has shown me that it’ll be a very valuable skill to learn), especially since Will has done everything from working on a 3-person team to managing a group of 350 engineers. he was really helpful!! we also got to tour another startup, Forge Atomics, and it was awesome to see the inner workings of a company that is just getting of the ground! they had a really cool concept and i loved their mission, which in talking to one of the co-founders (Rex the goat) i learned was one of the most important things in finding a team that is going to work well: your missions need to align. also i learned from both mentors that, unless you plan on doing something research heavy like quantum computing, you should NOT get a PhD. guess what i want to do!
okay so like i said last entry ill be leaving for three days, which means that i had to finish up some things today! i decided at this point that we were not going to able to mount a plate in the front for the intake (rip that idea and the whole bunch of filament we wasted on it 😭) so i spent the entire day pivoting on that idea and making the articulated suspension!!!! this was a really cool idea i talked with carlos about for like an hour, although we were thinking about only servos for suspension. this time around, i modified those servo mounts to place the head of of the edge of the main plate and used a bit of kevlar string Trina donated (ty Trina!) and tied it to the servo head and around the wheels hub. this means that when the servo is drawn up, the string pulls on the wheel, compresses the spring, and brings the robot down. for context, there is an 8 inch height requirement* that we had yet to succesfully get under. by that i mean the robot was like 11in. so, to get around that, these servo mounts could effectively deactivate the suspension at will, not only making driving more stable in the ball collection phase, but also actually getting under the height requirement! (since it was only a starting height requirement, we were allowed to expand after) anyways i made one mount, tested it, it didnt fully work, designed another and printed two of them, codexed while that was printing, tested one (it worked perfectly), printed 2 more, codexed the code for different states and positions for the servos and configuration stuff ofc, assembled the rest, tested all 4 of them out at the same time, actually tied good knots, and it was done by the end of the day!! im really proud of finishing this subsytem in one day before i left, it was suprisingly fun to see the robot dancing and doing pushups as it drove. and honestly, i think today really gave me that feeling of how incredible it is to see something like this just come to life, the way i feel when i make progress on a good coding project. i lowk want a 3d printer now… maybe that radish jam money could really come in handy…….
OKAY it is time to get down to business we do NOT have much time. first order of business was looking at the TPU wheels reflect printed! they had come in while i was gone, and compared to our flywheels they were actually suprisingly good (although they lowk had their heads blown shmoove off (the tops were weirdly disconnected and ripped off)). most of all, our wheels were much too stiff and theirs were relatively soft, so we decided to go with theirs. we’d also gotten metal parts back from lucas; unfortunately, lucas’ parts were cut kinda incorrectly and for whatever reason the machine shop didn’t make them!! so, i spent today primarily trying to figure out how to do intake while one partner was working on (OF COURSE) retightening and loctite-ing the set screws and the other partner was working on finishing/testing the climb with a smaller motor he bought online over my hiatus. and by figuring out the intake, i mean taping a cardboard box to the bottom of the robot and letting it flap down while desperately PRAYING that the balls go in. i was also driving around a bunch trying to figure out why the robot was still really struggling to take turns, especially on the foam. eventually i had the insight that the friction on the wheels was simply too much, and Lucas came up with the idea of wrapping tape around the wheels to reduce it!! after that it was insane how well it drove and took turns, especially off of the foam floor. i lowk drove it around for like 45 mins straight it was so insanely fun to see something we made acting like a real machine, cause it was driving at a quality i could actually expect in like a real product! it was so cool and gratifying :3 of course i forgot to get a picture of video of it, which i have a feeling im gonna regret…
and i call it frickmas cause THE COMPETITIONS TOMORROW OMG OMG OMG OMG OK SO here’s what on the agenda: making sure the set screws dont destroy themselves on the field getting the climb attached and making sure it maintains enough torque to actually pull the robot figuring out some sort of system for intake lining up all the suspension to prevent it from getting stuck, damaging the metal, or crapping out on the washboard section making sure the pi mount, buck converter, code, suspension actuation, and every other subsystem actually work testing!!! lots of testing of all of everything!!!!!!! for the first one, my partner had already spent so long on the set screws so some testing was all it took to see that they were fine, and that was enough cause they were not really going to get any better. my other partner finally got around to actually finishing up the climb and attaching it to the front of the bot. good news: it hooks! bad news: it doesn’t even remotely pull back! luckily, the rules still gove points for hook but no lift, so we decided to leave it there since his effort could be best spent elsewhere with this little time left the intake system was determined to be pretty much a dud by the end of the day, cause of course cardboard couldn’t really carry anything, and we didn’t have time to design something better since the last system fully failed lining up the suspension was pretty easy, just took a bit of manual adjustment and a good amount of testing on the field each of these were kind of annoying to address but i have a feeling itll be rather important at the end of the day (which is basically how long until handling all the wiring and subsystems took us) lastly for the testing, we just drove like a bunch of times! honestly the runs went like okayish ig, we rarely made it past the washboard and of course NEVER made it over the hill ever since we did it first a couple weeks ago. otherwise though, the robot was stable the entire time and didnt have any weird glitches or hardware malfunctions (thank god we taped down the battery this time) so we were good(ish) to go! below is basically what our final robot is gonna look like (minus the climb)
ladies, gentlemen, and my beautiful enbies * ITS TIME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *(ok so i admit this entry was written days later cause i had to go to school next day so my memory is foggy but! its still cool :3) basically the first half of the day (before everyone came in) was spent finalizing somethings we’d waved off earlier, like cable management and wiring in general, especially the motor wires were dangerously close to the suspension rods and a bunch of other things like that power and attaching the battery, since we really needed to keep the batteries charged properly to prevent the pi being underpowered and the battery needed to be held on with something a little less flimsy than straight up velcro 😭 THE GOD DAMN SET SCREWS HOLY TUNA THESE THINGS WILL NOT STAY TIGHT NO MATTER WHAT WE ARE NEVER GOING UP THAT HILL AGAIN ISTG (subtle foreshadowing) keeping the kill switch always accessible from the top and attaching it with a little more than tape and prayers making sure the wheels are attached properly and wont jut out weirdly as it has in the past, throwing the driving off balance as it getting the climb to actually work which is lowk a lost cause but we ball praying theres something we can do about the intake situation 😭🙏 among much more of course, the time eventually came when people started arriving (like alfonso, shoutout my goat) including a whole lot of parents. we started by showing them our robots as we made some final tweaks, like making sure the pi wouldnt fall off of our beautiful, incredibly complex attachment scheme (velcro mounting strips) until it finally happened… COMPETITION START‼️ so the way this ended up going is that each team alternated runs, usually getting progressively further (keyword usually …) Run 1: Team Big Fish (not us) their first run didn’t go too bad!! their ball intake was suprisingly functional (and by suprisingly i mean at all) (better than us tho) and they were almost able to get around the cones autonomously without hitting one! however, when it came to the washboard, it didnt really work out… their bot very quickly got stuck on a pipe and was ill equipped to unstuck itself, ending the first run. Run 2: Team 10 (US!!!!!!!!‼️!!!!!) also not too bad somehow!!!!!!!!!! of course there was no ball intake so we just drove over them, but we were able to slowly but surely get past the slalom with wide margins and very very slow turns in place. as for the washboard though, our run wasnt much better… i took the robot off of the ramp at the start rather fast, making sure to turn up the throttle limit in the hopes it would get us over a few obstacles. spoiler alert: it didnt. we pretty quickly just crashed into a full cinder block, bending the sheet metal base and unsurprisingly making it hard to continue the run! but whatever it was not too bad for a first attempt Run 3: Team Big Fish this one was probably their best! the ball intake was great, and they were able to carry them all through a perfect no-hit slalom! unfortunately, a similar fate to last time met them at the washboard. third times the charm hopefully… Run 4: Team 10 although the robot was slightly banged up now, it was still totally good to go! this slalom attempt was not nearly as graceful, and that certainly applies to the washboard too: i turned up the throttle limit more on the ramp and really just sent it, only to get stuck on top of that cinderblock instead of past it. fun stuff!
ok so from here on we just started placing the robots at different places trying to show what they could do if the washboard didnt always destroy their runs Exhibition 1: Team Big Fish and THE HILL … for our first exhibition, the other team set up the robot before the hill and took some stabs and speeding their way over it. in the end, none of the attempts made it, but i have video of the third one where they got so close that one of the wheels drove onto the other side of the hill and kept the robot there, until their driver let go of the throttle and let it down. it was super cool!! Exhibition 2: Team 10 and THE HOOK finally it was time for my teammates magnum opus of the past two weeks to be revealed and truly tested, and that of course was THE CLIMB!!!! and by the climb i mean a big pink plastic hook on the end of a measuring tape roll taken out of its case that we lovingly call “the bomb” (because it WILL explode if not handled properly). like i said a while ago though, the climb didnt have enough force to pull up the robot, but thats fine! theres still partial points for hooking, so all this exhibition really was was the hook rising at an almost comedically slow pace, before i carefully drove the robot over to the bar (as to not fold over the tape from the velocity) and gingerly brought the hook down on it. and everybody clapped! Exhibition 3: Team Big Fish and THE DUNK aka they used their shooter. it was super cool actually! they have a whole system with conveyor belt squeezing balls forward from above a slanted metal sheet, with flywheels at the end that can block balls for storage purposes until the gate is opened and the conveyor belts are forwarded to shoot them! it was suprisingly good and consistent, shooting from behind the second-to-last line. i wish we could do that… its okay they dont have a climb so we’re better and that was pretty much it! this experience has been so incredibly helpful for my learning and for me in general, and it really was(😢) one of the most fun times of my life. i dont even think i could near catalogue how much fun i had and how many things i learned. i really cant put it into words. thank you lucas, carlos, jade, maanya, patrick, alfonso, and trina for making this what it was, and of course thank you big zrl for sponsoring my attendance. if you’re reviewing this project, i recommend looking at devlogs further down if you’re missing context. the photos should hopefully help see the progression as well (if i can get those uploaded…) i leave you with 3 photos: the state of the robot right before i turned it off for the last time, the absolute state of our whiteboard after we used for brainstorming, and a last minute photo of the hallway i knew i would never walk again. happy hack clubbing!...
|
1792752594.3365576
|
1793357394.3365576
|
|
29287
|
le-fat-chaton by @unknown_lizzard | Stardance
|
unknown_lizzard
|
1
|
172.0
|
1818
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-20T09:10:04Z", "hours": 172.0, "multiplier": 14.88, "payout": 1818, "blessing": "neutral", "text": "at first I wanted to make a normal text model to try and learn more about llms, but I wanted to go further, agentic coding is a big thing so what better way to learn about llms than trying to make an agentic coding ai model. So thats how le gros chaton was born, the name originated from a joke on x about a fake huge mistral model coming out. to train this model I used already made datasets on hugging face, like fable5 traces, I also used kimi k3 as a teacher model to teach my smaller model to be good at coding and running commands, it kind of worked? but i’m not completely satisfied with the result, but at least i have learned some things and soon enough I will trying making an even better model! I dont have a demo url for you guys to try the model out since it was too expensive to run on a gpu so you’ll need to run it yourself, check it out on hugging face, follow the instructions and have fun.", "repo": "https://github.com/Mateooo93/le-gros-chaton", "demo": "https://mateooo93.github.io/le-gros-chaton/"}]...
|
[{"post_id": 50841, "ts": "202 [{"post_id": 50841, "ts": "2026-08-20T08:57:48Z", "hours": 3.2394, "text": "devlog #17 MI300X vLLM serving The old GPU box got destroyed, so I spun up a new MI300X with the same SSH key. ROCm 6.2 and Torch 2.5.1 were already set up, so getting the machine ready was easy. The hard part was vLLM. The pip version is CUDA only, and the ROCm Docker image only supported the multimodal version of Qwen3.5. Our model is text-only, so I had to patch the image. I added Qwen3_5ForCausalLM, fixed the hybrid KV-cache setup, added the missing Mamba state methods, and mapped the weight names so the text-only safetensors loaded correctly. I also patched the merged config to remove the M-RoPE and dtype fields. After that, the model served normally. I ran a one-task test with fix-git. The pipeline worked, but the model got stuck repeating git show until it ran out of turns. ##Shipped The merged model is now public on Hugging Face as mateo0093/le-gros-chaton under Apache-2.0. The 5×5 Terminal-Bench pilot finished at 3/25 (25%). All three successes were on fix-git, which shows that the SFT data was too focused on git tasks. I also tested RLVR with GRPO and a novelty bonus. The reward had almost no variance, so the training signal was basically useless. I saved the step-10 adapter but didn’t merge it. The GPU used about 12 hours of the 50 hour budget. All the vLLM patches and harness changes are in the repo. Main lesson: Qwen3.5’s hybrid model is a bit annoying to serve as text-only on ROCm. The model works but i think this was more of a learning opportunity, i know what i’ve done wrong and what i would have done differently, I will be working on a new model in a few weeks once I do a bit more research."}, {"post_id": 49761, "ts": "2026-08-18T18:01:12Z", "hours": 0.7992, "text": "Devlog #16, t4gpu The T4 16GB fought us the whole way. BF16 was baked into a pre quantized checkpoint, which made each step take 668 seconds because it had to use FP32 emulation. 2K context ran out of memory, the 248K logits ran out of memory too, FP16 started producing NaNs, Kaggle session limits locked us out, and the paged optimizer crashed last. Every fix seemed to create another problem. We eventually got it working with FP16 compute, chunked assistant token loss, autocast, and plain AdamW. Then we got access to an AMD MI300X with 192GB of memory. No quantization, 16K context, and enough memory to train full traces instead of cutting them off halfway through a message. Right now the 16K BF16 SFT run is training on the MI300X. Next up is merging the model, running Terminal Bench, and then RLVR."}, {"post_id": 49140, "ts": "2026-08-17T19:31:53Z", "hours": 16.24, "text": "Devlog 15 Traces are done The trace generator finally hit the target and went past it. We got 474 verified trajectories, zero malformed, zero duplicates, 19 templates, and a 95 percent self review pass rate. We were aiming for 450, so we ended up with 474. The dataset is synced to Hugging Face in two versions: raw and normalized. That part is finally done. It was the longest part of the project, and the model is only going to be as good as the traces, so getting this right was important The Kimi endpoint also stopped working. The old teacher account started returning 503 errors during generation and eventually died completely. We switched to a second Kimi account, which needed an extra header that we did not have at first. After figuring that out, generation resumed without losing any progress For GPUs, the 2070 still cannot realistically train the 9B. Kaggle hours are back, so we have 30 hours on a T4. The 4090 from my dad should arrive next week. The plan is to use the T4 for trajectory SFT, then the 4090 for merging, Terminal Bench evaluation, and RLVR. Status: 474 out of 474 traces done,"}, {"post_id": 42823, "ts": "2026-08-07T19:01:50Z", "hours": 8.9192, "text": "Devlog #14 worked a lot, still not done we worked a lot this week. honestly the main takeaway is that the fable5 sft was good but its traces alone weren’t enough the model needs way more verified agent trajectories, so we’ve been grinding those out (target is 450). we also ran out of credits mid-generation (the modal endpoint started failing with 503s) and had to switch to a second kimi account. took a minute to get the auth right the new endpoint wanted an extra header we didn’t have. after that the generator resumed fine and it’s been adding verified traces since (~340/450 now). biggest scare: we found out peft 0.20 silently drops the second adapter when you merge two at once. tested it and yeah, the outputs were identical with one or two adapters so our trajectory sft would have been lost in the merge. fixed it by merging sequentially (base first, then the second adapter). checked against the live model and it matches, so we’re good. my 2070 couldn’t fit the 9b model for real training, so we’re waiting on a 4090 (my dad’s) next week. all the scripts are ready sft, merge, rlvr, eval, even a setup script for the gpu box. just need the hardware. status: 340/450 traces, everything ready, waiting on the 4090. we’ve worked a lot, but the real run hasn’t happened yet :/."}, {"post_id": 41470, "ts": "2026-08-05T18:10:35Z", "hours": 18.5394, "text": "Devlog #13 we worked ALOT so this was the grind day. 18 hours of training babysitting and honestly it felt like 40. the modal training kept dying every hour. the client would crash and take the whole run with it. we restarted like 3 times before figuring out modal run -d (detached) keeps it alive on their servers even if our computer shits the bed. tested it by literally killing the process and it kept going. ez fix but we worked ALOT to get there. then we ran out of credits at 93% and switched accounts, but the other account “finished” the run in 6 MILLISECONDS which was sus af. turns out it just re-uploaded the old checkpoint and trained nothing. the resume logic had a bug where it thought 6200 >= 3799 meant done. patched it. another lesson learned. also we made the model creative lol. added diversity sampling to the trajectory generator (5 solutions per task, keep the novel ones), a novelty bonus reward for RLVR, and a creativity rule in the self-awareness prompt. so the fat cat will be innovative, not just memorize. current state: SFT is done at 91% (good enough), resume bug fixed, phase 2 (trajectory SFT with creativity + self-awareness baked in) is up next. 18 hours. we worked ALOT. the fat cat will be worth it 😼"}, {"post_id": 40883, "ts": "2026-08-04T18:02:57Z", "hours": 10.0019, "text": "Devlog #12 training kept dying for the last 10 hours the training kept crashing. not the model, not the gp but the modal client. every hour or so it would lose connection and take the whole run down with it. we’d restart, it’d run an hour, crash again. three times. the fix was simple: modal run -d runs detached, so the training lives on modal’s servers and doesn’t care if our local process dies. killed the client on purpose to test — training kept going. that’s it, that’s the fix. also worried the loss wasn’t moving but it was fine. lr had wound down on the crashed run, looked scary, re-warmed fine after restart. loss is 0.668 now and dropping. status: 72% through the fable5 sft. checkpoints safe on hf. after this: trajectory sft with the self-awareness stuff baked in, then rlvr, then real numbers."}, {"post_id": 40601, "ts": "2026-08-04T08:01:50Z", "hours": 11.4342, "text": "** Devlog #11 half way there! ** the training is going pretty well, I fixed a few bugs with the code and added documentation training is at 50%!"}, {"post_id": 40369, "ts": "2026-08-03T20:35:48Z", "hours": 8.8192, "text": "** Devlog #10 the full training is finally running ** ok so phase 1 full training is officially going. 160k rows of fable5 data on modal, resuming from the 12.8k rows we got on kaggle before the session cap killed us. we’re at ~27% and it should take like a day and a half total. big stuff that happened since last time: fast kernels actually work now. the model has hybrid linear-attention layers and transformers kept falling back to a slow torch path. the fix was: nvidia cuda-devel base image (needs nvcc to compile), installing flash-linear-attention[cuda] + causal-conv1d , and pinning torch 2.10. took a couple tries but now training is like 4x faster than it would be without them. had to split across two modal accounts. first account ran out of credits, so we set up a second profile and the script auto-resumes from the huggingface checkpoints when it dies. it’s been rock solid, it happens every 20% plus every hour it saves and uploads. lost zero progress to the account switch. we gave the model a personality. it’s called Le Gros Chaton (the fat cat) and we’re training self-awareness into it, not as a system prompt but baked into the weights. state-sheets ([STATE] goal/known/tried/failed/next), metacognition lines, and self-review at the end of tasks. the trajectory sft masks out the system prompt so the model learns to track its own state as behavior, not as a script it repeats. did some benchmark research too. base qwen3.5-9b scores 9.2% on terminal-bench 2.0. comparable 9b fine-tunes hit 24-28%. that’s our realistic target which is 2.5-3x the baseline. honestly at this point it’s just… waiting. the pipeline works, the checkpoints work, the account switching works. now the model just needs to finish cooking. then trajectory sft, then rlvr, then we actually see the benchmark numbers."}, {"post_id": 40029, "ts": "2026-08-03T11:45:18Z", "hours": 13.3375, "text": "# Devlog #9 — finally training, and now with checkpoints! so last time i was stuck debugging phase 1/2 on kaggle. well, still debugging lol, but we actually got somewhere. the first issue was transformers not knowing what the qwen3.5 model was, had to pin transformers 5.14.1. then tokenizers kept fighting with it (0.22.0 wants old huggingface-hub, 0.22.1 is fine). then torch on kaggle kept giving a p100 which modern pytorch just refuses to run on, so we had to tell it to give us a t4 instead. then the fun one: out of memory on the very first step. batch 2 was too big for the gpu they gave us, so batch 1 it is. also i learned the hard way that kaggle kills your session after 12 hours. the first long run got cancelled at 80% done and i had nothing saved. so now the training script saves a checkpoint every 20% + every hour and uploads it to huggingface, so if it dies we just resume. it actually saved us, the run got cut and we picked right back up from the checkpoint. right now the full 160k sft is running on modal (paying for gpus now, kaggle time ran out). it’s at like 9% and should take a couple days. we’ll see how it goes, and then rlvr after that. the end of the errors… might actually be in sight this time."}, {"post_id": 38292, "ts": "2026-07-31T16:38:26Z", "hours": 5.4886, "text": "Devlog #8 — phase 2 fixes I’ve been getting a lot of issues with the first two for this model. I’ve gotten a lot of errors in Kaggle and Colab. I’ve tried everything, and I’m still fixing the code. It’s taking a good amount of time, but I think I’m almost there. I’ve gone through a lot of errors, and I’m probably right at the end of the errors. I might be able to start actually training it tomorrow, but for now I’ll stop."}, {"post_id": 38079, "ts": "2026-07-31T09:21:05Z", "hours": 10.3872, "text": "Devlog #7 — phase 2 running phase 1 (sft) is done and phase 2 (rlvr) is running now on kaggle. this is the part where the model actually gets trained on solving coding problems with our verifier giving rewards, not just imitating fable data. honestly this is the part i care about more. sft just makes it mimic. rlvr is where it learns to actually fix code. grpo with proportional rewards = the model gets partial credit for getting some tests passing, which is way better than all-or-nothing. while it runs im just waiting tbh. not much to build. the pipeline works, the eval works, the agent works. next after this: full benchmark run. humaneval, swebench, agentic eval. we’ll see if all this actually made the model good at coding or if i just spent a week on a worse qwen lol."}, {"post_id": 37100, "ts": "2026-07-29T16:05:47Z", "hours": 8.4747, "text": "Devlog #6 — training done (phase 1) finally got the qwen finetune to actually run with 625 steps, took like 8 hours on kaggle. it finished. havent run full benchmarks yet cause i was busy building other stuff while it trained. but it trained. thats the main thing. I also built a swebench agent that can actually navigate repos and edit files and make patches. not just the basic agent loop that runs commands. this one actually works for real se tasks. also added swebench eval so we can measure if the model is actually good at fixing bugs and coding then i’ll run the benchmarks on the trained model and see if its actually any good lol."}, {"post_id": 36367, "ts": "2026-07-28T13:16:16Z", "hours": 13.6447, "text": "Devlog #5 — ok so I’m not building a 10B MoE anymore So last time I had this whole plan. 10B MoE, from scratch, SwiGLU, GQA, all that. And I actually built it. Like 60 Python files, tests passing, RL pipeline, self-play data gen, the whole thing. It was kinda sick ngl. But then I was like… wait. I’m building an ENGINE that TRAINS coding agents. Not the agent. And the engine is cool but training a 10B model from zero on $30 of Modal credits is not how you beat GLM-5.2. You know what beats GLM-5.2? Fine-tuning a model that already knows how to code. the pivot (again) Qwen3.5-9B came out. 9B params. Fits on a Kaggle T4 with 4-bit QLoRA. And Kaggle gives me 30 HOURS of free GPU. 2× T4. That’s literally free training. So I had to adapt the entire codebase to work with HuggingFace models instead of my custom GPT. Made like 5 new files. All the verifier/agent/reward stuff I built for the MoE? Now works with Qwen too. Didn’t have to rewrite everything — just slapped a Qwen adapter on top. the dataset Found this dataset on HF: Nexlab/fable5-agentic-coding-sft . 160K rows of Claude Fable 5 output. Like actual coding traces — building games, fixing bugs, writing shell scripts. Not just “write a function that passes a test.” Real agentic stuff. Training right now actually. Qwen3.5-9B on 10K rows. Should take like 8 hours on 2× T4. We’ll see if it doesn’t OOM again lol. While waiting for training I read papers: Routing-Free MoE — what if experts just decide for themselves when to activate? No router, no top-k. Already implemented it in model.py. GLM-5.2 has this IndexShare thing that reuses computation across layers. 2.9× cheaper at 1M context. Maybe later. DeepSWE trained Qwen3-32B with RL only and got 42% SWE-Bench. So our approach is valid. the first phase of training is going on right now, i’ll post another devlog once it’s done!"}, {"post_id": 20759, "ts": "2026-07-02T13:35:48Z", "hours": 5.6175, "text": "Devlog #4 — wait, why am I training on Wikipedia? Last week I got le gros chaton (my from-scratch transformer) to actually train. Ran it on wikitext-103 in a Colab notebook on a free T4, 12k steps, val loss hit 3.73. Felt insane for something I wrote myself from PyTorch primitives. But then I looked at what it generated. It could do English-ish. It knew about Singapore and stuff. The moment I asked it to write code? Total garbage. Fair enough. It has never seen a single line of code. the pivot I thought about what I actually want this thing to do. Answer: a coding agent. Something that mogs on terminal-bench, that you give a task and it runs commands, fixes its own bugs, gets it done. Qwen-coder territory. Wikitext won’t get me there. You can’t learn Python from Wikipedia articles about the snake. So the plan changed. The big project is now le fat chaton, the bigger sibling. And it’s a coder. the architecture stuff I went down a rabbit hole on what frontier coding models do. They’re basically all mixture-of-experts (MoE) now. Qwen3-coder is 480B params / 35B active. Deepseek-coder-v2-lite is 16B / 2.4B active. The trick: big total params (knows a lot) small active params per token (runs fast and cheap) Runs like a small model, knows like a big one. Exactly what I want for a snappy terminal agent. So I rewrote the model. Added an MoE class. A gate routes each token to its top-2 experts out of 8, with a load-balance loss so the router doesn’t pick the same expert every time. Also threw in: SwiGLU — gated MLP, basically free quality, every Llama uses it GQA — smaller KV cache, faster long-context decoding (the agent harness needs this) Shared expert — DeepSeek-style, one always-on expert for common knowledge Fat config math: ~10.25B total / ~3.65B active. Not building that locally, it would crash my PC again. the data question Wikitext was a fine proof. For the coder I need code. Options: smollm-corpus python-edu — 7.6M educational Python files, high quality, but gated behind S3 (slow pull) starcoderdata python — ~50GB Python, streams fast from HF, the Codellama workhorse the-stack-v2 — 900B tokens, overkill for my budget Going with starcoderdata Python, blended with ~15-20% cosmopedia (prose) so it has general knowledge. That blend is the Qwen-coder recipe. am I warm-starting from wikitext? No. Different architecture entirely (17M dense vs 10B MoE, weights don’t fit). Even if they did, warm-starting a coder from prose wastes compute unlearning prose. Fresh random init on the mixed corpus. Clean slate. This went from “lets make a little model that talks” to “lets build a coding agent that mogs the big labs” real fast. Ambitious for a solo student with a 2070 and $30 of Modal credits? Absolutely. Doing it anyway? Yeah. Next: the eval harness so I can measure if this is making the model better at code (pass@1, pass@5 on HumanEval). Val loss going down means nothing if it still can’t write a"}, {"post_id": 20019, "ts": "2026-07-01T14:54:30Z", "hours": 0.3917, "text": "DEVLOG #3: teaching it to talk (fine-tuning) the base model was a completer. ask it “what is 2+2?” and it just continues the sentence. fine-tuning is what makes it actually answer: same model, more training, but on prompt/response pairs. i wrote ~48 Q&A pairs by hand. trivia, math, jokes, hellos. all in the same rigid Q: …\\nA: format. new trick: loss masking. only the response counts toward the loss, not the prompt, so i set prompt targets to -100 (pytorch’s cross_entropy ignores that automatically, zero model changes). tested the mask boundary in isolation first. wrong mask = 400 steps of training the wrong thing. the run: load base weights, 400 steps, lower lr. loss went 12.3 to 0.02.then the reality check. it nails everything in the set. capitals, math, jokes, “who are you,” verbatim. but something NOT in the set? slop. 17M params + 48 examples is a lookup table, not a reasoner. real chat models are billions of params. not a bug, just the scale.but it’s finally coherent. the first base model was word salad. now you type a question and get a real answer back that makes sense. it’s tiny and dumb and can’t generalize, but it actually talks. that’s the win. full pipeline done: tokenizer, model from scratch, pretrain on wikipedia, fine-tune, chat. mine, it talks, i understand every piece."}, {"post_id": 20006, "ts": "2026-07-01T14:16:25Z", "hours": 0.4139, "text": "DEVLOG #2: real data, real loss, and a lesson about memorizing split my data into 90% train / 10% val. before i only had one number, training loss, and it lies to you. you can’t tell learning from memorizing with just that. now i check both every 200 steps. rule: both go down = learning. train down but val up = memorizing = useless.also made the model bigger, 7M -> 17.7M params. immediately ran out of gpu memory lol. dropped batch size to 32 to fit my 8GB card.training: 3000 steps. loss started at 158 (should be ~10 for random , my first pass blew up and made garbage). recovered fast though, didn’t ruin the run. right now the llm is spitting out gibberish and random words but after finetuning it should sound more coherent"}, {"post_id": 19989, "ts": "2026-07-01T13:48:37Z", "hours": 36.31, "text": "DEVLOG #1: wiki text training so i finally got the model to train on actual data instead of that one paragraph about singapore nature reserves lol. before this the whole thing was basically a joke, i trained a 7M parameter transformer on like 134 tokens and it just spat out jumbled fragments of the same sentence over and over. cool proof it worked but definitely not a “language model” in any real sense.anyway. the big move this week was swapping out the tiny json file for wikitext-2. that’s a huggingface dataset of wikipedia text, about 2.4 million tokens once you filter out the empty lines. that’s… a lot more than 134 lol. encoding it took maybe half a minute with tiktoken and the whole tensor fits on my gpu no problem (it’s only like 8MB of ints)."}]...
|
Title: le-fat-chaton by @unknown_lizzard | Stardan Title: le-fat-chaton by @unknown_lizzard | Stardance
Devlogs:
DEVLOG #1: wiki text training so i finally got the model to train on actual data instead of that one paragraph about singapore nature reserves lol. before this the whole thing was basically a joke, i trained a 7M parameter transformer on like 134 tokens and it just spat out jumbled fragments of the same sentence over and over. cool proof it worked but definitely not a “language model” in any real sense.anyway. the big move this week was swapping out the tiny json file for wikitext-2. that’s a huggingface dataset of wikipedia text, about 2.4 million tokens once you filter out the empty lines. that’s… a lot more than 134 lol. encoding it took maybe half a minute with tiktoken and the whole tensor fits on my gpu no problem (it’s only like 8MB of ints).
DEVLOG #2: real data, real loss, and a lesson about memorizing split my data into 90% train / 10% val. before i only had one number, training loss, and it lies to you. you can’t tell learning from memorizing with just that. now i check both every 200 steps. rule: both go down = learning. train down but val up = memorizing = useless.also made the model bigger, 7M -> 17.7M params. immediately ran out of gpu memory lol. dropped batch size to 32 to fit my 8GB card.training: 3000 steps. loss started at 158 (should be ~10 for random , my first pass blew up and made garbage). recovered fast though, didn’t ruin the run. right now the llm is spitting out gibberish and random words but after finetuning it should sound more coherent
DEVLOG #3: teaching it to talk (fine-tuning) the base model was a completer. ask it “what is 2+2?” and it just continues the sentence. fine-tuning is what makes it actually answer: same model, more training, but on prompt/response pairs. i wrote ~48 Q&A pairs by hand. trivia, math, jokes, hellos. all in the same rigid Q: …\nA: format. new trick: loss masking. only the response counts toward the loss, not the prompt, so i set prompt targets to -100 (pytorch’s cross_entropy ignores that automatically, zero model changes). tested the mask boundary in isolation first. wrong mask = 400 steps of training the wrong thing. the run: load base weights, 400 steps, lower lr. loss went 12.3 to 0.02.then the reality check. it nails everything in the set. capitals, math, jokes, “who are you,” verbatim. but something NOT in the set? slop. 17M params + 48 examples is a lookup table, not a reasoner. real chat models are billions of params. not a bug, just the scale.but it’s finally coherent. the first base model was word salad. now you type a question and get a real answer back that makes sense. it’s tiny and dumb and can’t generalize, but it actually talks. that’s the win. full pipeline done: tokenizer, model from scratch, pretrain on wikipedia, fine-tune, chat. mine, it talks, i understand every piece.
Devlog #4 — wait, why am I training on Wikipedia? Last week I got le gros chaton (my from-scratch transformer) to actually train. Ran it on wikitext-103 in a Colab notebook on a free T4, 12k steps, val loss hit 3.73. Felt insane for something I wrote myself from PyTorch primitives. But then I looked at what it generated. It could do English-ish. It knew about Singapore and stuff. The moment I asked it to write code? Total garbage. Fair enough. It has never seen a single line of code. the pivot I thought about what I actually want this thing to do. Answer: a coding agent. Something that mogs on terminal-bench, that you give a task and it runs commands, fixes its own bugs, gets it done. Qwen-coder territory. Wikitext won’t get me there. You can’t learn Python from Wikipedia articles about the snake. So the plan changed. The big project is now le fat chaton, the bigger sibling. And it’s a coder. the architecture stuff I went down a rabbit hole on what frontier coding models do. They’re basically all mixture-of-experts (MoE) now. Qwen3-coder is 480B params / 35B active. Deepseek-coder-v2-lite is 16B / 2.4B active. The trick: big total params (knows a lot) small active params per token (runs fast and cheap) Runs like a small model, knows like a big one. Exactly what I want for a snappy terminal agent. So I rewrote the model. Added an MoE class. A gate routes each token to its top-2 experts out of 8, with a load-balance loss so the router doesn’t pick the same expert every time. Also threw in: SwiGLU — gated MLP, basically free quality, every Llama uses it GQA — smaller KV cache, faster long-context decoding (the agent harness needs this) Shared expert — DeepSeek-style, one always-on expert for common knowledge Fat config math: ~10.25B total / ~3.65B active. Not building that locally, it would crash my PC again. the data question Wikitext was a fine proof. For the coder I need code. Options: smollm-corpus python-edu — 7.6M educational Python files, high quality, but gated behind S3 (slow pull) starcoderdata python — ~50GB Python, streams fast from HF, the Codellama workhorse the-stack-v2 — 900B tokens, overkill for my budget Going with starcoderdata Python, blended with ~15-20% cosmopedia (prose) so it has general knowledge. That blend is the Qwen-coder recipe. am I warm-starting from wikitext? No. Different architecture entirely (17M dense vs 10B MoE, weights don’t fit). Even if they did, warm-starting a coder from prose wastes compute unlearning prose. Fresh random init on the mixed corpus. Clean slate. This went from “lets make a little model that talks” to “lets build a coding agent that mogs the big labs” real fast. Ambitious for a solo student with a 2070 and $30 of Modal credits? Absolutely. Doing it anyway? Yeah. Next: the eval harness so I can measure if this is making the model better at code (pass@1, pass@5 on HumanEval). Val loss going down means nothing if it still can’t write a
Devlog #5 — ok so I’m not building a 10B MoE anymore So last time I had this whole plan. 10B MoE, from scratch, SwiGLU, GQA, all that. And I actually built it. Like 60 Python files, tests passing, RL pipeline, self-play data gen, the whole thing. It was kinda sick ngl. But then I was like… wait. I’m building an ENGINE that TRAINS coding agents. Not the agent. And the engine is cool but training a 10B model from zero on $30 of Modal credits is not how you beat GLM-5.2. You know what beats GLM-5.2? Fine-tuning a model that already knows how to code. the pivot (again) Qwen3.5-9B came out. 9B params. Fits on a Kaggle T4 with 4-bit QLoRA. And Kaggle gives me 30 HOURS of free GPU. 2× T4. That’s literally free training. So I had to adapt the entire codebase to work with HuggingFace models instead of my custom GPT. Made like 5 new files. All the verifier/agent/reward stuff I built for the MoE? Now works with Qwen too. Didn’t have to rewrite everything — just slapped a Qwen adapter on top. the dataset Found this dataset on HF: Nexlab/fable5-agentic-coding-sft . 160K rows of Claude Fable 5 output. Like actual coding traces — building games, fixing bugs, writing shell scripts. Not just “write a function that passes a test.” Real agentic stuff. Training right now actually. Qwen3.5-9B on 10K rows. Should take like 8 hours on 2× T4. We’ll see if it doesn’t OOM again lol. While waiting for training I read papers: Routing-Free MoE — what if experts just decide for themselves when to activate? No router, no top-k. Already implemented it in model.py. GLM-5.2 has this IndexShare thing that reuses computation across layers. 2.9× cheaper at 1M context. Maybe later. DeepSWE trained Qwen3-32B with RL only and got 42% SWE-Bench. So our approach is valid. the first phase of training is going on right now, i’ll post another devlog once it’s done!
Devlog #6 — training done (phase 1) finally got the qwen finetune to actually run with 625 steps, took like 8 hours on kaggle. it finished. havent run full benchmarks yet cause i was busy building other stuff while it trained. but it trained. thats the main thing. I also built a swebench agent that can actually navigate repos and edit files and make patches. not just the basic agent loop that runs commands. this one actually works for real se tasks. also added swebench eval so we can measure if the model is actually good at fixing bugs and coding then i’ll run the benchmarks on the trained model and see if its actually any good lol.
Devlog #7 — phase 2 running phase 1 (sft) is done and phase 2 (rlvr) is running now on kaggle. this is the part where the model actually gets trained on solving coding problems with our verifier giving rewards, not just imitating fable data. honestly this is the part i care about more. sft just makes it mimic. rlvr is where it learns to actually fix code. grpo with proportional rewards = the model gets partial credit for getting some tests passing, which is way better than all-or-nothing. while it runs im just waiting tbh. not much to build. the pipeline works, the eval works, the agent works. next after this: full benchmark run. humaneval, swebench, agentic eval. we’ll see if all this actually made the model good at coding or if i just spent a week on a worse qwen lol.
Devlog #8 — phase 2 fixes I’ve been getting a lot of issues with the first two for this model. I’ve gotten a lot of errors in Kaggle and Colab. I’ve tried everything, and I’m still fixing the code. It’s taking a good amount of time, but I think I’m almost there. I’ve gone through a lot of errors, and I’m probably right at the end of the errors. I might be able to start actually training it tomorrow, but for now I’ll stop.
# Devlog #9 — finally training, and now with checkpoints! so last time i was stuck debugging phase 1/2 on kaggle. well, still debugging lol, but we actually got somewhere. the first issue was transformers not knowing what the qwen3.5 model was, had to pin transformers 5.14.1. then tokenizers kept fighting with it (0.22.0 wants old huggingface-hub, 0.22.1 is fine). then torch on kaggle kept giving a p100 which modern pytorch just refuses to run on, so we had to tell it to give us a t4 instead. then the fun one: out of memory on the very first step. batch 2 was too big for the gpu they gave us, so batch 1 it is. also i learned the hard way that kaggle kills your session after 12 hours. the first long run got cancelled at 80% done and i had nothing saved. so now the training script saves a checkpoint every 20% + every hour and uploads it to huggingface, so if it dies we just resume. it actually saved us, the run got cut and we picked right back up from the checkpoint. right now the full 160k sft is running on modal (paying for gpus now, kaggle time ran out). it’s at like 9% and should take a couple days. we’ll see how it goes, and then rlvr after that. the end of the errors… might actually be in sight this time.
** Devlog #10 the full training is finally running ** ok so phase 1 full training is officially going. 160k rows of fable5 data on modal, resuming from the 12.8k rows we got on kaggle before the session cap killed us. we’re at ~27% and it should take like a day and a half total. big stuff that happened since last time: fast kernels actually work now. the model has hybrid linear-attention layers and transformers kept falling back to a slow torch path. the fix was: nvidia cuda-devel base image (needs nvcc to compile), installing flash-linear-attention[cuda] + causal-conv1d , and pinning torch 2.10. took a couple tries but now training is like 4x faster than it would be without them. had to split across two modal accounts. first account ran out of credits, so we set up a second profile and the script auto-resumes from the huggingface checkpoints when it dies. it’s been rock solid, it happens every 20% plus every hour it saves and uploads. lost zero progress to the account switch. we gave the model a personality. it’s called Le Gros Chaton (the fat cat) and we’re training self-awareness into it, not as a system prompt but baked into the weights. state-sheets ([STATE] goal/known/tried/failed/next), metacognition lines, and self-review at the end of tasks. the trajectory sft masks out the system prompt so the model learns to track its own state as behavior, not as a script it repeats. did some benchmark research too. base qwen3.5-9b scores 9.2% on terminal-bench 2.0. comparable 9b fine-tunes hit 24-28%. that’s our realistic target which is 2.5-3x the baseline. honestly at this point it’s just… waiting. the pipeline works, the checkpoints work, the account switching works. now the model just needs to finish cooking. then trajectory sft, then rlvr, then we actually see the benchmark numbers.
** Devlog #11 half way there! ** the training is going pretty well, I fixed a few bugs with the code and added documentation training is at 50%!
Devlog #12 training kept dying for the last 10 hours the training kept crashing. not the model, not the gp but the modal client. every hour or so it would lose connection and take the whole run down with it. we’d restart, it’d run an hour, crash again. three times. the fix was simple: modal run -d runs detached, so the training lives on modal’s servers and doesn’t care if our local process dies. killed the client on purpose to test — training kept going. that’s it, that’s the fix. also worried the loss wasn’t moving but it was fine. lr had wound down on the crashed run, looked scary, re-warmed fine after restart. loss is 0.668 now and dropping. status: 72% through the fable5 sft. checkpoints safe on hf. after this: trajectory sft with the self-awareness stuff baked in, then rlvr, then real numbers.
Devlog #13 we worked ALOT so this was the grind day. 18 hours of training babysitting and honestly it felt like 40. the modal training kept dying every hour. the client would crash and take the whole run with it. we restarted like 3 times before figuring out modal run -d (detached) keeps it alive on their servers even if our computer shits the bed. tested it by literally killing the process and it kept going. ez fix but we worked ALOT to get there. then we ran out of credits at 93% and switched accounts, but the other account “finished” the run in 6 MILLISECONDS which was sus af. turns out it just re-uploaded the old checkpoint and trained nothing. the resume logic had a bug where it thought 6200 >= 3799 meant done. patched it. another lesson learned. also we made the model creative lol. added diversity sampling to the trajectory generator (5 solutions per task, keep the novel ones), a novelty bonus reward for RLVR, and a creativity rule in the self-awareness prompt. so the fat cat will be innovative, not just memorize. current state: SFT is done at 91% (good enough), resume bug fixed, phase 2 (trajectory SFT with creativity + self-awareness baked in) is up next. 18 hours. we worked ALOT. the fat cat will be worth it 😼
Devlog #14 worked a lot, still not done we worked a lot this week. honestly the main takeaway is that the fable5 sft was good but its traces alone weren’t enough the model needs way more verified agent trajectories, so we’ve been grinding those out (target is 450). we also ran out of credits mid-generation (the modal endpoint started failing with 503s) and had to switch to a second kimi account. took a minute to get the auth right the new endpoint wanted an extra header we didn’t have. after that the generator resumed fine and it’s been adding verified traces since (~340/450 now). biggest scare: we found out peft 0.20 silently drops the second adapter when you merge two at once. tested it and yeah, the outputs were identical with one or two adapters so our trajectory sft would have been lost in the merge. fixed it by merging sequentially (base first, then the second adapter). checked against the live model and it matches, so we’re good. my 2070 couldn’t fit the 9b model for real training, so we’re waiting on a 4090 (my dad’s) next week. all the scripts are ready sft, merge, rlvr, eval, even a setup script for the gpu box. just need the hardware. status: 340/450 traces, everything ready, waiting on the 4090. we’ve worked a lot, but the real run hasn’t happened yet :/.
Devlog 15 Traces are done The trace generator finally hit the target and went past it. We got 474 verified trajectories, zero malformed, zero duplicates, 19 templates, and a 95 percent self review pass rate. We were aiming for 450, so we ended up with 474. The dataset is synced to Hugging Face in two versions: raw and normalized. That part is finally done. It was the longest part of the project, and the model is only going to be as good as the traces, so getting this right was important The Kimi endpoint also stopped working. The old teacher account started returning 503 errors during generation and eventually died completely. We switched to a second Kimi account, which needed an extra header that we did not have at first. After figuring that out, generation resumed without losing any progress For GPUs, the 2070 still cannot realistically train the 9B. Kaggle hours are back, so we have 30 hours on a T4. The 4090 from my dad should arrive next week. The plan is to use the T4 for trajectory SFT, then the 4090 for merging, Terminal Bench evaluation, and RLVR. Status: 474 out of 474 traces done,
Devlog #16, t4gpu The T4 16GB fought us the whole way. BF16 was baked into a pre quantized checkpoint, which made each step take 668 seconds because it had to use FP32 emulation. 2K context ran out of memory, the 248K logits ran out of memory too, FP16 started producing NaNs, Kaggle session limits locked us out, and the paged optimizer crashed last. Every fix seemed to create another problem. We eventually got it working with FP16 compute, chunked assistant token loss, autocast, and plain AdamW. Then we got access to an AMD MI300X with 192GB of memory. No quantization, 16K context, and enough memory to train full traces instead of cutting them off halfway through a message. Right now the 16K BF16 SFT run is training on the MI300X. Next up is merging the model, running Terminal Bench, and then RLVR.
devlog #17 MI300X vLLM serving The old GPU box got destroyed, so I spun up a new MI300X with the same SSH key. ROCm 6.2 and Torch 2.5.1 were already set up, so getting the machine ready was easy. The hard part was vLLM. The pip version is CUDA only, and the ROCm Docker image only supported the multimodal version of Qwen3.5. Our model is text-only, so I had to patch the image. I added Qwen3_5ForCausalLM, fixed the hybrid KV-cache setup, added the missing Mamba state methods, and mapped the weight names so the text-only safetensors loaded correctly. I also patched the merged config to remove the M-RoPE and dtype fields. After that, the model served normally. I ran a one-task test with fix-git. The pipeline worked, but the model got stuck repeating git show until it ran out of turns. ##Shipped The merged model is now public on Hugging Face as mateo0093/le-gros-chaton under Apache-2.0. The 5×5 Terminal-Bench pilot finished at 3/25 (25%). All three successes were on fix-git, which shows that the SFT data was too focused on git tasks. I also tested RLVR with GRPO and a novelty bonus. The reward had almost no variance, so the training signal was basically useless. I saved the step-10 adapter but didn’t merge it. The GPU used about 12 hours of the 50 hour budget. All the vLLM patches and harness changes are in the repo. Main lesson: Qwen3.5’s hybrid model is a bit annoying to serve as text-only on ROCm. The model works but i think this was more of a learning opportunity, i know what i’ve done wrong and what i would have done differently, I will be working on a new model in a few weeks once I do a bit more research.
Ships:
at first I wanted to make a normal text model to try and learn more about llms, but I wanted to go further, agentic coding is a big thing so what better way to learn about llms than trying to make an agentic coding ai model. So thats how le gros chaton was born, the name originated from a joke on x about a fake huge mistral model coming out. to train this model I used already made datasets on hugging face, like fable5 traces, I also used kimi k3 as a teacher model to teach my smaller model to be good at coding and running commands, it kind of worked? but i’m not completely satisfied with the result, but at least i have learned some things and soon enough I will trying making an even better model! I dont have a demo url for you guys to try the model out since it was too expensive to run on a gpu so you’ll need to run it yourself, check it out on hugging face, follow the instructions and have fun....
|
1792878632.7358682
|
1793742632.7358682
|
|
9570
|
Capital Chaos by @sol4r_on_hackclub | Stardance
|
sol4r_on_hackclub
|
1
|
171.6
|
3336
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T19:42:41Z", "hours": 171.0, "multiplier": 19.54, "payout": 3336, "blessing": "neutral", "text": "Welcome to Capital Chaos! One of Stardance’s most awaited projects ;) (hopefully anyways) We’ve got chaos, a bunch of random events, a boss fight and so much more for you to explore. SKIP if you are on Linux/MacOS (or you can vote based on the videos - completely up to you) as I only have a windows executable for now. I am honestly super proud of this, and the community built around this game. I hope you enjoy it as well. There have been TONNES of challenges, such as pathfinding, the initial grid also seemed really daunting. To the vacancy count which was literally plaguing me for the past MONTH and got fixed today (it was one line… i know.. maybe I should have used AI). But besides, it’s a sick project. I hope you all love it. Unzip the file in the release and it should be good to go. READ THE README FOR INSTRUCTIONS AND CONTROLS!! THERE IS NO TUTORIAL Read the story, watch the videos if you can and just enjoy the game! It will be on steam in 8-9 months so maybe subscribe?", "repo": "https://github.com/Sol4rOnGit/PocketCity", "demo": "https://github.com/Sol4rOnGit/PocketCity/releases"}]...
|
[{"post_id": 57569, "ts": "202 [{"post_id": 57569, "ts": "2026-08-29T19:13:24Z", "hours": 0.5961, "text": "Thank you all so much for the support! Framework 12 is on it’s way (and this wait is painful). After 171 hours! 19.54x is actually insane and I appreciate it a lot. Join the Discord! I made a discord (click above) and i’ll give you all an early supporter role before I put it out on YouTube and stuff for the “wishlist” when the full game comes out (if you want to stay in touch after stardance is done. ALSO IF YOU COMMENTED WHILE THE GAME WAS STILL CALLED POCKET CITY DM ME ILL GIVE U A SPECIAL ROLE The game beta is still up and you can try it out Currently just doing some minor stuff to the game (Fixed some normal/easy mode not settings correct phases. B2 Bomber should destroy itself and stop the nuke siren once launched), and slowly adding a tutorial but I’m like 90% focused on revising for uni entrance exams"}, {"post_id": 52586, "ts": "2026-08-22T19:35:44Z", "hours": 3.4139, "text": "BETA TEST! Nvm I have to devlog my final changes But lemme talk to those stardance reviewers real quick. Scroll down to see the endless content of my story, and all the community feedback (also on my youtube). Playing the game is a bit of a learning curve so you can watch my videos and stuff on it as well. I’d say watch this one: Boss Fight for the boss fight and maybe one of the other ones that you find interesting. Maybe this one because it has over 1,000 views and still climbing! The game is released there but it is windows only for now (i will release linux and maybe mac on the actual release game don’t worry but I’m super restricted for time right now) SKIP IF YOU’RE ON LINUX / MAC For everyone: Changes: Amended GameAudioManager to adjust for max voices which uses a List based system that appends and unappends. Boss fight also toggles and untoggles the game audio dependant on each audio source, because the game could currently have hundreds or even thousands of audio source which is really bad optimisation. So each audio source that I want to track has a ManagedAudioSource attached which automatically registers and unregisters itself from the GameAudioManager. I also edited the boss fight to make it a touch harder and amended the moves ;) And come and beta test NOWWW. leave all your comments, suggestions etc. on THE NEW DISCORD COMMUNITY!! or youtube, i’ll read it all and, again, thank you all for your support . I don’t know what to put as the image so here."}, {"post_id": 51908, "ts": "2026-08-21T20:18:25Z", "hours": 8.8033, "text": "Final DevLog before First Ship - Boss Battle I don’t think words can explain what I made so click here to watch a video on my probably final major addition (no pressure) & also help with a small dilemma I have. NO!! that does not mean this game will stop development, but i think i finally have enough hours (+10-15 more safety) to get a Framework 12! (and then i will be able to crack on with entrance exams - so i guess development will slow a touch). Of course I’ll ship once the game is polished enough. You might see a devlog or two from the “Capital Chaos Website” - follow me ;) I really hope you guys all enjoy it and now I need to do the readme and stuff. I also realised I was one of the most viewed on Stardance which is honestly amazing and I appreciate all of the support :) And thank you to all the new friends I’ve made and all the followers and commenters. It’s honestly been insane."}, {"post_id": 49800, "ts": "2026-08-18T18:52:58Z", "hours": 3.8472, "text": "Game Sountrack? But before I talk about that, lemme just say the game audio is almost finished, we have menu sounds for clicks and stuff, and i added support for main menu music. The firetruck hoses actually do stuff, floods sound like floods, theres some peaceful background nature sounds and yeah it makes the game feel so much nicer. although i forgot place sounds which was a massive oversight. also my wifi is still working. no idea why, but not complaining. and i’m cooking on a soundtrack lowk although none of it seems correlated in any way and idk how i’ll make it fit into this game but you know what maybe it’ll just all go into some random album. None of the hours put into these songs count but its okay. i’m no pro tho so. all i’ll say is i love some bass"}, {"post_id": 49147, "ts": "2026-08-17T19:36:51Z", "hours": 2.6206, "text": "I’m getting new wifi lol, & 150 hours so yeah i won’t be here and probably will have to post a 10 hour thing BUT on the plus side, we got a nice death screen that has a bunch of quotes that you can read below [SerializeField] private string[] quotes = { \"Opportunities multiply as they are seized \\n - Sun Tzu\", \"If you are going through hell, keep going \\n - Winston Churchill\", \"No empire was built on the first draft\", \"Fall seven times, stand up eight\", \"That which does not kill us, makes us stronger \\n - Friedrich Nietzsche\", \"Out of ash, a new foundation\", \"I have not failed. I just found 10,000 ways that don't work \\n - Thomas Edison\", \"A man is not finished when he is defeated. He is finished when he quits \\n - Richard M. Nixon\", \"It does not matter how slowly you go as long as you do not stop \\n - Confucius\", \"Out of difficulties grow miracles \\n - Jean de La Bruyère\", \"The greater the obstactle, the more glory in overcoming it \\n - Molière\", \"A Pocket Sized City is too small for your ambition. Build again \\n - The Dev\", \"Success usually comes to those who are too busy to be looking for it \\n - Henry David Thoreau\", \"Go big or go home\", \"You can't give up just yet. Stay determined... \\n - Undertale\" }; Maybe you’ll catch the little easter egg there as well ;) Working on adding game audio!! and probably finally enough hours to get the framework 12 (btw I wouldn’t recommend this as a daily laptop (f13 better), I just want something I can write on lol)"}, {"post_id": 48073, "ts": "2026-08-16T11:08:59Z", "hours": 3.8794, "text": "INSANE tree optimisations Went from 60-80 fps @ 4K to 400-450 (in game). Yes a 6 to 7x increase. How you ask? GPU Mesh Instance drawing offloading the CPU work of handling thousands of game objects. In English, I’m no longer spawning thousands of tree objects, but instead telling the GPU to draw the tree instances every frame. This seems quite unintuitive because you’re now drawing thousands of things every second. BUT this means that there are no game objects, so the CPU doesn’t even know that these exist. Also the GPU draws it thousands of times anyways. A game object handles transforms, rotations, etc. that the CPU has to keep track of whether it is active or not. This had the added benefit of the trees having no overhead when the trees are disabled, so you regain all of your framerate! Also I used some neat little script that combined the meshes all together in the GameObject prefab. Now it really should be able to run on your potato PC/Laptop. Combine script using UnityEngine; public class MeshCombineUtility : MonoBehaviour { [ContextMenu(\"Combine Children Meshes\")] public void Combine() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Matrix4x4 matrix = transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i].gameObject == gameObject) continue; combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = matrix * meshFilters[i].transform.localToWorldMatrix; } Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combine, true, true); #if UNITY_EDITOR string directory = $\"Assets/Assets/Mesh/Tree/{gameObject.name}.asset\"; UnityEditor.AssetDatabase.CreateAsset(combinedMesh, directory); UnityEditor.AssetDatabase.SaveAssets(); Debug.Log($\"Combined mesh saved to {directory}\"); #endif } } Draw section of GPU Mesh Instancing private void DrawTreeMeshes() { if (treeMesh == null || treeMaterial == null) return; foreach (var kvp in generatedChunks) { ChunkData chunk = kvp.Value; if (chunk.spawnedTrees == null || chunk.spawnedTrees.Count == 0) continue; int batchSize = 1023; int totalTrees = chunk.spawnedTrees.Count; for(int i = 0; i < totalTrees; i+=batchSize) { int length = Mathf.Min(batchSize, totalTrees - i); Matrix4x4[] subMatrices = new Matrix4x4[length]; for (int j = 0; j < length; j++) { subMatrices[j] = chunk.spawnedTrees[i + j].matrix; } int meshIndex = Mathf.Abs(chunk.chunkCord.GetHashCode() + i) % treeMesh.Length; Graphics.DrawMeshInstanced(treeMesh[meshIndex], 0, treeMaterial, subMatrices, length); } } }"}, {"post_id": 47547, "ts": "2026-08-15T14:59:51Z", "hours": 1.4756, "text": "You won’t believe it. I got it working FIRST TRY That’s actually crazy to be honest. Tells you how much expirience those 8 hours of menu development have given me. Someone give me a Unity menu doctorate or sum But on a serious note, we have game difficulty selection and its all nice and self contained. With controller support of course. You can see we have Previous Saves but that isn’t really functional yet. One of the things I learnt is to never rely on the UI giving you the data, only the click, so you’d manually add the elements and then call .value or .isOn respective to the component, and the same goes for dropdowns although I didn’t use one here. Let me know if you think it looks clean or any improvements to the UI readability, etc."}, {"post_id": 47161, "ts": "2026-08-14T20:58:41Z", "hours": 10.3042, "text": "I HATE Menus (in Unity at least) Genuinely hate them. But yeah we got settings menu working (which genuinely took like 5-6 hours because of stupid unity legacy stuff vs new stuff and then unity 6 vs 2023 version stuff i was used to) AHHHH I don’t remember it being this painful in Godot to be honest so maybe Godot is better for that? i had to get rid of VSync because it only worked on refresh. Created a debug menu to test performance, just to see that the only useful thing there was FPS and like RAM usage, and some engine stuff like active Rigidbodys. I couldn’t see the CPU utilisation or GPU utilisation which was… the thing I wanted to see. Although don’t worry performance does seem to be reasonable and early to mid game I can push over 1000 FPS on potato settings (specs at bottom if you care about them). It does obviously go down as the game continues on, but I think it’s quite optimised. Even with shadows its on 500+ FPS with a mid sized down. Although adding trees will quarter your FPS numbers. but it looks pretty so there’s your tradeoff. Although problematically if you turn trees off and you had already generated trees the fps stays low even though you’re not rendering it? I don’t know why unity is so weird. The game is quite unbalanced, but we’re in the final polishing stages (my target is 150 hours for the framework and hopefully it’s secure! (vote nice and high thanks - i did put a lot of effort into this game.) Up next: Difficulty selection Polishing Rebalancing updates Release!"}, {"post_id": 45186, "ts": "2026-08-11T14:41:21Z", "hours": 5.9322, "text": "NEW NAME!!! Flash Floods + Main Menu If you remember, Pocket City is a game that already exists so now it’s called Capital Chaos. Thank you YouTube comments! And all of you as well, for the suggestions. Ofc new video to go with it: watch by clicking here! I created flash floods that.. well flood the entire map. It’s meant to be a little toned down of a disaster, thats more survivable because it gives the game a touch more balance. It stops all services from working, so that could be detrimental during a virus attack. But on the other hand, it stops every single fire and prevents new ones and explosions. A lifesaver if theres a nuke, it gets completely nullified. Also new main menu, I think it looks pretty neat. Especially compared to the old one."}, {"post_id": 43501, "ts": "2026-08-08T20:10:46Z", "hours": 9.3828, "text": "Nukes… from a plane A famous plane. The B2 Bomber. Idk gng I got bored. No but it drops a nuke that decimates everything in a decent radius and then sets everything in a bigger radius on fire, and now we have a new rare event called a “military invasion”.. that spawns like 8 helicotpers AS WELL as the b2 bomber. The B2 Bomber starts a few clicks out and then flies toward the set target building. Then it drops the nuke, and you have a few seconds to try and kill the nuke before it kills you, and on impact (yes we are finally using rigidbodys as they are intended) it explodes. You better have that turret system ready. Of course, it’s clearly not enough. So maybe I’ll add a anti-missile system as a YouTube comment said. Speaking of YouTube, thank you for all the support :) 100+ comments goes crazy, and we’re on 73 subs up from the previous 29 literally 3 weeks ago. Not subscribed? Help a fellow dev out: TechScope Channel"}, {"post_id": 36089, "ts": "2026-07-27T23:24:15Z", "hours": 6.7969, "text": "WORKING AIR DEFENCE + ATTACK HELICOPTERS So we got working air defence turrets with some predictive aiming, and attack helicopters that shoot missiles at random buildings. Although you’re unlikely to get 3 attack helicopters at once… for now. The helicopters blades do spin, they bob up and down, they go towards buildings. They shoot out these missiles, which pathfind their way to the targetted building. They all have a healthsystem which means that the turrets do some damage on collisions only though, one turret might take a while but two (or the 7 you see below) will MOW them down. Still have to hook it all up to the Finance Manager, Special Building placement and other boring stuff, but… I need more IDEAS!! (read this thx) …for more Military stuff that can be added. Tank wars? Who knows. I was thinking of a military invasion as being one of the rare events which spawns like 10 missiles and 5 attack helicopters and maybe a B2 bomber or some stuff. I also need more allied options, maybe I’ll add like an anti-bomb turret that is specifically for the B2 bomber or something and does 100000 damage. Or maybe your own airbase that spawns an allied helicopter and now you have dogwars. or maybe your own plane. idk So yes @Adam_Lotfalla this is what the helicopter was for. Yay more things to worry about!!! Still have integrations left! I’ll see you (hopefully) tomorrow once that’s done. but its midnight now so goodbye."}, {"post_id": 35447, "ts": "2026-07-26T21:18:10Z", "hours": 1.8178, "text": "Hmmmm… What’s cooking? (Blender just WON’T count toward my hours but prolly spent 2-3 extra hours here) The helicopter blades actually spin. And W Unity particle system for the missile."}, {"post_id": 33603, "ts": "2026-07-23T17:37:47Z", "hours": 2.6228, "text": "I NEED YOUR HELP Pocket City already exists as a game. I know this is stupid and I should have checked this before starting since I had the intention of publishing it to steam but here we are. If you want more details, or more knowledge about the game check this video out: Video Oops…"}, {"post_id": 32074, "ts": "2026-07-20T23:48:35Z", "hours": 6.6703, "text": "UFOs in an Alien Invasion 💔💔 The second rare event addition to Pocket City! Get a chunk of your population zapped up by some not so friendly aliens… Any more ideas, let me know below! But it was pretty neat to implement. 3D modelled it and everything. 3 hours of doing god knows what. Tried to figure quality settings out and probably did smth else but was too busy with the World Cup to remember what I did. Probably bug fixes and stuff. Oh yeah and you see a pretty cool ripple pulse thing that propogates through the map. Although it is a little weak right now but i’ll fix that next time. Super tired. mb"}, {"post_id": 27226, "ts": "2026-07-12T16:41:03Z", "hours": 4.4661, "text": "Bugs are genuinely taking the life out of me Genuinely the worst thing ever. I STILL can’t figure it out but I had to post my weekly devlog anyways. Can you believe we’re 28 weeks into 2026??! Here’s the chaos where I accidentally created a “Pocket Empire” (Day 1105) Watch the video (click the title) if you wanna see how I ended up here and a minor crash out. very minor."}, {"post_id": 26578, "ts": "2026-07-11T14:19:18Z", "hours": 9.2114, "text": "I’m being forced to post Yeah thanks stardance. 10 hour limit for what. Probably spam filter. Also MASSIVE BUG(s). One is that the game just randomly deletes all the buildings from a chunk. No idea why, I’ve been at it for so long. Another issue is the stupid vacancy counter which has been broken FOREVER but atleast now it doesn’t go negative. I have a serious feeling I will have to spend a week just POLISHING the game. Whatever, Currently working through a new feature of allowing you to use your money that you spent so long accumulating to try and fix the chaos that you went through. This is done through the “Council FX” which I may rename if you guys can think of a better name, and you can see the countless things to do such as: Taking On DEBT!! YAY!! 100k that gains 1% every day. Seems low.. but it will pile up very quickly since it’s compound interest. Overclocking the grid for free placement + infinite water/power Maximising Housing/Business revenue Curing all infections … and many more as well as the ??? at level 100… who knows what that does. £2.5 million btw. Of course, those levels are the XP, which has finally given that a use. And no you wont be at level 11000 just like that, i’m just being lazy for testing. Also rebalanced so that all of the commercial buildings have ~10-15% of their previous employment caps. So that you’re not just spamming residential. It also makes industrial more useful as they have more employers even though they produce less money."}, {"post_id": 23054, "ts": "2026-07-05T19:50:43Z", "hours": 2.3469, "text": "Main menu 👀 I need help. UI clearly isn’t for me"}, {"post_id": 22419, "ts": "2026-07-04T21:33:08Z", "hours": 7.5172, "text": "CRIME!!! + C# Generics I added Arson and added a Police manager that goes out and solves these crimes. Lots more to come, let me know of any ideas you have! But before that let me teach you ALL something. C# Generics. I had a bunch of scripts that all did ABOUT the same thing but with different. This was FindClosestHospital, FindClosestFireStation and the thing I was adding which was FindClosestPoliceStation. It felt quire redundant to copy the same lines but instead of Hopsital it was replaced with FireStation or PoliceStation. //Generic functions private T FindClosestReachableService<T>(Vector2Int targetPos, Func<T, bool> hasAvailableVehicles, out List<Vector2Int> bestRoute) where T : Building { T closestBuilding = null; bestRoute = null; int shortestRouteLength = int.MaxValue; bool foundBuildingOfThisType = false; foreach (var kvp in gridManager.GetMapGrid()) { GridManager.GridTile tile = kvp.Value; if (tile.buildingScript != null && tile.buildingScript is T serviceBuilding) { foundBuildingOfThisType = true; if (!hasAvailableVehicles(serviceBuilding)) continue; List<Vector2Int> testRoute = CalculateRoadPath(tile.buildingScript.gridPos, targetPos); if (testRoute == null || testRoute.Count == 0) continue; if (testRoute.Count < shortestRouteLength) { shortestRouteLength = testRoute.Count; bestRoute = testRoute; closestBuilding = serviceBuilding; } } } if (!foundBuildingOfThisType) { bestRoute = null; return null; } return closestBuilding; } Above is an example of the C# generic. We have “T” type, and I think this is a good place to learn about them. Instead of defining the function as returning something like Building , we make T a type. and you can see it passed in a little <T> after the function name. We can also pass in entire functions like Func<T, bool> which is utilised as shown below: Building bestStation = FindClosestReachableService<PoliceStation>(building.gridPos, ps => ps.HasPolice(), out route); you can see ps => ps.HasPolice() calls that out. And finally, to define what T is meant to be, I’ve added where T : Building . You can do this many times, such as by having both a T as well as a U! and you’d have a repeated where T : Building where U: PotatoChips or something idk what U is meant to be bro. This was my first time using it but it’s pretty cool and if you’re using C# I’d recommend learning it as it saved me like 200 lines of code and changing something 3 times to change the same thing! And yes, I added a third thing which is Arson! which is a crime based thing, and you have a visual that shows up as a timer. if a police doesn’t solve the crime it sets on fire. It’s not too bad but it adds a use for the police, with much more to come for the police to deal with in the future! Also added asteroid BOMBARDMENT as a debuff. Yeah it’s brutal. 3 strikes… thats up to 108 tiles DESTROYED and set on fire. And of course, the image is from a youtube video: Click me!"}, {"post_id": 20327, "ts": "2026-07-01T22:02:59Z", "hours": 4.1806, "text": "BETTER UI + XP At the top of the image you can see a little progress bar… yep I’ve added XP now. Got plans for that, probably going to allow you to unlock stuff later. Like the lockdown ability etc. The UI has been overhauled. The actual images are a touch on the placeholder side apart from the road but it looks pretty good. You cycle between road, zoning and special building placement with 1, 2 and 3. Use R to rotate between the modes like residential, commercial and industrial zoning as well as Utilities & Emergency for the special buildings. Then finally T to rotate between those specific buildings. Complicated? Maybe? But it’s also a lot faster. I have completely lost my muscle memory of spamming R like the “good old days” though. Looks good? Bad? Horrible update and the game should never be changed ever again? Best update in the world and I should win £1 trillion? What do you think?"}, {"post_id": 17186, "ts": "2026-06-27T21:52:31Z", "hours": 9.9433, "text": "MAKE IT RAIN ASTEROIDS Pretty long run honestly. But before that, let’s talk about retrofitting your buildings. Earthquakes are pretty bad. Very bad when you loose your 100k building in a moment. So upgrade it. Yes it’ll cost you 35 to 55k now. But is your peace of mind worth that? And I added asteroids! These fly down and annihilate everything in a 3 unit radius and then set everything else in the 6 unit radius on fire. Lots of minor bug fixes as well, trying to get the game really polished now. Some rejigging of the game’s back end, such as creating a new abstract class for employer and reworking the systems to ensure that they run more smoothly and I believe almost finally fixing the unemployment/vacancy problem. I say almost because every 5 runs I see the game yell at me that it didn’t count something correctly but honestly I’ve spent so long on this I don’t even know if it’d be harder to just rewrite the entire employment system. For more detail, see my video linked below! See if you guys like it, my first proper long form I Added ASTEROIDS that ANNIHILATE your Adorable City And boy will this thing cook your economy."}, {"post_id": 15293, "ts": "2026-06-24T20:46:40Z", "hours": 7.6331, "text": "POLITICS!! + Debugging Hell v2 I mean I guess it is? Not too sure. Event Manager completely overhauled. Double events now no longer have the chance of repeating the same event. Created a new GameEffects script which just takes a bunch of simple code away from EventManager and plays the basic functions such as the “tax revenue increases” which you see below. This was quite a headache to create, and I severely underestimated how much time this would take. I have 2 extra nested classes inside of EventManager for Political Question and Political Scenario. [... inside EventManager.cs ...] public class PoliticalQuestion { public string Question; public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>(); public Action onAccept; public PoliticalQuestion(string question, Action onAccept) { Question = question; this.onAccept = onAccept; } } public class PoliticalScenario { public string description; public Action runnable; public PoliticalScenario(string featureDescription, Action functionality) { description = featureDescription; runnable = functionality; } } [Header(\"Political Question Variables\")] public List<PoliticalQuestion> PendingQuestions = new List<PoliticalQuestion>(); public event Action onQueueChanged; private PoliticalScenario[] goodFeatures; private PoliticalScenario[] badFeatures; The political question is sent off to the UI manager, which displays it as shown below. Then it handles user input pressing Y/Enter or N/Esc to accept the user choice, and returns it back to the Event Manager. Seems simple enough, yet there are many ways to do it but I think that the above implementation works the best out of all the ones that I tried. I attempted to use Game Manager as a middleman but that did not work out - so I resorted to passing an entire class. The political scenario allows for the string to actually do something, so that the game knows what to process and what the user agreed to without creating a bunch of variables, and can allow for stacked political question events which is nice. Game’s looking really neat, and the multipliers and stuff can make the game go very crazy very quickly. Too much of a good thing is a bad thing!! Debugged the entire system for like a solid 3 hours it was actually bad. Came first in the UK tho!! I’m back after those 6 exams are done. Yes I know the UI looks pretty bad but it’s good enough for pre-beta testing. Oh yeah, speaking of UI everything is more bold. Figured out how to do that."}, {"post_id": 14641, "ts": "2026-06-23T20:29:50Z", "hours": 2.74, "text": "I HAVE A PLANN For the spinal sprint toward completion. Should end up taking me to hour 70-75? Then we polish the UI and add a main menu… lacking feature I guess. Anyways, reorganised the code base and split game manager up, created folders and fixed dependencies for everything. There is now an event manager, which handles all of the events separately, and as you can see from this simple to-do list (should my next project be the to do list to end all to do lists with calendar integration and stuff???) that I have completed the first bit “Weighted Event system”. So now nothing has an equal chance of happening! Also as a side effect made adding new effects a lot easier due to the nested WeightedEvents class which was similar to an idea I had in my old minecraft mod plugin and transferred the skills across the languages. Quite nice neat code actually, that isn’t 600 lines long, so I can quickly show it to you below. It’s very applicable and I believe I have used it twice or three times in the past 4 months alone. The declarations for the events now look like this, very centralised and easy to add/remove events and modify the weightings. Called in the Start() function. weightedEvents.Add(new WeightedEvent(\"Nothing\", 20, () => { })); weightedEvents.Add(new WeightedEvent(\"Earthquake\", 5, Earthquake)); weightedEvents.Add(new WeightedEvent(\"Fire\", 40, SetBuildingOnFire)); weightedEvents.Add(new WeightedEvent(\"Virus\", 20, () => { TriggerVirusOutbreak(); } )); and the class is just simply storing the name, the weight and a weighted Event. public class WeightedEvent { public string name; public int weight; public Action weightedEvent; public WeightedEvent(string name, int weight, Action weightedEvent) { this.name = name; this.weight = weight; this.weightedEvent = weightedEvent; } } we do need to store the total weight which happens on the Start() function currently. When playRandomEvent() is called, we increase the cursor by the event’s weight until it is greater than the rolled random number between 0 and the total weight, at which point the class’ event is called. Broke nothing in the end! That’s great isn’t it, especially after migrating a bunch of “legacy” code. Hopefully didn’t jinx it."}, {"post_id": 12737, "ts": "2026-06-20T20:33:13Z", "hours": 4.3403, "text": "Okay now i SUCK at my own video game. Don’t worry it’s hard mode. Also lost 2 hours of work somewhere cuz it didn’t save? Don’t understand how. That’s always great isn’t it. But still, 62 days in and I’m fried because of one silly mistake I made 40 days ago. Really teaches you consequences I guess. Spent my time completely overhauling how everything works. You used to make too much money, so I made the revenue even more population based, by making the max revenue a multiplier of the max population. Completely rewrote the losing population, unemployment and vacancy calculations to prevent strange negative numbers which was irritating me for the past one and a half weeks. Also overhauled the inflation to use a formula instead of a very rudimentary lookup table from if statements which is staged into a end-game (130 days+) and early game stage with 20% and 2% simple interest respectively (no not compound for once - that would make the game too hard. Extreme mode?) The game is actually like a good game now. I don’t know how to explain apart from that though."}, {"post_id": 11524, "ts": "2026-06-18T20:22:52Z", "hours": 2.1214, "text": "I FINALLY LOST IN MY OWN GAME!! Rebalancing the game slowly but surely. Currently added inflation, which increases the price of everything as the days go by. It gets less severe the longer you play but the inflation rate stays high. The game days now vary, take 5 seconds at the start and slowly get faster and faster toward 1.5s linearly. The inflation rate also increases with bands as the game progresses so you need to keep up. This makes the game a good progression, but make one mistake during an earthquake and it might be ggs for you. There is now finally a game over function… although no restart but don’t worry about it. It just pauses the game and tells you that the game is finished. Next up: Detailed Finances, Rubbish? (follow thx)"}, {"post_id": 10848, "ts": "2026-06-17T19:53:45Z", "hours": 1.2564, "text": "Currently rebalancing the video game to make the game progression more realistic as it is currently extremely difficult at the start and stupidly impossible to die toward the end. Completely forgot to tell you guys that you can follow my projects on my YouTube: Video Like & sub if you can… mb for the self promo though. Sadly I have 6 exams next week so the next 2 weeks are most likely going to be slow ones… not dominating the leaderboards anymore."}, {"post_id": 10754, "ts": "2026-06-17T17:25:21Z", "hours": 4.8722, "text": "Working healthcare! The game now has a virus… and it spreads pretty quickly. Houses get infected, added to the random event chances on top of earthquakes and fires. I created hospitals that dispatch ambulances as required. Now all services cost money. Using the same A* algorithm from last time, but a little more complex due to the nature of the virus spreading to random buildings. This requires the game to check for any viruses. I created an UI that displays the day progression, using actions & delegates again. The day length is now no longer fixed, but instead it becomes smaller the longer you stay on the map, to try and add difficulty ramping. The game is currently very difficult at the start and incredibly easy at the end, so I’m trying to reverse this a bit and make it hard at the start but terrible towards the end. Also just realised there’s no ending lol - you just become broke and softlock yourself. Never done it to myself which really speaks out about how UNBALANCED the game is. I think it’s time to work on game balancing now before implementing new features, and over half way to shipping? maybe at 65-80 hours in at this rate?"}, {"post_id": 8771, "ts": "2026-06-14T16:10:08Z", "hours": 4.5692, "text": "WORKING PATHFINDING ON THE GRID! Created new assets so the game looks complete now! You can see the firetruck going from the Fire station all the way to the burning building where it will extinguish it. Yes, it follows the roads as intended and uses the A* algorithm to figure out the best path. And they shoot water out, so visual feedback for everything. This was super fun as it was the first time I’ve implemented the A* in a video game on a grid that procedurally generated. The coal power generator, fire station and fire trucks have models now, I think I made them good enough to fit with the game. Police station and healthcare to still be implemented but it’s looking good so far. This required creating a new services manager, creating a pathfinding script, updating global services and how everything interacts with the fire, and creating reverse pathfinding and small details. It’s coming together really cleanly now."}, {"post_id": 8393, "ts": "2026-06-13T23:23:02Z", "hours": 7.1706, "text": "Debugging HELL I added fires, which you can see in the corner. Unity Particle system actually really cool for that by the way. This forced me to rewrite how fires work and add new bits to the Building parent class. That was fine. Had to update the UI to show you that an earthquake was happening, which works more reliably than last time and I figured the ghost error out. I decided to implement water & energy requirements. Overhauled ChunkManager to allow for this, as each chunk needs enough. If it doesn’t produce enough, it imports from other chunks. If it can’t do that, everyone starts packing it up and leaving. Added this to city stats. Then modelled a cute little water tower as you can see below. Then I added energy, lots of chaos. Trying really hard to avoid circular loops to avoid a stack overflow, but it’s looking pretty good. User warnings now show up, like when an earthquake happens, or if a building burns down or if you can’t do something or don’t have money for something. Now I think I have time to do the fun part - creating chaotic fun stuff to make the city feel even more alive. But it’s looking pretty good right now. It’s getting close to being shipped, almost 40 hours in. Like & follow for the link ;) Now I really need to sleep. OH NO AND REVISE FOR THE PHYSICS TEST ON TUESDAY"}, {"post_id": 8051, "ts": "2026-06-13T13:04:47Z", "hours": 2.0944, "text": "It’s been a really long time since I’ve posted. Some progress going on here. Little sneak peak of the fires… yep. You thought the game was gonna be peaceful? On another 7+ hour sprint today"}, {"post_id": 7093, "ts": "2026-06-11T21:27:16Z", "hours": 4.3672, "text": "Clean codebase always pays off (unless you want to keep your job apparently?) Fixed the vacancies counter, as before I was using = instead of +=. Told you it’s the little things that catch you out. Created a safer version of the draft forceRemoveElement() that accounts for jobs and residents when destroying a building (houses/shops/industry). This now updates the game realistically, e.g. if you destroy a house, then you reduce from the population. If the residents were employed, then it removes positions from buildings. If they were unemployed, then we remove it from the stats. Since I am not storing direct references between buildings but creating a game pool for performance, this makes the operations require lots of calling. This could probably be optimised in the future but I will do that near the first release due to the ever-changing code base. This required updating GameManager.cs to have LosePopulation(), LoseJobs() with a helper RemoveWorkersFromBuildings() function. Luckily the lists in GridMananger that I made like 20 hours ago for “future proofing” came in useful. Finally, you can press F to show city statistics and it updates in real time."}, {"post_id": 6481, "ts": "2026-06-10T22:00:31Z", "hours": 1.0161, "text": "What’s the difference between these two: int maxEmployees = 50; int employees = 25; float taxRevenue = 1500.0f; ONE : float revenue = (employees / maxEmployees) * taxRevenue; TWO: float revenue = (employees * taxRevenue) / maxEmployees; Mathematically, they’re the same. a/b * c = c/b * a However, I missed one thing while coding (a lot harder to see when it’s not just this). They’re both integers. now what C# does is it divides 25/50. we get 0.5. but they’re both integers, so it tries to store it as an integer, which floors it to a 0. Therefore, it’ll suddenly jump to max revenue when the company is full. obviously not what was intended. Option 2 makes you multiply the integer with a float, and stores 25 * 1500 as a float, which can now be nicely divided by 50 to get the value that we inteded. Sometimes… actually, no MOST of the time it’s the little things that catch you out. Anyways, this has very much balanced the game. The companies get as many employees as they can, then grow by 1 employee each day. Their revenue scales with the employee count, so now residential houses are useful for once. If anything, essential. Next up: Road tax, Land tax. This might be the one time you want tax… or maybe it’s too much?"}, {"post_id": 6445, "ts": "2026-06-10T20:48:12Z", "hours": 1.1464, "text": "Sometimes, the most productive thing you can do is destroying everything for a clean slate. So that’s what I did and refactored my codebase, painting my GitHub red. The old city generation code ended up becoming messy spaghetti code that made it difficult to debug and work on it. And that sort of legacy code when I look back in a month is what ends up shelving projects for years on end. This half an hour will save me many in the future. I also removed the cluster expansion method of building expansion completely as it created annoying expansions that didn’t make sense of everything being 1 square off a road. Also created a GameManager and moved aspects of GridManager and FinanceManager to the new script, to try and centralise the logic and stop having random bits such as the day manager in the FinanceMananger, which didn’t make an sense. Also yes, I wasted 20 minutes trying to figure out what was going wrong when I forgot to add GameManager.cs to the scene 💔"}, {"post_id": 6367, "ts": "2026-06-10T18:39:39Z", "hours": 3.0794, "text": "It can’t POSSIBLY BE THAT HARD CAN IT? No but you have to mix up TAGS AND LAYERS. There’s some error you got 5 builds ago but NEVER APPEARED AGAIN. EVEN HOURS INTO TESTING. HOW DID IT FIX ITSELF?! The UI now updates how much you gained in the past day! But anyways, you can finally toggle between the layers… after too much debugging (and realising it was just me being stupid). But it’s okay I’ll hopefully get that laptop from this blood sweat and tears. Look how gorgeous it looks now!"}, {"post_id": 5918, "ts": "2026-06-09T22:00:15Z", "hours": 5.0561, "text": "Did you know it costs more to remove a road than create one?! Strange… Finally have a working economy in the game now! It’s VERY unbalanced. You WILL become very rich. And residential is currently useless, and everything just has a set employee count for now. But that will change soon, and we’ll make the game intelligent. Also the game clock is currently in the Finance Manager which is a little odd so maybe I’ll fix that later. But, I have used actions & delegates to optimise the game handling of the ridiculous amount of scripts for each building that will be running once the cities become larger and larger. Created a UI manager to update the script, which uses the above actions & delegates from the script manager. Created a Finance Manager which led me to have to recode GridManager for monetary support, but that was honestly less painful than it sounds. I also spent a considerable amount of time debugging last post’s Zoning. The code has multiple ways of producing a building and this caused me to have to go back and go through all of the code line by line to figure all the pathways out and debug it eventually. And yes, as promised I made it cost money to zone. Every action, such as creating a road and destroying them cost money and using my amazing research skills of using the first google result, destroying a road costs double placing a road! I think I should sleep. See you soon!"}, {"post_id": 5134, "ts": "2026-06-08T20:27:14Z", "hours": 2.4142, "text": "CITY ZONING! Annoyed that a massive skyscraper decided to spawn right next to a nice cozy cottage? Not anymore! You can zone areas by residential, commercial and industrial. There is also a “No Build” zone for areas that you just want to keep clear for now. This will eventually cost you money, because paperwork is really expensive apparently. (And to keep the game balanced of course). But there’s no money yet. I think you should like & follow to see how the game’s economy works."}, {"post_id": 4989, "ts": "2026-06-08T17:13:15Z", "hours": 2.5267, "text": "Pocket City Dev 5 The terrain was a little bland, so I decided to spice it up with nature. To fill the grid up, I decided to implement trees. Created a few basic tree grid varieties and implemented it into GridManager.cs. However, this forced me to spawn all of the trees in the Start() function which causes a longer loading time, CPU spike and worst of all it makes it so that after the initial radius no more trees spawn. Increasing the radius exponentially increases the amount of trees being added (because each ring has more grid sections to cover). So i had to pivot. I created a new Chunk Manager, split the main grid up into 16x16 chunks, and checked the player camera and only loaded the surrounding chunks. This makes trees spawn around the player continuously. However, this would become laggy as it would happen every frame. Two ways I decided to prevent this: Check if the player had changed chunks. If it’s still the same chunk, early return to skip the entire code process. Check if the nature has already been loaded. Only load if not loaded. This obviously saves on time complexity, and allows me to have the freedom of creating varying tree density. It also makes it so that the trees do not regenerate constantly. And that completes the visuals for now. Probably will add more foliage and other variety in the future, but for now this will suffice. Finally, this has a severe performance penalty. To cater for lower-end devices, I added a toggle which will later come to a settings menu for ~4x the performance without impacting gameplay. Optimisations, such as chunkloading and LODs will be added later to increase the performance with trees, but that will come after the core game is finalised."}, {"post_id": 3868, "ts": "2026-06-06T23:09:38Z", "hours": 2.8567, "text": "Hello everyone! The city is finally generating. They automatically generate alongside roads or try grow in clusters with each other. Game looks pretty sweet. Almost 9 hours in, I think it’s time to get some sleep now."}, {"post_id": 3730, "ts": "2026-06-06T19:33:02Z", "hours": 4.095, "text": "Coming first in the UK leaderboard is pretty honourable. Anyways, working on Pocket City and we’ve almost got generation of buildings and I’ve got a lot of things lined up for this project. I really need that framework 12 💔. The roads have a cursor and you can destroy and create them in a row as well, camera movement is more polished with a sprint key. Got all the building assets and everything ready. What a entry to stardance & hackclub!"}, {"post_id": 3473, "ts": "2026-06-06T12:53:43Z", "hours": 1.3806, "text": "Procedural road addition, so that when you add a tile (which is still done through code currently), it will decide which road layout to add, be it an intersection, 4 way, 3 way, a road turn or anything else. Added clean camera movement with WSAD + scroll as well."}, {"post_id": 3429, "ts": "2026-06-06T11:20:47Z", "hours": 1.0264, "text": "Hello! I’m working on creating a top-down 2D-styled but 3D game where you control a city. I’ve got this grid layout so far and it works fabulously and I somehow got the rotations correct on the first try 🤣"}]...
|
Title: Capital Chaos by @sol4r_on_hackclub | Stard Title: Capital Chaos by @sol4r_on_hackclub | Stardance
Devlogs:
Hello! I’m working on creating a top-down 2D-styled but 3D game where you control a city. I’ve got this grid layout so far and it works fabulously and I somehow got the rotations correct on the first try 🤣
Procedural road addition, so that when you add a tile (which is still done through code currently), it will decide which road layout to add, be it an intersection, 4 way, 3 way, a road turn or anything else. Added clean camera movement with WSAD + scroll as well.
Coming first in the UK leaderboard is pretty honourable. Anyways, working on Pocket City and we’ve almost got generation of buildings and I’ve got a lot of things lined up for this project. I really need that framework 12 💔. The roads have a cursor and you can destroy and create them in a row as well, camera movement is more polished with a sprint key. Got all the building assets and everything ready. What a entry to stardance & hackclub!
Hello everyone! The city is finally generating. They automatically generate alongside roads or try grow in clusters with each other. Game looks pretty sweet. Almost 9 hours in, I think it’s time to get some sleep now.
Pocket City Dev 5 The terrain was a little bland, so I decided to spice it up with nature. To fill the grid up, I decided to implement trees. Created a few basic tree grid varieties and implemented it into GridManager.cs. However, this forced me to spawn all of the trees in the Start() function which causes a longer loading time, CPU spike and worst of all it makes it so that after the initial radius no more trees spawn. Increasing the radius exponentially increases the amount of trees being added (because each ring has more grid sections to cover). So i had to pivot. I created a new Chunk Manager, split the main grid up into 16x16 chunks, and checked the player camera and only loaded the surrounding chunks. This makes trees spawn around the player continuously. However, this would become laggy as it would happen every frame. Two ways I decided to prevent this: Check if the player had changed chunks. If it’s still the same chunk, early return to skip the entire code process. Check if the nature has already been loaded. Only load if not loaded. This obviously saves on time complexity, and allows me to have the freedom of creating varying tree density. It also makes it so that the trees do not regenerate constantly. And that completes the visuals for now. Probably will add more foliage and other variety in the future, but for now this will suffice. Finally, this has a severe performance penalty. To cater for lower-end devices, I added a toggle which will later come to a settings menu for ~4x the performance without impacting gameplay. Optimisations, such as chunkloading and LODs will be added later to increase the performance with trees, but that will come after the core game is finalised.
CITY ZONING! Annoyed that a massive skyscraper decided to spawn right next to a nice cozy cottage? Not anymore! You can zone areas by residential, commercial and industrial. There is also a “No Build” zone for areas that you just want to keep clear for now. This will eventually cost you money, because paperwork is really expensive apparently. (And to keep the game balanced of course). But there’s no money yet. I think you should like & follow to see how the game’s economy works.
Did you know it costs more to remove a road than create one?! Strange… Finally have a working economy in the game now! It’s VERY unbalanced. You WILL become very rich. And residential is currently useless, and everything just has a set employee count for now. But that will change soon, and we’ll make the game intelligent. Also the game clock is currently in the Finance Manager which is a little odd so maybe I’ll fix that later. But, I have used actions & delegates to optimise the game handling of the ridiculous amount of scripts for each building that will be running once the cities become larger and larger. Created a UI manager to update the script, which uses the above actions & delegates from the script manager. Created a Finance Manager which led me to have to recode GridManager for monetary support, but that was honestly less painful than it sounds. I also spent a considerable amount of time debugging last post’s Zoning. The code has multiple ways of producing a building and this caused me to have to go back and go through all of the code line by line to figure all the pathways out and debug it eventually. And yes, as promised I made it cost money to zone. Every action, such as creating a road and destroying them cost money and using my amazing research skills of using the first google result, destroying a road costs double placing a road! I think I should sleep. See you soon!
It can’t POSSIBLY BE THAT HARD CAN IT? No but you have to mix up TAGS AND LAYERS. There’s some error you got 5 builds ago but NEVER APPEARED AGAIN. EVEN HOURS INTO TESTING. HOW DID IT FIX ITSELF?! The UI now updates how much you gained in the past day! But anyways, you can finally toggle between the layers… after too much debugging (and realising it was just me being stupid). But it’s okay I’ll hopefully get that laptop from this blood sweat and tears. Look how gorgeous it looks now!
Sometimes, the most productive thing you can do is destroying everything for a clean slate. So that’s what I did and refactored my codebase, painting my GitHub red. The old city generation code ended up becoming messy spaghetti code that made it difficult to debug and work on it. And that sort of legacy code when I look back in a month is what ends up shelving projects for years on end. This half an hour will save me many in the future. I also removed the cluster expansion method of building expansion completely as it created annoying expansions that didn’t make sense of everything being 1 square off a road. Also created a GameManager and moved aspects of GridManager and FinanceManager to the new script, to try and centralise the logic and stop having random bits such as the day manager in the FinanceMananger, which didn’t make an sense. Also yes, I wasted 20 minutes trying to figure out what was going wrong when I forgot to add GameManager.cs to the scene 💔
What’s the difference between these two: int maxEmployees = 50; int employees = 25; float taxRevenue = 1500.0f; ONE : float revenue = (employees / maxEmployees) * taxRevenue; TWO: float revenue = (employees * taxRevenue) / maxEmployees; Mathematically, they’re the same. a/b * c = c/b * a However, I missed one thing while coding (a lot harder to see when it’s not just this). They’re both integers. now what C# does is it divides 25/50. we get 0.5. but they’re both integers, so it tries to store it as an integer, which floors it to a 0. Therefore, it’ll suddenly jump to max revenue when the company is full. obviously not what was intended. Option 2 makes you multiply the integer with a float, and stores 25 * 1500 as a float, which can now be nicely divided by 50 to get the value that we inteded. Sometimes… actually, no MOST of the time it’s the little things that catch you out. Anyways, this has very much balanced the game. The companies get as many employees as they can, then grow by 1 employee each day. Their revenue scales with the employee count, so now residential houses are useful for once. If anything, essential. Next up: Road tax, Land tax. This might be the one time you want tax… or maybe it’s too much?
Clean codebase always pays off (unless you want to keep your job apparently?) Fixed the vacancies counter, as before I was using = instead of +=. Told you it’s the little things that catch you out. Created a safer version of the draft forceRemoveElement() that accounts for jobs and residents when destroying a building (houses/shops/industry). This now updates the game realistically, e.g. if you destroy a house, then you reduce from the population. If the residents were employed, then it removes positions from buildings. If they were unemployed, then we remove it from the stats. Since I am not storing direct references between buildings but creating a game pool for performance, this makes the operations require lots of calling. This could probably be optimised in the future but I will do that near the first release due to the ever-changing code base. This required updating GameManager.cs to have LosePopulation(), LoseJobs() with a helper RemoveWorkersFromBuildings() function. Luckily the lists in GridMananger that I made like 20 hours ago for “future proofing” came in useful. Finally, you can press F to show city statistics and it updates in real time.
It’s been a really long time since I’ve posted. Some progress going on here. Little sneak peak of the fires… yep. You thought the game was gonna be peaceful? On another 7+ hour sprint today
Debugging HELL I added fires, which you can see in the corner. Unity Particle system actually really cool for that by the way. This forced me to rewrite how fires work and add new bits to the Building parent class. That was fine. Had to update the UI to show you that an earthquake was happening, which works more reliably than last time and I figured the ghost error out. I decided to implement water & energy requirements. Overhauled ChunkManager to allow for this, as each chunk needs enough. If it doesn’t produce enough, it imports from other chunks. If it can’t do that, everyone starts packing it up and leaving. Added this to city stats. Then modelled a cute little water tower as you can see below. Then I added energy, lots of chaos. Trying really hard to avoid circular loops to avoid a stack overflow, but it’s looking pretty good. User warnings now show up, like when an earthquake happens, or if a building burns down or if you can’t do something or don’t have money for something. Now I think I have time to do the fun part - creating chaotic fun stuff to make the city feel even more alive. But it’s looking pretty good right now. It’s getting close to being shipped, almost 40 hours in. Like & follow for the link ;) Now I really need to sleep. OH NO AND REVISE FOR THE PHYSICS TEST ON TUESDAY
WORKING PATHFINDING ON THE GRID! Created new assets so the game looks complete now! You can see the firetruck going from the Fire station all the way to the burning building where it will extinguish it. Yes, it follows the roads as intended and uses the A* algorithm to figure out the best path. And they shoot water out, so visual feedback for everything. This was super fun as it was the first time I’ve implemented the A* in a video game on a grid that procedurally generated. The coal power generator, fire station and fire trucks have models now, I think I made them good enough to fit with the game. Police station and healthcare to still be implemented but it’s looking good so far. This required creating a new services manager, creating a pathfinding script, updating global services and how everything interacts with the fire, and creating reverse pathfinding and small details. It’s coming together really cleanly now.
Working healthcare! The game now has a virus… and it spreads pretty quickly. Houses get infected, added to the random event chances on top of earthquakes and fires. I created hospitals that dispatch ambulances as required. Now all services cost money. Using the same A* algorithm from last time, but a little more complex due to the nature of the virus spreading to random buildings. This requires the game to check for any viruses. I created an UI that displays the day progression, using actions & delegates again. The day length is now no longer fixed, but instead it becomes smaller the longer you stay on the map, to try and add difficulty ramping. The game is currently very difficult at the start and incredibly easy at the end, so I’m trying to reverse this a bit and make it hard at the start but terrible towards the end. Also just realised there’s no ending lol - you just become broke and softlock yourself. Never done it to myself which really speaks out about how UNBALANCED the game is. I think it’s time to work on game balancing now before implementing new features, and over half way to shipping? maybe at 65-80 hours in at this rate?
Currently rebalancing the video game to make the game progression more realistic as it is currently extremely difficult at the start and stupidly impossible to die toward the end. Completely forgot to tell you guys that you can follow my projects on my YouTube: Video Like & sub if you can… mb for the self promo though. Sadly I have 6 exams next week so the next 2 weeks are most likely going to be slow ones… not dominating the leaderboards anymore.
I FINALLY LOST IN MY OWN GAME!! Rebalancing the game slowly but surely. Currently added inflation, which increases the price of everything as the days go by. It gets less severe the longer you play but the inflation rate stays high. The game days now vary, take 5 seconds at the start and slowly get faster and faster toward 1.5s linearly. The inflation rate also increases with bands as the game progresses so you need to keep up. This makes the game a good progression, but make one mistake during an earthquake and it might be ggs for you. There is now finally a game over function… although no restart but don’t worry about it. It just pauses the game and tells you that the game is finished. Next up: Detailed Finances, Rubbish? (follow thx)
Okay now i SUCK at my own video game. Don’t worry it’s hard mode. Also lost 2 hours of work somewhere cuz it didn’t save? Don’t understand how. That’s always great isn’t it. But still, 62 days in and I’m fried because of one silly mistake I made 40 days ago. Really teaches you consequences I guess. Spent my time completely overhauling how everything works. You used to make too much money, so I made the revenue even more population based, by making the max revenue a multiplier of the max population. Completely rewrote the losing population, unemployment and vacancy calculations to prevent strange negative numbers which was irritating me for the past one and a half weeks. Also overhauled the inflation to use a formula instead of a very rudimentary lookup table from if statements which is staged into a end-game (130 days+) and early game stage with 20% and 2% simple interest respectively (no not compound for once - that would make the game too hard. Extreme mode?) The game is actually like a good game now. I don’t know how to explain apart from that though.
I HAVE A PLANN For the spinal sprint toward completion. Should end up taking me to hour 70-75? Then we polish the UI and add a main menu… lacking feature I guess. Anyways, reorganised the code base and split game manager up, created folders and fixed dependencies for everything. There is now an event manager, which handles all of the events separately, and as you can see from this simple to-do list (should my next project be the to do list to end all to do lists with calendar integration and stuff???) that I have completed the first bit “Weighted Event system”. So now nothing has an equal chance of happening! Also as a side effect made adding new effects a lot easier due to the nested WeightedEvents class which was similar to an idea I had in my old minecraft mod plugin and transferred the skills across the languages. Quite nice neat code actually, that isn’t 600 lines long, so I can quickly show it to you below. It’s very applicable and I believe I have used it twice or three times in the past 4 months alone. The declarations for the events now look like this, very centralised and easy to add/remove events and modify the weightings. Called in the Start() function. weightedEvents.Add(new WeightedEvent("Nothing", 20, () => { })); weightedEvents.Add(new WeightedEvent("Earthquake", 5, Earthquake)); weightedEvents.Add(new WeightedEvent("Fire", 40, SetBuildingOnFire)); weightedEvents.Add(new WeightedEvent("Virus", 20, () => { TriggerVirusOutbreak(); } )); and the class is just simply storing the name, the weight and a weighted Event. public class WeightedEvent { public string name; public int weight; public Action weightedEvent; public WeightedEvent(string name, int weight, Action weightedEvent) { this.name = name; this.weight = weight; this.weightedEvent = weightedEvent; } } we do need to store the total weight which happens on the Start() function currently. When playRandomEvent() is called, we increase the cursor by the event’s weight until it is greater than the rolled random number between 0 and the total weight, at which point the class’ event is called. Broke nothing in the end! That’s great isn’t it, especially after migrating a bunch of “legacy” code. Hopefully didn’t jinx it.
POLITICS!! + Debugging Hell v2 I mean I guess it is? Not too sure. Event Manager completely overhauled. Double events now no longer have the chance of repeating the same event. Created a new GameEffects script which just takes a bunch of simple code away from EventManager and plays the basic functions such as the “tax revenue increases” which you see below. This was quite a headache to create, and I severely underestimated how much time this would take. I have 2 extra nested classes inside of EventManager for Political Question and Political Scenario. [... inside EventManager.cs ...] public class PoliticalQuestion { public string Question; public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>(); public Action onAccept; public PoliticalQuestion(string question, Action onAccept) { Question = question; this.onAccept = onAccept; } } public class PoliticalScenario { public string description; public Action runnable; public PoliticalScenario(string featureDescription, Action functionality) { description = featureDescription; runnable = functionality; } } [Header("Political Question Variables")] public List<PoliticalQuestion> PendingQuestions = new List<PoliticalQuestion>(); public event Action onQueueChanged; private PoliticalScenario[] goodFeatures; private PoliticalScenario[] badFeatures; The political question is sent off to the UI manager, which displays it as shown below. Then it handles user input pressing Y/Enter or N/Esc to accept the user choice, and returns it back to the Event Manager. Seems simple enough, yet there are many ways to do it but I think that the above implementation works the best out of all the ones that I tried. I attempted to use Game Manager as a middleman but that did not work out - so I resorted to passing an entire class. The political scenario allows for the string to actually do something, so that the game knows what to process and what the user agreed to without creating a bunch of variables, and can allow for stacked political question events which is nice. Game’s looking really neat, and the multipliers and stuff can make the game go very crazy very quickly. Too much of a good thing is a bad thing!! Debugged the entire system for like a solid 3 hours it was actually bad. Came first in the UK tho!! I’m back after those 6 exams are done. Yes I know the UI looks pretty bad but it’s good enough for pre-beta testing. Oh yeah, speaking of UI everything is more bold. Figured out how to do that.
MAKE IT RAIN ASTEROIDS Pretty long run honestly. But before that, let’s talk about retrofitting your buildings. Earthquakes are pretty bad. Very bad when you loose your 100k building in a moment. So upgrade it. Yes it’ll cost you 35 to 55k now. But is your peace of mind worth that? And I added asteroids! These fly down and annihilate everything in a 3 unit radius and then set everything else in the 6 unit radius on fire. Lots of minor bug fixes as well, trying to get the game really polished now. Some rejigging of the game’s back end, such as creating a new abstract class for employer and reworking the systems to ensure that they run more smoothly and I believe almost finally fixing the unemployment/vacancy problem. I say almost because every 5 runs I see the game yell at me that it didn’t count something correctly but honestly I’ve spent so long on this I don’t even know if it’d be harder to just rewrite the entire employment system. For more detail, see my video linked below! See if you guys like it, my first proper long form I Added ASTEROIDS that ANNIHILATE your Adorable City And boy will this thing cook your economy.
BETTER UI + XP At the top of the image you can see a little progress bar… yep I’ve added XP now. Got plans for that, probably going to allow you to unlock stuff later. Like the lockdown ability etc. The UI has been overhauled. The actual images are a touch on the placeholder side apart from the road but it looks pretty good. You cycle between road, zoning and special building placement with 1, 2 and 3. Use R to rotate between the modes like residential, commercial and industrial zoning as well as Utilities & Emergency for the special buildings. Then finally T to rotate between those specific buildings. Complicated? Maybe? But it’s also a lot faster. I have completely lost my muscle memory of spamming R like the “good old days” though. Looks good? Bad? Horrible update and the game should never be changed ever again? Best update in the world and I should win £1 trillion? What do you think?
CRIME!!! + C# Generics I added Arson and added a Police manager that goes out and solves these crimes. Lots more to come, let me know of any ideas you have! But before that let me teach you ALL something. C# Generics. I had a bunch of scripts that all did ABOUT the same thing but with different. This was FindClosestHospital, FindClosestFireStation and the thing I was adding which was FindClosestPoliceStation. It felt quire redundant to copy the same lines but instead of Hopsital it was replaced with FireStation or PoliceStation. //Generic functions private T FindClosestReachableService<T>(Vector2Int targetPos, Func<T, bool> hasAvailableVehicles, out List<Vector2Int> bestRoute) where T : Building { T closestBuilding = null; bestRoute = null; int shortestRouteLength = int.MaxValue; bool foundBuildingOfThisType = false; foreach (var kvp in gridManager.GetMapGrid()) { GridManager.GridTile tile = kvp.Value; if (tile.buildingScript != null && tile.buildingScript is T serviceBuilding) { foundBuildingOfThisType = true; if (!hasAvailableVehicles(serviceBuilding)) continue; List<Vector2Int> testRoute = CalculateRoadPath(tile.buildingScript.gridPos, targetPos); if (testRoute == null || testRoute.Count == 0) continue; if (testRoute.Count < shortestRouteLength) { shortestRouteLength = testRoute.Count; bestRoute = testRoute; closestBuilding = serviceBuilding; } } } if (!foundBuildingOfThisType) { bestRoute = null; return null; } return closestBuilding; } Above is an example of the C# generic. We have “T” type, and I think this is a good place to learn about them. Instead of defining the function as returning something like Building , we make T a type. and you can see it passed in a little <T> after the function name. We can also pass in entire functions like Func<T, bool> which is utilised as shown below: Building bestStation = FindClosestReachableService<PoliceStation>(building.gridPos, ps => ps.HasPolice(), out route); you can see ps => ps.HasPolice() calls that out. And finally, to define what T is meant to be, I’ve added where T : Building . You can do this many times, such as by having both a T as well as a U! and you’d have a repeated where T : Building where U: PotatoChips or something idk what U is meant to be bro. This was my first time using it but it’s pretty cool and if you’re using C# I’d recommend learning it as it saved me like 200 lines of code and changing something 3 times to change the same thing! And yes, I added a third thing which is Arson! which is a crime based thing, and you have a visual that shows up as a timer. if a police doesn’t solve the crime it sets on fire. It’s not too bad but it adds a use for the police, with much more to come for the police to deal with in the future! Also added asteroid BOMBARDMENT as a debuff. Yeah it’s brutal. 3 strikes… thats up to 108 tiles DESTROYED and set on fire. And of course, the image is from a youtube video: Click me!
Main menu 👀 I need help. UI clearly isn’t for me
I’m being forced to post Yeah thanks stardance. 10 hour limit for what. Probably spam filter. Also MASSIVE BUG(s). One is that the game just randomly deletes all the buildings from a chunk. No idea why, I’ve been at it for so long. Another issue is the stupid vacancy counter which has been broken FOREVER but atleast now it doesn’t go negative. I have a serious feeling I will have to spend a week just POLISHING the game. Whatever, Currently working through a new feature of allowing you to use your money that you spent so long accumulating to try and fix the chaos that you went through. This is done through the “Council FX” which I may rename if you guys can think of a better name, and you can see the countless things to do such as: Taking On DEBT!! YAY!! 100k that gains 1% every day. Seems low.. but it will pile up very quickly since it’s compound interest. Overclocking the grid for free placement + infinite water/power Maximising Housing/Business revenue Curing all infections … and many more as well as the ??? at level 100… who knows what that does. £2.5 million btw. Of course, those levels are the XP, which has finally given that a use. And no you wont be at level 11000 just like that, i’m just being lazy for testing. Also rebalanced so that all of the commercial buildings have ~10-15% of their previous employment caps. So that you’re not just spamming residential. It also makes industrial more useful as they have more employers even though they produce less money.
Bugs are genuinely taking the life out of me Genuinely the worst thing ever. I STILL can’t figure it out but I had to post my weekly devlog anyways. Can you believe we’re 28 weeks into 2026??! Here’s the chaos where I accidentally created a “Pocket Empire” (Day 1105) Watch the video (click the title) if you wanna see how I ended up here and a minor crash out. very minor.
UFOs in an Alien Invasion 💔💔 The second rare event addition to Pocket City! Get a chunk of your population zapped up by some not so friendly aliens… Any more ideas, let me know below! But it was pretty neat to implement. 3D modelled it and everything. 3 hours of doing god knows what. Tried to figure quality settings out and probably did smth else but was too busy with the World Cup to remember what I did. Probably bug fixes and stuff. Oh yeah and you see a pretty cool ripple pulse thing that propogates through the map. Although it is a little weak right now but i’ll fix that next time. Super tired. mb
I NEED YOUR HELP Pocket City already exists as a game. I know this is stupid and I should have checked this before starting since I had the intention of publishing it to steam but here we are. If you want more details, or more knowledge about the game check this video out: Video Oops…
Hmmmm… What’s cooking? (Blender just WON’T count toward my hours but prolly spent 2-3 extra hours here) The helicopter blades actually spin. And W Unity particle system for the missile.
WORKING AIR DEFENCE + ATTACK HELICOPTERS So we got working air defence turrets with some predictive aiming, and attack helicopters that shoot missiles at random buildings. Although you’re unlikely to get 3 attack helicopters at once… for now. The helicopters blades do spin, they bob up and down, they go towards buildings. They shoot out these missiles, which pathfind their way to the targetted building. They all have a healthsystem which means that the turrets do some damage on collisions only though, one turret might take a while but two (or the 7 you see below) will MOW them down. Still have to hook it all up to the Finance Manager, Special Building placement and other boring stuff, but… I need more IDEAS!! (read this thx) …for more Military stuff that can be added. Tank wars? Who knows. I was thinking of a military invasion as being one of the rare events which spawns like 10 missiles and 5 attack helicopters and maybe a B2 bomber or some stuff. I also need more allied options, maybe I’ll add like an anti-bomb turret that is specifically for the B2 bomber or something and does 100000 damage. Or maybe your own airbase that spawns an allied helicopter and now you have dogwars. or maybe your own plane. idk So yes @Adam_Lotfalla this is what the helicopter was for. Yay more things to worry about!!! Still have integrations left! I’ll see you (hopefully) tomorrow once that’s done. but its midnight now so goodbye.
Nukes… from a plane A famous plane. The B2 Bomber. Idk gng I got bored. No but it drops a nuke that decimates everything in a decent radius and then sets everything in a bigger radius on fire, and now we have a new rare event called a “military invasion”.. that spawns like 8 helicotpers AS WELL as the b2 bomber. The B2 Bomber starts a few clicks out and then flies toward the set target building. Then it drops the nuke, and you have a few seconds to try and kill the nuke before it kills you, and on impact (yes we are finally using rigidbodys as they are intended) it explodes. You better have that turret system ready. Of course, it’s clearly not enough. So maybe I’ll add a anti-missile system as a YouTube comment said. Speaking of YouTube, thank you for all the support :) 100+ comments goes crazy, and we’re on 73 subs up from the previous 29 literally 3 weeks ago. Not subscribed? Help a fellow dev out: TechScope Channel
NEW NAME!!! Flash Floods + Main Menu If you remember, Pocket City is a game that already exists so now it’s called Capital Chaos. Thank you YouTube comments! And all of you as well, for the suggestions. Ofc new video to go with it: watch by clicking here! I created flash floods that.. well flood the entire map. It’s meant to be a little toned down of a disaster, thats more survivable because it gives the game a touch more balance. It stops all services from working, so that could be detrimental during a virus attack. But on the other hand, it stops every single fire and prevents new ones and explosions. A lifesaver if theres a nuke, it gets completely nullified. Also new main menu, I think it looks pretty neat. Especially compared to the old one.
I HATE Menus (in Unity at least) Genuinely hate them. But yeah we got settings menu working (which genuinely took like 5-6 hours because of stupid unity legacy stuff vs new stuff and then unity 6 vs 2023 version stuff i was used to) AHHHH I don’t remember it being this painful in Godot to be honest so maybe Godot is better for that? i had to get rid of VSync because it only worked on refresh. Created a debug menu to test performance, just to see that the only useful thing there was FPS and like RAM usage, and some engine stuff like active Rigidbodys. I couldn’t see the CPU utilisation or GPU utilisation which was… the thing I wanted to see. Although don’t worry performance does seem to be reasonable and early to mid game I can push over 1000 FPS on potato settings (specs at bottom if you care about them). It does obviously go down as the game continues on, but I think it’s quite optimised. Even with shadows its on 500+ FPS with a mid sized down. Although adding trees will quarter your FPS numbers. but it looks pretty so there’s your tradeoff. Although problematically if you turn trees off and you had already generated trees the fps stays low even though you’re not rendering it? I don’t know why unity is so weird. The game is quite unbalanced, but we’re in the final polishing stages (my target is 150 hours for the framework and hopefully it’s secure! (vote nice and high thanks - i did put a lot of effort into this game.) Up next: Difficulty selection Polishing Rebalancing updates Release!
You won’t believe it. I got it working FIRST TRY That’s actually crazy to be honest. Tells you how much expirience those 8 hours of menu development have given me. Someone give me a Unity menu doctorate or sum But on a serious note, we have game difficulty selection and its all nice and self contained. With controller support of course. You can see we have Previous Saves but that isn’t really functional yet. One of the things I learnt is to never rely on the UI giving you the data, only the click, so you’d manually add the elements and then call .value or .isOn respective to the component, and the same goes for dropdowns although I didn’t use one here. Let me know if you think it looks clean or any improvements to the UI readability, etc.
INSANE tree optimisations Went from 60-80 fps @ 4K to 400-450 (in game). Yes a 6 to 7x increase. How you ask? GPU Mesh Instance drawing offloading the CPU work of handling thousands of game objects. In English, I’m no longer spawning thousands of tree objects, but instead telling the GPU to draw the tree instances every frame. This seems quite unintuitive because you’re now drawing thousands of things every second. BUT this means that there are no game objects, so the CPU doesn’t even know that these exist. Also the GPU draws it thousands of times anyways. A game object handles transforms, rotations, etc. that the CPU has to keep track of whether it is active or not. This had the added benefit of the trees having no overhead when the trees are disabled, so you regain all of your framerate! Also I used some neat little script that combined the meshes all together in the GameObject prefab. Now it really should be able to run on your potato PC/Laptop. Combine script using UnityEngine; public class MeshCombineUtility : MonoBehaviour { [ContextMenu("Combine Children Meshes")] public void Combine() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Matrix4x4 matrix = transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i].gameObject == gameObject) continue; combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = matrix * meshFilters[i].transform.localToWorldMatrix; } Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combine, true, true); #if UNITY_EDITOR string directory = $"Assets/Assets/Mesh/Tree/{gameObject.name}.asset"; UnityEditor.AssetDatabase.CreateAsset(combinedMesh, directory); UnityEditor.AssetDatabase.SaveAssets(); Debug.Log($"Combined mesh saved to {directory}"); #endif } } Draw section of GPU Mesh Instancing private void DrawTreeMeshes() { if (treeMesh == null || treeMaterial == null) return; foreach (var kvp in generatedChunks) { ChunkData chunk = kvp.Value; if (chunk.spawnedTrees == null || chunk.spawnedTrees.Count == 0) continue; int batchSize = 1023; int totalTrees = chunk.spawnedTrees.Count; for(int i = 0; i < totalTrees; i+=batchSize) { int length = Mathf.Min(batchSize, totalTrees - i); Matrix4x4[] subMatrices = new Matrix4x4[length]; for (int j = 0; j < length; j++) { subMatrices[j] = chunk.spawnedTrees[i + j].matrix; } int meshIndex = Mathf.Abs(chunk.chunkCord.GetHashCode() + i) % treeMesh.Length; Graphics.DrawMeshInstanced(treeMesh[meshIndex], 0, treeMaterial, subMatrices, length); } } }
I’m getting new wifi lol, & 150 hours so yeah i won’t be here and probably will have to post a 10 hour thing BUT on the plus side, we got a nice death screen that has a bunch of quotes that you can read below [SerializeField] private string[] quotes = { "Opportunities multiply as they are seized \n - Sun Tzu", "If you are going through hell, keep going \n - Winston Churchill", "No empire was built on the first draft", "Fall seven times, stand up eight", "That which does not kill us, makes us stronger \n - Friedrich Nietzsche", "Out of ash, a new foundation", "I have not failed. I just found 10,000 ways that don't work \n - Thomas Edison", "A man is not finished when he is defeated. He is finished when he quits \n - Richard M. Nixon", "It does not matter how slowly you go as long as you do not stop \n - Confucius", "Out of difficulties grow miracles \n - Jean de La Bruyère", "The greater the obstactle, the more glory in overcoming it \n - Molière", "A Pocket Sized City is too small for your ambition. Build again \n - The Dev", "Success usually comes to those who are too busy to be looking for it \n - Henry David Thoreau", "Go big or go home", "You can't give up just yet. Stay determined... \n - Undertale" }; Maybe you’ll catch the little easter egg there as well ;) Working on adding game audio!! and probably finally enough hours to get the framework 12 (btw I wouldn’t recommend this as a daily laptop (f13 better), I just want something I can write on lol)
Game Sountrack? But before I talk about that, lemme just say the game audio is almost finished, we have menu sounds for clicks and stuff, and i added support for main menu music. The firetruck hoses actually do stuff, floods sound like floods, theres some peaceful background nature sounds and yeah it makes the game feel so much nicer. although i forgot place sounds which was a massive oversight. also my wifi is still working. no idea why, but not complaining. and i’m cooking on a soundtrack lowk although none of it seems correlated in any way and idk how i’ll make it fit into this game but you know what maybe it’ll just all go into some random album. None of the hours put into these songs count but its okay. i’m no pro tho so. all i’ll say is i love some bass
Final DevLog before First Ship - Boss Battle I don’t think words can explain what I made so click here to watch a video on my probably final major addition (no pressure) & also help with a small dilemma I have. NO!! that does not mean this game will stop development, but i think i finally have enough hours (+10-15 more safety) to get a Framework 12! (and then i will be able to crack on with entrance exams - so i guess development will slow a touch). Of course I’ll ship once the game is polished enough. You might see a devlog or two from the “Capital Chaos Website” - follow me ;) I really hope you guys all enjoy it and now I need to do the readme and stuff. I also realised I was one of the most viewed on Stardance which is honestly amazing and I appreciate all of the support :) And thank you to all the new friends I’ve made and all the followers and commenters. It’s honestly been insane.
BETA TEST! Nvm I have to devlog my final changes But lemme talk to those stardance reviewers real quick. Scroll down to see the endless content of my story, and all the community feedback (also on my youtube). Playing the game is a bit of a learning curve so you can watch my videos and stuff on it as well. I’d say watch this one: Boss Fight for the boss fight and maybe one of the other ones that you find interesting. Maybe this one because it has over 1,000 views and still climbing! The game is released there but it is windows only for now (i will release linux and maybe mac on the actual release game don’t worry but I’m super restricted for time right now) SKIP IF YOU’RE ON LINUX / MAC For everyone: Changes: Amended GameAudioManager to adjust for max voices which uses a List based system that appends and unappends. Boss fight also toggles and untoggles the game audio dependant on each audio source, because the game could currently have hundreds or even thousands of audio source which is really bad optimisation. So each audio source that I want to track has a ManagedAudioSource attached which automatically registers and unregisters itself from the GameAudioManager. I also edited the boss fight to make it a touch harder and amended the moves ;) And come and beta test NOWWW. leave all your comments, suggestions etc. on THE NEW DISCORD COMMUNITY!! or youtube, i’ll read it all and, again, thank you all for your support . I don’t know what to put as the image so here.
Thank you all so much for the support! Framework 12 is on it’s way (and this wait is painful). After 171 hours! 19.54x is actually insane and I appreciate it a lot. Join the Discord! I made a discord (click above) and i’ll give you all an early supporter role before I put it out on YouTube and stuff for the “wishlist” when the full game comes out (if you want to stay in touch after stardance is done. ALSO IF YOU COMMENTED WHILE THE GAME WAS STILL CALLED POCKET CITY DM ME ILL GIVE U A SPECIAL ROLE The game beta is still up and you can try it out Currently just doing some minor stuff to the game (Fixed some normal/easy mode not settings correct phases. B2 Bomber should destroy itself and stop the nuke siren once launched), and slowly adding a tutorial but I’m like 90% focused on revising for uni entrance exams
Ships:
Welcome to Capital Chaos! One of Stardance’s most awaited projects ;) (hopefully anyways) We’ve got chaos, a bunch of random events, a boss fight and so much more for you to explore. SKIP if you are on Linux/MacOS (or you can vote based on the videos - completely up to you) as I only have a windows executable for now. I am honestly super proud of this, and the community built around this game. I hope you enjoy it as well. There have been TONNES of challenges, such as pathfinding, the initial grid also seemed really daunting. To the vacancy count which was literally plaguing me for the past MONTH and got fixed today (it was one line… i know.. maybe I should have used AI). But besides, it’s a sick project. I hope you all love it. Unzip the file in the release and it should be good to go. READ THE README FOR INSTRUCTIONS AND CONTROLS!! THERE IS NO TUTORIAL Read the story, watch the videos if you can and just enjoy the game! It will be on steam in 8-9 months so maybe subscribe?...
|
1792990598.3956556
|
1793076998.3956556
|
|
13978
|
Roblox Minigolf by @ThatRandomMaker | Stardance
|
ThatRandomMaker
|
1
|
170.69
|
2416
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T09:33:14Z", "hours": 167.0, "multiplier": 15.65, "payout": 2416, "blessing": "neutral", "text": "I’ve made a minigolf game in Roblox studio, featuring 3 maps and 22 stages in total, with cosmetics that can be bought for your golf club or golf ball, and some nice QoL features like a music menu, or a hide UI hotkey In my opinion, the main challenging thing was building all the maps. I’m not a great map builder, so making even one map or all stages took a lot of time, plus taking on the task of making 3 maps for the first release was, admittedly, a not-so-thought-through idea. Of course, this doesn’t mean that there was just 1 challenge, this was just the main one for me. Please note: due to the Roblox guideline changes, you must have an account that is 16+ Facial Age Estimation or ID verified to play the game. This can only be changed if the game reaches 250 “active” players. There are alternatives, which is either setting up the game yourself in Roblox Studio (takes some time), or just by watching the small feature demo. These restrictions/alternatives are mentioned in the README. (written per default questions)", "repo": "https://github.com/ThatRandomMaker/Roblox-Minigolf", "demo": "https://www.roblox.com/games/11200475351/Minigolf"}]...
|
[{"post_id": 76096, "ts": "202 [{"post_id": 76096, "ts": "2026-10-02T09:52:34Z", "hours": 2.2314, "text": "Finished the first room in the new Factory map! What lighting style do you think is better? Realistic or soft? (shadowmap) Realistic is img 1-2, soft is 3-4 At the moment, there won’t be any minigolf courses, as I’d rather finish the building first. Also, I had a few new ideas for the game that may make it a bit more “immersive” to say the least.. Will experiment with them and post something in the future if it works out."}, {"post_id": 72599, "ts": "2026-09-23T09:50:33Z", "hours": 1.4561, "text": "After a few prototypes, (a lot) I’ve decided to make another map, which a factory/warehouse type of map. So far, I’ve made these props: Conveyor Structual beam Light Unloading zones At the moment, I’m not really sure how I’ll make the stages in the map, but I have an idea of making them more interactive (somewhat similar to the arcade map.) One small mention, the map will likely be in beta or not fully finished (when or if I ship again), as Stardance is likely going to end soon."}, {"post_id": 67234, "ts": "2026-09-13T09:16:00Z", "hours": 4.0808, "text": "FINALLY shipping! (after this devlog) After likely losing a few hairs here and there (/j) after these 3 (almost 3 and 1/2) months, I deem minigolf to be done. I’m kind of suprised myself that the project took so long. I believe that this, by far is the longest project I’ve ever made. During the process, I’ve learned A LOT more about studio and luau overall, which will definetly help make better games (with better implementations). I have to admit, coming closer to the end there was a bit of burnout, but the result, in my opinion, was definetly worth it. I also want to say thank you to everyone that has supported me and this project, it means a lot :) Since the last devlog, I fixed and updated the few rough edges left in the game, GitHub repository and Stardance which are: Stardance: Making a new banner (old one didn’t even match the style of the game anymore) Adding a demo link & github repository link GitHub repository: Made a README that, in my opinion, is nice. It follows the requirements that the shipping guide/README guide Stardance mentions (controls, images, demo link, features, etc) Game: Changing the teleport screen to one that blends in during teleport Changed badges for new ones (icons) and requirements (now 1, 10 and 22 stages) Made the maze in stage 8 (grass map) harder to complete, was too easy before Changed all loading music Removed the funFacts moduleScript (not needed anymore) Stage 9 sign fixed to show status for Arcade_9 instead of Arcade_3 Updated desertMap particles to be thinner Changed loadUI to have fake shadow text instead of a thick UIStroke"}, {"post_id": 65465, "ts": "2026-09-10T16:40:51Z", "hours": 1.6436, "text": "Desert map complete! Well.. that was way faster compared to the other maps, which makes sense due to a desert.. well, being a desert. Anyway, now that the main game is done*, I’ve also made thumbnails and an icon for the game. I still need to make a README and a proper description for the game, to ship , of course. *Will likely rework the tutorial gui a bit and the ui shown when teleporting between maps Anyway, look forward to seeing a few more updates soon, as the aforementioned updates/additions shouldn’t take a while"}, {"post_id": 64885, "ts": "2026-09-09T16:18:59Z", "hours": 1.3189, "text": "Started work on the “Desert” map. All stages are now built! There are only 5 stages due to school taking most of my time, as usual. (and, there’s already 2 other maps in the game, so that’s that)"}, {"post_id": 64261, "ts": "2026-09-08T15:10:07Z", "hours": 8.0694, "text": "Arcade map complete! New: the outside has now been fully finished (instead of just being a baseplate) Smaller changes/additions: the arcade map now has seats , shapes on the floor and ambiance zones. As the second map is done, I’m getting closer to (finally) shipping this project, and (hopefully) getting good enough reviews to get my goal from SD. The “Desert” map will likely be a bit shorter compared to the arcade map (or even grass map, undecided.), as I don’t have that much time anymore due to school starting."}, {"post_id": 61466, "ts": "2026-09-04T12:15:21Z", "hours": 10.2056, "text": "Arcade map update The indoor area is close to being finished! It still, of course needs a few things to be completed (for example, the food area, filling the empty space, etcetera.) Next step is, of course, the outdoors! I assume it shouldn’t take as long to make as the interior was, but who knows Another thing the game still needs is ambiance zones. (and a new ambiance sound for the indoors, of course) I’m thinking of implementing this with just 2 parts for the indoors and outdoors, which should do the trick. Every day this project is (hopefully) coming a bit closer to being shipped, but progress will slow down a bit due to school starting. In an ideal situation this’ll likely be shipped in a week, or atleast I hope to get it sort-of-ship ready by that time."}, {"post_id": 54531, "ts": "2026-08-25T15:39:57Z", "hours": 4.0231, "text": "Arcade Machines They have interactable buttons (which do nothing, except move up and down) Nothing else to say about them, really.. Changes/additions: Changed song2 (main menu) due to likely being made by AI (cover seems to be aigen) Light mode setting now also changes the main menu Changed buttonFrame in-game to have wrapper frames, in result being affected by the UIListLayout, and now they don’t clip together when using smaller screens, but they can still be animated."}, {"post_id": 51588, "ts": "2026-08-21T11:08:56Z", "hours": 8.1239, "text": "Overhauled main menu GUI including new songs and animations! Demo is in the attached video as usual! So, I’ve spent a bit of time reworking the main menu , since the old one looked “temporary” instead of finished. In my opinion, the result seems to be pretty nice . I’ve made/added/reworked: Esentially every menu New animations when moving pages or when going in-game Added hover effects for buttons Icons for the main buttons Added fake shadows to text instead of the bad-looking UIStroke like before Added image backgrounds Replaced (most) old songs! (song 1, song 3-5) It still isn’t fully finished, as I need to implement a light mode for it, but otherwise it’s fully functional! When light mode for the main menu and (maybe) loadUI is done, the focus will likely shift back to building the arcade map. Every time I test the game I somehow find bugs on accident, whoops! Anyway, there were a “few” fixes/updates that were made during development of this overhaul: Fixed spinnyCamera (script) to not repeat points Updated generateNumber for spinnyCamera (script) to go through all the points instead of randomly pick one and look repetitive Fixed autosaveUI appearing in the main menu Fixed hideUIHotkey setting (a lot of things which I won’t describe as this post isn’t meant to be a wall of text) Fixed mainMenuButton UIScale bug by resetting UIScale on click Updated both cameraFolder(s) to be models instead of folders, with ModelStreamingMode to be set to Atomic (fixes delay or infinite yielding on slower devices) Updated mainMenuUI image background transparency to 0.5 for settingsFrame, cameraModeFrame and creditsFrame Updated hideHotkey setting textColor3 when text is “Set Keybind” and added UIPadding to the button for text not to clip Fixed soundLogic volume bug that didn’t reset audio volume when going back to the main menu, in result making the song silent Updated soundLogic to fade in song volume instead of immediately start playing it at full volume And a lot more… (these are just ones found after the overhaul)"}, {"post_id": 48935, "ts": "2026-08-17T14:30:42Z", "hours": 4.1728, "text": "New camera mode for the main menu! Demo is in the video! Before remaking/overhauling the main menu UI into light/dark mode (and, to look nice, of course), I’ve decided to rework the camera as it’s a bit of a weak point in the menu. It features: Camera sway Camera switching between points 15 different points for the camera Now, this has also reminded me that the main menu needs a little bit different of a song selection, as drum and bass for a gentle camera sway obviously doesn’t work. Miscellanous changes/fixes: Flying trees fixed statsGui (naming fix soonTM) bgcolor and background transparency changed in light mode to that of the old UI."}, {"post_id": 48115, "ts": "2026-08-16T12:28:38Z", "hours": 9.935, "text": "In-game UI revamp is complete! *and a few miscellaneous fixes have been made The settings menu has been revamped to add the light mode setting, now featuring page 1 and 2, and a few other settings which are currently in progress of being made. In my opinion, light mode looks decent but I still prefer dark mode. A new setting that is still a bit of a work in progress, but mostly finished is a hide UI hotkey , which as the name states, hides ui (in-game only). I still need to implement that the setting saves, but overall it works just fine. It’s made to only apply a keybind if you’re playing on PC, though. Fixes: autosaveUI loading/saving icon was still spinning when not visible. Fixed by seeing if the frame is actually visible (instead of if the frame exists, small typo) Shadow button now just changes immediately instead of waiting for the server to change the variable, now it just fires the remoteEvent only to save the setting autosaveUI UIstroke clipping fixed by changing it to apply inner instead of outer Tree sway intensity has been changed to be a bit lower, otherwise it’d look unnatural. Tree pivots fixed to be on the bottom for tree sway (this was a pain) Tree pivot issues: Changing tree pivots manually always broke for some reason. It took a few hours to fix them, then when I dragged the trees down it reset them. Upon pressing undo the pivots were still reset, not like they were before. Then, I tried fixing them without dragging anything, and the next time I opened studio it reset again. I found that ctrl+l may work, but that didn’t work either. Had to end up cloning everything over again, which somehow has made the shadows more intense in the dense tree areas, even though nothing changed between the two. This was NOT fun When writing this devlog, I found out that the oak trees have decided to fly in the air, so that’s great"}, {"post_id": 41247, "ts": "2026-08-05T10:30:05Z", "hours": 9.6728, "text": "UI Revamp (W.I.P) I’ve started reworking the main UI for the game because well.. the old one is to say the least - not good. So far I’ve reworked basically everything in-game (except the tutorial, but it won’t be reworked anyway as it can only be seen one time) I’ve also experimented a bit with hover tweens (button getting larger on hover) and sound effects, which have been implemented now. Another thing I’ve experimented a bit with is viewport frames , which are now used in the shop to show golf balls and clubs/“sticks” spinning. I’d want to possibly implement a “Are you sure you want to buy (x) item for (x) amount” in the shop, but that’s not planned at the moment. Things still unfinished that I want to complete (for UIs): Setting to enable/disable dark mode Light mode UI (as at the moment it’s dark mode only) Sound changes: “song2” in the main menu has been replaced due to it being striked by Roblox (not sure why!) Sound in the tutorial UI before accepting/declining the tutorial has been changed (same issue)"}, {"post_id": 37696, "ts": "2026-07-30T16:22:40Z", "hours": 4.7486, "text": "Every stage in the Arcade (map) has been built! The arcade now consists of 9 stages in total! New thing is that some are a bit more.. interactive , and a few are a bit difficult or tedious .. to say the least. (example of changing stages the attached video) Now that the stages are done, the game is inching a bit closer to completion! Now, of course, there may be ~15 or more things to still complete in the roadmap , but any progress is great. You may (or may not) be wondering how I made all of these in 4 hours. Well, I only have one explanation. I uhh… forgot to enable the plugin after making something else. Oops! (factory gambler prototype) Anyway, during this time a few small misc changes have been done: stageLogic (new script) has been added to well.. control the stages. (Stage 5, 7 and 9.) Shop UI trail naming has been changed a little. Blinking activity on stage signs has been removed. Note: Video player in SD is bugged. You have to click on the devlog, then go and click on the video for it to play."}, {"post_id": 35256, "ts": "2026-07-26T15:40:53Z", "hours": 8.5958, "text": "Hello again! I’ve started working on the arcade map, as the grass map is pretty much complete (just need to fix the ui a bit) I’ve decided to rewrite the playSound script a bit to not be hardcoded and play a different sound (depending on what string is received from the remoteEvent) instead of creating a remoteEvent and a new script for each one For example, now it can play either the golfhole sound or the sound for the ball disappearing in stage 2. Also, for the new automated door, I’ve experimented a little with spatial-ish sound. Turns out it’s really easy (for what I need, atleast) So far I’ve made a few things in-game and outlined a few ideas and a roadmap. Currently built: First three stages (which are glow-in-the-dark!) mostly complete parking lot Front of the building (although unfinished) A road leading up to the parking lot with a small grass patch. Automated door There may not be as much devlogs now, but the game is still in development!"}, {"post_id": 30623, "ts": "2026-07-18T10:46:31Z", "hours": 6.6422, "text": "Devlog 7 Additions: Grass map is now complete! Added lamp scenery to the stages, so you can actually complete them during the night Tutorial is complete with music! Shop UI now has shadows behind the buttons Added an invisible hitbox extension to the golfstick (mainly fixes issue, although still may need to switch to r6 due to animation packs) UI with stats (Cash, stages won) and sounds + cash counting up/down The tutorial now has animations for hitting the ball Changes: Tutorial made more visually similar overall First tutorial animation changed to: Move the golfstick not as far back/forward Move the golfstick a bit faster when hitting the ball Tutorial second animation changed to: Not rotate the golfstick as far (60 degrees instead of 90) Fixes: Stats UI centering on screen Before starting to work on the next map which is the Arcade, a few other settings will be added to the settings menu. Music UI may also change."}, {"post_id": 27248, "ts": "2026-07-12T17:13:40Z", "hours": 10.0919, "text": "Small update/Devlog 6 New additions: A tutorial has been added and is fully working! (still needs sounds but otherwise fully complete) Main menu disallows the player to join the Arcade and Desert map if they haven’t completed the tutorial yet. Map scenery is done! Only need the stages now A boost pad has been added (and a golf ball loop will be made!) Colorcorrectioneffect has been added to make the game brighter in terms of colors instead of dull. Fixes: Trees were optimized a little in blender (the fir tree originally had 6.6k faces when I opened the file.. oof) Renderfidelity on leaf parts for trees was changed to automatic (otherwise the trees would look like twigs from far away) Lights turn off when daytime cycle setting gets turned off Daytime cycle script fixed to turn off after turning off the nighttime setting Changes: Lighting from invisible walls on stages removed (will use lights that the player can see instead) Main menu UI has been changed to have shadows on the buttons. Main menu UI text also has a “manual” shadow on the “Choose your destination!” text UIStroke on stage signs is now a bit thicker (text is easier to read) Need to add/fix: UI that shows your current leaderboard stats instead of the default one Arm swinging the golfstick when moving with it (will probably either switch to R6 or just make an invisible hitbox for the tool) Note: Ignore the last map building update. The upload system completely broke for me. I can’t add an attachment to the devlog (so I can’t edit it) and deleting it just results in an error."}, {"post_id": 25189, "ts": "2026-07-09T08:12:53Z", "hours": 21.9158, "text": "Map development update #2 I’ve developed the map and it’s outer scenery a lot , although I’m running into optimization regarding te trees. (haven’t worked on a lot of stages though, only added the 4th one) Maybe the tree has a lot of vertices and I could somehow optimize it in blender? If so, that could be the main factor why the game ran better with less trees. Sunrays, bloom and a shorter range detpth of field have been added And a small experiment for a tutorial cutscene has been added too. In the process of this “devlog” I’ve also lost 11h of work Also, a new loading screen has been added and the one from TP has been fixed!"}, {"post_id": 19276, "ts": "2026-06-30T15:27:41Z", "hours": 4.4606, "text": "Map development update I’ve been working on a few ideas recently and have been attempting to build something “decent”. With a bit of trial and error so far I’ve made A tree And 3 stages 🤞 Perfect development pace, isn’t it? Anyway, here are the images showing stages and the tree."}, {"post_id": 17522, "ts": "2026-06-28T10:34:21Z", "hours": 10.4989, "text": "Small update/Devlog 5.5 I’ve been working on a few things for the game before starting to build the map and in result wanted to share these. Changes: “New” spawnPad and clearBall models, both now display their cooldowns with text and colors (locally for the player) I’ve replaced the low quality music in the main menu and added a “few” more songs, instead of just 11 songs now the game has.. 87! Now the main menu is also controlled by one script only, instead of having one in each button (in result also making porting easier to the other places) Also, the side buttons have been redesigned! Now they have a collapse menu button, and a button for returning to the main menu. This is so that more of the screen is available for mobile players (and a bit of the screen on PC, too). Returning to the main menu will be useful for example, if the player completes every stage in the Grass “destination”/Environment and wants to continue to the next one. Also the music UI has been fixed to work on 4K (didn’t properly implement scale on the buttons) And, a very special thing in my opinion is that the shop is finally complete ! Consisting of golf balls, trails, effects and different golf clubs (for a visual representation, go to the video after reading this post) The Golf club preview image on the tool changes per the equipped cosmetic too!"}, {"post_id": 15173, "ts": "2026-06-24T17:30:12Z", "hours": 10.3753, "text": "Devlog 5! New fixes and additions also shown in the video Features: Parts now spin the same speed at any fps, and one main script is now controlling them all using CollectionService The GolfStick now has customization added in the shop! Autosave has been added (saves every 60sec with visual UI) Completed levels and main menu settings get saved Main menu now has transitions! Fixes: Shop and music menu now finally properly scale on ALL resolutions! Shop buttons fixed with scale instead of sizing Disabled the back button when attempting to teleport to a different place Lights are fixed for the nightTime setting (didn’t turn on/off before) Ambiance now plays with the nightTime setting on A saved table is now used instead of searching for lamp parts each time the alpha tween runs (dynamic lighting on/off tween), in result saving performance. Fixed golf ball trail and effect visibility (now you don’t see other player trails and effects, which reduced visibility before.) Main menu play button fixed to not start volume fade out from volume 1, instead now uses the current volume of the sound Commented out debug prints that aren’t needed anymore (kept incase something breaks though) Fixed saves when altf4-ing from the game or the server shutting down. PlayerRemoving and BindToClose double saving upon shutdown Still need to replace: Placeholder images and items in the shop UI. After that, time to start building!"}, {"post_id": 11863, "ts": "2026-06-19T09:53:37Z", "hours": 8.5456, "text": "Devlog 4 fixes and additions New additions and fixes also shown in the video Features: Added badge rewards on milestones (5 badges so far, 1-1000 stages won) Setting for daytime cycle in main menu Dynamic lighting system Replaced placeholder images in the main menu (main menu is fully complete now) Seperate play UI instead of one button Spinning parts Loading screen Day and night ambiance Fixes: Dynamic lighting fixed to not depend the animation on ClockTime, instead make a tween and play it in a certain time range. Dynamic lighting fixed to not read ClockTime every time it changes (inefficient) Teleport handler fixed to handle any errors with servers and re-enable the menu incase of an unsuccesful teleport. Music UI fixed to show volume slider properly (not to combine the button to stop the current song playing in the same line) Implemented proper join song rng (otherwise it’d usually pick the first or the 4th song) Credit menu scaling Needs fixing: Shop and music menu scaling on 1440p screens (Credit to ShootingCat for finding this bug, since I don’t have a 1440p monitor) Disabling the back button when attempting to teleport to a different place When enabling night time, to turn the lights on, since the current dynamic lighting system only checks 2 timeframes, and doesn’t turn on otherwise. Still need to add/replace: Replace placeholder items and images in the shop frame Adding customization options for the golf club (or as it’s named, golfstick) 3. Finally start building the map (if nothing else comes up that needs fixing, or another idea that needs to be implemented)"}, {"post_id": 10585, "ts": "2026-06-17T12:07:24Z", "hours": 7.51, "text": "Devlog 3, game additions and hotfixes New additions shown in the video Additions: Implemented most of the main menu. Includes: Credits, settings (shadows and night time) Camera spinning around a specific (target) part for main menu Button to stop current song in the music menu. Replaced placeholder images and sounds in the music menu Spinning parts using tween(s) Fixes: Menu proper scaling for devices Player input and backpack UI disabling when in main menu Shop has an error sound (instead of purchase sound) when not having enough money for an item. Added default/none options to the shop for disabling trails and effects. Still need to add: Badge rewards on a milestone (changed from reward per stage) Volume slider or manual volume entering for the music menu Replacing placeholder items and images in the shop frame Images for the buttons, separate play UI in the main menu"}, {"post_id": 9284, "ts": "2026-06-15T16:15:08Z", "hours": 6.1644, "text": "Devlog 2, a lot has changed! Project demo available in the video Features: Shop UI has now been fully implemented and saving works Golf balls are now customizable by buying cosmetics from the shop (with in-game cash), cosmetics consist of golf ball colors, trails and effects Music UI has been added to the game for listening songs during gameplay Now there was one bad thing, which is that I somehow accidentally deleted the whole shop UI and had to remake it since autosave (of course) had to save in that exact moment.. Still need to implement: Badge rewards when winning a stage Main menu with setting(s) Spinning and moving parts (for unique stages) Volume control for music UI Replacing placeholder sounds in the music frame Replacing placeholder items and images in the shop frame Adding materials as a customization option for golf balls"}, {"post_id": 7945, "ts": "2026-06-13T07:59:58Z", "hours": 6.6408, "text": "Hello, Minigolf! Implemented the core mechanics for the game to work which are: Custom collisiongroups to prevent griefing (for example, your golf ball hitting one that’s owned by another player, or the golf club hitting the ground making it hard to play) Transparency on different clients, to know which golf ball you own Working goal with a sound effect and tween to fade out the ball before destroying it Side mechanics added: Barebones datastore implementation, now rewards cash and golf hole scored/won UI test for music selection menu and shop (to get trails, custom golf ball colors, etc), full implementation soonTM Still working on to implement: Working shop with equippable cosmetics Working music selection Main menu"}]...
|
Title: Roblox Minigolf by @ThatRandomMaker | Stard Title: Roblox Minigolf by @ThatRandomMaker | Stardance
Devlogs:
Hello, Minigolf! Implemented the core mechanics for the game to work which are: Custom collisiongroups to prevent griefing (for example, your golf ball hitting one that’s owned by another player, or the golf club hitting the ground making it hard to play) Transparency on different clients, to know which golf ball you own Working goal with a sound effect and tween to fade out the ball before destroying it Side mechanics added: Barebones datastore implementation, now rewards cash and golf hole scored/won UI test for music selection menu and shop (to get trails, custom golf ball colors, etc), full implementation soonTM Still working on to implement: Working shop with equippable cosmetics Working music selection Main menu
Devlog 2, a lot has changed! Project demo available in the video Features: Shop UI has now been fully implemented and saving works Golf balls are now customizable by buying cosmetics from the shop (with in-game cash), cosmetics consist of golf ball colors, trails and effects Music UI has been added to the game for listening songs during gameplay Now there was one bad thing, which is that I somehow accidentally deleted the whole shop UI and had to remake it since autosave (of course) had to save in that exact moment.. Still need to implement: Badge rewards when winning a stage Main menu with setting(s) Spinning and moving parts (for unique stages) Volume control for music UI Replacing placeholder sounds in the music frame Replacing placeholder items and images in the shop frame Adding materials as a customization option for golf balls
Devlog 3, game additions and hotfixes New additions shown in the video Additions: Implemented most of the main menu. Includes: Credits, settings (shadows and night time) Camera spinning around a specific (target) part for main menu Button to stop current song in the music menu. Replaced placeholder images and sounds in the music menu Spinning parts using tween(s) Fixes: Menu proper scaling for devices Player input and backpack UI disabling when in main menu Shop has an error sound (instead of purchase sound) when not having enough money for an item. Added default/none options to the shop for disabling trails and effects. Still need to add: Badge rewards on a milestone (changed from reward per stage) Volume slider or manual volume entering for the music menu Replacing placeholder items and images in the shop frame Images for the buttons, separate play UI in the main menu
Devlog 4 fixes and additions New additions and fixes also shown in the video Features: Added badge rewards on milestones (5 badges so far, 1-1000 stages won) Setting for daytime cycle in main menu Dynamic lighting system Replaced placeholder images in the main menu (main menu is fully complete now) Seperate play UI instead of one button Spinning parts Loading screen Day and night ambiance Fixes: Dynamic lighting fixed to not depend the animation on ClockTime, instead make a tween and play it in a certain time range. Dynamic lighting fixed to not read ClockTime every time it changes (inefficient) Teleport handler fixed to handle any errors with servers and re-enable the menu incase of an unsuccesful teleport. Music UI fixed to show volume slider properly (not to combine the button to stop the current song playing in the same line) Implemented proper join song rng (otherwise it’d usually pick the first or the 4th song) Credit menu scaling Needs fixing: Shop and music menu scaling on 1440p screens (Credit to ShootingCat for finding this bug, since I don’t have a 1440p monitor) Disabling the back button when attempting to teleport to a different place When enabling night time, to turn the lights on, since the current dynamic lighting system only checks 2 timeframes, and doesn’t turn on otherwise. Still need to add/replace: Replace placeholder items and images in the shop frame Adding customization options for the golf club (or as it’s named, golfstick) 3. Finally start building the map (if nothing else comes up that needs fixing, or another idea that needs to be implemented)
Devlog 5! New fixes and additions also shown in the video Features: Parts now spin the same speed at any fps, and one main script is now controlling them all using CollectionService The GolfStick now has customization added in the shop! Autosave has been added (saves every 60sec with visual UI) Completed levels and main menu settings get saved Main menu now has transitions! Fixes: Shop and music menu now finally properly scale on ALL resolutions! Shop buttons fixed with scale instead of sizing Disabled the back button when attempting to teleport to a different place Lights are fixed for the nightTime setting (didn’t turn on/off before) Ambiance now plays with the nightTime setting on A saved table is now used instead of searching for lamp parts each time the alpha tween runs (dynamic lighting on/off tween), in result saving performance. Fixed golf ball trail and effect visibility (now you don’t see other player trails and effects, which reduced visibility before.) Main menu play button fixed to not start volume fade out from volume 1, instead now uses the current volume of the sound Commented out debug prints that aren’t needed anymore (kept incase something breaks though) Fixed saves when altf4-ing from the game or the server shutting down. PlayerRemoving and BindToClose double saving upon shutdown Still need to replace: Placeholder images and items in the shop UI. After that, time to start building!
Small update/Devlog 5.5 I’ve been working on a few things for the game before starting to build the map and in result wanted to share these. Changes: “New” spawnPad and clearBall models, both now display their cooldowns with text and colors (locally for the player) I’ve replaced the low quality music in the main menu and added a “few” more songs, instead of just 11 songs now the game has.. 87! Now the main menu is also controlled by one script only, instead of having one in each button (in result also making porting easier to the other places) Also, the side buttons have been redesigned! Now they have a collapse menu button, and a button for returning to the main menu. This is so that more of the screen is available for mobile players (and a bit of the screen on PC, too). Returning to the main menu will be useful for example, if the player completes every stage in the Grass “destination”/Environment and wants to continue to the next one. Also the music UI has been fixed to work on 4K (didn’t properly implement scale on the buttons) And, a very special thing in my opinion is that the shop is finally complete ! Consisting of golf balls, trails, effects and different golf clubs (for a visual representation, go to the video after reading this post) The Golf club preview image on the tool changes per the equipped cosmetic too!
Map development update I’ve been working on a few ideas recently and have been attempting to build something “decent”. With a bit of trial and error so far I’ve made A tree And 3 stages 🤞 Perfect development pace, isn’t it? Anyway, here are the images showing stages and the tree.
Map development update #2 I’ve developed the map and it’s outer scenery a lot , although I’m running into optimization regarding te trees. (haven’t worked on a lot of stages though, only added the 4th one) Maybe the tree has a lot of vertices and I could somehow optimize it in blender? If so, that could be the main factor why the game ran better with less trees. Sunrays, bloom and a shorter range detpth of field have been added And a small experiment for a tutorial cutscene has been added too. In the process of this “devlog” I’ve also lost 11h of work Also, a new loading screen has been added and the one from TP has been fixed!
Small update/Devlog 6 New additions: A tutorial has been added and is fully working! (still needs sounds but otherwise fully complete) Main menu disallows the player to join the Arcade and Desert map if they haven’t completed the tutorial yet. Map scenery is done! Only need the stages now A boost pad has been added (and a golf ball loop will be made!) Colorcorrectioneffect has been added to make the game brighter in terms of colors instead of dull. Fixes: Trees were optimized a little in blender (the fir tree originally had 6.6k faces when I opened the file.. oof) Renderfidelity on leaf parts for trees was changed to automatic (otherwise the trees would look like twigs from far away) Lights turn off when daytime cycle setting gets turned off Daytime cycle script fixed to turn off after turning off the nighttime setting Changes: Lighting from invisible walls on stages removed (will use lights that the player can see instead) Main menu UI has been changed to have shadows on the buttons. Main menu UI text also has a “manual” shadow on the “Choose your destination!” text UIStroke on stage signs is now a bit thicker (text is easier to read) Need to add/fix: UI that shows your current leaderboard stats instead of the default one Arm swinging the golfstick when moving with it (will probably either switch to R6 or just make an invisible hitbox for the tool) Note: Ignore the last map building update. The upload system completely broke for me. I can’t add an attachment to the devlog (so I can’t edit it) and deleting it just results in an error.
Devlog 7 Additions: Grass map is now complete! Added lamp scenery to the stages, so you can actually complete them during the night Tutorial is complete with music! Shop UI now has shadows behind the buttons Added an invisible hitbox extension to the golfstick (mainly fixes issue, although still may need to switch to r6 due to animation packs) UI with stats (Cash, stages won) and sounds + cash counting up/down The tutorial now has animations for hitting the ball Changes: Tutorial made more visually similar overall First tutorial animation changed to: Move the golfstick not as far back/forward Move the golfstick a bit faster when hitting the ball Tutorial second animation changed to: Not rotate the golfstick as far (60 degrees instead of 90) Fixes: Stats UI centering on screen Before starting to work on the next map which is the Arcade, a few other settings will be added to the settings menu. Music UI may also change.
Hello again! I’ve started working on the arcade map, as the grass map is pretty much complete (just need to fix the ui a bit) I’ve decided to rewrite the playSound script a bit to not be hardcoded and play a different sound (depending on what string is received from the remoteEvent) instead of creating a remoteEvent and a new script for each one For example, now it can play either the golfhole sound or the sound for the ball disappearing in stage 2. Also, for the new automated door, I’ve experimented a little with spatial-ish sound. Turns out it’s really easy (for what I need, atleast) So far I’ve made a few things in-game and outlined a few ideas and a roadmap. Currently built: First three stages (which are glow-in-the-dark!) mostly complete parking lot Front of the building (although unfinished) A road leading up to the parking lot with a small grass patch. Automated door There may not be as much devlogs now, but the game is still in development!
Every stage in the Arcade (map) has been built! The arcade now consists of 9 stages in total! New thing is that some are a bit more.. interactive , and a few are a bit difficult or tedious .. to say the least. (example of changing stages the attached video) Now that the stages are done, the game is inching a bit closer to completion! Now, of course, there may be ~15 or more things to still complete in the roadmap , but any progress is great. You may (or may not) be wondering how I made all of these in 4 hours. Well, I only have one explanation. I uhh… forgot to enable the plugin after making something else. Oops! (factory gambler prototype) Anyway, during this time a few small misc changes have been done: stageLogic (new script) has been added to well.. control the stages. (Stage 5, 7 and 9.) Shop UI trail naming has been changed a little. Blinking activity on stage signs has been removed. Note: Video player in SD is bugged. You have to click on the devlog, then go and click on the video for it to play.
UI Revamp (W.I.P) I’ve started reworking the main UI for the game because well.. the old one is to say the least - not good. So far I’ve reworked basically everything in-game (except the tutorial, but it won’t be reworked anyway as it can only be seen one time) I’ve also experimented a bit with hover tweens (button getting larger on hover) and sound effects, which have been implemented now. Another thing I’ve experimented a bit with is viewport frames , which are now used in the shop to show golf balls and clubs/“sticks” spinning. I’d want to possibly implement a “Are you sure you want to buy (x) item for (x) amount” in the shop, but that’s not planned at the moment. Things still unfinished that I want to complete (for UIs): Setting to enable/disable dark mode Light mode UI (as at the moment it’s dark mode only) Sound changes: “song2” in the main menu has been replaced due to it being striked by Roblox (not sure why!) Sound in the tutorial UI before accepting/declining the tutorial has been changed (same issue)
In-game UI revamp is complete! *and a few miscellaneous fixes have been made The settings menu has been revamped to add the light mode setting, now featuring page 1 and 2, and a few other settings which are currently in progress of being made. In my opinion, light mode looks decent but I still prefer dark mode. A new setting that is still a bit of a work in progress, but mostly finished is a hide UI hotkey , which as the name states, hides ui (in-game only). I still need to implement that the setting saves, but overall it works just fine. It’s made to only apply a keybind if you’re playing on PC, though. Fixes: autosaveUI loading/saving icon was still spinning when not visible. Fixed by seeing if the frame is actually visible (instead of if the frame exists, small typo) Shadow button now just changes immediately instead of waiting for the server to change the variable, now it just fires the remoteEvent only to save the setting autosaveUI UIstroke clipping fixed by changing it to apply inner instead of outer Tree sway intensity has been changed to be a bit lower, otherwise it’d look unnatural. Tree pivots fixed to be on the bottom for tree sway (this was a pain) Tree pivot issues: Changing tree pivots manually always broke for some reason. It took a few hours to fix them, then when I dragged the trees down it reset them. Upon pressing undo the pivots were still reset, not like they were before. Then, I tried fixing them without dragging anything, and the next time I opened studio it reset again. I found that ctrl+l may work, but that didn’t work either. Had to end up cloning everything over again, which somehow has made the shadows more intense in the dense tree areas, even though nothing changed between the two. This was NOT fun When writing this devlog, I found out that the oak trees have decided to fly in the air, so that’s great
New camera mode for the main menu! Demo is in the video! Before remaking/overhauling the main menu UI into light/dark mode (and, to look nice, of course), I’ve decided to rework the camera as it’s a bit of a weak point in the menu. It features: Camera sway Camera switching between points 15 different points for the camera Now, this has also reminded me that the main menu needs a little bit different of a song selection, as drum and bass for a gentle camera sway obviously doesn’t work. Miscellanous changes/fixes: Flying trees fixed statsGui (naming fix soonTM) bgcolor and background transparency changed in light mode to that of the old UI.
Overhauled main menu GUI including new songs and animations! Demo is in the attached video as usual! So, I’ve spent a bit of time reworking the main menu , since the old one looked “temporary” instead of finished. In my opinion, the result seems to be pretty nice . I’ve made/added/reworked: Esentially every menu New animations when moving pages or when going in-game Added hover effects for buttons Icons for the main buttons Added fake shadows to text instead of the bad-looking UIStroke like before Added image backgrounds Replaced (most) old songs! (song 1, song 3-5) It still isn’t fully finished, as I need to implement a light mode for it, but otherwise it’s fully functional! When light mode for the main menu and (maybe) loadUI is done, the focus will likely shift back to building the arcade map. Every time I test the game I somehow find bugs on accident, whoops! Anyway, there were a “few” fixes/updates that were made during development of this overhaul: Fixed spinnyCamera (script) to not repeat points Updated generateNumber for spinnyCamera (script) to go through all the points instead of randomly pick one and look repetitive Fixed autosaveUI appearing in the main menu Fixed hideUIHotkey setting (a lot of things which I won’t describe as this post isn’t meant to be a wall of text) Fixed mainMenuButton UIScale bug by resetting UIScale on click Updated both cameraFolder(s) to be models instead of folders, with ModelStreamingMode to be set to Atomic (fixes delay or infinite yielding on slower devices) Updated mainMenuUI image background transparency to 0.5 for settingsFrame, cameraModeFrame and creditsFrame Updated hideHotkey setting textColor3 when text is “Set Keybind” and added UIPadding to the button for text not to clip Fixed soundLogic volume bug that didn’t reset audio volume when going back to the main menu, in result making the song silent Updated soundLogic to fade in song volume instead of immediately start playing it at full volume And a lot more… (these are just ones found after the overhaul)
Arcade Machines They have interactable buttons (which do nothing, except move up and down) Nothing else to say about them, really.. Changes/additions: Changed song2 (main menu) due to likely being made by AI (cover seems to be aigen) Light mode setting now also changes the main menu Changed buttonFrame in-game to have wrapper frames, in result being affected by the UIListLayout, and now they don’t clip together when using smaller screens, but they can still be animated.
Arcade map update The indoor area is close to being finished! It still, of course needs a few things to be completed (for example, the food area, filling the empty space, etcetera.) Next step is, of course, the outdoors! I assume it shouldn’t take as long to make as the interior was, but who knows Another thing the game still needs is ambiance zones. (and a new ambiance sound for the indoors, of course) I’m thinking of implementing this with just 2 parts for the indoors and outdoors, which should do the trick. Every day this project is (hopefully) coming a bit closer to being shipped, but progress will slow down a bit due to school starting. In an ideal situation this’ll likely be shipped in a week, or atleast I hope to get it sort-of-ship ready by that time.
Arcade map complete! New: the outside has now been fully finished (instead of just being a baseplate) Smaller changes/additions: the arcade map now has seats , shapes on the floor and ambiance zones. As the second map is done, I’m getting closer to (finally) shipping this project, and (hopefully) getting good enough reviews to get my goal from SD. The “Desert” map will likely be a bit shorter compared to the arcade map (or even grass map, undecided.), as I don’t have that much time anymore due to school starting.
Started work on the “Desert” map. All stages are now built! There are only 5 stages due to school taking most of my time, as usual. (and, there’s already 2 other maps in the game, so that’s that)
Desert map complete! Well.. that was way faster compared to the other maps, which makes sense due to a desert.. well, being a desert. Anyway, now that the main game is done*, I’ve also made thumbnails and an icon for the game. I still need to make a README and a proper description for the game, to ship , of course. *Will likely rework the tutorial gui a bit and the ui shown when teleporting between maps Anyway, look forward to seeing a few more updates soon, as the aforementioned updates/additions shouldn’t take a while
FINALLY shipping! (after this devlog) After likely losing a few hairs here and there (/j) after these 3 (almost 3 and 1/2) months, I deem minigolf to be done. I’m kind of suprised myself that the project took so long. I believe that this, by far is the longest project I’ve ever made. During the process, I’ve learned A LOT more about studio and luau overall, which will definetly help make better games (with better implementations). I have to admit, coming closer to the end there was a bit of burnout, but the result, in my opinion, was definetly worth it. I also want to say thank you to everyone that has supported me and this project, it means a lot :) Since the last devlog, I fixed and updated the few rough edges left in the game, GitHub repository and Stardance which are: Stardance: Making a new banner (old one didn’t even match the style of the game anymore) Adding a demo link & github repository link GitHub repository: Made a README that, in my opinion, is nice. It follows the requirements that the shipping guide/README guide Stardance mentions (controls, images, demo link, features, etc) Game: Changing the teleport screen to one that blends in during teleport Changed badges for new ones (icons) and requirements (now 1, 10 and 22 stages) Made the maze in stage 8 (grass map) harder to complete, was too easy before Changed all loading music Removed the funFacts moduleScript (not needed anymore) Stage 9 sign fixed to show status for Arcade_9 instead of Arcade_3 Updated desertMap particles to be thinner Changed loadUI to have fake shadow text instead of a thick UIStroke
After a few prototypes, (a lot) I’ve decided to make another map, which a factory/warehouse type of map. So far, I’ve made these props: Conveyor Structual beam Light Unloading zones At the moment, I’m not really sure how I’ll make the stages in the map, but I have an idea of making them more interactive (somewhat similar to the arcade map.) One small mention, the map will likely be in beta or not fully finished (when or if I ship again), as Stardance is likely going to end soon.
Finished the first room in the new Factory map! What lighting style do you think is better? Realistic or soft? (shadowmap) Realistic is img 1-2, soft is 3-4 At the moment, there won’t be any minigolf courses, as I’d rather finish the building first. Also, I had a few new ideas for the game that may make it a bit more “immersive” to say the least.. Will experiment with them and post something in the future if it works out.
Ships:
I’ve made a minigolf game in Roblox studio, featuring 3 maps and 22 stages in total, with cosmetics that can be bought for your golf club or golf ball, and some nice QoL features like a music menu, or a hide UI hotkey In my opinion, the main challenging thing was building all the maps. I’m not a great map builder, so making even one map or all stages took a lot of time, plus taking on the task of making 3 maps for the first release was, admittedly, a not-so-thought-through idea. Of course, this doesn’t mean that there was just 1 challenge, this was just the main one for me. Please note: due to the Roblox guideline changes, you must have an account that is 16+ Facial Age Estimation or ID verified to play the game. This can only be changed if the game reaches 250 “active” players. There are alternatives, which is either setting up the game yourself in Roblox Studio (takes some time), or just by watching the small feature demo. These restrictions/alternatives are mentioned in the README. (written per default questions)...
|
1792853249.3186958
|
1792939649.3186958
|
|
33460
|
Intelligent Star Wars Droid by @Mortaccio | Starda Intelligent Star Wars Droid by @Mortaccio | Stardance...
|
Mortaccio
|
0
|
169.09
|
0
|
[]
|
[{"post_id": 43590, "ts": "202 [{"post_id": 43590, "ts": "2026-08-08T22:53:16Z", "hours": 39.4822, "text": "Still working on the RL policy, I have Claude helping me bug fix the scripts for the training algorithms, its rough so far but I think if I optimize for low torque and then continuously lower kp I can make it work with my current constraints, so far I have moved the batteries in the head to increase stability and a better COM, but a working walking policy is still on the horizon"}, {"post_id": 40699, "ts": "2026-08-04T12:03:56Z", "hours": 14.7025, "text": "RL training in progress, you cant exactly see it in this screenshot, but I have hundreds of millions of robots being trained digitally with consideration of position, heat and balance of course. Now that I have a standing model, I will need to make some tweaks, like making sure it stands a bit taller so the shins dont collide with th etorso and implementing a walking policy."}, {"post_id": 38592, "ts": "2026-08-01T02:15:46Z", "hours": 10.3872, "text": "New Spring system for balancing torque on knee, which will save energy, add more deep squat margin, and increase efficiency. Scoped spring and cord dimensions, learned how to auto implement screws in onshape, and got it all figured out for the most part, now all I need to do is lower weight, probably by decreasing batteries, and maybe I wont even have to reduce weight with this new spring in place, then I can implement the foam inserts on feet, remodel head, and maybe add head yaw, a lot to go but a majority of the work is done."}, {"post_id": 33926, "ts": "2026-07-24T07:26:00Z", "hours": 8.2003, "text": "full body mockup, with brackets, major electrical components, actuators and timing belt/gear system installed. Now all that needs to be done is add masses and rotation limits and small tweaks, then I can simulate in mujoco, test for major flaws, onshape to urdf file, then to Isaac Lab."}, {"post_id": 33438, "ts": "2026-07-23T11:57:09Z", "hours": 12.0608, "text": "Bracketing of electronics and added new antenna servos along with capstan drive for the antenna servos"}, {"post_id": 32694, "ts": "2026-07-22T00:28:44Z", "hours": 7.6347, "text": "Gear Synch Added! Ok so boom, gears/pulleys for the timing belt system are added and implemented, found all the parts I need on Amazon for ~$25 extra for both legs and used the provided seller info to spec the CAD models. Now, just have to add the foot, along with its connection to the ankle gear, and add all the significantly weighted tech pieces/ anything that takes up significant space to figure out bracketing. After that, add weights, clean rough edges, and train the RL policy while we wait for a grant."}, {"post_id": 32168, "ts": "2026-07-21T04:23:30Z", "hours": 16.975, "text": "New design work, made the motor proxies bigger to account for drivers, made thigh brackets bigger, added antennas with rotation axis, turns out im going to be using a dual antenna system, where only one is powered at a time based upon which garners a greater signal, but for right now only the antenna proxies are needed for weight calculations, fixed some more design details, am currently working on implementing belt system into cad."}, {"post_id": 30507, "ts": "2026-07-18T04:20:35Z", "hours": 11.2592, "text": "Details Galore, added details to the thigh bracket, torso and head. Reproportionized a lot of stuff, all in all just a big design change day. Really hit a wave of frustration today when looking at some other people’s robots and how far other people have come. But then I started realizing that to compare to robots with different functions and different budgets is apples to oranges. I will continue to do the best with what I have. The budget has run out of control. Currently, my estimated cost to finish the robot is around an additional 350 dollars. I know that sounds rough but that’s where I’m at. Maybe GDZ34 drivers wouldnt be too bad a present for my birthday lol. All in all, rough day. I think I just need to fall in love with the design again and my motivation will come back. I plan on making the final-final version out of metal, so I will model for that."}, {"post_id": 28730, "ts": "2026-07-15T05:15:52Z", "hours": 9.7186, "text": "NEW Mechanisms in the pipeline, removing ankle servo in favor of utilizing a chain linkage to the hip actuator to sync hip and ankle movements inversely. New designs, new CAD model for the foot. New Shin redesign. Due to heat strain on hip roll servos, a aluminum heatsink will be added, may require further cooling solutions in the future. Removing the ankle servos saves weight, distal mass and complexity of bus protocols. All in all, simpler is better and this new redesign is elegant and simple."}, {"post_id": 27533, "ts": "2026-07-13T05:21:26Z", "hours": 8.3167, "text": "Final Touches, Moving to Sim————————Extended Shin, Recalculate Torque, Added Hip Roll Motor Horn Connectors, Signed up for AWS, requested more large server access (EC2), did material testing and found I only need ~avg 20% infill, made feet and imported to mujoco to get this awesome pic"}, {"post_id": 26748, "ts": "2026-07-11T18:30:13Z", "hours": 5.2828, "text": "CAD Leg Shenanigans– Found cheap ankle servos that work from Feetech, Remodeled the shin and thigh brackets for better aesthetics and new bracketing. To do: Find and implement hip roll servos, implement head tilt/pan servo (if able to- not super high priority) and make knee 3:2 ratio gear if needed."}, {"post_id": 26296, "ts": "2026-07-11T00:32:26Z", "hours": 1.5578, "text": "Ive found it, the Goldilock of motors for my build. After hours of bartering with Alibaba factories, and messing with thigh and shin lengths, re-calculating torque requirements, I’ve found the motor that singlehandedly will solve all of my problems. The GIM3505-8 has RPM ~2x what I would have needed for walking, with enough torque for the hip pitch and possibly the knee pitch (hopefully). Because of the fact that my CAD and Mujoco models show most of the weight falling on the knee joint, as it is backward-facing, it is often holding the weight of the robot in solely its rotation. In addition, the knee joint requires the highest rpm and the highest range of motion. All these limits make it increasingly difficult to stay true to the form factor of the BD-1 without sacrificing money in the thousands. The motor comes with a encoder, so all I need is a driver. I thought about utilizing a all in one PCB board, with the Reinforcement Learning Policy, drivers and any other compute needed all in one place. Unfortunately, this elegant solution is very cost inefficent. While a great way to try my luck at PCB design, it will run me at least ~$30 more than just buying two arduinos and a raspberry pie 4. I still need to decide on the ankle motor replacement and the hip roll replacement as my old proxies were incorrect. (Claude doesn’t like CAD)."}, {"post_id": 26191, "ts": "2026-07-10T21:02:05Z", "hours": 23.5128, "text": "Shin + Thigh Re-proportioning and Motor selection and Motor CAD Implementation"}]...
|
Title: Intelligent Star Wars Droid by @Mortaccio | Title: Intelligent Star Wars Droid by @Mortaccio | Stardance
Devlogs:
Shin + Thigh Re-proportioning and Motor selection and Motor CAD Implementation
Ive found it, the Goldilock of motors for my build. After hours of bartering with Alibaba factories, and messing with thigh and shin lengths, re-calculating torque requirements, I’ve found the motor that singlehandedly will solve all of my problems. The GIM3505-8 has RPM ~2x what I would have needed for walking, with enough torque for the hip pitch and possibly the knee pitch (hopefully). Because of the fact that my CAD and Mujoco models show most of the weight falling on the knee joint, as it is backward-facing, it is often holding the weight of the robot in solely its rotation. In addition, the knee joint requires the highest rpm and the highest range of motion. All these limits make it increasingly difficult to stay true to the form factor of the BD-1 without sacrificing money in the thousands. The motor comes with a encoder, so all I need is a driver. I thought about utilizing a all in one PCB board, with the Reinforcement Learning Policy, drivers and any other compute needed all in one place. Unfortunately, this elegant solution is very cost inefficent. While a great way to try my luck at PCB design, it will run me at least ~$30 more than just buying two arduinos and a raspberry pie 4. I still need to decide on the ankle motor replacement and the hip roll replacement as my old proxies were incorrect. (Claude doesn’t like CAD).
CAD Leg Shenanigans– Found cheap ankle servos that work from Feetech, Remodeled the shin and thigh brackets for better aesthetics and new bracketing. To do: Find and implement hip roll servos, implement head tilt/pan servo (if able to- not super high priority) and make knee 3:2 ratio gear if needed.
Final Touches, Moving to Sim————————Extended Shin, Recalculate Torque, Added Hip Roll Motor Horn Connectors, Signed up for AWS, requested more large server access (EC2), did material testing and found I only need ~avg 20% infill, made feet and imported to mujoco to get this awesome pic
NEW Mechanisms in the pipeline, removing ankle servo in favor of utilizing a chain linkage to the hip actuator to sync hip and ankle movements inversely. New designs, new CAD model for the foot. New Shin redesign. Due to heat strain on hip roll servos, a aluminum heatsink will be added, may require further cooling solutions in the future. Removing the ankle servos saves weight, distal mass and complexity of bus protocols. All in all, simpler is better and this new redesign is elegant and simple.
Details Galore, added details to the thigh bracket, torso and head. Reproportionized a lot of stuff, all in all just a big design change day. Really hit a wave of frustration today when looking at some other people’s robots and how far other people have come. But then I started realizing that to compare to robots with different functions and different budgets is apples to oranges. I will continue to do the best with what I have. The budget has run out of control. Currently, my estimated cost to finish the robot is around an additional 350 dollars. I know that sounds rough but that’s where I’m at. Maybe GDZ34 drivers wouldnt be too bad a present for my birthday lol. All in all, rough day. I think I just need to fall in love with the design again and my motivation will come back. I plan on making the final-final version out of metal, so I will model for that.
New design work, made the motor proxies bigger to account for drivers, made thigh brackets bigger, added antennas with rotation axis, turns out im going to be using a dual antenna system, where only one is powered at a time based upon which garners a greater signal, but for right now only the antenna proxies are needed for weight calculations, fixed some more design details, am currently working on implementing belt system into cad.
Gear Synch Added! Ok so boom, gears/pulleys for the timing belt system are added and implemented, found all the parts I need on Amazon for ~$25 extra for both legs and used the provided seller info to spec the CAD models. Now, just have to add the foot, along with its connection to the ankle gear, and add all the significantly weighted tech pieces/ anything that takes up significant space to figure out bracketing. After that, add weights, clean rough edges, and train the RL policy while we wait for a grant.
Bracketing of electronics and added new antenna servos along with capstan drive for the antenna servos
full body mockup, with brackets, major electrical components, actuators and timing belt/gear system installed. Now all that needs to be done is add masses and rotation limits and small tweaks, then I can simulate in mujoco, test for major flaws, onshape to urdf file, then to Isaac Lab.
New Spring system for balancing torque on knee, which will save energy, add more deep squat margin, and increase efficiency. Scoped spring and cord dimensions, learned how to auto implement screws in onshape, and got it all figured out for the most part, now all I need to do is lower weight, probably by decreasing batteries, and maybe I wont even have to reduce weight with this new spring in place, then I can implement the foam inserts on feet, remodel head, and maybe add head yaw, a lot to go but a majority of the work is done.
RL training in progress, you cant exactly see it in this screenshot, but I have hundreds of millions of robots being trained digitally with consideration of position, heat and balance of course. Now that I have a standing model, I will need to make some tweaks, like making sure it stands a bit taller so the shins dont collide with th etorso and implementing a walking policy.
Still working on the RL policy, I have Claude helping me bug fix the scripts for the training algorithms, its rough so far but I think if I optimize for low torque and then continuously lower kp I can make it work with my current constraints, so far I have moved the batteries in the head to increase stability and a better COM, but a working walking policy is still on the horizon...
|
1792752893.2222433
|
1793357693.2222433
|
|
4066
|
Koryphaios by @Micah | Stardance
|
Micah
|
1
|
167.02
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T07:26:21Z", "hours": 134.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Koryphaios, a desktop workspace for running AI agents together without losing control of your files, costs, or progress. The hardest part was getting the cli providers to cooperate with koryphaios’s built in features like notes, goals, workflows, etc. I am proud of how much of the app now works as one connected experience. Keep in mind this is a desktop app but all it takes is one little curl command and you can delete it after if you dont like it too. Critque is wanted on this and I look forward to seeing how people use it.", "repo": "https://github.com/Sylorlabs/koryphaios", "demo": "https://koryphaios.com/download/"}]...
|
[{"post_id": 44475, "ts": "202 [{"post_id": 44475, "ts": "2026-08-10T07:58:20Z", "hours": 33.0247, "text": "fixing dumb bugs like error repeating itself 2 times"}, {"post_id": 40587, "ts": "2026-08-04T07:18:28Z", "hours": 133.7669, "text": "this is the ui for koryphaios 0.1.0 I still need to adjust some things like the placement of goal mode or were workflows are placed"}]...
|
Title: Koryphaios by @Micah | Stardance
Devlogs:
Title: Koryphaios by @Micah | Stardance
Devlogs:
this is the ui for koryphaios 0.1.0 I still need to adjust some things like the placement of goal mode or were workflows are placed
fixing dumb bugs like error repeating itself 2 times
Ships:
I made Koryphaios, a desktop workspace for running AI agents together without losing control of your files, costs, or progress. The hardest part was getting the cli providers to cooperate with koryphaios’s built in features like notes, goals, workflows, etc. I am proud of how much of the app now works as one connected experience. Keep in mind this is a desktop app but all it takes is one little curl command and you can delete it after if you dont like it too. Critque is wanted on this and I look forward to seeing how people use it....
|
1792983338.875472
|
1793069738.875472
|
|
508
|
Slime Simulator by @RespectableDot | Stardance
|
RespectableDot
|
1
|
166.0
|
3195
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-05T19:22:45Z", "hours": 166.0, "multiplier": 19.34, "payout": 3195, "blessing": "neutral", "text": "A simulator that is about making crazy slimes through natural selection, evolution, and genetic engineering. One thing that made this project challenging was the slime pathfinding. To solve this, I used the A* pathfinding technique. Something I am proud of is the art style. I worked very hard on it and I think it look good. To test my project, just click on the demo link. Thank you to the people who supported and suggested good ideas to the project!", "repo": "https://github.com/Aidnpatrick/Slime-Hub", "demo": "https://respectabledot.itch.io/slime-simulator"}]...
|
[{"post_id": 41491, "ts": "202 [{"post_id": 41491, "ts": "2026-08-05T18:49:31Z", "hours": 3.4703, "text": "Sound! Devlog 35 This will be a short devlog because I don’t know what else to say. Sounds effects I added inside the game: Slime spawning Clicking on slime clicking on ui(button) Slime Noises ocean wind Slime Eating Planting Guns(Lasers, Regular bullets Passive slime noises Active slime noises Night(Crickets) Credit to qubodup and filippe for the slime sound effects."}, {"post_id": 39720, "ts": "2026-08-02T21:12:32Z", "hours": 6.6606, "text": "Optimization and Fixes Devlog 34 2nd to last devlog! Cant wait to ship Things I added: When you press escape or the gear icon at the bottom-right, you can enter the settings page. In here, you can disable or enable features to your likings. This can help run the game faster on lower-end PCs. Placing blocks, plants or effects shows a small special effect. Between and Night, there will be dusk and evening. They will make the sky orange for 15 seconds. There will be more farmers and less unemployed people. Big Fixes: Upgraded the pathfinding system for the slimes. Whenever they are hungry but can’t reach their food, they will find alternate food that is close to them."}, {"post_id": 37321, "ts": "2026-07-29T22:57:14Z", "hours": 7.0725, "text": "Another Batch of Updates Devlog 33 I dont know when to stop this project, I have a lot of things to add… Check out my game here! https://respectabledot.itch.io/slime-simulator Things I added: Day/Night Cycle! Every minute it switches from day to night or vice versa. When at night, slimes and buildings glow so they are easier to see. Also, it looks cool. (The light thing took a long time to figure out) There is a notification bar that tells you what is currently happening in the world. When guns fire, it will create a muzzle flash effect. New Items: FN SCAR: A powerful gun that hits hard. It is kind of inaccurate though. Laser Gun: Its bullets are faster than other guns. Does decent damage."}, {"post_id": 35337, "ts": "2026-07-26T17:35:05Z", "hours": 8.3517, "text": "More Mechanics and Items! Devlog 32 Things I added: Houses are a new building. Currently they don’t really do anything, but later on they can be used for slimes to sleep in. Doctors is a new ability that treats and heal slimes. Their item is a medkit. When you favorite a slime, a star icon will show up above them. This helps keep track of your favorite slimes. Added 8 new cosmetics! New Items! MP5: A submachine gun that fires really fast. Blue staff: A staff that is blue and shoots out 3 blue balls. Katana: The first melee weapon. Does a lot of damage. Medkit: Used by doctors to treat and heal other slimes. M1911: Originally called the pistol. AR-15: Originally called the Rifle. MP-133: Originally called the Shotgun. Things I will add: More cosmetics coming soon! Houses will have a function other than doing the embappe special Game link here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 33076, "ts": "2026-07-22T17:35:43Z", "hours": 9.6567, "text": "Items and Slime sizes Devlog 31 I forgot to devlog again :( Items and Equipment Slimes can now have items. Items can help them complete tasks or give them a buff. To see what item the slime has, check in the slime stats. Items currently in the game: Hammer: Used for constructing buildings. Hoe: Used by farmers to farm. Pistol: For killing slimes. Rifle: For killing slimes. Slime characteristics and stuff Instead of slimes being the same size, they can be big or small. This makes it more realistic, I guess. Slimes can pass down their family name. If the two parents have different family names, the offspring chooses one of them. UI Changes The section for terrain editing got a small upgrade. Next to the text, there is an image of the block to show you what it looks like. At the top-right corner of the slime statistics page, there is the X button that closes the UI. You can check what equipment the slime is using by going to the slime UI & statistics Other Waves can appear outside of the editing zone so it looks more natural."}, {"post_id": 31412, "ts": "2026-07-19T19:17:11Z", "hours": 2.9606, "text": "Spells! Devlog 30 Check out my game here: https://respectabledot.itch.io/slime-simulator Spells control and influence a slime mentally and physically. Currently, there are only 4 spells. I will plan to add more of them in later updates."}, {"post_id": 30419, "ts": "2026-07-17T22:56:36Z", "hours": 7.5947, "text": "UI Revamp and cosmetics Devlog 29 I am currently working on another update but I forgot to post a devlog, so I will post a devlog for the things I finished then post the ones I haven’t finished yet. Things I added: After taking some feedback, I changed some stuff inside the slime UI. Instead of just plain text, I added pictures and icons to make reading a slime’s information much easier. I also replaced most of the transparent boxes with some better ones that are drawn. For the cosmetics, I added around 10 new hats."}, {"post_id": 29034, "ts": "2026-07-15T18:03:17Z", "hours": 6.9889, "text": "Kingdoms and Colonies👑🔥👑🔥 Devlog 28 Slimes can establish kingdoms if there aren’t any or are far enough away from other kingdoms. If a slime is spawned by the user, the slime will head to the cllosest kingdom(If close enough). But if a slime came from another slime, they will automatically be part of the kingdom. A slime can create a settlement if they are already in a kingdom and is far enough away from it. If a slime has one parent from a kingdom and another from another kingdom, then they will random choose which to live in. A slime farmer can only work in the kingdom’s fields. Things I will add next time: War and Economy will be my next priority. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 27515, "ts": "2026-07-13T04:30:28Z", "hours": 11.2606, "text": "Another big update but isn’t as tiring Devlog 27 Things I added: Violence is a lot more encouraged between the slimes. There is too much peace. Added lettuce. Instead of the slimes growing meat, they grow lettuce. This is a lot more normal. Slimes have a Walking Animation, which is just them expanding and shrinking constantly. Food generation in farms is reduced because this encourages them to explore the world more. Bug fixes Buttons in the bottom bar will not activate when users are cancelling them. In planting mode, blockable objects like trees will destroy items beneath them. In building mode, changing a tile will cause things that are stuck on top of them to disappear. Things I will add next time: There will be a list of effects. These effects buff or weaken a slime’s body or influence the way it acts. An example could be make it faster, have more health, or make it more prone to attacking other slimes. Clans and kingdoms is already being worked on. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 26625, "ts": "2026-07-11T15:32:53Z", "hours": 7.8944, "text": "100 HOURS LETS GO Farms. Devlog 26 This is the most tiring update ever. This update is a test, so a lot of things can be broken. Things I added: Added roles. Some slimes get assigned task, like constructing buildings or farming. Added farms. Slimes can plant and produe their own food. All they have to do is place farming soil near windmills that are set up by constructors. The soil will automatically generate crops, which is meat. Made the art for the windmill. It even has an animation! Slimes interacting with other slimes is encouraged. Food spawning is greatly reduced because slimes can now produce their own food. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 26089, "ts": "2026-07-10T17:53:13Z", "hours": 3.8569, "text": "Miscellaneous Updates Devlog 25 Things I added: Made a sprite for when the slimes die. It looks like a splat. When a slime dies, their family member and friends get sad. You can press “h” to hide UI. Bug Fixes: Fixed a bug where the slimes get stuck after doing eating or interacting. Fixed the tutorial-skipping button. Slimes don’t lose their color anymore Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 25634, "ts": "2026-07-10T01:18:16Z", "hours": 2.4928, "text": "Introduction Update Devlog 24 Made a simple intro. It contains the game’s logo and unity’s logo. Made a tutorial for the start of the game. It teaches you how to spawn slimes. If you have already played, there will be an option to skip. Check out my game: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 25102, "ts": "2026-07-09T02:57:24Z", "hours": 2.9383, "text": "Cosmetics Update Devlog 23 I added 10 kinds of hats that can spawn on the slimes. They don’t affect the slimes, it’s just for appearance. My project is now on itch.io, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 24389, "ts": "2026-07-07T22:19:12Z", "hours": 5.8222, "text": "Random Good Updates Devlog 22 Sorry for not devlogging more Made a new button where you can plant weeds and trees. I don’t know what else to say but this took me so long. Reworked the violence behavior in slimes. Before the update, slimes would attack the nearest person when they get upset and hungry (Hangry). But now, slimes may choose to slime out someone nearby OR someone who they already don’t like in their relationships list. This makes it more realistic to real life. Reworked equation for slime violence weight: tasks[2] = distanceSlime > 18 ? 0 : (100 - stats[2] * 0.6f - stats[0] * 0.85f) / 50 + angryBias + baseTasks[2]; When slimes sleep, they will have their own special sprite for that. Also, they will have the “zzz” icon above them. Still working on the issue where slimes get stuck after doing some task. It seems to be fixed though, for now. My project is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 23626, "ts": "2026-07-06T18:08:25Z", "hours": 1.6611, "text": "Misc. Update Devlog 21 Added palm trees. They act like normal tree but spawn on sand. Also, they generate coconuts. Made a system where the slime’s pathfinding algorithm is a lot more efficient. Whenever they find a place where it’s impossible to go, they will make a mental note of that. This reduces possessing power. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 23264, "ts": "2026-07-06T03:28:23Z", "hours": 5.8814, "text": "Emotion Update 😀😢😡 Devlog 20 I have something else that I worked on but there is still a little more work to go. I will post it in another devlog. For this update, I added emotion to the slimes. Slimes will get happy when they eat food or when they talk to their friends. They get sad overtime when they don’t do anything or they get attacked. You will know when they get upset when a emoji shows up above them. Emojis will show up for other things too, like when eating, fighting, or interacting with others. I will post the other part in the next devlog. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 22259, "ts": "2026-07-04T17:10:08Z", "hours": 2.6747, "text": "Miscellaneous Update Devlog 19 My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator — Things I added: Added a crosschair. THis makes it a lot easier to see what you are hovering over. The crosschair can highlight on tiles and slimes. Made an about and instructions page. Go to the top-left and you will see the buttons that will take you to the pages. Fixed slime behavior. Sometimes the slimes get stuck after eating so I hope I fixed the issue."}, {"post_id": 21595, "ts": "2026-07-03T17:07:39Z", "hours": 3.0675, "text": "Taking Feedback Devlog 18 Font Change When I showed my project to people asking for some suggestions, they said I should change the font. So I decided to change the font to more of a pixel style, called “Pixel Operator”. It took a while to set up due to my lack of experience. Slime Violence Slime will now be able to attack each other. It starts from them being sad or angry, and being hungry. Then they unleashed their fury onto other slimes. When they hit other slimes, the slimes that are hit lose health. Other Stuff Slime can now slowly regenerate health when they are fed and have energy. Fixed a bug where rocks wont spawn in world editing mode."}, {"post_id": 20544, "ts": "2026-07-02T04:58:51Z", "hours": 3.8733, "text": "Visual Update Devlog 16 Check out my game here: https://respectabledot.itch.io/slime-simulator Particles Water used to look bad because it’s just blue and nothing else, so I added waves for the movement. Leaves now fall off trees. Other graphics When near land(Sand, Grass, rocks), the water becomes more shallow. It is indicated by the water being more light than the others. Added more grass when starting the game. Clouds appear a lot less due to it sometimes blocking the user’s vision. Bug fixes Fixed a bug where slimes were not spawning, caused by a poor algorithm. Temporarily removed the buggy walking animation for the slimes. I also added apples🍎"}, {"post_id": 20090, "ts": "2026-07-01T16:38:46Z", "hours": 6.3022, "text": "World Building Update Devlog 15 Terrain Editing You can now edit your world. All of the blocks will be available. To use this feature, click on the button with the blocks. All of the blocks: Water, Grass, Sand, Rock Programming took a bit longer than I thought, but testing was surprisingly easy. Next time, I could add things other than blocks, maybe like trees and grass. Other stuff There is now world age so you know how old your world is. Small changes in some of the UI"}, {"post_id": 18659, "ts": "2026-06-29T20:59:19Z", "hours": 5.4806, "text": "Map Update Devlog 14 Terrain Generation After implementing A* pathfinding, I added obstacles and other things for the map. I used to perlin noise to make the mountains and rivers feel more real. float noise = Mathf.PerlinNoise(i * 0.05f+ offsetX, j * 0.05f + offsetY); Added trees. I can make them useful for the slimes in later updates. Art I made the sprites for the rocks and water. It didn’t take that long because it didn’t need much detail. Made the art for the “kill slime” button, which is a knife. Bug fixing Fixed a ton of bugs because adding in the new pathfinding messed a lot of things up. A lot of problems came up when making terrain generation, like the slimes behaving weirdly. Future Updates I might add clans and tribes to make things more interesting. Violence will be added very soon. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 17664, "ts": "2026-06-28T15:31:41Z", "hours": 5.295, "text": "Big Update Devlog 13 Favorites tab You can now favorite slimes. This is for when you like one of them or find one interesting. To use, just click on one of the slimes. Kill tab If you want to get rid of a slime, go to the kill tab and click on the slime. I will add the death animation next time. New pathfinding Replaced the old AI reinforcement learning with the A* pathfinding method. This is because the new system can avoid obstacles and doesn’t take much computing power. UI revamp Made the UI better. Most of the buttons and panels have art and stuff. Things I will add in the future Terrain: You will be able to customize the terrain to make the world more interesting Animations: When walking, the slime will have animation."}, {"post_id": 16090, "ts": "2026-06-26T04:47:00Z", "hours": 6.1744, "text": "A title Devlog 12 Things I implemented Slimes don’t mixed up colors equally anymore. This is because mixing them up equally makes them more dull and grey over time. To stop this, I had to mix the colors up unevenly to maintain the vibrant colors. To track and follow a slime, click on them and press the “Track” button. The slime UI got a major upgrade. It’s now easier to read and more sorted out. You can now spawn food for the slimes. To do it, go to the bar at the bottom. Above the bar, there is a text that tells you what you have selected inside the bar. Clouds have been implemented. Right now they don’t do anything, but they will be able to drop food."}, {"post_id": 15381, "ts": "2026-06-25T00:34:38Z", "hours": 5.0311, "text": "Batch of Updates! Devlog 11 Slime genetics Slimes have more realistic natural genetic creation. Instead of only picking up one of their parent’s colors, they mix the two colors together. Speed and Health changes for an offspring is toned down. Implemented more slime mutations. These includes drastic color changes, faster or slow speeds, or health changes. When testing, I noticed that after a while, the colors started becoming black(I don’t know why). That’s why I made it so that an offspring may be given a bold color(Blue, Red, Green, etc.). UI Made a system where you can view slimes’ friends just by checking their friends list. By clicking on one of their friends or family, it will take you to the selected slime. I made the UIs a lot more responsive and clean."}, {"post_id": 13969, "ts": "2026-06-22T22:33:23Z", "hours": 4.535, "text": "More Mechanics! Devlog 10 Small UI Update The slime information and slime population text boxes are separated. There is now a bar that is gonna contain some button. Right now the only button I added is adding more slimes, but there are gonna be more in the future. Other Things I added Slimes can now have multiple babies instead of only one. I added some grass to make it less barren."}, {"post_id": 12908, "ts": "2026-06-21T04:19:17Z", "hours": 3.1158, "text": "Update Devlog 9 Traits Slimes now have traits! Traits are minor tweaks on the brain of a slime. This brings out personality and characteristics. For now, traits are only obtainable at birth. Slimes aren’t able to pass down traits to their offspring. Other stuff I finished working on the background and is preparing to work on the art of the food. Things I will do next time I will start working on the UI because that makes it easier for people to test my simulator. I will work on more traits, so far I have 7-8 of them."}, {"post_id": 12810, "ts": "2026-06-20T23:26:52Z", "hours": 7.8597, "text": "Big Fat Update 🔨🔨🔥🔥 Devlog 8 I don’t use AI to write any of my devlogs. Relationships Slimes can interact with one another. To do so, they just have to be next to each other. After an interaction, if they haven’t known each other before, they will have an updated friends list. If they have already met each other, then what they think of each other goes up. If two slime’s relationship value go up to a certain number like 30, then they can have babies. DNA and Genes Each Slime have their own characteristics. This includes speed, health, and species. They pass down their genes to their offspring. Offspring’s traits will be slightly changed to maintain diversity and natural selection. For example, a slime with a fast genes will be able to get to a food quicker than the ones that are slow. The faster slime will get to survive and make babies. Color 🔥🔥(My fav update) Slimes have multiple kinds of traits, and that includes color. They can pass down their color to their offspring(Though their offspring’s color may be slightly different). This addition makes the game look a lot better. Problems 😢😢😢 While doing some tests, I noticed that some slimes were dying. This was weird because there were definitely enough food for everyone. When I looked closer, I realized that there was a bug where some slimes get stuck and become braindead. This problem is and still very difficult to fix."}, {"post_id": 11703, "ts": "2026-06-19T02:03:09Z", "hours": 2.3189, "text": "Art! 🔥🔥🔥🔥 Devlog 7 Made a sprite for the slimes. The default color is white because it supposed to be changed into other colors. The movement of slimes is now smooth instead of teleporting to the nearest block. A lot easier ot tell what’s going on. Things I will add later: Better UI will be implemented later. Because right now it’s just a piece of text that tells you the stats of a slime. Demo will be released soon because I need some feedback. Slimes will be able to kill each other. 💀💀💀"}, {"post_id": 11574, "ts": "2026-06-18T21:13:40Z", "hours": 4.0161, "text": "More mechanics! Devlog 6 In this update I added a basic social structure and generations. Things added in this update: When two slimes meet, they gather some information. If one slime’s mental value is bad while meeting, then they will have a bad meeting. If they have a good meeting and keep it up for multiple interactions, then they can have babies. There are a lot less bugs when slimes are interacting with each other. They don’t glitch out nor do they just stop moving. Food now constantly generates, so the slimes can live and thrive. Things I will add later: Parents will soon be able to pass down genes and DNA to their offspring. There will be a more advanced social structure so it doesn’t seem too robotic. Art will be implemented later on. I might put this on itch.io for people to test. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 11017, "ts": "2026-06-18T01:23:04Z", "hours": 3.3789, "text": "Relationships!😀😀😀😀 Devlog 5 This update is mainly focused on relationships. Slimes can now interact with each other. How it works: ⚙️⚙️⚙️ Slime number 1 will look for another slime within a certain radius. If found, slime number 1 will go to that slime (Slime number 2) and have some sort of interaction. If slime number two is already in the list of contact of slime number one, their bond will go up. Formula for the value of interacting: (100 - stats[2]) / 100 - Vector3.Distance(FindClosest(otherSlimes, Mathf.Infinity, \"pluh\").transform.position, transform.position) / 20; Later updates: 🔨🔨🔨🔨 Big fixes: Sometimes after an interaction, slime glitches out and has a seizure. The seizure is temporary but I still want to fix this issue. Slime mating: If slimes have a very high bond, they can have baby slimes. (Baby slimes will have the genes and DNA of their parents)"}, {"post_id": 10413, "ts": "2026-06-17T03:20:04Z", "hours": 2.1417, "text": "4th Devlog Like & Sub for good payouts (Legit and proved) Things I added: ⭐🐵 Slimes now has an idling state. This mean that when they dont have anything to do, they will just wander around to nearby places or stand still. This mechanic is to make the slimes feel more alive. Made it so that whenever a slime finishes a task, they will have a cooldown for around 2 seconds. Then they can do their thing again. Fixed bugs, like the UI not working right and the slime tweaking out whenever they finish pathfinding. Thing I will add later: 🔨🔨🔨 Slimes will soon have relationships with other slimes. They can be friends or enemies. Since I already coded the pathfinding, it should be easy. Slimes who are enemies will attack each other. DNA and Genes will be added later on. Parents will be able to pass their genes to their offsprings."}, {"post_id": 9735, "ts": "2026-06-16T05:02:30Z", "hours": 2.0414, "text": "Devlog 3.😩😩😩 Things I added: Slimes now have color! There is a statistic text at the top-left. Whenever you click on a slime, it will show the stats of that slime. Fixed a bug where slimes stop whenever they collect food."}, {"post_id": 9560, "ts": "2026-06-15T22:42:40Z", "hours": 0.8458, "text": "Du Bist Gut Genug 🥵🥵 (Ball knowledge) Devlog 3 Things I added: I wanted to make each slime have a unique name, so I added a name generator. How this works is a script will put random words from a text file that contains nouns. Slimes now has different movement speed. The average speed of all of them should be around 0.7 block/sec. (Lowest speed: 1 b/s, Highest speed: 0.4 b/s) Slimes now have hit points. If the hit points go to 0 they will die. (Lowest hitpoint: 70, Highest hitpoint: 140) If the slime has 0 hunger or is too tired, they will slowly start to lose health and die. Made the github repo, so people can see my cool code."}, {"post_id": 9498, "ts": "2026-06-15T21:03:54Z", "hours": 2.3692, "text": "2nd Devlog🥵🥵🥵 Note: Still no github repo for you Things I added: I put together the slime, so now it can walk around and do things slimes do. The slime now has a food source, so the slimes can now walk around and collect some nutrients. Things I will add in the future: Slimes will be able to do more things, and they will be able to interact. They can do things like talk or kill each other."}, {"post_id": 8918, "ts": "2026-06-14T20:53:50Z", "hours": 1.3481, "text": "1st Devlog! Note: No repo yet, I will add it later. Things I added: Made the structure of a slimes’ brain and mechanic. Made my own AI pathfinding thingy. Right now it doesn’t support obstacles, but it will soon. How the slime’s brain works: There was many variables inside. Each variable represents a stat, like hunger points or energy level. Once in a while the brain chooses the highest variable and will act accordingly. ex. If the hunger variable is the highest then the brain will find something to eat. Updates for later: I will actually put everything together and maybe make the repo. The slimes will be seperated into different species. The the much later future, you can influence the slime’s dna and stuff."}]...
|
Title: Slime Simulator by @RespectableDot | Starda Title: Slime Simulator by @RespectableDot | Stardance
Devlogs:
1st Devlog! Note: No repo yet, I will add it later. Things I added: Made the structure of a slimes’ brain and mechanic. Made my own AI pathfinding thingy. Right now it doesn’t support obstacles, but it will soon. How the slime’s brain works: There was many variables inside. Each variable represents a stat, like hunger points or energy level. Once in a while the brain chooses the highest variable and will act accordingly. ex. If the hunger variable is the highest then the brain will find something to eat. Updates for later: I will actually put everything together and maybe make the repo. The slimes will be seperated into different species. The the much later future, you can influence the slime’s dna and stuff.
2nd Devlog🥵🥵🥵 Note: Still no github repo for you Things I added: I put together the slime, so now it can walk around and do things slimes do. The slime now has a food source, so the slimes can now walk around and collect some nutrients. Things I will add in the future: Slimes will be able to do more things, and they will be able to interact. They can do things like talk or kill each other.
Du Bist Gut Genug 🥵🥵 (Ball knowledge) Devlog 3 Things I added: I wanted to make each slime have a unique name, so I added a name generator. How this works is a script will put random words from a text file that contains nouns. Slimes now has different movement speed. The average speed of all of them should be around 0.7 block/sec. (Lowest speed: 1 b/s, Highest speed: 0.4 b/s) Slimes now have hit points. If the hit points go to 0 they will die. (Lowest hitpoint: 70, Highest hitpoint: 140) If the slime has 0 hunger or is too tired, they will slowly start to lose health and die. Made the github repo, so people can see my cool code.
Devlog 3.😩😩😩 Things I added: Slimes now have color! There is a statistic text at the top-left. Whenever you click on a slime, it will show the stats of that slime. Fixed a bug where slimes stop whenever they collect food.
4th Devlog Like & Sub for good payouts (Legit and proved) Things I added: ⭐🐵 Slimes now has an idling state. This mean that when they dont have anything to do, they will just wander around to nearby places or stand still. This mechanic is to make the slimes feel more alive. Made it so that whenever a slime finishes a task, they will have a cooldown for around 2 seconds. Then they can do their thing again. Fixed bugs, like the UI not working right and the slime tweaking out whenever they finish pathfinding. Thing I will add later: 🔨🔨🔨 Slimes will soon have relationships with other slimes. They can be friends or enemies. Since I already coded the pathfinding, it should be easy. Slimes who are enemies will attack each other. DNA and Genes will be added later on. Parents will be able to pass their genes to their offsprings.
Relationships!😀😀😀😀 Devlog 5 This update is mainly focused on relationships. Slimes can now interact with each other. How it works: ⚙️⚙️⚙️ Slime number 1 will look for another slime within a certain radius. If found, slime number 1 will go to that slime (Slime number 2) and have some sort of interaction. If slime number two is already in the list of contact of slime number one, their bond will go up. Formula for the value of interacting: (100 - stats[2]) / 100 - Vector3.Distance(FindClosest(otherSlimes, Mathf.Infinity, "pluh").transform.position, transform.position) / 20; Later updates: 🔨🔨🔨🔨 Big fixes: Sometimes after an interaction, slime glitches out and has a seizure. The seizure is temporary but I still want to fix this issue. Slime mating: If slimes have a very high bond, they can have baby slimes. (Baby slimes will have the genes and DNA of their parents)
More mechanics! Devlog 6 In this update I added a basic social structure and generations. Things added in this update: When two slimes meet, they gather some information. If one slime’s mental value is bad while meeting, then they will have a bad meeting. If they have a good meeting and keep it up for multiple interactions, then they can have babies. There are a lot less bugs when slimes are interacting with each other. They don’t glitch out nor do they just stop moving. Food now constantly generates, so the slimes can live and thrive. Things I will add later: Parents will soon be able to pass down genes and DNA to their offspring. There will be a more advanced social structure so it doesn’t seem too robotic. Art will be implemented later on. I might put this on itch.io for people to test. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Art! 🔥🔥🔥🔥 Devlog 7 Made a sprite for the slimes. The default color is white because it supposed to be changed into other colors. The movement of slimes is now smooth instead of teleporting to the nearest block. A lot easier ot tell what’s going on. Things I will add later: Better UI will be implemented later. Because right now it’s just a piece of text that tells you the stats of a slime. Demo will be released soon because I need some feedback. Slimes will be able to kill each other. 💀💀💀
Big Fat Update 🔨🔨🔥🔥 Devlog 8 I don’t use AI to write any of my devlogs. Relationships Slimes can interact with one another. To do so, they just have to be next to each other. After an interaction, if they haven’t known each other before, they will have an updated friends list. If they have already met each other, then what they think of each other goes up. If two slime’s relationship value go up to a certain number like 30, then they can have babies. DNA and Genes Each Slime have their own characteristics. This includes speed, health, and species. They pass down their genes to their offspring. Offspring’s traits will be slightly changed to maintain diversity and natural selection. For example, a slime with a fast genes will be able to get to a food quicker than the ones that are slow. The faster slime will get to survive and make babies. Color 🔥🔥(My fav update) Slimes have multiple kinds of traits, and that includes color. They can pass down their color to their offspring(Though their offspring’s color may be slightly different). This addition makes the game look a lot better. Problems 😢😢😢 While doing some tests, I noticed that some slimes were dying. This was weird because there were definitely enough food for everyone. When I looked closer, I realized that there was a bug where some slimes get stuck and become braindead. This problem is and still very difficult to fix.
Update Devlog 9 Traits Slimes now have traits! Traits are minor tweaks on the brain of a slime. This brings out personality and characteristics. For now, traits are only obtainable at birth. Slimes aren’t able to pass down traits to their offspring. Other stuff I finished working on the background and is preparing to work on the art of the food. Things I will do next time I will start working on the UI because that makes it easier for people to test my simulator. I will work on more traits, so far I have 7-8 of them.
More Mechanics! Devlog 10 Small UI Update The slime information and slime population text boxes are separated. There is now a bar that is gonna contain some button. Right now the only button I added is adding more slimes, but there are gonna be more in the future. Other Things I added Slimes can now have multiple babies instead of only one. I added some grass to make it less barren.
Batch of Updates! Devlog 11 Slime genetics Slimes have more realistic natural genetic creation. Instead of only picking up one of their parent’s colors, they mix the two colors together. Speed and Health changes for an offspring is toned down. Implemented more slime mutations. These includes drastic color changes, faster or slow speeds, or health changes. When testing, I noticed that after a while, the colors started becoming black(I don’t know why). That’s why I made it so that an offspring may be given a bold color(Blue, Red, Green, etc.). UI Made a system where you can view slimes’ friends just by checking their friends list. By clicking on one of their friends or family, it will take you to the selected slime. I made the UIs a lot more responsive and clean.
A title Devlog 12 Things I implemented Slimes don’t mixed up colors equally anymore. This is because mixing them up equally makes them more dull and grey over time. To stop this, I had to mix the colors up unevenly to maintain the vibrant colors. To track and follow a slime, click on them and press the “Track” button. The slime UI got a major upgrade. It’s now easier to read and more sorted out. You can now spawn food for the slimes. To do it, go to the bar at the bottom. Above the bar, there is a text that tells you what you have selected inside the bar. Clouds have been implemented. Right now they don’t do anything, but they will be able to drop food.
Big Update Devlog 13 Favorites tab You can now favorite slimes. This is for when you like one of them or find one interesting. To use, just click on one of the slimes. Kill tab If you want to get rid of a slime, go to the kill tab and click on the slime. I will add the death animation next time. New pathfinding Replaced the old AI reinforcement learning with the A* pathfinding method. This is because the new system can avoid obstacles and doesn’t take much computing power. UI revamp Made the UI better. Most of the buttons and panels have art and stuff. Things I will add in the future Terrain: You will be able to customize the terrain to make the world more interesting Animations: When walking, the slime will have animation.
Map Update Devlog 14 Terrain Generation After implementing A* pathfinding, I added obstacles and other things for the map. I used to perlin noise to make the mountains and rivers feel more real. float noise = Mathf.PerlinNoise(i * 0.05f+ offsetX, j * 0.05f + offsetY); Added trees. I can make them useful for the slimes in later updates. Art I made the sprites for the rocks and water. It didn’t take that long because it didn’t need much detail. Made the art for the “kill slime” button, which is a knife. Bug fixing Fixed a ton of bugs because adding in the new pathfinding messed a lot of things up. A lot of problems came up when making terrain generation, like the slimes behaving weirdly. Future Updates I might add clans and tribes to make things more interesting. Violence will be added very soon. Check out my game here: https://respectabledot.itch.io/slime-simulator
World Building Update Devlog 15 Terrain Editing You can now edit your world. All of the blocks will be available. To use this feature, click on the button with the blocks. All of the blocks: Water, Grass, Sand, Rock Programming took a bit longer than I thought, but testing was surprisingly easy. Next time, I could add things other than blocks, maybe like trees and grass. Other stuff There is now world age so you know how old your world is. Small changes in some of the UI
Visual Update Devlog 16 Check out my game here: https://respectabledot.itch.io/slime-simulator Particles Water used to look bad because it’s just blue and nothing else, so I added waves for the movement. Leaves now fall off trees. Other graphics When near land(Sand, Grass, rocks), the water becomes more shallow. It is indicated by the water being more light than the others. Added more grass when starting the game. Clouds appear a lot less due to it sometimes blocking the user’s vision. Bug fixes Fixed a bug where slimes were not spawning, caused by a poor algorithm. Temporarily removed the buggy walking animation for the slimes. I also added apples🍎
Taking Feedback Devlog 18 Font Change When I showed my project to people asking for some suggestions, they said I should change the font. So I decided to change the font to more of a pixel style, called “Pixel Operator”. It took a while to set up due to my lack of experience. Slime Violence Slime will now be able to attack each other. It starts from them being sad or angry, and being hungry. Then they unleashed their fury onto other slimes. When they hit other slimes, the slimes that are hit lose health. Other Stuff Slime can now slowly regenerate health when they are fed and have energy. Fixed a bug where rocks wont spawn in world editing mode.
Miscellaneous Update Devlog 19 My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator — Things I added: Added a crosschair. THis makes it a lot easier to see what you are hovering over. The crosschair can highlight on tiles and slimes. Made an about and instructions page. Go to the top-left and you will see the buttons that will take you to the pages. Fixed slime behavior. Sometimes the slimes get stuck after eating so I hope I fixed the issue.
Emotion Update 😀😢😡 Devlog 20 I have something else that I worked on but there is still a little more work to go. I will post it in another devlog. For this update, I added emotion to the slimes. Slimes will get happy when they eat food or when they talk to their friends. They get sad overtime when they don’t do anything or they get attacked. You will know when they get upset when a emoji shows up above them. Emojis will show up for other things too, like when eating, fighting, or interacting with others. I will post the other part in the next devlog. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Misc. Update Devlog 21 Added palm trees. They act like normal tree but spawn on sand. Also, they generate coconuts. Made a system where the slime’s pathfinding algorithm is a lot more efficient. Whenever they find a place where it’s impossible to go, they will make a mental note of that. This reduces possessing power. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Random Good Updates Devlog 22 Sorry for not devlogging more Made a new button where you can plant weeds and trees. I don’t know what else to say but this took me so long. Reworked the violence behavior in slimes. Before the update, slimes would attack the nearest person when they get upset and hungry (Hangry). But now, slimes may choose to slime out someone nearby OR someone who they already don’t like in their relationships list. This makes it more realistic to real life. Reworked equation for slime violence weight: tasks[2] = distanceSlime > 18 ? 0 : (100 - stats[2] * 0.6f - stats[0] * 0.85f) / 50 + angryBias + baseTasks[2]; When slimes sleep, they will have their own special sprite for that. Also, they will have the “zzz” icon above them. Still working on the issue where slimes get stuck after doing some task. It seems to be fixed though, for now. My project is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Cosmetics Update Devlog 23 I added 10 kinds of hats that can spawn on the slimes. They don’t affect the slimes, it’s just for appearance. My project is now on itch.io, go check it out! https://respectabledot.itch.io/slime-simulator
Introduction Update Devlog 24 Made a simple intro. It contains the game’s logo and unity’s logo. Made a tutorial for the start of the game. It teaches you how to spawn slimes. If you have already played, there will be an option to skip. Check out my game: https://respectabledot.itch.io/slime-simulator
Miscellaneous Updates Devlog 25 Things I added: Made a sprite for when the slimes die. It looks like a splat. When a slime dies, their family member and friends get sad. You can press “h” to hide UI. Bug Fixes: Fixed a bug where the slimes get stuck after doing eating or interacting. Fixed the tutorial-skipping button. Slimes don’t lose their color anymore Check out my game here: https://respectabledot.itch.io/slime-simulator
100 HOURS LETS GO Farms. Devlog 26 This is the most tiring update ever. This update is a test, so a lot of things can be broken. Things I added: Added roles. Some slimes get assigned task, like constructing buildings or farming. Added farms. Slimes can plant and produe their own food. All they have to do is place farming soil near windmills that are set up by constructors. The soil will automatically generate crops, which is meat. Made the art for the windmill. It even has an animation! Slimes interacting with other slimes is encouraged. Food spawning is greatly reduced because slimes can now produce their own food. Check out my game here: https://respectabledot.itch.io/slime-simulator
Another big update but isn’t as tiring Devlog 27 Things I added: Violence is a lot more encouraged between the slimes. There is too much peace. Added lettuce. Instead of the slimes growing meat, they grow lettuce. This is a lot more normal. Slimes have a Walking Animation, which is just them expanding and shrinking constantly. Food generation in farms is reduced because this encourages them to explore the world more. Bug fixes Buttons in the bottom bar will not activate when users are cancelling them. In planting mode, blockable objects like trees will destroy items beneath them. In building mode, changing a tile will cause things that are stuck on top of them to disappear. Things I will add next time: There will be a list of effects. These effects buff or weaken a slime’s body or influence the way it acts. An example could be make it faster, have more health, or make it more prone to attacking other slimes. Clans and kingdoms is already being worked on. Check out my game here: https://respectabledot.itch.io/slime-simulator
Kingdoms and Colonies👑🔥👑🔥 Devlog 28 Slimes can establish kingdoms if there aren’t any or are far enough away from other kingdoms. If a slime is spawned by the user, the slime will head to the cllosest kingdom(If close enough). But if a slime came from another slime, they will automatically be part of the kingdom. A slime can create a settlement if they are already in a kingdom and is far enough away from it. If a slime has one parent from a kingdom and another from another kingdom, then they will random choose which to live in. A slime farmer can only work in the kingdom’s fields. Things I will add next time: War and Economy will be my next priority. Check out my game here: https://respectabledot.itch.io/slime-simulator
UI Revamp and cosmetics Devlog 29 I am currently working on another update but I forgot to post a devlog, so I will post a devlog for the things I finished then post the ones I haven’t finished yet. Things I added: After taking some feedback, I changed some stuff inside the slime UI. Instead of just plain text, I added pictures and icons to make reading a slime’s information much easier. I also replaced most of the transparent boxes with some better ones that are drawn. For the cosmetics, I added around 10 new hats.
Spells! Devlog 30 Check out my game here: https://respectabledot.itch.io/slime-simulator Spells control and influence a slime mentally and physically. Currently, there are only 4 spells. I will plan to add more of them in later updates.
Items and Slime sizes Devlog 31 I forgot to devlog again :( Items and Equipment Slimes can now have items. Items can help them complete tasks or give them a buff. To see what item the slime has, check in the slime stats. Items currently in the game: Hammer: Used for constructing buildings. Hoe: Used by farmers to farm. Pistol: For killing slimes. Rifle: For killing slimes. Slime characteristics and stuff Instead of slimes being the same size, they can be big or small. This makes it more realistic, I guess. Slimes can pass down their family name. If the two parents have different family names, the offspring chooses one of them. UI Changes The section for terrain editing got a small upgrade. Next to the text, there is an image of the block to show you what it looks like. At the top-right corner of the slime statistics page, there is the X button that closes the UI. You can check what equipment the slime is using by going to the slime UI & statistics Other Waves can appear outside of the editing zone so it looks more natural.
More Mechanics and Items! Devlog 32 Things I added: Houses are a new building. Currently they don’t really do anything, but later on they can be used for slimes to sleep in. Doctors is a new ability that treats and heal slimes. Their item is a medkit. When you favorite a slime, a star icon will show up above them. This helps keep track of your favorite slimes. Added 8 new cosmetics! New Items! MP5: A submachine gun that fires really fast. Blue staff: A staff that is blue and shoots out 3 blue balls. Katana: The first melee weapon. Does a lot of damage. Medkit: Used by doctors to treat and heal other slimes. M1911: Originally called the pistol. AR-15: Originally called the Rifle. MP-133: Originally called the Shotgun. Things I will add: More cosmetics coming soon! Houses will have a function other than doing the embappe special Game link here: https://respectabledot.itch.io/slime-simulator
Another Batch of Updates Devlog 33 I dont know when to stop this project, I have a lot of things to add… Check out my game here! https://respectabledot.itch.io/slime-simulator Things I added: Day/Night Cycle! Every minute it switches from day to night or vice versa. When at night, slimes and buildings glow so they are easier to see. Also, it looks cool. (The light thing took a long time to figure out) There is a notification bar that tells you what is currently happening in the world. When guns fire, it will create a muzzle flash effect. New Items: FN SCAR: A powerful gun that hits hard. It is kind of inaccurate though. Laser Gun: Its bullets are faster than other guns. Does decent damage.
Optimization and Fixes Devlog 34 2nd to last devlog! Cant wait to ship Things I added: When you press escape or the gear icon at the bottom-right, you can enter the settings page. In here, you can disable or enable features to your likings. This can help run the game faster on lower-end PCs. Placing blocks, plants or effects shows a small special effect. Between and Night, there will be dusk and evening. They will make the sky orange for 15 seconds. There will be more farmers and less unemployed people. Big Fixes: Upgraded the pathfinding system for the slimes. Whenever they are hungry but can’t reach their food, they will find alternate food that is close to them.
Sound! Devlog 35 This will be a short devlog because I don’t know what else to say. Sounds effects I added inside the game: Slime spawning Clicking on slime clicking on ui(button) Slime Noises ocean wind Slime Eating Planting Guns(Lasers, Regular bullets Passive slime noises Active slime noises Night(Crickets) Credit to qubodup and filippe for the slime sound effects.
Ships:
A simulator that is about making crazy slimes through natural selection, evolution, and genetic engineering. One thing that made this project challenging was the slime pathfinding. To solve this, I used the A* pathfinding technique. Something I am proud of is the art style. I worked very hard on it and I think it look good. To test my project, just click on the demo link. Thank you to the people who supported and suggested good ideas to the project!...
|
1792993734.975676
|
1793080134.975676
|
|
5003
|
Browse++ by @kallenseelo | Stardance
|
kallenseelo
|
1
|
165.0
|
3160
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-29T03:43:00Z", "hours": 165.0, "multiplier": 19.1, "payout": 3160, "blessing": "neutral", "text": "Browse++ A C++ Browser Engine from Scratch. Overview: Over the course of 2 months and almost 300 hours (165 coding) of work, I built a browser engine that can download, parse, and render websites with tab handling and a lot of other cool features, from almost complete scratch! What’s a Browser Engine? A basic definition of a browser engine is a program that pulls content from a website, then takes that content, gives the elements the properties assigned in the CSS, and then renders the content on the screen. They end up being very difficult to build, as HTML and CSS can run and be run without errors, so that makes it super hard to build an engine that can properly handle, parse, and render a site with a lot of errors. How to use this? If you would like to use my browser engine, there is quite a few ways to do so! NOTE: I do not have an actual Linux laptop, so the Linux version is super buggy (and does not have any networking), but I really hope to fix that in the future, but you can use the more outdated web demo! If you don’t want to download anything, you can use the Web Demo , its a bit behind, but it shows it nicely. If you are willing to download, and you are on windows , you can go to the github here and download to try it! If you want to see the real thing, I have a video going through it here. What am I most proud of? I think the thing I’m most proud of was the amount of browser systems i was able to build from scratch , this was a super fun thing to build, but it had a lot of challenges and ups and down, and a lot of hours fixing bugs that make no sense at all lol! The other thing I’m most proud of is not using any AI on the main engine; there was a bit of AI used for the web demo, as that wasn’t my main focus, but the browser engine overall used absolutely no AI! AI usage GLM 5.2 was used to convert the Windows code to a web server for Linux (way before I supported Linux). Any code changes are clearly marked with ( // CHANGED WITH AI: ... ) if they have been changed with AI, and very little has been changed.", "repo": "https://github.com/k754a/C-Plus-Plus-Web-Engine", "demo": "https://k754a.hackclub.app/"}]...
|
[{"post_id": 56948, "ts": "202 [{"post_id": 56948, "ts": "2026-08-28T23:53:05Z", "hours": 4.8833, "text": "Final work on the readme, getting a standalone windows build! Over the last few days, I’ve been hard at work getting the readme finished up, it was super tedious but now its in a good spot for a ship, and looks awesome! I’ve also gotten the windows build to be standalone! this took a lot of googling, but now with CMake, it now can run on anyone’s computer, without needing anything else!! Other than that, its been a bit of work on the Linux side, i attempted to get some sort of https working, but because its a vm, its super screwy, and i hope to be able to have a computer that has Linux on it for use, but we will see ig. Also made a YT vid https://www.youtube.com/watch?v=I-mCh9xSYeg&t=8s Overall a good day!"}, {"post_id": 54642, "ts": "2026-08-25T17:49:57Z", "hours": 4.9522, "text": "Linux support!!! Over the last few days, I’ve been working on migrating the project from MSBuild to CMake, allowing it to run on both Linux and macOS (though I haven’t been able to test it lol). Linux has been tested, however, and everything works on it (except I haven’t migrated the networking, so that’s still to do!!), so there are still some things that need to be done, but it boots on my Debian VM and renders! So I’m super happy for that. Some other changes were that I got autocompletion (you’ll see it in a sec) as well as getting the open in a new tab working a bit better for both Windows and Linux!! Overall a good day!"}, {"post_id": 52150, "ts": "2026-08-22T07:40:12Z", "hours": 6.0289, "text": "Updated context menu, Desktop Logo, Hover effects, Rework of the input bar, and bug fixes! Ok, its like 1:30 am rn lol, so im going to try to do this fast. First, i updated the context menu, the menu now has a nice drop shadow, and looks so much nicer than before (lemme know what you think about it). second, i added a basic desktop logo (a grayish black circle) that changes based on light or dark mode (the vid shows it well). Another change was hover effects! now hovering over buttons changes the color slighly, making it a bit simpler to see that your over something, and aswell as being a bit more reactive! the input bar rework allows clicking onto the bar, rather than always typing on the bar (for ctr-F coming soon!). Finally, bug fixes, i had a lot of issues with having both custom x pos, and custom y pos, but thats all fixed now! aswell as the backgrounds not updating per tab (thats now fixed too!). Finally II, i worked on the readme a bit! Overall it was a good day (with over 10 hours of work lol), and i still have a few features to add! so yeah, thanks for reading! (as well as excuse the spelling mistakes, there might be a lot lol)"}, {"post_id": 51922, "ts": "2026-08-21T20:50:43Z", "hours": 6.1733, "text": "More HTML style options, browser history, and work on the Readme.md Ok, so over the last 6 hours this is what I worked on. First, I worked on adding more style options, so now you can set font size (another way) and set font boldness (like normal HTML), and you can now add custom number values to the vertical alignment (that in the vid is shown on the homepage!). I also worked on the browser history now, saving it to a txt file. You can scroll back through what you’ve searched before (and add a button to clear it next update).I also was working on the readme, making it clear and better before the ship. Overall a good day, and I think I’ll try to do the settings menu, aswell as support for buttons in the viewer (though they probably won’t do anything thanks to not having JavaScript), so yeah!"}, {"post_id": 51394, "ts": "2026-08-21T02:14:27Z", "hours": 5.9358, "text": "More text formatting and positioning. (and LOTS of bug fixing) Today was a great day of work; I got height adjusting working, and this took way longer than I thought, just with all the bugs and problems I ran into, with old code I had created, but I was able to solve it all. The other notable thing is having another way to color text and the bg of text, but also, I fixed it so that none of the text falls off the edge in the positioning, so overall a good day! I’m actually so close to being done; I’ve wanted to go to 200 hours, then kind of just chill and slow down, and I’m at 14 hours left of that! Then I’ll ship. But I do want to finish the history menu, though I may leave the settings menu on pause. (for now). So yeah!"}, {"post_id": 50790, "ts": "2026-08-20T05:38:54Z", "hours": 5.1342, "text": "HTML text-align handling, history tab, and settings. Ok, I’m going to be honest, I looked at that settings menu and genuinely did NOTHING. It’s going to be a pain, so I’m just avoiding it till I have no choice. Something HUGE, though, I’ve gotten working is getting proper styling so that text can render in the middle and right (with way more text-align and style options to come)! This really opens the door for much more dynamic rendering text, though there are still a few bugs with it (large text goes off screen, and the home screen doesn’t apply the settings), so there is still a lot to fix, but honestly, I didn’t even think it was possible, so this is awesome! Overall a good day; I’m going to continue working on history and styles and then the settings lol."}, {"post_id": 49986, "ts": "2026-08-19T00:38:26Z", "hours": 6.455, "text": "Add context menu and startup URL (and fixed a LOT of bugs)! Sorry it’s been like 2 weeks, but after finishing my other project, I’m back at it! Over the last 2 days, I worked a LOT on the context menu and bug fixes (like loading text files into the engine, and old ones I caught working on this!). The context menu changes its options based on what things you right-click (like a real context menu), so for example, when I click a link, I get way more different options than if I clicked a tab. This allows for a lot of customization, and it’s basically fully implemented (minus a few features I want to add). The startup URL is kind of a part of that; when clicking a link, you have the choice to open it in a new window, and getting a URL that can change on startup really made it easy to add the feature! So overall a good day. What I’m going to work on next is the settings menu. Thanks for reading!"}, {"post_id": 41749, "ts": "2026-08-06T04:16:16Z", "hours": 5.6256, "text": "Settings button, bug fixes, scroll bar drag, and a context menu! This update was just a crazy number of features! I ended up shifting around the top area to make room for a settings button (that I will deal with soon), then I decided to allow scroll bar drag so that you can scroll through a page with the bar, not just your wheel! The big thing was the context menu; this took the most time and was the most difficult, as it was just a pain to get 2 windows rendering, but now, it works super well! I also attempted to work on getting a better layout, but I just screwed a lot of stuff up lol, so that didn’t really work out, but that’s ok!"}, {"post_id": 39793, "ts": "2026-08-03T00:24:38Z", "hours": 3.6864, "text": "Done all comments and released 0.1.0 ! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine I ended up going on a camping trip with the homies, so I didn’t work on this for a bit, but when I came back, I fixed a few more bugs, ended up finishing all the comments for GUI.cpp, and created release 0.1. 0! This is huge, as I was able to fix all known bugs and get a working version out! For version 1.0.0, I want to fully fix the layout engine to render close to a modern browser, add a settings page, fix performance, and add things like buttons and checkboxes on websites! Thanks for reading!"}, {"post_id": 35496, "ts": "2026-07-26T23:35:45Z", "hours": 3.4192, "text": "Quality of life improvements, more comments, and finally fixed the crashes If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Ok, so first off, the huge crash I was getting was because of using a global variable for holding the link and not a local variable, and when 2 threads attempted to use it at the same time, my app would freeze and crash, so now it runs great! Some of the QofL improvements are adding keyboard shortcuts and the ability to close tabs by pressing the middle button down, like a real browser! Then there were a lot more comments that I am so close to being done! Overall a decent 2 days; I’m definitely getting a bit bored of the comments, so my plan is to work on my other project for a bit and come back later! But yeah, a good day. :)"}, {"post_id": 33882, "ts": "2026-07-24T04:53:53Z", "hours": 6.0147, "text": "Local file loading, better comments, and crash fixing! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Today, I worked a TON; I got through all the comments for the start and collision events for all the buttons and things in GUIRENDER . I also added some new features and fixed some huge bugs! The new feature is file loading! You can now load PNG, JPEG, HTML, TXT, and HTM files straight from the search bar! The main fix, and what took most of my time, was the prerender. as i was working on slimming the new tab create button down, i found a lot of strange bugs, esspicaly with webpages with large amounts of images (like stardance), this lead me down a lot of changes, overall, it was a issue with how i checked to see if i wanted to load it from disk, but it was also a bunch of stuff to do with multithreading, and locking parts, but after a lot of work, i fixed it! I still need to fix up and finish GUIRENDER , but once I’m done with that, it’s off to work on the settings page. Thanks for reading!"}, {"post_id": 33247, "ts": "2026-07-23T00:15:09Z", "hours": 5.6319, "text": "Halfway done rewriting Gui.cpp—Lots of bug fixes and speed improvements! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Over the last 2 days, I’ve rewritten about half of GUI.cpp (up to the GUIRENDER function), with changes, bug fixes, and speedups that helped the engine a lot! The main speedup came from changing the way I handled the font so that I loaded it once, not every loop. This allowed a lot less SSD usage and a gradual increase of performance, up to about 50% for large sites! I worked a lot on organization and got it so that different functions are grouped together, even moving some to different scripts that fit better! The final change was reworking how images and the home button worked, and it allowed me to drop a function, as well as have much faster image batch loading times! Going through the code made me realize how many bugs and bad code I did. I fixed a lot of it, but I still got a bit to go! Overall it was a good day. My plan for everything else is to finish the rest of GUI.cpp, start work on a settings page, and try to make the parser faster still! Thanks for reading!"}, {"post_id": 32062, "ts": "2026-07-20T23:17:12Z", "hours": 3.9422, "text": "Lots of bug fixes, quality-of-life changes, and the start of a rewrite! try it out! https://k754a.hackclub.app/ I’ve been still a bit busy, but over the last 2 days, I ended up fixing a lot of bugs with crashing, especially with dealing with multithreaded tab handling. Some of the quality-of-life changes I did were creating a new tab handle that allows you to go back to the new tab in history and other small changes! The biggest bug was where, if you searched something and, while it was loading, switched tabs, it would overwrite your tab to the one you switched to, not the original one you searched in. Now that is fully fixed! Overall a good day! I’m going to fully rewrite and comment all 2500+ lines of the GUI and other functions, fix a LOT of bugs, and then add settings, history, and a few other things! Thanks for reading!"}, {"post_id": 29965, "ts": "2026-07-17T05:38:51Z", "hours": 4.44, "text": "Dark mode and bug fixes (with more bugs) and HTTP error codes Today, I recorded most of my link and search handling to be better at handling URLs and links like /home. I also added a dark mode! (Super helpful on the eyes lol) Unfortunately there is a big bug, some websites will just not work anymore (like hackclub), and also websites take super long to load, this is because the images it is processing are in a buffer, and this buffer needs to finish the images of one page before the other, i think i have an idea to fix it, so I hope I will be able too soon! But overall, this update changed a lot of bugs, and I’m hoping it can be even better for the future!"}, {"post_id": 28606, "ts": "2026-07-14T23:12:44Z", "hours": 6.4553, "text": "Lots of optimization, better comments, and bug fixes! Sorry for not posting for a few days; I was super busy and didn’t really have the time. However, I’m back at it! Over the last week, I’ve been changing and updating lots of stuff. The first one was much better comments for the layout.cpp file! I still have a bit left to do, but I was getting pretty tired, so I moved onto making the engine a bit faster! One of the main things I did was use threading, passing the text off to the GPU rather than going from CPU to GPU, as well as multithreading it. This allows about 2 seconds faster search time, and I have some more ideas for changes too! The reason this took so long is the number of bugs I introduced. The Gui.cpp is huge (2000+ lines), so I want to really rewrite it, as there is SO much junk and bad coding practices lol. Overall though, it was a good day, and I think I want to start tackling JavaScript after adding a lot of QofL and fixes to a ton of bugs! Thanks for reading!"}, {"post_id": 23282, "ts": "2026-07-06T04:43:49Z", "hours": 3.3869, "text": "Performance analyzer and comments for our DOM! Today, I created a performance analyzer that could tell me how many microseconds it takes to get through certain programs. This helped a lot with optimization and making things faster! I also finished and optimized the DOM code! Today was a pretty basic day; I’m a bit busy over this coming week, so it’s going to be a bit more broken up, but overall a good day today!"}, {"post_id": 22558, "ts": "2026-07-05T02:28:53Z", "hours": 4.8858, "text": "Performance increases, and a rewrite of the parser! Today was a nice easy day; I rewrote most of the parser, fixing a lot of bugs, and also learned how to use the performance analyzer in C++! The code is much more documented, with every line describing what it’s doing, making it super easy to follow along! The main change was an increase in speed from about 5% CPU usage to 1% and a 50MB reduction in RAM usage, allowing for 10 tabs at once, with only 61MB overall, rather than the 1000MB of something like Chrome! as well as about a 6% faster parse and load time. There is still a lot to optimize and work on, so I’ll keep doing that!"}, {"post_id": 21750, "ts": "2026-07-03T20:49:12Z", "hours": 5.1881, "text": "The first part is rewritten! Today, I worked on rewriting my network code with better comments, names, and methods. This took a while, as I created so many bugs, but it does work! The long part is still yet to come; however, the main things like the parser and the GUI are going to be a headache, but I should get it done! Overall a good day; ~4 files have been changed, with 6 more to go! Then after this, i want to add a history button, a settings page, and just improve performance, and formatting, then I’m done!"}, {"post_id": 21182, "ts": "2026-07-03T00:10:54Z", "hours": 3.2625, "text": "Updated the web version to the latest! Ok, so the main thing i did today was update the web version, and got it to match the main version overall, with everything! I also tried to get better formatting on the text, but i think my code is just so muddled its gonna be impossible, so my plan is to start rewriting it, with the things I’ve learned, and updating the comments (as i have a lot of them, in many wrong spaces)! that should take a bit, but hopefully will pay off in the future! If you want to try the new version, its here: https://k754a.hackclub.app/"}, {"post_id": 20502, "ts": "2026-07-02T03:18:13Z", "hours": 4.0853, "text": "Scroll bar support, bookmarks, and printing sites! Today I got a lot done; the main things were getting scrollbars, bookmarks, and getting sites to print all working! I ended up running into a lot of bugs (especially with the scroll bar), but now it works, so yeah! Currently the browser portion is far behind, and I want to update it, so I’ll try doing that next! Overall today was a good day; I got a lot done and a lot working! Anyways, thanks for reading! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ "}, {"post_id": 20310, "ts": "2026-07-01T21:33:17Z", "hours": 3.6294, "text": "New icons and more buttons! Today, I was able to get icons supported into the engine (kind of)! The way I did it was by using a font modifier. I loaded the font I’ve been using and created some custom icons! A lot of the challenge was fixing text, as the new icons had issues with scaling and position, especially the back and forth arrows! Overall it was a great day. I’ll work on getting the printer button and the star button working; then it’s on to improving the engine! (also added a home button!)"}, {"post_id": 19574, "ts": "2026-06-30T22:14:59Z", "hours": 3.1631, "text": "Got Flex and Absolute boxes working on the engine! This took a while, just with fixing all the bugs and the weird reasons why some things would just not work at all lol! It was definitely a learning process for sure, and it should be easier to add more support for everything else in the future! This has to be one of the most difficult projects I’ve ever worked on, but it’s coming along! I want to do something a bit more fun, so my plan is to start work on a UI overall, just to give myself a break from all the crazy stuff! Anyways, thanks for reading! (oh, websites look so much nicer, with the new stuff!)"}, {"post_id": 19420, "ts": "2026-06-30T18:56:13Z", "hours": 4.5111, "text": "Rebuild of the layout engine! Today, I rebuilt a bunch of the layout engine to start support for flexboxes and divs! I mainly switched the code to do 2 passes, first to figure out spacing, size, and position, then to place the elements on it! Overall, this was a kind of boring day; it works basically the exact same rn, so there’s really nothing to show, but I’ll send a screenshot or two of my code! Anyways, the plan next is to get flexboxes working! After that, I might rewrite my engine, as it’s getting a bit ugly and crowded, and I coded some stuff pretty badly the first time around; it probably would only take about 10 hours, working off my code, but I think it would save me time in the future, but I’ll see! Anyways, thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine"}, {"post_id": 19020, "ts": "2026-06-30T05:52:42Z", "hours": 3.1311, "text": "Lots of bug fixing on the engine! & Making it to the news letter! First of all, I want to thank everyone who has liked, reposted, and checked out my project. I made it to the Stardance newsletter, and it was so awesome :). Thank you so much! Today, I fixed a crazy amount of bugs; the main one was I would have these empty boxes, and it took me a good hour and a half to figure it out, but now text renders so much nicer! The next bug I fixed was clicking links. Up until this point, clicking links did not work at ALL, so now they work! (super happy about that)! History now works for each tab, not just one pool! I’m also starting work on making a YT video for this project. I’ve never made one before, so we will see how it turns out. For tomorrow, I’m going to work on the formatting of the engine, as normal websites have text like how Stardance has the home, notifications, rate, missions, etc, on the side and the main text in the middle, so I’ll hopefully get that working! Anyways, thanks for reading! You can check out my project below. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ "}, {"post_id": 16595, "ts": "2026-06-27T00:22:18Z", "hours": 5.3503, "text": "Images Working for the Browser Engine! I’m going to be honest with you, this has to be the top 10 worst things I’ve ever coded. 😭😭 But images now can load; there are a few bugs, most images don’t load, and the ones that do load in pairs of 2 have weird bounding boxes. However, they do work, and that’s what I’m happy about! I’m going to do a quick side project, just to have a bit of room so I don’t overdo it, but overall it was good. Next I’ll just fix the bugs and start getting like the formatting of texts to start matching websites! The vid below shows them in action."}, {"post_id": 16093, "ts": "2026-06-26T05:07:23Z", "hours": 3.3942, "text": "Rebuilt part of the browser engine to handle tabs! Today, I worked on getting tabs working! It wasn’t as bad as I thought; the worst part was making all the UI elements and handling the inputs for them! I also found a bug; the engine easily uses my entire CPU’s dedicated GPU and causes issues with other apps lol, but I’ll fix it in a bit! Overall it was just bug fixes, quality-of-life improvements, and tabs! Hopefully tomorrow I’ll do images, then I’m taking a break for a bit and doing something else because I’m burnt out, and that’s a tip for all of you too: don’t overwork yourselves! The vid below shows it in action. Thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine"}, {"post_id": 15935, "ts": "2026-06-25T21:47:30Z", "hours": 3.0242, "text": "Back and forth arrows, reloading, better formatting, and searching on the browser! Today was huge; I was able to get better formatting for text, search for things, and get buttons like back and forth and reloading working! My next task to tackle is images! The vid below shows all of the changes in action! Thanks for reading!"}, {"post_id": 15459, "ts": "2026-06-25T04:13:52Z", "hours": 2.7303, "text": "Links, and better rendering! Today I got links, and rendering improved rendering! Words now render together, rather than making a new line each time. I also got links, and that allows you to browse something like Wikipedia (the video below) much easier! For next time, I’m going to get the back and forward arrow and reload a working website! And may start work on getting the browser to have divs! Thanks for reading!"}, {"post_id": 15204, "ts": "2026-06-24T18:29:06Z", "hours": 2.1114, "text": "Today, I got a bunch of colors working! The browser engine can now render different colored backgrounds, texts, and highlights! This actually wasn’t too bad, as the hardest part was just fixing all the bugs from CSS being such a bad language, but overall it turned out awesome!"}, {"post_id": 14842, "ts": "2026-06-24T03:19:32Z", "hours": 2.5572, "text": "Version 0.1.0 of the Browser Engine! If you don’t know what I’m building, I’m creating a custom browser engine in C++ from scratch, something like Chromium, but a lot more bare bones. Today, I did a bunch of things. I got my first CSS attributes to detect and work! Text now is not hardcoded and dynamically scales based on the CSS! This really wasn’t too hard, so I moved on to the next thing, getting a working UI! The UI I’ve created is basic, but it allows you to search without using the terminal and search multiple things! Overall this was an awesome day for today; my plan over the coming days is to support more CSS and work on fixing performance and overflow bugs! Thanks for reading. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video shows the standalone app, and searching 2 different sites."}, {"post_id": 14688, "ts": "2026-06-23T21:39:00Z", "hours": 3.2131, "text": "CSS Parsing! I got CSS working! I was able to get my CSS parser working on the engine and parse properly. This wasn’t as easy as I thought, as my first attempt worked but was dreadfully slow (10+ seconds), so a lot of the time went into rewrites and optimizations, bringing it from 10+ to about 2 seconds for huge CSS (1000+ lines of CSS)! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Video below shows it loading the hackclub website!"}, {"post_id": 13373, "ts": "2026-06-21T22:06:37Z", "hours": 2.1894, "text": "The browser now has a GUI! This took a bit and a few tutorials, but now you’re able to browse the web with no styles, one font, and just things like headers, but for now this is super awesome! I’ve been going pretty hard at it the last few days, and I lowkey need a break, or else I’m gonna get super burnt out, so I might just start a side project for the fun of it, something easy when I’m feeling a bit sluggish. When I come back, I’ll work on adding a UI around the browser (to get fully away from the terminal), and then it’s just getting CSS parsed and working, which isn’t too bad at all. You can check out the code and try the project below. C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine"}, {"post_id": 12960, "ts": "2026-06-21T06:40:22Z", "hours": 1.6656, "text": "C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got started work on the GUI using SDL3! Today, I worked on getting a GUI up and running; for now it’s just a window, but I’ll get it working! I also started work on a logo, as I felt a bit burnt out during today, but nothing really came of it, as all my designs I tried sucked; the best one I linked below. I also created the first readme!"}, {"post_id": 12643, "ts": "2026-06-20T17:28:53Z", "hours": 0.7358, "text": "This is a super short devlog, I updated the server so that it uses my latest code, and supports HTTPS! you can try it out with the link below. https://k754a.hackclub.app/"}, {"post_id": 12395, "ts": "2026-06-20T07:09:43Z", "hours": 2.2253, "text": "C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got the DOM tree working! Ok, in this devlog, I fixed the DOM tree issues; it seemed to be a combo of issues with the parser (I fixed that) and some actually easy fixes from the DOM tree; it just took a rewrite! I was also able to code a way to see the tree: DOM TREE ├── [ROOT] │ ├── [!DOCTYPE] │ │ ├── [html] │ │ │ ├── [body] │ │ │ │ ├── [h1] │ │ │ │ │ └──── \" Heading test \" │ │ │ │ ├── [p] │ │ │ │ │ └──── \" Paragraph test \" │ │ │ │ ├── [p] │ │ │ │ │ └──── \" Multiple \" │ │ │ │ │ ├── [strong] │ │ │ │ │ │ └──── \" Char \" │ │ │ │ │ └──── \" Test \" We are super close to getting our first text on the screen! (Maybe just a devlog or 2). The vid below shows it in action! Thanks for reading :)"}, {"post_id": 12205, "ts": "2026-06-19T22:30:15Z", "hours": 1.7031, "text": "Today I Worked on the DOM tree, for my C++ Web Engine from scratch! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Today was my first attempt at building a DOM tree and also learning structure types and building trees. This first attempt, after learning a lot about how trees work, doesn’t really work fully; it seems to have issues when parsing tokens and just processing them overall, so the hope is that I can rebuild this for next time! Overall this was a pretty boring day; hopefully I’ll get the DOM tree working, then it’s straight to rendering!"}, {"post_id": 11748, "ts": "2026-06-19T04:11:02Z", "hours": 2.1842, "text": "Fixed my parser! Today’s update: I fixed my parser. The main issue was that it didn’t parse in order; it would do it like this: Text that should be in <a></a> The problem was that I couldn’t use this for my DOM tree, and getting my DOM program to do this would be slow and inefficient. Also, the cause of this was because I didn’t check for conditions that it was a start, middle, or end tag. I did it so I bunched the start and end together, and this was a huge problem because it ended up being put at the bottom, which wouldn’t work at all! Fixing it took a hot minute, but tomorrow I should have DOM’s working. Ok, thanks for reading that! The before and after are in the images below. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/"}, {"post_id": 10978, "ts": "2026-06-18T00:22:11Z", "hours": 3.2256, "text": "HTTPS Working I was able to get HTTPS working on the C++ engine and get it to properly parse. Most websites work on it, but they were a bit slow, so I ended up rebuilding parts of the tokenizer to be faster, changing the speed overall from 3+ seconds to under 0.2 seconds. The main problem is Google websites don’t load at all, so I’ll fix that in the future. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video below shows it in action, loading the Hack Club web page super fast."}, {"post_id": 10261, "ts": "2026-06-16T22:03:22Z", "hours": 2.195, "text": "C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine I built a custom tokenizer for HTTP to be able to load and render websites! I’m building a super-fast, pure custom C++ browser engine from scratch, and the thing I built today was an HTML parser! HTML parsers are super hard to code, thanks to HTML being a very loose markup language. There can be tons of stuff, like: Missing divs <div> Hello World! </p></div> Missing end tags <img src= \"image.png\" Even nested divs! <div class= \"container\" ><span> Nested Elements </span></div> So I needed to build a parser that could handle all of it. Another challenge I’ve been trying is forcing myself to stop making variables for everything and trying to be minimal and fast! This new update also added local HTML loading; this lets me test much faster and test certain things, especially for the DOM and render tree! Some struggles I ran into while building this project were just the amount of errors and debugging I had to do to figure out what went wrong, as well as working with large pieces of code with constant changes. This part really taught me about data types, how to find and remove elements from multiple different classes and types, how to make loops efficient, and how to use vectors! My plan for the next devlog will be building a DOM tree or getting HTTPS to work. After doing some research, I found that I can use: #include <wininet.h> to help get this thing working, so that’s my plan! Okay, this was super long. Thanks for looking at it. The video linked below is a demo of it loading and tokenizing some text locally on a machine!"}, {"post_id": 9517, "ts": "2026-06-15T21:46:02Z", "hours": 3.3375, "text": "In this devlog I built the first half of my parser for the web engine; it can go through a website and match tokens! There are a few issues; some things, like conditions (like <a href=> arnt supported), as well as I can’t pull text from things like headers and stuff. I also made an animation so people can see how it works! The animations basically shows how my buffer system, and determining the order of tokens works, to prevent things like mismatches!"}, {"post_id": 8360, "ts": "2026-06-13T21:58:37Z", "hours": 1.1603, "text": "I was able to build a website demo for people to try out. To make this, I ran it on the Nest servers from Hack Club! However, I used a bit of AI, as I had never set up a server, as well as my project being only built for Windows. However, AI still hasn’t and will not be used in the main project. I did this as a bit of a time saver and to not have to commit 40+ times to test it lol. https://k754a.hackclub.app/"}, {"post_id": 7951, "ts": "2026-06-13T08:10:50Z", "hours": 1.3631, "text": "First version of the browser. It is currently all through the terminal; there is no formatting, CSS, JavaScript, fonts, styles, or even structure to the text. However, any HTTP website can now be rendered into readable text, even if it’s a bit hard to see, lol! The next version of this, I’m going to hook up a rendering pipeline (not sure to what yet, though). Then it will be allowing different fonts and structures, and then finally, support for some CSS. What I have just described will probably take 200 hours!"}, {"post_id": 7836, "ts": "2026-06-13T02:24:42Z", "hours": 1.7817, "text": "I update the web browser engine to allow the download of full files from websites in HTTP. This will pave the way to let me parse the website for the next devlog! Some more changes I made were a bit more error handling and also refining some of the output to make it cleaner and retiring some of the older debug logs. The next difficult part will be some basic parsing and pulling out text Then I’ll attempt to render text without position (this will take about ~4 hours), and then I’ll work on formatting."}, {"post_id": 7688, "ts": "2026-06-12T20:48:29Z", "hours": 1.8869, "text": "I built the first version of my web client. It can now pull HTML data from HTTP sites, using a TCP socket. If you don’t know what I’m working on, I’m building a pure C++ browser engine, to load and render websites like google without the use of AI and libraries. Note that it does not work for https, as to build a handshake between the 2 is super difficult, even for a good programmer. The next step will be to pull an entire webpage off and save it in RAM. Thanks for reading, and I hope you follow my journey!"}, {"post_id": 7066, "ts": "2026-06-11T20:43:24Z", "hours": 1.8558, "text": "Using C++ and native windows libraries, i was able to connect to a website and pull some data off of it. this was super difficult, but im super happy it worked, its able to connect to any IPV4, http site. my next plan is to start pulling files, like html into ram from websites. "}, {"post_id": 4053, "ts": "2026-06-07T07:22:15Z", "hours": 1.5675, "text": "The overall of my essay, is just laying out how im going to be building a web engine from scratch. its not going to run JavaScirpt or interface with HTTPS off the bat, as i have to code all of that and it sucks. https://github.com/k754a/C-Plus-Plus-Web-Engine/blob/main/README.md (this is a link to it as i could not upload a pdf file.) Overall, this will be one of the most complex projects I’ve ever tried/attempted to take on, even over https://github.com/k754a/C-Custom-Code-Editor by a long shot. This will 100% test my research, development, and C++ skills, but I believe that even if I’m not able to pull this off, I will learn a lot about how browsers work and good C++ practices. I hope you will follow my progress on GitHub and Stardance as I build this!"}]...
|
Title: Browse++ by @kallenseelo | Stardance
Devlo Title: Browse++ by @kallenseelo | Stardance
Devlogs:
The overall of my essay, is just laying out how im going to be building a web engine from scratch. its not going to run JavaScirpt or interface with HTTPS off the bat, as i have to code all of that and it sucks. https://github.com/k754a/C-Plus-Plus-Web-Engine/blob/main/README.md (this is a link to it as i could not upload a pdf file.) Overall, this will be one of the most complex projects I’ve ever tried/attempted to take on, even over https://github.com/k754a/C-Custom-Code-Editor by a long shot. This will 100% test my research, development, and C++ skills, but I believe that even if I’m not able to pull this off, I will learn a lot about how browsers work and good C++ practices. I hope you will follow my progress on GitHub and Stardance as I build this!
Using C++ and native windows libraries, i was able to connect to a website and pull some data off of it. this was super difficult, but im super happy it worked, its able to connect to any IPV4, http site. my next plan is to start pulling files, like html into ram from websites.
I built the first version of my web client. It can now pull HTML data from HTTP sites, using a TCP socket. If you don’t know what I’m working on, I’m building a pure C++ browser engine, to load and render websites like google without the use of AI and libraries. Note that it does not work for https, as to build a handshake between the 2 is super difficult, even for a good programmer. The next step will be to pull an entire webpage off and save it in RAM. Thanks for reading, and I hope you follow my journey!
I update the web browser engine to allow the download of full files from websites in HTTP. This will pave the way to let me parse the website for the next devlog! Some more changes I made were a bit more error handling and also refining some of the output to make it cleaner and retiring some of the older debug logs. The next difficult part will be some basic parsing and pulling out text Then I’ll attempt to render text without position (this will take about ~4 hours), and then I’ll work on formatting.
First version of the browser. It is currently all through the terminal; there is no formatting, CSS, JavaScript, fonts, styles, or even structure to the text. However, any HTTP website can now be rendered into readable text, even if it’s a bit hard to see, lol! The next version of this, I’m going to hook up a rendering pipeline (not sure to what yet, though). Then it will be allowing different fonts and structures, and then finally, support for some CSS. What I have just described will probably take 200 hours!
I was able to build a website demo for people to try out. To make this, I ran it on the Nest servers from Hack Club! However, I used a bit of AI, as I had never set up a server, as well as my project being only built for Windows. However, AI still hasn’t and will not be used in the main project. I did this as a bit of a time saver and to not have to commit 40+ times to test it lol. https://k754a.hackclub.app/
In this devlog I built the first half of my parser for the web engine; it can go through a website and match tokens! There are a few issues; some things, like conditions (like <a href=> arnt supported), as well as I can’t pull text from things like headers and stuff. I also made an animation so people can see how it works! The animations basically shows how my buffer system, and determining the order of tokens works, to prevent things like mismatches!
C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine I built a custom tokenizer for HTTP to be able to load and render websites! I’m building a super-fast, pure custom C++ browser engine from scratch, and the thing I built today was an HTML parser! HTML parsers are super hard to code, thanks to HTML being a very loose markup language. There can be tons of stuff, like: Missing divs <div> Hello World! </p></div> Missing end tags <img src= "image.png" Even nested divs! <div class= "container" ><span> Nested Elements </span></div> So I needed to build a parser that could handle all of it. Another challenge I’ve been trying is forcing myself to stop making variables for everything and trying to be minimal and fast! This new update also added local HTML loading; this lets me test much faster and test certain things, especially for the DOM and render tree! Some struggles I ran into while building this project were just the amount of errors and debugging I had to do to figure out what went wrong, as well as working with large pieces of code with constant changes. This part really taught me about data types, how to find and remove elements from multiple different classes and types, how to make loops efficient, and how to use vectors! My plan for the next devlog will be building a DOM tree or getting HTTPS to work. After doing some research, I found that I can use: #include <wininet.h> to help get this thing working, so that’s my plan! Okay, this was super long. Thanks for looking at it. The video linked below is a demo of it loading and tokenizing some text locally on a machine!
HTTPS Working I was able to get HTTPS working on the C++ engine and get it to properly parse. Most websites work on it, but they were a bit slow, so I ended up rebuilding parts of the tokenizer to be faster, changing the speed overall from 3+ seconds to under 0.2 seconds. The main problem is Google websites don’t load at all, so I’ll fix that in the future. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video below shows it in action, loading the Hack Club web page super fast.
Fixed my parser! Today’s update: I fixed my parser. The main issue was that it didn’t parse in order; it would do it like this: Text that should be in <a></a> The problem was that I couldn’t use this for my DOM tree, and getting my DOM program to do this would be slow and inefficient. Also, the cause of this was because I didn’t check for conditions that it was a start, middle, or end tag. I did it so I bunched the start and end together, and this was a huge problem because it ended up being put at the bottom, which wouldn’t work at all! Fixing it took a hot minute, but tomorrow I should have DOM’s working. Ok, thanks for reading that! The before and after are in the images below. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/
Today I Worked on the DOM tree, for my C++ Web Engine from scratch! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Today was my first attempt at building a DOM tree and also learning structure types and building trees. This first attempt, after learning a lot about how trees work, doesn’t really work fully; it seems to have issues when parsing tokens and just processing them overall, so the hope is that I can rebuild this for next time! Overall this was a pretty boring day; hopefully I’ll get the DOM tree working, then it’s straight to rendering!
C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got the DOM tree working! Ok, in this devlog, I fixed the DOM tree issues; it seemed to be a combo of issues with the parser (I fixed that) and some actually easy fixes from the DOM tree; it just took a rewrite! I was also able to code a way to see the tree: DOM TREE ├── [ROOT] │ ├── [!DOCTYPE] │ │ ├── [html] │ │ │ ├── [body] │ │ │ │ ├── [h1] │ │ │ │ │ └──── " Heading test " │ │ │ │ ├── [p] │ │ │ │ │ └──── " Paragraph test " │ │ │ │ ├── [p] │ │ │ │ │ └──── " Multiple " │ │ │ │ │ ├── [strong] │ │ │ │ │ │ └──── " Char " │ │ │ │ │ └──── " Test " We are super close to getting our first text on the screen! (Maybe just a devlog or 2). The vid below shows it in action! Thanks for reading :)
This is a super short devlog, I updated the server so that it uses my latest code, and supports HTTPS! you can try it out with the link below. https://k754a.hackclub.app/
C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got started work on the GUI using SDL3! Today, I worked on getting a GUI up and running; for now it’s just a window, but I’ll get it working! I also started work on a logo, as I felt a bit burnt out during today, but nothing really came of it, as all my designs I tried sucked; the best one I linked below. I also created the first readme!
The browser now has a GUI! This took a bit and a few tutorials, but now you’re able to browse the web with no styles, one font, and just things like headers, but for now this is super awesome! I’ve been going pretty hard at it the last few days, and I lowkey need a break, or else I’m gonna get super burnt out, so I might just start a side project for the fun of it, something easy when I’m feeling a bit sluggish. When I come back, I’ll work on adding a UI around the browser (to get fully away from the terminal), and then it’s just getting CSS parsed and working, which isn’t too bad at all. You can check out the code and try the project below. C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine
CSS Parsing! I got CSS working! I was able to get my CSS parser working on the engine and parse properly. This wasn’t as easy as I thought, as my first attempt worked but was dreadfully slow (10+ seconds), so a lot of the time went into rewrites and optimizations, bringing it from 10+ to about 2 seconds for huge CSS (1000+ lines of CSS)! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Video below shows it loading the hackclub website!
Version 0.1.0 of the Browser Engine! If you don’t know what I’m building, I’m creating a custom browser engine in C++ from scratch, something like Chromium, but a lot more bare bones. Today, I did a bunch of things. I got my first CSS attributes to detect and work! Text now is not hardcoded and dynamically scales based on the CSS! This really wasn’t too hard, so I moved on to the next thing, getting a working UI! The UI I’ve created is basic, but it allows you to search without using the terminal and search multiple things! Overall this was an awesome day for today; my plan over the coming days is to support more CSS and work on fixing performance and overflow bugs! Thanks for reading. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video shows the standalone app, and searching 2 different sites.
Today, I got a bunch of colors working! The browser engine can now render different colored backgrounds, texts, and highlights! This actually wasn’t too bad, as the hardest part was just fixing all the bugs from CSS being such a bad language, but overall it turned out awesome!
Links, and better rendering! Today I got links, and rendering improved rendering! Words now render together, rather than making a new line each time. I also got links, and that allows you to browse something like Wikipedia (the video below) much easier! For next time, I’m going to get the back and forward arrow and reload a working website! And may start work on getting the browser to have divs! Thanks for reading!
Back and forth arrows, reloading, better formatting, and searching on the browser! Today was huge; I was able to get better formatting for text, search for things, and get buttons like back and forth and reloading working! My next task to tackle is images! The vid below shows all of the changes in action! Thanks for reading!
Rebuilt part of the browser engine to handle tabs! Today, I worked on getting tabs working! It wasn’t as bad as I thought; the worst part was making all the UI elements and handling the inputs for them! I also found a bug; the engine easily uses my entire CPU’s dedicated GPU and causes issues with other apps lol, but I’ll fix it in a bit! Overall it was just bug fixes, quality-of-life improvements, and tabs! Hopefully tomorrow I’ll do images, then I’m taking a break for a bit and doing something else because I’m burnt out, and that’s a tip for all of you too: don’t overwork yourselves! The vid below shows it in action. Thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine
Images Working for the Browser Engine! I’m going to be honest with you, this has to be the top 10 worst things I’ve ever coded. 😭😭 But images now can load; there are a few bugs, most images don’t load, and the ones that do load in pairs of 2 have weird bounding boxes. However, they do work, and that’s what I’m happy about! I’m going to do a quick side project, just to have a bit of room so I don’t overdo it, but overall it was good. Next I’ll just fix the bugs and start getting like the formatting of texts to start matching websites! The vid below shows them in action.
Lots of bug fixing on the engine! & Making it to the news letter! First of all, I want to thank everyone who has liked, reposted, and checked out my project. I made it to the Stardance newsletter, and it was so awesome :). Thank you so much! Today, I fixed a crazy amount of bugs; the main one was I would have these empty boxes, and it took me a good hour and a half to figure it out, but now text renders so much nicer! The next bug I fixed was clicking links. Up until this point, clicking links did not work at ALL, so now they work! (super happy about that)! History now works for each tab, not just one pool! I’m also starting work on making a YT video for this project. I’ve never made one before, so we will see how it turns out. For tomorrow, I’m going to work on the formatting of the engine, as normal websites have text like how Stardance has the home, notifications, rate, missions, etc, on the side and the main text in the middle, so I’ll hopefully get that working! Anyways, thanks for reading! You can check out my project below. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/
Rebuild of the layout engine! Today, I rebuilt a bunch of the layout engine to start support for flexboxes and divs! I mainly switched the code to do 2 passes, first to figure out spacing, size, and position, then to place the elements on it! Overall, this was a kind of boring day; it works basically the exact same rn, so there’s really nothing to show, but I’ll send a screenshot or two of my code! Anyways, the plan next is to get flexboxes working! After that, I might rewrite my engine, as it’s getting a bit ugly and crowded, and I coded some stuff pretty badly the first time around; it probably would only take about 10 hours, working off my code, but I think it would save me time in the future, but I’ll see! Anyways, thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine
Got Flex and Absolute boxes working on the engine! This took a while, just with fixing all the bugs and the weird reasons why some things would just not work at all lol! It was definitely a learning process for sure, and it should be easier to add more support for everything else in the future! This has to be one of the most difficult projects I’ve ever worked on, but it’s coming along! I want to do something a bit more fun, so my plan is to start work on a UI overall, just to give myself a break from all the crazy stuff! Anyways, thanks for reading! (oh, websites look so much nicer, with the new stuff!)
New icons and more buttons! Today, I was able to get icons supported into the engine (kind of)! The way I did it was by using a font modifier. I loaded the font I’ve been using and created some custom icons! A lot of the challenge was fixing text, as the new icons had issues with scaling and position, especially the back and forth arrows! Overall it was a great day. I’ll work on getting the printer button and the star button working; then it’s on to improving the engine! (also added a home button!)
Scroll bar support, bookmarks, and printing sites! Today I got a lot done; the main things were getting scrollbars, bookmarks, and getting sites to print all working! I ended up running into a lot of bugs (especially with the scroll bar), but now it works, so yeah! Currently the browser portion is far behind, and I want to update it, so I’ll try doing that next! Overall today was a good day; I got a lot done and a lot working! Anyways, thanks for reading! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/
Updated the web version to the latest! Ok, so the main thing i did today was update the web version, and got it to match the main version overall, with everything! I also tried to get better formatting on the text, but i think my code is just so muddled its gonna be impossible, so my plan is to start rewriting it, with the things I’ve learned, and updating the comments (as i have a lot of them, in many wrong spaces)! that should take a bit, but hopefully will pay off in the future! If you want to try the new version, its here: https://k754a.hackclub.app/
The first part is rewritten! Today, I worked on rewriting my network code with better comments, names, and methods. This took a while, as I created so many bugs, but it does work! The long part is still yet to come; however, the main things like the parser and the GUI are going to be a headache, but I should get it done! Overall a good day; ~4 files have been changed, with 6 more to go! Then after this, i want to add a history button, a settings page, and just improve performance, and formatting, then I’m done!
Performance increases, and a rewrite of the parser! Today was a nice easy day; I rewrote most of the parser, fixing a lot of bugs, and also learned how to use the performance analyzer in C++! The code is much more documented, with every line describing what it’s doing, making it super easy to follow along! The main change was an increase in speed from about 5% CPU usage to 1% and a 50MB reduction in RAM usage, allowing for 10 tabs at once, with only 61MB overall, rather than the 1000MB of something like Chrome! as well as about a 6% faster parse and load time. There is still a lot to optimize and work on, so I’ll keep doing that!
Performance analyzer and comments for our DOM! Today, I created a performance analyzer that could tell me how many microseconds it takes to get through certain programs. This helped a lot with optimization and making things faster! I also finished and optimized the DOM code! Today was a pretty basic day; I’m a bit busy over this coming week, so it’s going to be a bit more broken up, but overall a good day today!
Lots of optimization, better comments, and bug fixes! Sorry for not posting for a few days; I was super busy and didn’t really have the time. However, I’m back at it! Over the last week, I’ve been changing and updating lots of stuff. The first one was much better comments for the layout.cpp file! I still have a bit left to do, but I was getting pretty tired, so I moved onto making the engine a bit faster! One of the main things I did was use threading, passing the text off to the GPU rather than going from CPU to GPU, as well as multithreading it. This allows about 2 seconds faster search time, and I have some more ideas for changes too! The reason this took so long is the number of bugs I introduced. The Gui.cpp is huge (2000+ lines), so I want to really rewrite it, as there is SO much junk and bad coding practices lol. Overall though, it was a good day, and I think I want to start tackling JavaScript after adding a lot of QofL and fixes to a ton of bugs! Thanks for reading!
Dark mode and bug fixes (with more bugs) and HTTP error codes Today, I recorded most of my link and search handling to be better at handling URLs and links like /home. I also added a dark mode! (Super helpful on the eyes lol) Unfortunately there is a big bug, some websites will just not work anymore (like hackclub), and also websites take super long to load, this is because the images it is processing are in a buffer, and this buffer needs to finish the images of one page before the other, i think i have an idea to fix it, so I hope I will be able too soon! But overall, this update changed a lot of bugs, and I’m hoping it can be even better for the future!
Lots of bug fixes, quality-of-life changes, and the start of a rewrite! try it out! https://k754a.hackclub.app/ I’ve been still a bit busy, but over the last 2 days, I ended up fixing a lot of bugs with crashing, especially with dealing with multithreaded tab handling. Some of the quality-of-life changes I did were creating a new tab handle that allows you to go back to the new tab in history and other small changes! The biggest bug was where, if you searched something and, while it was loading, switched tabs, it would overwrite your tab to the one you switched to, not the original one you searched in. Now that is fully fixed! Overall a good day! I’m going to fully rewrite and comment all 2500+ lines of the GUI and other functions, fix a LOT of bugs, and then add settings, history, and a few other things! Thanks for reading!
Halfway done rewriting Gui.cpp—Lots of bug fixes and speed improvements! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Over the last 2 days, I’ve rewritten about half of GUI.cpp (up to the GUIRENDER function), with changes, bug fixes, and speedups that helped the engine a lot! The main speedup came from changing the way I handled the font so that I loaded it once, not every loop. This allowed a lot less SSD usage and a gradual increase of performance, up to about 50% for large sites! I worked a lot on organization and got it so that different functions are grouped together, even moving some to different scripts that fit better! The final change was reworking how images and the home button worked, and it allowed me to drop a function, as well as have much faster image batch loading times! Going through the code made me realize how many bugs and bad code I did. I fixed a lot of it, but I still got a bit to go! Overall it was a good day. My plan for everything else is to finish the rest of GUI.cpp, start work on a settings page, and try to make the parser faster still! Thanks for reading!
Local file loading, better comments, and crash fixing! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Today, I worked a TON; I got through all the comments for the start and collision events for all the buttons and things in GUIRENDER . I also added some new features and fixed some huge bugs! The new feature is file loading! You can now load PNG, JPEG, HTML, TXT, and HTM files straight from the search bar! The main fix, and what took most of my time, was the prerender. as i was working on slimming the new tab create button down, i found a lot of strange bugs, esspicaly with webpages with large amounts of images (like stardance), this lead me down a lot of changes, overall, it was a issue with how i checked to see if i wanted to load it from disk, but it was also a bunch of stuff to do with multithreading, and locking parts, but after a lot of work, i fixed it! I still need to fix up and finish GUIRENDER , but once I’m done with that, it’s off to work on the settings page. Thanks for reading!
Quality of life improvements, more comments, and finally fixed the crashes If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Ok, so first off, the huge crash I was getting was because of using a global variable for holding the link and not a local variable, and when 2 threads attempted to use it at the same time, my app would freeze and crash, so now it runs great! Some of the QofL improvements are adding keyboard shortcuts and the ability to close tabs by pressing the middle button down, like a real browser! Then there were a lot more comments that I am so close to being done! Overall a decent 2 days; I’m definitely getting a bit bored of the comments, so my plan is to work on my other project for a bit and come back later! But yeah, a good day. :)
Done all comments and released 0.1.0 ! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine I ended up going on a camping trip with the homies, so I didn’t work on this for a bit, but when I came back, I fixed a few more bugs, ended up finishing all the comments for GUI.cpp, and created release 0.1. 0! This is huge, as I was able to fix all known bugs and get a working version out! For version 1.0.0, I want to fully fix the layout engine to render close to a modern browser, add a settings page, fix performance, and add things like buttons and checkboxes on websites! Thanks for reading!
Settings button, bug fixes, scroll bar drag, and a context menu! This update was just a crazy number of features! I ended up shifting around the top area to make room for a settings button (that I will deal with soon), then I decided to allow scroll bar drag so that you can scroll through a page with the bar, not just your wheel! The big thing was the context menu; this took the most time and was the most difficult, as it was just a pain to get 2 windows rendering, but now, it works super well! I also attempted to work on getting a better layout, but I just screwed a lot of stuff up lol, so that didn’t really work out, but that’s ok!
Add context menu and startup URL (and fixed a LOT of bugs)! Sorry it’s been like 2 weeks, but after finishing my other project, I’m back at it! Over the last 2 days, I worked a LOT on the context menu and bug fixes (like loading text files into the engine, and old ones I caught working on this!). The context menu changes its options based on what things you right-click (like a real context menu), so for example, when I click a link, I get way more different options than if I clicked a tab. This allows for a lot of customization, and it’s basically fully implemented (minus a few features I want to add). The startup URL is kind of a part of that; when clicking a link, you have the choice to open it in a new window, and getting a URL that can change on startup really made it easy to add the feature! So overall a good day. What I’m going to work on next is the settings menu. Thanks for reading!
HTML text-align handling, history tab, and settings. Ok, I’m going to be honest, I looked at that settings menu and genuinely did NOTHING. It’s going to be a pain, so I’m just avoiding it till I have no choice. Something HUGE, though, I’ve gotten working is getting proper styling so that text can render in the middle and right (with way more text-align and style options to come)! This really opens the door for much more dynamic rendering text, though there are still a few bugs with it (large text goes off screen, and the home screen doesn’t apply the settings), so there is still a lot to fix, but honestly, I didn’t even think it was possible, so this is awesome! Overall a good day; I’m going to continue working on history and styles and then the settings lol.
More text formatting and positioning. (and LOTS of bug fixing) Today was a great day of work; I got height adjusting working, and this took way longer than I thought, just with all the bugs and problems I ran into, with old code I had created, but I was able to solve it all. The other notable thing is having another way to color text and the bg of text, but also, I fixed it so that none of the text falls off the edge in the positioning, so overall a good day! I’m actually so close to being done; I’ve wanted to go to 200 hours, then kind of just chill and slow down, and I’m at 14 hours left of that! Then I’ll ship. But I do want to finish the history menu, though I may leave the settings menu on pause. (for now). So yeah!
More HTML style options, browser history, and work on the Readme.md Ok, so over the last 6 hours this is what I worked on. First, I worked on adding more style options, so now you can set font size (another way) and set font boldness (like normal HTML), and you can now add custom number values to the vertical alignment (that in the vid is shown on the homepage!). I also worked on the browser history now, saving it to a txt file. You can scroll back through what you’ve searched before (and add a button to clear it next update).I also was working on the readme, making it clear and better before the ship. Overall a good day, and I think I’ll try to do the settings menu, aswell as support for buttons in the viewer (though they probably won’t do anything thanks to not having JavaScript), so yeah!
Updated context menu, Desktop Logo, Hover effects, Rework of the input bar, and bug fixes! Ok, its like 1:30 am rn lol, so im going to try to do this fast. First, i updated the context menu, the menu now has a nice drop shadow, and looks so much nicer than before (lemme know what you think about it). second, i added a basic desktop logo (a grayish black circle) that changes based on light or dark mode (the vid shows it well). Another change was hover effects! now hovering over buttons changes the color slighly, making it a bit simpler to see that your over something, and aswell as being a bit more reactive! the input bar rework allows clicking onto the bar, rather than always typing on the bar (for ctr-F coming soon!). Finally, bug fixes, i had a lot of issues with having both custom x pos, and custom y pos, but thats all fixed now! aswell as the backgrounds not updating per tab (thats now fixed too!). Finally II, i worked on the readme a bit! Overall it was a good day (with over 10 hours of work lol), and i still have a few features to add! so yeah, thanks for reading! (as well as excuse the spelling mistakes, there might be a lot lol)
Linux support!!! Over the last few days, I’ve been working on migrating the project from MSBuild to CMake, allowing it to run on both Linux and macOS (though I haven’t been able to test it lol). Linux has been tested, however, and everything works on it (except I haven’t migrated the networking, so that’s still to do!!), so there are still some things that need to be done, but it boots on my Debian VM and renders! So I’m super happy for that. Some other changes were that I got autocompletion (you’ll see it in a sec) as well as getting the open in a new tab working a bit better for both Windows and Linux!! Overall a good day!
Final work on the readme, getting a standalone windows build! Over the last few days, I’ve been hard at work getting the readme finished up, it was super tedious but now its in a good spot for a ship, and looks awesome! I’ve also gotten the windows build to be standalone! this took a lot of googling, but now with CMake, it now can run on anyone’s computer, without needing anything else!! Other than that, its been a bit of work on the Linux side, i attempted to get some sort of https working, but because its a vm, its super screwy, and i hope to be able to have a computer that has Linux on it for use, but we will see ig. Also made a YT vid https://www.youtube.com/watch?v=I-mCh9xSYeg&t=8s Overall a good day!
Ships:
Browse++ A C++ Browser Engine from Scratch. Overview: Over the course of 2 months and almost 300 hours (165 coding) of work, I built a browser engine that can download, parse, and render websites with tab handling and a lot of other cool features, from almost complete scratch! What’s a Browser Engine? A basic definition of a browser engine is a program that pulls content from a website, then takes that content, gives the elements the properties assigned in the CSS, and then renders the content on the screen. They end up being very difficult to build, as HTML and CSS can run and be run without errors, so that makes it super hard to build an engine that can properly handle, parse, and render a site with a lot of errors. How to use this? If you would like to use my browser engine, there is quite a few ways to do so! NOTE: I do not have an actual Linux laptop, so the Linux version is super buggy (and does not have any networking), but I really hope to fix that in the future, but you can use the more outdated web demo! If you don’t want to download anything, you can use the Web Demo , its a bit behind, but it shows it nicely. If you are willing to download, and you are on windows , you can go to the github here and download to try it! If you want to see the real thing, I have a video going through it here. What am I most proud of? I think the thing I’m most proud of was the amount of browser systems i was able to build from scratch , this was a super fun thing to build, but it had a lot of challenges and ups and down, and a lot of hours fixing bugs that make no sense at all lol! The other thing I’m most proud of is not using any AI on the main engine; there was a bit of AI used for the web demo, as that wasn’t my main focus, but the browser engine overall used absolutely no AI! AI usage GLM 5.2 was used to convert the Windows code to a web server for Linux (way before I supported Linux). Any code changes are clearly marked with ( // CHANGED WITH AI: ... ) if they have been changed with AI, and very little has been changed....
|
1792878475.348404
|
1793742475.348404
|
|
15129
|
Tempname: Engine by @pkncoder | Stardance
|
pkncoder
|
1
|
165.0
|
2930
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T12:06:16Z", "hours": 165.0, "multiplier": 19.97, "payout": 2930, "blessing": "neutral", "text": "—————– Ship #1 —————– - - Welcome - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💚 The current state 💫 There is still no UI, all render control is based in a JSON file. The current only renderer is a custom Deferred Renderer. Note: As this is built for 3d rendering, a modern computer, with a GPU is recommended. Modern Macbooks will run it, however it will be slower as it is basically magic that it works on them. Thank you so much! I’ve spent a lot of time on this. It may not seem like that, however when building this, I decided to do it right (as this is my 3rd attempt). I split the development into phases: Get a window Get something rendering + a camera Get object/material/texture loaders + basic scene managers + basic concept of working Create full scale (professional) renderers/scene managers/resource managers/etc. Get a UI Currently, I’m in getting everything polished in the backend. I didn’t want to move on to the UI, as I didn’t want to rush that. Rushing a UI meant missing other things. So thank you, and I really hope you enjoy. If there are any issues, please report them to the issues page on the github, and message me on slack ( @pkncoder ). Github releases: https://github.com/pkncoder/Engine/releases Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine", "repo": "https://github.com/pkncoder/Engine/", "demo": "https://pkncoder.github.io/Engine/index.html"}]...
|
[{"post_id": 72971, "ts": "202 [{"post_id": 72971, "ts": "2026-09-24T04:20:28Z", "hours": 2.5239, "text": "—————– Devlog XXVII —————– - - Release is out testing time – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not too much has happened, mostly: Updated README (resources, gallery, installation & use) Updated the landing page (added a tech-stack) Created my first release under the 1.3.x alpha title That big 1.3.x “alpha” release is the big one, as I need some help. If you could just take a bit of time, and you aren’t on linux-arm or apple-intel, could you check out the github releases and try it out, that would be great! I plan to ship tmwr, but I want some testing done first. Thank You for Reading So close!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 72516, "ts": "2026-09-23T03:30:31Z", "hours": 9.9433, "text": "—————– Devlog XXVI —————– - - Almost… there – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In order to show the capabilites, I’ve been setting up scenes for my engine to show off, and here are some of the results! It would be great to get your favorite render of these! For the full 9 renders , check out the scrapbook in the slack , as they will be there w/ a thread. Thank You for Reading Hopefully will actually ship tmwr! I’m actually getting kind of sad, I won’t be stopping development by any means, but this has been my summer (although I might not be able to get any stardance tokens, but that’s ok ig…). If you have any questions, feel free to DM me either here, or at @pkncoder on discord if that’s easier for you! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 71565, "ts": "2026-09-21T02:05:45Z", "hours": 2.1433, "text": "—————– Devlog XXV —————– – New JSON scene file 📁 - SHIP TIMEEEEE – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not that much has happened tbh. All that has really happened… Updated the README a bit more Added a new json parser to spawn the scene from that Added hot reloading of the scene So yea, next should be the ship. When updating the README on the github, I was going through the Usage section, and added a new promise for how people could add their own meshes. In this I created the idea of activeScene.json , a JSON file that listed the scene data (crazy, right?). And so, after I updated the README , I added the new loader, and made the scene reload by pressing the “ r ” key. That’s kinda it… Thank You for Reading Before shipping, I need to… Do another update of the README Create the base Releases for Mac, Windows, and Linux And test these Do a pass through TODO.md Update the landing page Shouldn’t take too long Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 69952, "ts": "2026-09-18T03:52:09Z", "hours": 8.6456, "text": "—————– Devlog XXIV —————– – i HATE shadow maps!!! - Renderer? I hardly know her? – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ WOAH A lot has happened. Previously, I had just implemented a new entity system & a new camera system. So what’s new? I present: The Deferred Renderer !!! Basically, it’s just another way of rendering. HOWEVER , it has some funzies: Mostly together render graph, just a little smthin Shadow Pass G-Buffer Pass Lighting Pass New point lights (replacing the emmissive texture searching before) Looking to add SSAO (hemisphere sampling) in the future!! Now, along with this, I just tested creating a build for windows and testing it on a friends machine, and it worked (his laptop is crap, so it ran slow, but surprisingly fast) . Along with that, I also tried the current build on mac, and it also worked, so that’s also great (I’m supprised)!! However, the real prize, is the trypophobia horrors made along the way!! That’s right! When trying to get textures to work, I ran into a ton of problems (mostly related to the alpha map & image formats) that caused major headaches. Images and videos, where they are a bit compressed, can be found below. Thank You for Reading Almost there, I still need to change up the landing page, rewrite the readme, and merge the main branch, plus try to get a way to change the 3d models for users, but I’m getting there. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 67656, "ts": "2026-09-13T20:09:19Z", "hours": 7.9958, "text": "—————– Devlog XXIII —————– – I NEED TO HURRY UP AAAA - EnTT - Table – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In my previous devlog, I stated how I was working on the new RenderGraph . I’ve now realized, that I have like until the end of the week for when I need to ship. So instead , my goal is to get this looking impressive . To start, here is what I’ve done so far : Cleaned up system inits Changed how the UUID service works (now you just access it and call generate ) Implemented a new library, EnTT Did some cleanning up Added a PointLightComponent for future use (no dev. yet) Added and implemented the CameraComponent Here are the big things: EnTT EnTT is an open-source library that handles objects within games, editors, etc. It’s creator is: Michele Caini (skypjack on github) . EnTT is a library that exposes something called an Entity Component System (ECS). Basically, instead of saving a bunch of data directly inside of one struct or class, you define an entity (a unique id) and assign that entity components. The components are what actually gives the entity meaning. New Camera If you have ever ued Blender for a bit, you would know that your camera is on the same list as your meshes. This is since, to Blender, they are inherantly the same thing (don’t quote me on that) . Previously, my camera was seperate to all of the rest of the objects. This caused the data to be split, and handling the differences made my architecture a bit weird. Now that I’ve implemented EnTT , I’ve added a CameraComponent that defines things like rotation, FoV, etc - completely erasing the need for a separate camera, and opening the doors to more flexibility. Thank You for Reading New book is great! I won’t get to use too much of it for stardance, but I’m checking out this snowglobe thing that seems like it would be the next area!! Wish me luck on the ship. I want to get it out by the end of the week so I can hopefully still cache in some stardust. Probally won’t get the computer though (high hopes for a living or smthin idk) Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Change my Rasterizer to be a Defered Renderer & implement multiple point lights UI??"}, {"post_id": 61084, "ts": "2026-09-03T20:05:33Z", "hours": 3.7325, "text": "—————– Devlog XXII —————– – BrEaKiNg ChaNGeS - 📖 NEW BOOOKKKK – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I’ve done much coding Base list This is what I have done since the last devlog: Planned out a bit more on the inner workings from no Renderer->Rendered Image Created the new Shader & Program classes Updated the workings on RendererManager Started work on the new Renderer / IRenderer class Current commit is now broken (compiles, doesn’t run Overview In my new obsidian vault , I’ve been working on creating the new database on how it all works. Through this, I’ve been using excalidraw (Obsidian) to plan out pipelines & create visuals. Currently, I have 2 main drawings: Shader & Program pipeline Renderer Pipeline The Shader & Program pipeline explains the lifetime and usage of both the Shader and Program (OpenGL program) classes. A program gets created, has shaders attached to it (deleting the shader in the process) , and then the program gets linked & binded. The Renderer Pipeline explains the lifetime and usage of a renderer. Starting from the RendererManager, go through normal rendering stuff, and will end at shutting down the RendererManager. For the inner workings of the new renderer setup, I’ll leave that for (hopefully next devlog) when I get everything working start to finish of the RendererPipeline . Thank You for Reading As for the “ New Book I got, I have just purchased “ Game Engine Architecture Vol. I ” (Jason Gregory) to specialize the program more (most likely after Stardance ends). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Plan out the RenderGraph Create the base RenderGraph class Create the BlitList Create the INodeInput & INodeOutput"}, {"post_id": 58866, "ts": "2026-08-31T13:21:49Z", "hours": 3.4211, "text": "—————– Devlog XXI —————– – My brain hurts 🧠 - Sharp like glass – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I haven’t done much coding Instead, I’ve been trying to figure out how I want my Render Graph to work. To start, what is a render graph? What I am interpreting the render graph as, issss: An API meant to simplify and provide structure to a final renderer. In the final application, the render graph will be an option for a more advanced final render editor. What I am working on now, is how it will be put together so I don’t have a mess in the future. Recently, I’ve been using Obsidian to mark everything down. This also starts a little docs. Using a mix of Obsidian and the excalidraw plugin, I’m able to write everything down and create visuals. Currently, I have a mix of nodes that are the main important ones. These nodes are just the interfaces , so they aren’t specified. They act as a blueprint for any of the full nodes. IRenderOutput - Add textures to a list of blitables IShaderInput - Base input interface IShaderOutput - Base output interface IShaderNode - Node representation of shaders IShaderPassNode - Base shader interface Thank You for Reading I haven’t been home enough to create the “big brain wall” which is sad, but at least my stuff is digital. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Setup current program for Render Graph implementation Implement IShader, IGPUTexture, etc. Create IRenderGraph for the renderers"}, {"post_id": 53552, "ts": "2026-08-24T04:42:42Z", "hours": 3.7022, "text": "—————– Devlog XX —————– – 🌟I have the best one liners 🗿– 🥀 Now I have to be smart ??? 🧠 – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ For the quick overview: Fixed the shadow map issue ( so angry about this, see below ) Fixed an issue with textures not caching Got the very base implementation of Uniform Buffers To start off, in the previous devlog I mentioned I was re-writing the shadow mapping . Shadow Mapping - Rendering a 3d model with the light being the eye. Everything that it can see is not in shadow, everything else is. quick explanation I was having issues with getting the shadows to work correctly. I had ideas for issues, including: (the model matrix , the renderPackets being in a bad order , the far plane ). IT TURNS OUT It was none of these. Whenever I made the code to compile a geometry shader along the vertex & fragment shader, I just copied my old one and spliced in the code. Turns out I forgot to swap some variables, and I was putting code in places it should NOT be at. No idea why it didn’t crash, but it fixed my shadow issues very quick . As for UBOs, I’ll talk about them in a future devlog, when I have everything planned out. Thank You for Reading As I said with “Planning out” everything, I’m going to set up a whiteboard - I’ll have to move my 🏳️🌈 pride flags 🏳️⚧️ :( - Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Refactor Build the big brain wall Do some thinking 🥀 Git Commits🗿 Weird position issue Saving now, I am so angry about this. I was compiling and overwrigting the wrong code :( Made the testing for shadows a bit better, and changed the rendering a bit Fixed issue with textures and full models not actually caching Removed anoying debug line for shadow transform matricies Working on getting the ubos working’ Got it to push First test ubos"}, {"post_id": 52406, "ts": "2026-08-22T15:11:34Z", "hours": 4.0344, "text": "—————– Devlog XIX —————– - 🌲 Textuers 🧚♀️ - 👩💻 Shadoowwsss 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To recap on what I did: Got the program to launch to black screen I needed to inject the Asset Manager to a class Got objects loading correctly without shadows Got textures to load Started work on fixing the shadow map Nothing too crazy has been changed, the texture issues were about some compatibility problems and not uploading to the same index. The shadow values are uploaded to a 3d texture, where to calculate if an object is in sight or not, we commit triangles based on their position. The problem now is about the far plane, and hitting triangles that weren’t in shadow. I’m not sure what the problem is, but I’m going to do a bit more looking into it. Thank You for Reading :3-blahaj-spinning I still have to fix the shadows issue (obviuosly) but then I can move onto formatting the data (putting it into buffers, creating wrappers, etc).!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms Refactor / clean Create the real Render Graph? 🥀 Git Commits (shortened)🗿 Commits: https://github.com/pkncoder/Engine/commits/Phase-IV/ Most Recent: Temporary Save"}, {"post_id": 50519, "ts": "2026-08-19T18:20:39Z", "hours": 5.6344, "text": "—————– Devlog XVIII —————– - 🌲 Trees 🧚♀️ - 👩💻 SO MUCH REWRITING 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ These last few days, I’ve been working on getting my Rasterizer (drawing triangles of a model on screen and coloring them) working. The big changes that I did include: Fixing an issue with textures not loading Updated the Interface for every Renderer. Implemented the extract / prepare / dispatch pipeline into the Rasterizer for real now. Started working on the base ideas of a “Shader Graph” The issue with textures was just moving a line like 3 lines lower . I was freeing the image data before saving it (oops) . The updated interface is the IRenderer class. Each Renderer bases off of the class, supplying it with a framework so each Renderer can be talked to the same way. Here are some of those functions: beginFrame - Clear previous frame data and prepare for a new frame extract - Take raw scene data ( camera , renderables ) and convert it into packets for the next step. prepare - Take each packet from extract and turn them into draw commands for dispatch. dispatch - Take each draw command and send a draw call, along the way binding any textures & uniforms. postProcess - Take the frame and post-process it. This may be removed. present - Take the rendered frame and show it to the screen ( blit it ). To do a quick review on what the Shader Graph is - it is a collection of “nodes,” each with their own inputs and outputs that connect together to render out a frame. I’m still a bit confused, but I’ve been watching presentations on the topic from companies like Unity & Activision . Thank You for Reading Yea, I know it’s been a while since my last devlog. I’ve been making some posts in slack about my Path Tracer, since I spent a little time on that. I’m looking at the timing for everything , the hope is to ship this at the end of Phase-IV and hope that I can get a UI working before too late. I’m hoping I can get enough stardust to pay for a new laptop, but idk that’s a long shot. I still have about 25 more hours if I get a 16x mult (which I can only hope for) before I would hit the mark for the FW 12, which isn’t crazy (the mult is tho). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Stop the program from crashing to reach a black screen Rewrite shaders to allow for correct models wo/ shadows Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms 🥀 Git Commits (shortened)🗿 https://github.com/pkncoder/Engine/commits/Phase-IV/"}, {"post_id": 45347, "ts": "2026-08-11T18:54:11Z", "hours": 2.9381, "text": "—————– Devlog XVII —————– - Strange Hours - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To start off, I did not work directly on my application, but the online demo . It’s like working on the website, but through another editor sometimes. The goal of the Path Tracer is to eventaully get it clean & quick enough to be real-time. This is the first of the 5 renderers that I will be making. I was working on my online shadertoy DEMO for the Path Tracer, specifically the denoiser. The name of the denoiser I am using is the “Edge-Avoiding Á Trous Wavelet Transform” . As a quick overview: It applies a blur “ with holes ” to allow for less to no image distortion Fast enough for realtime Includes “ weights ” based on (in my code): Normal , Depth , and Color . The larger the difference between the center pixel and the scanned pixel * (kernel), the more weight is applied, lessening the amount of blur. This is amazing, however when the camera moves , the denoiser assumes that the current and previous pixel are in the same world postion (when it isn’t). This causes errors when trying to overlay the image and gather data. This is why we track the motion of the camera, creating a vector to get the same world position pixel. I got this wrong on one of the first attempts, the last attachment (videos are compressed) shows that fun video (warning for those who get motion sick). With this, I am able to blur the image, and with some more techniques, I can get rid of “ghosting.” Thank You for Reading In the videos, I rendered them in fullscreen 4k on my better laptop+GPU, don’t worry about your system being too slow, just don’t fullscreen it <3 (the development was done on my lower end mac). The hours logged are from refactoring the project after the last devlog, and editing the code when I didn’t do it in shadertoy’s editor. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 BREAKING CHANGE - Refactored Buffer & GPUResource managers + IRenderer - Code has been broken for a bit but womp womp Shadertoy shaders path tracer https://www.shadertoy.com/view/7fBSzR"}, {"post_id": 44514, "ts": "2026-08-10T10:13:23Z", "hours": 4.0428, "text": "—————– Devlog XVI —————– So long , gay Bowser ⭐️ – IRenderer, hardly know her? - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ⭐️ BEFORE ANYTHING - Thanks so much to @AVD for the super star, wasn’t expecting it and I really appreciate it 👏 👏. Now, for what I did: Dealt with an issue in Obsidian, as apparently there was “minor rendering performance improvements.” This is FALSE :( - I just downgraded the version Created the new BufferManager to handle UBOs, SSBOs, VBOs, EBOs, etc. + Dynamic, Static, and Stream buffers. Integrated the RenderTarget & ShaderPass system from PathTracer straight into IRenderer + added base utilities to it. Did some formatting Overall the two big things that I did was the new Buffer system & the updated IRenderer interface. For the new Buffers, previously I had UBOs (dynamic values) & SSBOs (big mostly static information blocks) set up in seperate files, that BufferManager returned. Now, every buffer is a single struct called GPUBuffer , and GPUBuffer has a type, and a usage (see attached photo). Now everything is centralized on that. For the new IRenderer interface, now there are RenderTargets - textures that shaders write to as output - and ShaderPasses - A pass of a shader. These can be added to a registry, keyed by a UUID (big number, in this case). Thanks for reading Again, thanks so much to AVD for the super star! I’m excited for when I can finally start writing my shaders, it’s getting closer & closer!! The fancy Path Tracer will be cool and all, but I have big plans for the Ray Marcher!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 Fixed an obsidian issue I ran into, “Minor rendering performance improvements.” was NOT true, broke almost the entire canvas. Fixed it though + new png Created the new buffer managegr system, I need to go through and make changes. Also, on launch there was more blacked out sections, different every launch :( New IRenderer setup for the render targets & render handles Refactor 1-6 Refactor 7-9 for BufferManager"}, {"post_id": 42396, "ts": "2026-08-07T02:46:23Z", "hours": 5.3317, "text": "—————– Devlog XV —————– – Temp code go brrrrr 🔋 - New term : “Far Landing” – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ I tried getting this out before 4 hours, but it just –wouldn’t__ happen. Weird errors kept popping up ( mostly being my fault) . Here’s a list of what I did: Figured out generally how I was going to deal with uploading and caching meshes + textures Put the new GPUResourceManager class into place to do the previously mentioned job Started reworking the renderer pipeline (NOT THE RENDER PIPELINE) on CPU side, and set up the interface class with that Patched together the old Rasterizer renderer to work with the new IRenderer pipeline Fixed errors throughout Split up normal & bump textures Planned out how I will deal with all the different textures on the shader side, cutting the checks out at shader compile time Yea, I know, it’s a lot . It just felt wrong to create a devlog in the middle of everything, since up until after fixing errors I had nothing to show for it. :( I ran into this errors when fixing those errors, where the entire model (I was using the Sponza scene, check the attached video ) was banded, where parts “didn’t exist” and the other bands did . This reminded me a lot of the “Minecraft Farlands” specifically the pocket edition ones. 🔥 What didn’t I do? 💥 To keep this brief: Fully split up the SSBO system in the BufferManager Reimplement good use cases of UBOs (although I did put in place double buffering) Add the more sophicticated data handling in the PathTracer (as I commented it’s existance out so I could complile). Figure out how shadow mapping is going to be cleaned up in the Rasterizer. ❤️ Thanks for reading! These devlogs have been getting more attention, and I’m getting closer to doing a rebrand to finally get my point and final ideas across! :3 Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git commits 🗿 Patched in the “new” buffer system - Really just to get it to compile before I do anything big. Attempting to run the app to test resources & scene Well it compiles, runs, and renders. I still need to go through all the models, HOWEVER, I am having an issue with like 3 models in sponza and bump UGH Well, I checked Phase-III, and the issue with those models are there too, probally some texture coord issue or the bump map is messed up (I’ll check in blender), BUT THEN ON FIRST LOAD THE MODEL FRA LANDED????"}, {"post_id": 40154, "ts": "2026-08-03T15:39:36Z", "hours": 3.0697, "text": "—————– Devlog XIV —————– The Planning - The possible NEW NAME??? - The New Project!! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ So What Happened? 📸 I haven’t done much pure coding, HOWEVER , I am getting ready for some large-scale rewrites and additions to the code. For what has happened: Fully sectioned the resource - disk - and scene - cpu/logic - directories (folders) so there wasn’t any GPU actions taken place. Refactored resource and scene directories Re-implemented Application into CMakeLists so I can compile and link that file. Did some planning for the huge renderer rewrite that is coming up. Along with all of that, I came up with a possible name for the application (since, surprisingly, Tempname: Engine is a temp name) I had it when when gazing at the sun through some clouds over a feild. Although it is super basic, so I’m going to have to play with it. ❤️ Thanks for Reading!!! I might have to take a bit of a break from progress on this project, as I have a website that I’m making for my local fire dept. (look out for a new stardance project)! I’m also planning on doing some re-marketing / re-branding (idk what to call it) to change the descriptions of the project (ex. the “To recap section on my devlogs, and the landing page). I’ve been getting more questions on it, and my current explanations are a bit too much. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🗿 Commits 🥀 (top-oldest : bottom-newest) No more mention of buffer manager or any uploading to gpu in scene & assets. Meshes are now split up from models in the cache, models hold refrences to asset handles to meshes. Refactored and fixed errors in scene and resources. The program won’t work, as only scene and resources are being compiled & linked Added application back into the mix & fixed the scene loading section. Did some planning on how a model will go from spawn to render"}, {"post_id": 38683, "ts": "2026-08-01T06:03:47Z", "hours": 3.0264, "text": "—————– Devlog XIII —————– Spent some time off from working on this project, started the beginnings of another one. Finally ended up getting the interest to come back to this one To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💡 Overview Commit message for this devlog: BREAKING CHANGE - New asset system, new scene system, renamed SceneLoader to PrefabSpawner, still need to update rest of code with temp fix until reworking for new system. ✨ What did I do? Previously, the asset manager did still handle caching already loaded assets (models, materials, textures), however the implementation was not professional and temporary: Caching based on a string key (slow) Broke the “single responsibility principal” many times by uploading to the GPU & constructing Scene objects Now, I am using AssetHandles (UUIDs) for caching, and I no longer uploading to the GPU in AssetManager. ❌ What didn’t I do? This new system is a good start for realigning and separating the different parts of the program, but is only about a third of the work. For what I still need to do, this is what follows: Stop uploading to the GPU in the PrefabSpawner (scene) Fix the renderer and find where I will upload the mesh & texture data. Check for compilation and working across the whole project. Change every instance of AssetManager to using AssetHandles. Once I have these, I can move onto redoing the renderers and FINALLY start working on the “fun stuff” ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 36073, "ts": "2026-07-27T22:33:56Z", "hours": 1.5831, "text": "—————– Devlog XII —————– I haven’t done as much programing recently, but yesterday I wanted to finish what I needed to do quickly, as it wouldn’t take that long. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 🎯 UUIDs For a quick explanation of what a UUID is: UUID stands for Universally Unique Identifier. In practice it is a random alphanumeric (a-z,0-9) ID between 64-128 bits. For my project, I used an unsigned 64 bit integer (no negative numbers). It isn’t exactly what the standard for a UUID is, as it isn’t alphanumeric, but I think for now 18.4 quintillion ids are just fine. ⬆️ What Next?? Now that I’ve finished this, the next step is to gut & rewrite the entire asset managing system. I need to redo how files are found, how data is stored, how they are retrieved. Basically the CRUD (create, read, update, delete) line and more. ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 32890, "ts": "2026-07-22T10:48:43Z", "hours": 6.8567, "text": "—————– Devlog XI —————– I haven’t been programming as much, as marching band 🎺 has started, so I’ve had less time. But now I can do the really exiting stuff! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). What did I Do? As I mentioned in the last devlog, I have been working on doing a full passthrough of the entire project to get ready for major rewrites. I have completed by refactor checklist, so I have gone through ever cpp file to: Fix warnings Check object method & attribute visibility Check const, static, and inline declarations Change the placement and formatting of method Going through every line of code to do minor logic changes & change formatting Rename methods, attributes, functions, and variables to better names & names w/ personal conventions. Add comments everywhere Change the placement of the #include statements (main header file, object interfaces, project files, project packages, extra C++ headers) Run a full clean, compile, and test of the application The LIE Technically I didn’t go through every file, as I left AssetManager & Rasterizer . Since these will be completely rewrote soon I felt like it was a waste. What next? Now that I have finished cleaning up the code base, the next projects are to: Move to using UUIDs instead of an entity index in scene Gut AssetManager and rewrite it Change to using metafiles instead of a preditermined path to assets Rework the scene class Extend IRenderer and get ready for the fun part! Thanks for reading! I tried to keep this one shorter for y’all. I don’t normally get too much attention to my devlogs, but I would be more than happy to answer any questions, as there is so much more to this project that even the landing page doesn’t cover (WIP). If you’re curious, feel free to reach out on slack (pkncoder), and here are some extra links about the project: Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 29073, "ts": "2026-07-15T18:41:40Z", "hours": 4.3689, "text": "—————– Devlog X —————– I’ve been working on refactoring my project for the last few hours. Part of how I code includes: Comments throughout to explain the code, strict formatting throughout, and trying to help the compiler with “const” and “inline” keywords. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). The process My process of refactoring usually happens once I finish a new addition, however I haven’t been adding new things for a while. Now that I’ve added a new addition to the project (Event system & LayerStack), I want to go through the entire codebase under the src/ directory (not the glsl shaders). Project code stats (src/ directory) Running the command line utility “cloc” on my src/ directory to count code stats, I get these counts: ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 23 646 464 1930 C/C++ Header 47 506 205 1302 ------------------------------------------------------------------------------- SUM: 70 1152 669 3232 ------------------------------------------------------------------------------- Not very big yet, although that will be increased once I get to redoing the entire rendering engine. What I have done Now, back to my refactoring. I got through the basics: removing warnings, double checking the public/private attribute declarations on classes & structs, setting const on functions & params, setting inline on functions. The checklist This is my entire checklist for refactors, this is my first project using it, so it is still being worked on: ### Refactor Checklist (src/) 1. [x] Fix warnings 2. [x] Fix public vs. private 3. [x] Make functions const when needed 4. [x] Make function params const when needed 5. [x] Make functions inline when needed 6. [ ] Fix placement of functions 7. [ ] Refactor step by step in code 8. [ ] Rename things 9. [ ] Add comments 10. [ ] Place the \\#includes in the right spots 11. [ ] Fix file tree 12. [ ] Run ```./fullTest``` 13. [ ] Update the obsidian canvas & png 14. [ ] Update the website Eventually I will also need to make one for the shaders too, as they are sometimes more technical on the code side. Conclusion That’s all that I’ve been doing, thanks for reading. Here is my Github repo & landing page for this application: Source Code: https://github.com/pkncoder/Engine Landing Page: https://pkncoder.github.io/Engine"}, {"post_id": 27729, "ts": "2026-07-13T15:23:24Z", "hours": 8.2792, "text": "Devlog IX I have been working the past week to get the Event system working & trying to fix pointer / referance issues (there are still a few I haven’t figured out). But now I have a working event system. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). LayerStack recap In my previous devlog, I explained the Layer Stack 🥞, a top-down structure for controlling object ownership and main loop execution. Every frame, the layer stack runs the first layer to poll camera movement inputs (temp), and then next layer is ran to render out the frame through the RendererManager. Events This is great, but where the layer stack really shines is the event system . Events are reactions to when anything happens, keys being pressed / released, the window resizing, etc. When an event is dispatched, the layerstack stops, loops through each layer running it’s “onEvent” function to let that layer react (ex. the final render needing it’s texture resized). If a layer doesn’t want below layers to react to the event, it can consume it, stopping the event dispatching and continuing execution. Struggle and Pointer Nonsense I struggled a ton with the event state not updating correctly, and the camera not giving the right values to render the triangles. It turned out to be objects/classes duplicating, and not being able to update. There is so many debug messages in the terminal 😭 Ends This was all front-end changes (no change in the render), but now there is a better system put in place (back end changes). Github repo: https://github.com/pkncoder/Engine/tree/Phase-IV Landing page / Website: https://pkncoder.github.io/Engine/"}, {"post_id": 23348, "ts": "2026-07-06T07:48:30Z", "hours": 11.7481, "text": "Tempname: Engine update. I am so tired To keep it all contained, since the last devlog I have: Merged Phase-III into main & created a Phase-IV branch Changed the landing page’s color palette Modified the target architecture 4 times (3 committed) Created a rudimentary SceneManager class Implemented an EngineContext class to distribute ownership & to help with data flow+containment Implemented a layer system to help cut down on application & to contain/host the events system. Finally put in the system directory (folder) in the architecture that will host any simulations, computations, and animations. Currently it is the planned details for the camera system. The biggest thing that I have done so far is the layer system & state/context creation. The context of the engine lets managers talk to each other so everything can work together, while keeping everything contained. The state is split up into two parts, state & settings (or state & configuration). The state is meant for information that is meant to change throughout runtime, and the engine depends on it to render the right final result (ex. camera state & position). The settings part is meant for variables that won’t change too much, but if they do it is something that is a large modification to the runtime (ex. window title, rendering engine). The layer system is like a regenerating stack of pancakes 🥞. Before you cast your pancake regeneration spell we all have, you have to prep the pancakes with butter and syrup. Each time you finish the pancakes, a new round starts and you eat them again. Then, once you are done, you have to disable the regeneration spell. The layer system acts the same, but computationally & layers instead of pancakes. Each layer goes through the lifecycle of onAttach -> onUpdate -> onDetach. By far the biggest reason for the layer system is the event system, but I’ll leave that for the next devlog. Here is the github page: https://github.com/pkncoder/Engine/tree/Phase-IV Here is the landing page: https://pkncoder.github.io/Engine/ I still have soooo much to do, especially with & after the event system. I’ve completed most of the easy stuff for Phase-IV. Here is the current architecture & a site screenshot."}, {"post_id": 19362, "ts": "2026-06-30T17:15:23Z", "hours": 5.5031, "text": "Changed my mind on shipping, however I do now have a landing page! I still have to do things like changing the color palette (it’s alright now, but I want something different I think), adding little details to really sell the “Rendering” aspect of Tempname: Engine, etc. etc. Here’s the landing page, please check it out & give any feedback! https://pkncoder.github.io/Engine/index.html Since I changed my mind on shipping, here are those images that I was going to use!"}, {"post_id": 18091, "ts": "2026-06-29T02:57:38Z", "hours": 8.6825, "text": "Just got done with some renders on the engine, been working all day on implementing the things needed. Along with the images, I added: Shadow Mapping for the Rasterizer (only 1 emitter) Tone mapping to the Rasterizer Fog to the Rasterizer A vignette effect to the Rasterizer Transparency maps to the Rasterizer Settings & presets for the renders A new “Queer Room” modeled by me in blender for the Path Tracer (going to post it on ship). I honestly have had so much fun with this. Currently working on a landing page to go in place of my “Online Demo” on stardance (since this isn’t that kind of application D: ). Here’s the github: https://github.com/pkncoder/Engine/tree/Phase-III ! At some point I’ll be redoing the README as well for more info. Also, these images aren’t even the best ones, I’ll leave that for the ship :3"}, {"post_id": 16960, "ts": "2026-06-27T15:16:34Z", "hours": 1.2764, "text": "I’ve done a bunch more Todos in my code, getting ready for shipping Phase-III. However, I realized I forgot in my planned Architechture about Acceleration structures (which are very important). So I planned that out! Currently just: BVH (Bounding Volume Heirarchy) for Ray & Path Tracing SVO (Sparse Voxel Octree) for Ray Marching (Hypothetically) These acceleration structures make rendering methods like Ray & Path Tracing, Ray Marching, Ray Casting, etc. feasible for real-time by “cutting out” data (objects) similar to how a Binary Tree works. Next is more clean up, then creating models for some renders I can use in the banner of this + the github Readme, and finally creating a landing page to put in place of the online demo! Then I can finally ship!!!! Here’s the github (ignore main branch): https://github.com/pkncoder/Engine/tree/Phase-III ."}, {"post_id": 16713, "ts": "2026-06-27T04:43:42Z", "hours": 17.5281, "text": "Working on finishing the current development phase, of my project, which also means finally shipping Tempname Engine: Phase-III. I wanted to plan out Phase IV a little bit more, which will focus on: Getting a structured scene management system Improving the Renderer (ability & architecture) + adding 2 new Renderers Adding scene loading & serialization (and “asset serialization” which is weird name) Here is the current & planned architectures of Phase III & Phase IV, at some point I need to redo Phase-III’s to match the style, but I’m tired of working in obsidian to not even get the hours logged."}, {"post_id": 11788, "ts": "2026-06-19T05:50:41Z", "hours": 7.56, "text": "I have finished getting albedo (basic color) textures loading! To get this working I had to redo how meshes were loaded completely, but I finally finished that. The backrooms model was an issue, as I needed to find one that would work, and then fix it in blender, but I’m glad it’s rendering! As for the promised model of the oiiaioooooiai cat 🐈 (Ethel), I did get the model & textures, but I will have to mess with it more, as the model & texture do not line up yet. If you would like to try for yourself, the github repo is here: https://github.com/pkncoder/Engine/tree/Phase-III . The repo is large currently, as I still need to compress the files, or remove them (gitignore). The path tracer is currently disabled , as I need to swap the textures to handles, and then modify the path tracer to work with the textures. It will look really good once I get that working though!"}, {"post_id": 10063, "ts": "2026-06-16T17:20:32Z", "hours": 2.4, "text": "I haven’t done much work on getting textures or anything, however I was able to re-do the shaders. Just some framework stuff like abstracting the shader models so each renderer can implement them to their need. I also spent some more time getting some generic formatting stuff like naming conventions (mostly naming conventions) I also made an “architecture” diagram, as I was requested for one (plus I needed one anyways). Anything purple (besides the background) is a temporary connection/file. Anything green needs re-worked The “Services” group contains files that are completely static in use, and are accessible globally. It’s still a bit messy, but that’s partly due to the temporary/need re-worked files. There’s a still some spaghetti code due to that. The shader files do look a lot like spaghetti as well, but that is mostly do to positioning. It’s pretty basic, as the ui/ and system/ dirs aren’t in there either (system/ is simulations + any computations that would need to be done (ex. translating data for one renderer to another)). I made the image in Obsidian’s canvas, sadly the wakatime add-on wasn’t working for me, so that time didn’t get counted, but oh well. And if the image is cut-off for you, the Services block has Input.cpp, Timer.cpp, and Logger.cpp. I still have a lot of shader work to redo, but I might try to get textures working soon for the Rasterizer, as I’m wanting them more & more."}, {"post_id": 9647, "ts": "2026-06-16T01:45:44Z", "hours": 19.2833, "text": "Hey everyone, I’m Kia! 👋 I’m currently building a custom 3D Engine from the ground up. While it’s definitely a fun passion project, it’s designed to be a genuinely powerful and useful tool. The scope of this project is pretty massive, but here are the main goals I’m chasing right now: 🎨 Multi-Style Rendering: I want this engine to render scenes in highly stylized ways using a variety of techniques. Currently planning support for: Rasterization Path Tracing Ray Marching Ray Casting (Voxels) Simple and easy: No one likes being thrown to the wolves. The engine will feature a clean, simple UI that scales in complexity as you learn how to use it, rather than overwhelming you right at the start. Accessible Animation: Built-in tools for animations and simulations that are actually easy to understand and use. 🛠️ Latest Update: Path Tracer Rewrite I recently did a complete rewrite of the Path Tracer! This was a massive step to future-proof the engine. It now supports multiple shader passes, debug textures, and is fully prepped for texture mapping. Why am I so excited about getting textures working? Because the second they drop, I am immediately rendering 1) The Backrooms 🟨 and 2) the spinning “Oiiaioooooiai” cat 🐈. Texture support should be ready very soon! Want to check it out (please do)? 💻 GitHub: Check out the code and the todo.md to see what I’m working on next: https://github.com/pkncoder/Engine/tree/Phase-III 🎮 Live Demo: Try out my almost real-time Path Tracer right in your browser (click and drag to look around): Shadertoy Path Tracer Demo: https://www.shadertoy.com/view/7fBSzR"}]...
|
Title: Tempname: Engine by @pkncoder | Stardance
Title: Tempname: Engine by @pkncoder | Stardance
Devlogs:
Hey everyone, I’m Kia! 👋 I’m currently building a custom 3D Engine from the ground up. While it’s definitely a fun passion project, it’s designed to be a genuinely powerful and useful tool. The scope of this project is pretty massive, but here are the main goals I’m chasing right now: 🎨 Multi-Style Rendering: I want this engine to render scenes in highly stylized ways using a variety of techniques. Currently planning support for: Rasterization Path Tracing Ray Marching Ray Casting (Voxels) Simple and easy: No one likes being thrown to the wolves. The engine will feature a clean, simple UI that scales in complexity as you learn how to use it, rather than overwhelming you right at the start. Accessible Animation: Built-in tools for animations and simulations that are actually easy to understand and use. 🛠️ Latest Update: Path Tracer Rewrite I recently did a complete rewrite of the Path Tracer! This was a massive step to future-proof the engine. It now supports multiple shader passes, debug textures, and is fully prepped for texture mapping. Why am I so excited about getting textures working? Because the second they drop, I am immediately rendering 1) The Backrooms 🟨 and 2) the spinning “Oiiaioooooiai” cat 🐈. Texture support should be ready very soon! Want to check it out (please do)? 💻 GitHub: Check out the code and the todo.md to see what I’m working on next: https://github.com/pkncoder/Engine/tree/Phase-III 🎮 Live Demo: Try out my almost real-time Path Tracer right in your browser (click and drag to look around): Shadertoy Path Tracer Demo: https://www.shadertoy.com/view/7fBSzR
I haven’t done much work on getting textures or anything, however I was able to re-do the shaders. Just some framework stuff like abstracting the shader models so each renderer can implement them to their need. I also spent some more time getting some generic formatting stuff like naming conventions (mostly naming conventions) I also made an “architecture” diagram, as I was requested for one (plus I needed one anyways). Anything purple (besides the background) is a temporary connection/file. Anything green needs re-worked The “Services” group contains files that are completely static in use, and are accessible globally. It’s still a bit messy, but that’s partly due to the temporary/need re-worked files. There’s a still some spaghetti code due to that. The shader files do look a lot like spaghetti as well, but that is mostly do to positioning. It’s pretty basic, as the ui/ and system/ dirs aren’t in there either (system/ is simulations + any computations that would need to be done (ex. translating data for one renderer to another)). I made the image in Obsidian’s canvas, sadly the wakatime add-on wasn’t working for me, so that time didn’t get counted, but oh well. And if the image is cut-off for you, the Services block has Input.cpp, Timer.cpp, and Logger.cpp. I still have a lot of shader work to redo, but I might try to get textures working soon for the Rasterizer, as I’m wanting them more & more.
I have finished getting albedo (basic color) textures loading! To get this working I had to redo how meshes were loaded completely, but I finally finished that. The backrooms model was an issue, as I needed to find one that would work, and then fix it in blender, but I’m glad it’s rendering! As for the promised model of the oiiaioooooiai cat 🐈 (Ethel), I did get the model & textures, but I will have to mess with it more, as the model & texture do not line up yet. If you would like to try for yourself, the github repo is here: https://github.com/pkncoder/Engine/tree/Phase-III . The repo is large currently, as I still need to compress the files, or remove them (gitignore). The path tracer is currently disabled , as I need to swap the textures to handles, and then modify the path tracer to work with the textures. It will look really good once I get that working though!
Working on finishing the current development phase, of my project, which also means finally shipping Tempname Engine: Phase-III. I wanted to plan out Phase IV a little bit more, which will focus on: Getting a structured scene management system Improving the Renderer (ability & architecture) + adding 2 new Renderers Adding scene loading & serialization (and “asset serialization” which is weird name) Here is the current & planned architectures of Phase III & Phase IV, at some point I need to redo Phase-III’s to match the style, but I’m tired of working in obsidian to not even get the hours logged.
I’ve done a bunch more Todos in my code, getting ready for shipping Phase-III. However, I realized I forgot in my planned Architechture about Acceleration structures (which are very important). So I planned that out! Currently just: BVH (Bounding Volume Heirarchy) for Ray & Path Tracing SVO (Sparse Voxel Octree) for Ray Marching (Hypothetically) These acceleration structures make rendering methods like Ray & Path Tracing, Ray Marching, Ray Casting, etc. feasible for real-time by “cutting out” data (objects) similar to how a Binary Tree works. Next is more clean up, then creating models for some renders I can use in the banner of this + the github Readme, and finally creating a landing page to put in place of the online demo! Then I can finally ship!!!! Here’s the github (ignore main branch): https://github.com/pkncoder/Engine/tree/Phase-III .
Just got done with some renders on the engine, been working all day on implementing the things needed. Along with the images, I added: Shadow Mapping for the Rasterizer (only 1 emitter) Tone mapping to the Rasterizer Fog to the Rasterizer A vignette effect to the Rasterizer Transparency maps to the Rasterizer Settings & presets for the renders A new “Queer Room” modeled by me in blender for the Path Tracer (going to post it on ship). I honestly have had so much fun with this. Currently working on a landing page to go in place of my “Online Demo” on stardance (since this isn’t that kind of application D: ). Here’s the github: https://github.com/pkncoder/Engine/tree/Phase-III ! At some point I’ll be redoing the README as well for more info. Also, these images aren’t even the best ones, I’ll leave that for the ship :3
Changed my mind on shipping, however I do now have a landing page! I still have to do things like changing the color palette (it’s alright now, but I want something different I think), adding little details to really sell the “Rendering” aspect of Tempname: Engine, etc. etc. Here’s the landing page, please check it out & give any feedback! https://pkncoder.github.io/Engine/index.html Since I changed my mind on shipping, here are those images that I was going to use!
Tempname: Engine update. I am so tired To keep it all contained, since the last devlog I have: Merged Phase-III into main & created a Phase-IV branch Changed the landing page’s color palette Modified the target architecture 4 times (3 committed) Created a rudimentary SceneManager class Implemented an EngineContext class to distribute ownership & to help with data flow+containment Implemented a layer system to help cut down on application & to contain/host the events system. Finally put in the system directory (folder) in the architecture that will host any simulations, computations, and animations. Currently it is the planned details for the camera system. The biggest thing that I have done so far is the layer system & state/context creation. The context of the engine lets managers talk to each other so everything can work together, while keeping everything contained. The state is split up into two parts, state & settings (or state & configuration). The state is meant for information that is meant to change throughout runtime, and the engine depends on it to render the right final result (ex. camera state & position). The settings part is meant for variables that won’t change too much, but if they do it is something that is a large modification to the runtime (ex. window title, rendering engine). The layer system is like a regenerating stack of pancakes 🥞. Before you cast your pancake regeneration spell we all have, you have to prep the pancakes with butter and syrup. Each time you finish the pancakes, a new round starts and you eat them again. Then, once you are done, you have to disable the regeneration spell. The layer system acts the same, but computationally & layers instead of pancakes. Each layer goes through the lifecycle of onAttach -> onUpdate -> onDetach. By far the biggest reason for the layer system is the event system, but I’ll leave that for the next devlog. Here is the github page: https://github.com/pkncoder/Engine/tree/Phase-IV Here is the landing page: https://pkncoder.github.io/Engine/ I still have soooo much to do, especially with & after the event system. I’ve completed most of the easy stuff for Phase-IV. Here is the current architecture & a site screenshot.
Devlog IX I have been working the past week to get the Event system working & trying to fix pointer / referance issues (there are still a few I haven’t figured out). But now I have a working event system. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). LayerStack recap In my previous devlog, I explained the Layer Stack 🥞, a top-down structure for controlling object ownership and main loop execution. Every frame, the layer stack runs the first layer to poll camera movement inputs (temp), and then next layer is ran to render out the frame through the RendererManager. Events This is great, but where the layer stack really shines is the event system . Events are reactions to when anything happens, keys being pressed / released, the window resizing, etc. When an event is dispatched, the layerstack stops, loops through each layer running it’s “onEvent” function to let that layer react (ex. the final render needing it’s texture resized). If a layer doesn’t want below layers to react to the event, it can consume it, stopping the event dispatching and continuing execution. Struggle and Pointer Nonsense I struggled a ton with the event state not updating correctly, and the camera not giving the right values to render the triangles. It turned out to be objects/classes duplicating, and not being able to update. There is so many debug messages in the terminal 😭 Ends This was all front-end changes (no change in the render), but now there is a better system put in place (back end changes). Github repo: https://github.com/pkncoder/Engine/tree/Phase-IV Landing page / Website: https://pkncoder.github.io/Engine/
—————– Devlog X —————– I’ve been working on refactoring my project for the last few hours. Part of how I code includes: Comments throughout to explain the code, strict formatting throughout, and trying to help the compiler with “const” and “inline” keywords. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). The process My process of refactoring usually happens once I finish a new addition, however I haven’t been adding new things for a while. Now that I’ve added a new addition to the project (Event system & LayerStack), I want to go through the entire codebase under the src/ directory (not the glsl shaders). Project code stats (src/ directory) Running the command line utility “cloc” on my src/ directory to count code stats, I get these counts: ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 23 646 464 1930 C/C++ Header 47 506 205 1302 ------------------------------------------------------------------------------- SUM: 70 1152 669 3232 ------------------------------------------------------------------------------- Not very big yet, although that will be increased once I get to redoing the entire rendering engine. What I have done Now, back to my refactoring. I got through the basics: removing warnings, double checking the public/private attribute declarations on classes & structs, setting const on functions & params, setting inline on functions. The checklist This is my entire checklist for refactors, this is my first project using it, so it is still being worked on: ### Refactor Checklist (src/) 1. [x] Fix warnings 2. [x] Fix public vs. private 3. [x] Make functions const when needed 4. [x] Make function params const when needed 5. [x] Make functions inline when needed 6. [ ] Fix placement of functions 7. [ ] Refactor step by step in code 8. [ ] Rename things 9. [ ] Add comments 10. [ ] Place the \#includes in the right spots 11. [ ] Fix file tree 12. [ ] Run ```./fullTest``` 13. [ ] Update the obsidian canvas & png 14. [ ] Update the website Eventually I will also need to make one for the shaders too, as they are sometimes more technical on the code side. Conclusion That’s all that I’ve been doing, thanks for reading. Here is my Github repo & landing page for this application: Source Code: https://github.com/pkncoder/Engine Landing Page: https://pkncoder.github.io/Engine
—————– Devlog XI —————– I haven’t been programming as much, as marching band 🎺 has started, so I’ve had less time. But now I can do the really exiting stuff! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). What did I Do? As I mentioned in the last devlog, I have been working on doing a full passthrough of the entire project to get ready for major rewrites. I have completed by refactor checklist, so I have gone through ever cpp file to: Fix warnings Check object method & attribute visibility Check const, static, and inline declarations Change the placement and formatting of method Going through every line of code to do minor logic changes & change formatting Rename methods, attributes, functions, and variables to better names & names w/ personal conventions. Add comments everywhere Change the placement of the #include statements (main header file, object interfaces, project files, project packages, extra C++ headers) Run a full clean, compile, and test of the application The LIE Technically I didn’t go through every file, as I left AssetManager & Rasterizer . Since these will be completely rewrote soon I felt like it was a waste. What next? Now that I have finished cleaning up the code base, the next projects are to: Move to using UUIDs instead of an entity index in scene Gut AssetManager and rewrite it Change to using metafiles instead of a preditermined path to assets Rework the scene class Extend IRenderer and get ready for the fun part! Thanks for reading! I tried to keep this one shorter for y’all. I don’t normally get too much attention to my devlogs, but I would be more than happy to answer any questions, as there is so much more to this project that even the landing page doesn’t cover (WIP). If you’re curious, feel free to reach out on slack (pkncoder), and here are some extra links about the project: Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XII —————– I haven’t done as much programing recently, but yesterday I wanted to finish what I needed to do quickly, as it wouldn’t take that long. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 🎯 UUIDs For a quick explanation of what a UUID is: UUID stands for Universally Unique Identifier. In practice it is a random alphanumeric (a-z,0-9) ID between 64-128 bits. For my project, I used an unsigned 64 bit integer (no negative numbers). It isn’t exactly what the standard for a UUID is, as it isn’t alphanumeric, but I think for now 18.4 quintillion ids are just fine. ⬆️ What Next?? Now that I’ve finished this, the next step is to gut & rewrite the entire asset managing system. I need to redo how files are found, how data is stored, how they are retrieved. Basically the CRUD (create, read, update, delete) line and more. ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XIII —————– Spent some time off from working on this project, started the beginnings of another one. Finally ended up getting the interest to come back to this one To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💡 Overview Commit message for this devlog: BREAKING CHANGE - New asset system, new scene system, renamed SceneLoader to PrefabSpawner, still need to update rest of code with temp fix until reworking for new system. ✨ What did I do? Previously, the asset manager did still handle caching already loaded assets (models, materials, textures), however the implementation was not professional and temporary: Caching based on a string key (slow) Broke the “single responsibility principal” many times by uploading to the GPU & constructing Scene objects Now, I am using AssetHandles (UUIDs) for caching, and I no longer uploading to the GPU in AssetManager. ❌ What didn’t I do? This new system is a good start for realigning and separating the different parts of the program, but is only about a third of the work. For what I still need to do, this is what follows: Stop uploading to the GPU in the PrefabSpawner (scene) Fix the renderer and find where I will upload the mesh & texture data. Check for compilation and working across the whole project. Change every instance of AssetManager to using AssetHandles. Once I have these, I can move onto redoing the renderers and FINALLY start working on the “fun stuff” ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XIV —————– The Planning - The possible NEW NAME??? - The New Project!! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ So What Happened? 📸 I haven’t done much pure coding, HOWEVER , I am getting ready for some large-scale rewrites and additions to the code. For what has happened: Fully sectioned the resource - disk - and scene - cpu/logic - directories (folders) so there wasn’t any GPU actions taken place. Refactored resource and scene directories Re-implemented Application into CMakeLists so I can compile and link that file. Did some planning for the huge renderer rewrite that is coming up. Along with all of that, I came up with a possible name for the application (since, surprisingly, Tempname: Engine is a temp name) I had it when when gazing at the sun through some clouds over a feild. Although it is super basic, so I’m going to have to play with it. ❤️ Thanks for Reading!!! I might have to take a bit of a break from progress on this project, as I have a website that I’m making for my local fire dept. (look out for a new stardance project)! I’m also planning on doing some re-marketing / re-branding (idk what to call it) to change the descriptions of the project (ex. the “To recap section on my devlogs, and the landing page). I’ve been getting more questions on it, and my current explanations are a bit too much. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🗿 Commits 🥀 (top-oldest : bottom-newest) No more mention of buffer manager or any uploading to gpu in scene & assets. Meshes are now split up from models in the cache, models hold refrences to asset handles to meshes. Refactored and fixed errors in scene and resources. The program won’t work, as only scene and resources are being compiled & linked Added application back into the mix & fixed the scene loading section. Did some planning on how a model will go from spawn to render
—————– Devlog XV —————– – Temp code go brrrrr 🔋 - New term : “Far Landing” – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ I tried getting this out before 4 hours, but it just –wouldn’t__ happen. Weird errors kept popping up ( mostly being my fault) . Here’s a list of what I did: Figured out generally how I was going to deal with uploading and caching meshes + textures Put the new GPUResourceManager class into place to do the previously mentioned job Started reworking the renderer pipeline (NOT THE RENDER PIPELINE) on CPU side, and set up the interface class with that Patched together the old Rasterizer renderer to work with the new IRenderer pipeline Fixed errors throughout Split up normal & bump textures Planned out how I will deal with all the different textures on the shader side, cutting the checks out at shader compile time Yea, I know, it’s a lot . It just felt wrong to create a devlog in the middle of everything, since up until after fixing errors I had nothing to show for it. :( I ran into this errors when fixing those errors, where the entire model (I was using the Sponza scene, check the attached video ) was banded, where parts “didn’t exist” and the other bands did . This reminded me a lot of the “Minecraft Farlands” specifically the pocket edition ones. 🔥 What didn’t I do? 💥 To keep this brief: Fully split up the SSBO system in the BufferManager Reimplement good use cases of UBOs (although I did put in place double buffering) Add the more sophicticated data handling in the PathTracer (as I commented it’s existance out so I could complile). Figure out how shadow mapping is going to be cleaned up in the Rasterizer. ❤️ Thanks for reading! These devlogs have been getting more attention, and I’m getting closer to doing a rebrand to finally get my point and final ideas across! :3 Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git commits 🗿 Patched in the “new” buffer system - Really just to get it to compile before I do anything big. Attempting to run the app to test resources & scene Well it compiles, runs, and renders. I still need to go through all the models, HOWEVER, I am having an issue with like 3 models in sponza and bump UGH Well, I checked Phase-III, and the issue with those models are there too, probally some texture coord issue or the bump map is messed up (I’ll check in blender), BUT THEN ON FIRST LOAD THE MODEL FRA LANDED????
—————– Devlog XVI —————– So long , gay Bowser ⭐️ – IRenderer, hardly know her? - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ⭐️ BEFORE ANYTHING - Thanks so much to @AVD for the super star, wasn’t expecting it and I really appreciate it 👏 👏. Now, for what I did: Dealt with an issue in Obsidian, as apparently there was “minor rendering performance improvements.” This is FALSE :( - I just downgraded the version Created the new BufferManager to handle UBOs, SSBOs, VBOs, EBOs, etc. + Dynamic, Static, and Stream buffers. Integrated the RenderTarget & ShaderPass system from PathTracer straight into IRenderer + added base utilities to it. Did some formatting Overall the two big things that I did was the new Buffer system & the updated IRenderer interface. For the new Buffers, previously I had UBOs (dynamic values) & SSBOs (big mostly static information blocks) set up in seperate files, that BufferManager returned. Now, every buffer is a single struct called GPUBuffer , and GPUBuffer has a type, and a usage (see attached photo). Now everything is centralized on that. For the new IRenderer interface, now there are RenderTargets - textures that shaders write to as output - and ShaderPasses - A pass of a shader. These can be added to a registry, keyed by a UUID (big number, in this case). Thanks for reading Again, thanks so much to AVD for the super star! I’m excited for when I can finally start writing my shaders, it’s getting closer & closer!! The fancy Path Tracer will be cool and all, but I have big plans for the Ray Marcher!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 Fixed an obsidian issue I ran into, “Minor rendering performance improvements.” was NOT true, broke almost the entire canvas. Fixed it though + new png Created the new buffer managegr system, I need to go through and make changes. Also, on launch there was more blacked out sections, different every launch :( New IRenderer setup for the render targets & render handles Refactor 1-6 Refactor 7-9 for BufferManager
—————– Devlog XVII —————– - Strange Hours - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To start off, I did not work directly on my application, but the online demo . It’s like working on the website, but through another editor sometimes. The goal of the Path Tracer is to eventaully get it clean & quick enough to be real-time. This is the first of the 5 renderers that I will be making. I was working on my online shadertoy DEMO for the Path Tracer, specifically the denoiser. The name of the denoiser I am using is the “Edge-Avoiding Á Trous Wavelet Transform” . As a quick overview: It applies a blur “ with holes ” to allow for less to no image distortion Fast enough for realtime Includes “ weights ” based on (in my code): Normal , Depth , and Color . The larger the difference between the center pixel and the scanned pixel * (kernel), the more weight is applied, lessening the amount of blur. This is amazing, however when the camera moves , the denoiser assumes that the current and previous pixel are in the same world postion (when it isn’t). This causes errors when trying to overlay the image and gather data. This is why we track the motion of the camera, creating a vector to get the same world position pixel. I got this wrong on one of the first attempts, the last attachment (videos are compressed) shows that fun video (warning for those who get motion sick). With this, I am able to blur the image, and with some more techniques, I can get rid of “ghosting.” Thank You for Reading In the videos, I rendered them in fullscreen 4k on my better laptop+GPU, don’t worry about your system being too slow, just don’t fullscreen it <3 (the development was done on my lower end mac). The hours logged are from refactoring the project after the last devlog, and editing the code when I didn’t do it in shadertoy’s editor. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 BREAKING CHANGE - Refactored Buffer & GPUResource managers + IRenderer - Code has been broken for a bit but womp womp Shadertoy shaders path tracer https://www.shadertoy.com/view/7fBSzR
—————– Devlog XVIII —————– - 🌲 Trees 🧚♀️ - 👩💻 SO MUCH REWRITING 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ These last few days, I’ve been working on getting my Rasterizer (drawing triangles of a model on screen and coloring them) working. The big changes that I did include: Fixing an issue with textures not loading Updated the Interface for every Renderer. Implemented the extract / prepare / dispatch pipeline into the Rasterizer for real now. Started working on the base ideas of a “Shader Graph” The issue with textures was just moving a line like 3 lines lower . I was freeing the image data before saving it (oops) . The updated interface is the IRenderer class. Each Renderer bases off of the class, supplying it with a framework so each Renderer can be talked to the same way. Here are some of those functions: beginFrame - Clear previous frame data and prepare for a new frame extract - Take raw scene data ( camera , renderables ) and convert it into packets for the next step. prepare - Take each packet from extract and turn them into draw commands for dispatch. dispatch - Take each draw command and send a draw call, along the way binding any textures & uniforms. postProcess - Take the frame and post-process it. This may be removed. present - Take the rendered frame and show it to the screen ( blit it ). To do a quick review on what the Shader Graph is - it is a collection of “nodes,” each with their own inputs and outputs that connect together to render out a frame. I’m still a bit confused, but I’ve been watching presentations on the topic from companies like Unity & Activision . Thank You for Reading Yea, I know it’s been a while since my last devlog. I’ve been making some posts in slack about my Path Tracer, since I spent a little time on that. I’m looking at the timing for everything , the hope is to ship this at the end of Phase-IV and hope that I can get a UI working before too late. I’m hoping I can get enough stardust to pay for a new laptop, but idk that’s a long shot. I still have about 25 more hours if I get a 16x mult (which I can only hope for) before I would hit the mark for the FW 12, which isn’t crazy (the mult is tho). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Stop the program from crashing to reach a black screen Rewrite shaders to allow for correct models wo/ shadows Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms 🥀 Git Commits (shortened)🗿 https://github.com/pkncoder/Engine/commits/Phase-IV/
—————– Devlog XIX —————– - 🌲 Textuers 🧚♀️ - 👩💻 Shadoowwsss 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To recap on what I did: Got the program to launch to black screen I needed to inject the Asset Manager to a class Got objects loading correctly without shadows Got textures to load Started work on fixing the shadow map Nothing too crazy has been changed, the texture issues were about some compatibility problems and not uploading to the same index. The shadow values are uploaded to a 3d texture, where to calculate if an object is in sight or not, we commit triangles based on their position. The problem now is about the far plane, and hitting triangles that weren’t in shadow. I’m not sure what the problem is, but I’m going to do a bit more looking into it. Thank You for Reading :3-blahaj-spinning I still have to fix the shadows issue (obviuosly) but then I can move onto formatting the data (putting it into buffers, creating wrappers, etc).!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms Refactor / clean Create the real Render Graph? 🥀 Git Commits (shortened)🗿 Commits: https://github.com/pkncoder/Engine/commits/Phase-IV/ Most Recent: Temporary Save
—————– Devlog XX —————– – 🌟I have the best one liners 🗿– 🥀 Now I have to be smart ??? 🧠 – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ For the quick overview: Fixed the shadow map issue ( so angry about this, see below ) Fixed an issue with textures not caching Got the very base implementation of Uniform Buffers To start off, in the previous devlog I mentioned I was re-writing the shadow mapping . Shadow Mapping - Rendering a 3d model with the light being the eye. Everything that it can see is not in shadow, everything else is. quick explanation I was having issues with getting the shadows to work correctly. I had ideas for issues, including: (the model matrix , the renderPackets being in a bad order , the far plane ). IT TURNS OUT It was none of these. Whenever I made the code to compile a geometry shader along the vertex & fragment shader, I just copied my old one and spliced in the code. Turns out I forgot to swap some variables, and I was putting code in places it should NOT be at. No idea why it didn’t crash, but it fixed my shadow issues very quick . As for UBOs, I’ll talk about them in a future devlog, when I have everything planned out. Thank You for Reading As I said with “Planning out” everything, I’m going to set up a whiteboard - I’ll have to move my 🏳️🌈 pride flags 🏳️⚧️ :( - Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Refactor Build the big brain wall Do some thinking 🥀 Git Commits🗿 Weird position issue Saving now, I am so angry about this. I was compiling and overwrigting the wrong code :( Made the testing for shadows a bit better, and changed the rendering a bit Fixed issue with textures and full models not actually caching Removed anoying debug line for shadow transform matricies Working on getting the ubos working’ Got it to push First test ubos
—————– Devlog XXI —————– – My brain hurts 🧠 - Sharp like glass – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I haven’t done much coding Instead, I’ve been trying to figure out how I want my Render Graph to work. To start, what is a render graph? What I am interpreting the render graph as, issss: An API meant to simplify and provide structure to a final renderer. In the final application, the render graph will be an option for a more advanced final render editor. What I am working on now, is how it will be put together so I don’t have a mess in the future. Recently, I’ve been using Obsidian to mark everything down. This also starts a little docs. Using a mix of Obsidian and the excalidraw plugin, I’m able to write everything down and create visuals. Currently, I have a mix of nodes that are the main important ones. These nodes are just the interfaces , so they aren’t specified. They act as a blueprint for any of the full nodes. IRenderOutput - Add textures to a list of blitables IShaderInput - Base input interface IShaderOutput - Base output interface IShaderNode - Node representation of shaders IShaderPassNode - Base shader interface Thank You for Reading I haven’t been home enough to create the “big brain wall” which is sad, but at least my stuff is digital. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Setup current program for Render Graph implementation Implement IShader, IGPUTexture, etc. Create IRenderGraph for the renderers
—————– Devlog XXII —————– – BrEaKiNg ChaNGeS - 📖 NEW BOOOKKKK – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I’ve done much coding Base list This is what I have done since the last devlog: Planned out a bit more on the inner workings from no Renderer->Rendered Image Created the new Shader & Program classes Updated the workings on RendererManager Started work on the new Renderer / IRenderer class Current commit is now broken (compiles, doesn’t run Overview In my new obsidian vault , I’ve been working on creating the new database on how it all works. Through this, I’ve been using excalidraw (Obsidian) to plan out pipelines & create visuals. Currently, I have 2 main drawings: Shader & Program pipeline Renderer Pipeline The Shader & Program pipeline explains the lifetime and usage of both the Shader and Program (OpenGL program) classes. A program gets created, has shaders attached to it (deleting the shader in the process) , and then the program gets linked & binded. The Renderer Pipeline explains the lifetime and usage of a renderer. Starting from the RendererManager, go through normal rendering stuff, and will end at shutting down the RendererManager. For the inner workings of the new renderer setup, I’ll leave that for (hopefully next devlog) when I get everything working start to finish of the RendererPipeline . Thank You for Reading As for the “ New Book I got, I have just purchased “ Game Engine Architecture Vol. I ” (Jason Gregory) to specialize the program more (most likely after Stardance ends). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Plan out the RenderGraph Create the base RenderGraph class Create the BlitList Create the INodeInput & INodeOutput
—————– Devlog XXIII —————– – I NEED TO HURRY UP AAAA - EnTT - Table – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In my previous devlog, I stated how I was working on the new RenderGraph . I’ve now realized, that I have like until the end of the week for when I need to ship. So instead , my goal is to get this looking impressive . To start, here is what I’ve done so far : Cleaned up system inits Changed how the UUID service works (now you just access it and call generate ) Implemented a new library, EnTT Did some cleanning up Added a PointLightComponent for future use (no dev. yet) Added and implemented the CameraComponent Here are the big things: EnTT EnTT is an open-source library that handles objects within games, editors, etc. It’s creator is: Michele Caini (skypjack on github) . EnTT is a library that exposes something called an Entity Component System (ECS). Basically, instead of saving a bunch of data directly inside of one struct or class, you define an entity (a unique id) and assign that entity components. The components are what actually gives the entity meaning. New Camera If you have ever ued Blender for a bit, you would know that your camera is on the same list as your meshes. This is since, to Blender, they are inherantly the same thing (don’t quote me on that) . Previously, my camera was seperate to all of the rest of the objects. This caused the data to be split, and handling the differences made my architecture a bit weird. Now that I’ve implemented EnTT , I’ve added a CameraComponent that defines things like rotation, FoV, etc - completely erasing the need for a separate camera, and opening the doors to more flexibility. Thank You for Reading New book is great! I won’t get to use too much of it for stardance, but I’m checking out this snowglobe thing that seems like it would be the next area!! Wish me luck on the ship. I want to get it out by the end of the week so I can hopefully still cache in some stardust. Probally won’t get the computer though (high hopes for a living or smthin idk) Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Change my Rasterizer to be a Defered Renderer & implement multiple point lights UI??
—————– Devlog XXIV —————– – i HATE shadow maps!!! - Renderer? I hardly know her? – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ WOAH A lot has happened. Previously, I had just implemented a new entity system & a new camera system. So what’s new? I present: The Deferred Renderer !!! Basically, it’s just another way of rendering. HOWEVER , it has some funzies: Mostly together render graph, just a little smthin Shadow Pass G-Buffer Pass Lighting Pass New point lights (replacing the emmissive texture searching before) Looking to add SSAO (hemisphere sampling) in the future!! Now, along with this, I just tested creating a build for windows and testing it on a friends machine, and it worked (his laptop is crap, so it ran slow, but surprisingly fast) . Along with that, I also tried the current build on mac, and it also worked, so that’s also great (I’m supprised)!! However, the real prize, is the trypophobia horrors made along the way!! That’s right! When trying to get textures to work, I ran into a ton of problems (mostly related to the alpha map & image formats) that caused major headaches. Images and videos, where they are a bit compressed, can be found below. Thank You for Reading Almost there, I still need to change up the landing page, rewrite the readme, and merge the main branch, plus try to get a way to change the 3d models for users, but I’m getting there. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXV —————– – New JSON scene file 📁 - SHIP TIMEEEEE – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not that much has happened tbh. All that has really happened… Updated the README a bit more Added a new json parser to spawn the scene from that Added hot reloading of the scene So yea, next should be the ship. When updating the README on the github, I was going through the Usage section, and added a new promise for how people could add their own meshes. In this I created the idea of activeScene.json , a JSON file that listed the scene data (crazy, right?). And so, after I updated the README , I added the new loader, and made the scene reload by pressing the “ r ” key. That’s kinda it… Thank You for Reading Before shipping, I need to… Do another update of the README Create the base Releases for Mac, Windows, and Linux And test these Do a pass through TODO.md Update the landing page Shouldn’t take too long Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXVI —————– - - Almost… there – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In order to show the capabilites, I’ve been setting up scenes for my engine to show off, and here are some of the results! It would be great to get your favorite render of these! For the full 9 renders , check out the scrapbook in the slack , as they will be there w/ a thread. Thank You for Reading Hopefully will actually ship tmwr! I’m actually getting kind of sad, I won’t be stopping development by any means, but this has been my summer (although I might not be able to get any stardance tokens, but that’s ok ig…). If you have any questions, feel free to DM me either here, or at @pkncoder on discord if that’s easier for you! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXVII —————– - - Release is out testing time – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not too much has happened, mostly: Updated README (resources, gallery, installation & use) Updated the landing page (added a tech-stack) Created my first release under the 1.3.x alpha title That big 1.3.x “alpha” release is the big one, as I need some help. If you could just take a bit of time, and you aren’t on linux-arm or apple-intel, could you check out the github releases and try it out, that would be great! I plan to ship tmwr, but I want some testing done first. Thank You for Reading So close!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
Ships:
—————– Ship #1 —————– - - Welcome - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💚 The current state 💫 There is still no UI, all render control is based in a JSON file. The current only renderer is a custom Deferred Renderer. Note: As this is built for 3d rendering, a modern computer, with a GPU is recommended. Modern Macbooks will run it, however it will be slower as it is basically magic that it works on them. Thank you so much! I’ve spent a lot of time on this. It may not seem like that, however when building this, I decided to do it right (as this is my 3rd attempt). I split the development into phases: Get a window Get something rendering + a camera Get object/material/texture loaders + basic scene managers + basic concept of working Create full scale (professional) renderers/scene managers/resource managers/etc. Get a UI Currently, I’m in getting everything polished in the backend. I didn’t want to move on to the UI, as I didn’t want to rush that. Rushing a UI meant missing other things. So thank you, and I really hope you enjoy. If there are any issues, please report them to the issues page on the github, and message me on slack ( @pkncoder ). Github releases: https://github.com/pkncoder/Engine/releases Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine...
|
1792853732.3869977
|
1792940132.3869977
|
|
46447
|
My own site! by @spearedrice | Stardance
|
spearedrice
|
0
|
163.4
|
0
|
[]
|
[{"post_id": 81376, "ts": "202 [{"post_id": 81376, "ts": "2026-10-21T01:50:11Z", "hours": 0.3669, "text": "we all love larpin!!"}, {"post_id": 81365, "ts": "2026-10-21T00:13:33Z", "hours": 8.1392, "text": "more poses ig"}, {"post_id": 81231, "ts": "2026-10-20T11:42:14Z", "hours": 18.3669, "text": "added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)"}, {"post_id": 80282, "ts": "2026-10-17T03:01:36Z", "hours": 10.0369, "text": "added the konami code so now lots of stuff happens"}, {"post_id": 80056, "ts": "2026-10-16T02:48:40Z", "hours": 15.3181, "text": "adding a INSANE feature"}, {"post_id": 79517, "ts": "2026-10-14T12:36:15Z", "hours": 10.6333, "text": "progress (adding screensaver, unfinished so here is some blurry code)"}, {"post_id": 78938, "ts": "2026-10-12T03:06:08Z", "hours": 10.0128, "text": "adding a button that finally mutes the music"}, {"post_id": 78726, "ts": "2026-10-11T12:33:55Z", "hours": 11.0222, "text": "almost done, 2 features left"}, {"post_id": 78482, "ts": "2026-10-10T22:27:34Z", "hours": 10.0333, "text": "amazing things (unfinished)"}, {"post_id": 78316, "ts": "2026-10-10T12:13:10Z", "hours": 11.795, "text": "uhh unfinished right now but great things coming 😭"}, {"post_id": 78205, "ts": "2026-10-09T23:36:45Z", "hours": 56.6311, "text": "spent 50 hours on THIS"}, {"post_id": 57011, "ts": "2026-08-29T02:36:13Z", "hours": 0.6814, "text": "Adding windows to my site, also added GTA 6"}, {"post_id": 54873, "ts": "2026-08-26T02:26:45Z", "hours": 0.3675, "text": "I made my own site (for the 2nd time) and added some pretty cool styling."}]...
|
Title: My own site! by @spearedrice | Stardance
D Title: My own site! by @spearedrice | Stardance
Devlogs:
I made my own site (for the 2nd time) and added some pretty cool styling.
Adding windows to my site, also added GTA 6
spent 50 hours on THIS
uhh unfinished right now but great things coming 😭
amazing things (unfinished)
almost done, 2 features left
adding a button that finally mutes the music
progress (adding screensaver, unfinished so here is some blurry code)
adding a INSANE feature
added the konami code so now lots of stuff happens
added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)
more poses ig
we all love larpin!!...
|
1792662908.7921853
|
1793267708.7921853
|
|
20759
|
ez-SDR by @lupc65779 | Stardance
|
lupc65779
|
1
|
163.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T15:44:56Z", "hours": 163.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built ez-SDR , an open source software defined radio application written entirely in Rust (one of the relatively few fully Rust-based SDR desktop applications). ez-SDR has three main tabs: Radio: A general-purpose radio receiver with AM, FM, SSB, CW, and other modulation modes, real-time spectrum and waterfall displays, and stereo FM with RDS support. ADS-B: An aircraft tracking system with an interactive map showing aircraft positions, altitudes, speeds, headings, and flight trails. It includes native decoders for both 1090 MHz ADS-B, used worldwide, and the freedom frequency (978 MHz) Meteor Decoding: A satellite image decoder capable of decoding imagery transmitted by the Russian Meteor-M2-3 and M2-4 weather satellites. It supports both live reception and decoding previously recorded radio signals (saved as CS8 or CF32 files), with image previews and PNG exports. (A moment of silence for the deprecated NOAA satellites) Another major feature is the architecture itself. I beheaded it. (The project.) The actual GUI is separated from the radio processing backend allowing it to run as a headless daemon. It exposes HTTP and WebSocket API’s, making it possible to interact with the backend without using the GUI. Getting everything working was… interesting. Building the decoding pipelines, integrating them into a responsive desktop interface (making it snappy and fast took several tens of hours), debugging signal processing issues, and literally running through cornfields with an antenna in my hand were some of the biggest challenges I ran into. The project went through several major redesigns, from the initial Rust implementation to separating the backend from the UI, briefly experimenting with Electron, and eventually returning to the native Rust interface. After over 160 hours of logged work , I’m excited to finally ship ez-SDR! The source code and Linux builds are available on GitHub, with a Windows build planned for the near future.", "repo": "https://github.com/Lupc9102/ez-sdr", "demo": "https://drive.google.com/file/d/1CAk3eGq8M2QFzbwPgKeuX1w_fwFsIhUG/view?usp=sharing"}]...
|
[{"post_id": 80362, "ts": "202 [{"post_id": 80362, "ts": "2026-10-17T12:36:53Z", "hours": 10.9075, "text": "Major reliability and release readiness improvements for EZ-SDR -stronger ADS-B/UAT decoding -safer settings, cleaner daemon and browser lifecycles -better audio and integrations - finally stable data paths -packaging fixes -removal of immense amounts of bloat PS heres an image of LRPT decoding in action"}, {"post_id": 78367, "ts": "2026-10-10T16:02:57Z", "hours": 10.4897, "text": "Getting ready to ship it so here I am trying to patch some final bugs in the Meteor Satellite Lrpt decoding pipeline"}, {"post_id": 77103, "ts": "2026-10-05T17:15:36Z", "hours": 15.5006, "text": "Going for a final round of fixes on the ads-b pipeline before marking it as finished 6.1 sol xhigh audited it and its not looking too good (holy f 11k words)"}, {"post_id": 74071, "ts": "2026-09-26T16:52:51Z", "hours": 8.1261, "text": "Rust UI is back, also ported a couple of features from sdr++, The screenshot contains an actual signal (unlike the mockups in past devblogs), more precisely a local music radio station received through ez-sdr with a rtl sdr v4 dongle"}, {"post_id": 72598, "ts": "2026-09-23T09:47:02Z", "hours": 13.9953, "text": "a TON of bug hunting and im going back to the old rust ui because it turns out the electron app wasnt my brightest idea"}, {"post_id": 57242, "ts": "2026-08-29T10:50:29Z", "hours": 9.9469, "text": "Couldnt patch the ads-b map view inside the rust gui app so i took a U turn with the porject and went all in for an Electron App as the gui for the ez-sdr daemon. mockup waterfall"}, {"post_id": 44519, "ts": "2026-08-10T10:22:10Z", "hours": 8.3333, "text": "Not much to be written, just some painful and slow progress with decoding meteor imagery."}, {"post_id": 28507, "ts": "2026-07-14T20:02:26Z", "hours": 6.0031, "text": "Should I even be happy? I finally tested ez-sdr’s satellite decoding with a real recording I took yesterday on an Meteor M2-4 88* pass, and it’s… not great, especially compared to SatDump’s decode. (Ez-sdr is the first image, SatDump is the second image.) What troubles me the most is that I literally stole SatDump’s homework equation by equation and rewrote it in Rust, and it still looks like shite lol. Its for sure progress and im happy with that lol"}, {"post_id": 27542, "ts": "2026-07-13T06:10:40Z", "hours": 9.3789, "text": "Considering that the last two LRPT satellites that still transmit are Meteor m2-3 and Meteor m2-4 i did efforts to make decoding them as fast as possible , especially cf32, cs16 and cs8 decoding. Now i didnt really get to test the upgrades.. because i didnt get to FINISH the upgrades but i DID finish the web ui remote from the last devlog. (I am posting this devlog WITHOUT a finished feature because im getting close to the 10 hour cap) Also ive went outside, touched grass and snatched a good cs32 from meteor m2-4 so i actually have what to test the decoding on."}, {"post_id": 25907, "ts": "2026-07-10T12:18:29Z", "hours": 10.7172, "text": "I cut its head off. Fully decoupled Ez-sdr from Ez-gui (the Rust UI), effectively turning Ez-sdr into a headless project. This allows Ez-sdr to be coupled to multiple channels: The original Rust UI WebUI (Almost done, in development) Discord (in development) This decoupling also exposes an API, allowing you to integrate and use Ez-sdr functionalities on the go within your own applications and projects."}, {"post_id": 25177, "ts": "2026-07-09T07:11:47Z", "hours": 28.3117, "text": "Yet another from-scratch redesign because lately most of the app started feeling bloated and hard to use for beginners (which defeats the entire purpose of ez -sdr, which is meant to be easy . Therefore i moved most of the unnecessary stuff in advanced and other tabs. Also patched a lot of bugs."}, {"post_id": 20817, "ts": "2026-07-02T15:02:41Z", "hours": 25.5669, "text": "Full UI redesign + a ton of new features: The ADSB tab now includes a map, plane labels, and a 3D view mode. Added a Discord gateway that sends notifications and images of detected planes, satellite passes, and more. Overhauled the AI Assistant tab. Added a reasoning effort dropdown to the AI assistant. Granted the AI the ability to perform web searches. Added well-documented checklists and tutorials for beginners setting up their SDR kits, including an antenna angle and length calculator, recommended environments, cabling tips, and driver recommendations. Added UI presets: users can select their experience level on the first boot, and the app automatically customizes the interface accordingly (beginners rely more on the AI assistant and auto-tuning, while experts manage everything manually with optional AI assistance). Added premade themes and in depth ui customization."}, {"post_id": 17812, "ts": "2026-06-28T19:00:19Z", "hours": 5.7533, "text": "I know how hard is it to get started with software defined radios. I went through the hassle of being a complete beginner and having to deal with sketchy blogs and UIs of apps older than most of us participating in this hackaton, and so I tried to build an all-in-one SDR app with most of the cool things you can get from the average RTL-SDR kit: plane tracking, listening to ATC and some other cool frequencies, satellite signal capturing, decoding and tracking, and many more in one unified app interface. I originally intended to do ALL this in Python, but it was way too slow and crashed during DSP, so I had to rewrite it fully in Rust. Problem is that I don’t really know Rust (and basically anything lower level than Python) so props on kimi k2.6 who handled the whole rewrite flawlessly. There’s still many things to improve on this, and, more importantly.. a ton of testing and trial and error"}]...
|
Title: ez-SDR by @lupc65779 | Stardance
Devlogs:
Title: ez-SDR by @lupc65779 | Stardance
Devlogs:
I know how hard is it to get started with software defined radios. I went through the hassle of being a complete beginner and having to deal with sketchy blogs and UIs of apps older than most of us participating in this hackaton, and so I tried to build an all-in-one SDR app with most of the cool things you can get from the average RTL-SDR kit: plane tracking, listening to ATC and some other cool frequencies, satellite signal capturing, decoding and tracking, and many more in one unified app interface. I originally intended to do ALL this in Python, but it was way too slow and crashed during DSP, so I had to rewrite it fully in Rust. Problem is that I don’t really know Rust (and basically anything lower level than Python) so props on kimi k2.6 who handled the whole rewrite flawlessly. There’s still many things to improve on this, and, more importantly.. a ton of testing and trial and error
Full UI redesign + a ton of new features: The ADSB tab now includes a map, plane labels, and a 3D view mode. Added a Discord gateway that sends notifications and images of detected planes, satellite passes, and more. Overhauled the AI Assistant tab. Added a reasoning effort dropdown to the AI assistant. Granted the AI the ability to perform web searches. Added well-documented checklists and tutorials for beginners setting up their SDR kits, including an antenna angle and length calculator, recommended environments, cabling tips, and driver recommendations. Added UI presets: users can select their experience level on the first boot, and the app automatically customizes the interface accordingly (beginners rely more on the AI assistant and auto-tuning, while experts manage everything manually with optional AI assistance). Added premade themes and in depth ui customization.
Yet another from-scratch redesign because lately most of the app started feeling bloated and hard to use for beginners (which defeats the entire purpose of ez -sdr, which is meant to be easy . Therefore i moved most of the unnecessary stuff in advanced and other tabs. Also patched a lot of bugs.
I cut its head off. Fully decoupled Ez-sdr from Ez-gui (the Rust UI), effectively turning Ez-sdr into a headless project. This allows Ez-sdr to be coupled to multiple channels: The original Rust UI WebUI (Almost done, in development) Discord (in development) This decoupling also exposes an API, allowing you to integrate and use Ez-sdr functionalities on the go within your own applications and projects.
Considering that the last two LRPT satellites that still transmit are Meteor m2-3 and Meteor m2-4 i did efforts to make decoding them as fast as possible , especially cf32, cs16 and cs8 decoding. Now i didnt really get to test the upgrades.. because i didnt get to FINISH the upgrades but i DID finish the web ui remote from the last devlog. (I am posting this devlog WITHOUT a finished feature because im getting close to the 10 hour cap) Also ive went outside, touched grass and snatched a good cs32 from meteor m2-4 so i actually have what to test the decoding on.
Should I even be happy? I finally tested ez-sdr’s satellite decoding with a real recording I took yesterday on an Meteor M2-4 88* pass, and it’s… not great, especially compared to SatDump’s decode. (Ez-sdr is the first image, SatDump is the second image.) What troubles me the most is that I literally stole SatDump’s homework equation by equation and rewrote it in Rust, and it still looks like shite lol. Its for sure progress and im happy with that lol
Not much to be written, just some painful and slow progress with decoding meteor imagery.
Couldnt patch the ads-b map view inside the rust gui app so i took a U turn with the porject and went all in for an Electron App as the gui for the ez-sdr daemon. mockup waterfall
a TON of bug hunting and im going back to the old rust ui because it turns out the electron app wasnt my brightest idea
Rust UI is back, also ported a couple of features from sdr++, The screenshot contains an actual signal (unlike the mockups in past devblogs), more precisely a local music radio station received through ez-sdr with a rtl sdr v4 dongle
Going for a final round of fixes on the ads-b pipeline before marking it as finished 6.1 sol xhigh audited it and its not looking too good (holy f 11k words)
Getting ready to ship it so here I am trying to patch some final bugs in the Meteor Satellite Lrpt decoding pipeline
Major reliability and release readiness improvements for EZ-SDR -stronger ADS-B/UAT decoding -safer settings, cleaner daemon and browser lifecycles -better audio and integrations - finally stable data paths -packaging fixes -removal of immense amounts of bloat PS heres an image of LRPT decoding in action
Ships:
I built ez-SDR , an open source software defined radio application written entirely in Rust (one of the relatively few fully Rust-based SDR desktop applications). ez-SDR has three main tabs: Radio: A general-purpose radio receiver with AM, FM, SSB, CW, and other modulation modes, real-time spectrum and waterfall displays, and stereo FM with RDS support. ADS-B: An aircraft tracking system with an interactive map showing aircraft positions, altitudes, speeds, headings, and flight trails. It includes native decoders for both 1090 MHz ADS-B, used worldwide, and the freedom frequency (978 MHz) Meteor Decoding: A satellite image decoder capable of decoding imagery transmitted by the Russian Meteor-M2-3 and M2-4 weather satellites. It supports both live reception and decoding previously recorded radio signals (saved as CS8 or CF32 files), with image previews and PNG exports. (A moment of silence for the deprecated NOAA satellites) Another major feature is the architecture itself. I beheaded it. (The project.) The actual GUI is separated from the radio processing backend allowing it to run as a headless daemon. It exposes HTTP and WebSocket API’s, making it possible to interact with the backend without using the GUI. Getting everything working was… interesting. Building the decoding pipelines, integrating them into a responsive desktop interface (making it snappy and fast took several tens of hours), debugging signal processing issues, and literally running through cornfields with an antenna in my hand were some of the biggest challenges I ran into. The project went through several major redesigns, from the initial Rust implementation to separating the backend from the UI, briefly experimenting with Electron, and eventually returning to the native Rust interface. After over 160 hours of logged work , I’m excited to finally ship ez-SDR! The source code and Linux builds are available on GitHub, with a Windows build planned for the near future....
|
1792957908.851022
|
1793044308.851022
|
|
6400
|
Minecraft Web by @TruthEntity | Stardance
|
TruthEntity
|
2
|
160.71
|
1901
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T10:33:36Z", "hours": 73.0, "multiplier": 15.82, "payout": 1127, "blessing": "neutral", "text": "NOTE: Please Skip Voting, if it failed to run on your system please… Hi Friends, so, I have been working on Minecraft for a long time, and Virtually touching grass LOL.. AKA, Making Minecraft, it is quite challenging to say the least, you can check my devlogs.. Basically, I want to make a very very optimized version of minecraft, that you can see through far and far, and highly optimized. I want to add lighting and all, but the banner is a bit misleading.. I will continue to work on the project, but obviously, not Three.js, because What I have learnt is that.. You can use engines like Unity and Unreal, and make goated projects, the feel of making optimized content, and making it run even on a potato, is just on another level.. Seeing the entire generation moving towards fast making and prototyping, it is always a safe bet to try something new and interesting. This is one of the prototypes that taught me a lot, from How to deal with chunks, and manage chunks, to making biomes, which was actually new.. Chunks I have worked with AI before, and it helped me a ton, and I know about those, but not here.. Hope you love my project", "repo": "https://github.com/SatyamRaj67/Minecraft-with-Three", "demo": "https://satyamraj67.github.io/Minecraft-with-Three/"}, {"ship_num": 2, "ts": "2026-06-15T05:58:35Z", "hours": 58.0, "multiplier": 14.37, "payout": 774, "blessing": "neutral", "text": "Basically, What I have made is Minecraft Web, well Minecraft but on the Website, running on your Browser. Through the Power of Optimizations and knowing how to code, and also using AI for my shader building and debugging bugs like IDK, What I have done to my life. But Basically, I made my own Engine just to prove that You don’t always need THREE.js to do your heavy lifting, and honestly, it was not that hard. You can see the source code, just a few days ago, I refactored it. Hope you love and enjoy my project.", "repo": "https://github.com/SatyamRaj67/Minecraft-with-Three", "demo": "https://satyamraj67.github.io/Minecraft-with-Three/"}]...
|
[{"post_id": 31749, "ts": "202 [{"post_id": 31749, "ts": "2026-07-20T12:00:53Z", "hours": 0.5433, "text": "Hi Everyone, My Devlogs have been lacking a bit, and this another quick devlog, because, I am really not feeling good these days. I am having fever and not feeling great about anything. Currently, I was just searching and asking AI about chunk generation. One of the things, where AI is now needed, because I know noise generation, but I don’t really know, how to make it into reality, and specially when people want realistic chunk generation and all.. I will get into good and start fixing first of all, this light problem, and then just hope, I get well soon, because India’s heat waves are really no joke. My Indian Friends.. Please stay safe and inside house.. IDK, Why even schools are open.."}, {"post_id": 30259, "ts": "2026-07-17T18:05:03Z", "hours": 1.0661, "text": "I literally been sick for 2 days, and now that I come back, I somehow see worse.. Like, I wanted to implement meshing and all.. GUESS WHAT I DONE.. YES, MESHED THE ENTIRE WORLD TO DISAPPEAR.. BALLS… I AM GUAVA AND I WILL EAT MYSELF.. That’s enough coding for today as well, signing off.."}, {"post_id": 30030, "ts": "2026-07-17T08:56:17Z", "hours": 3.1806, "text": "67 Structure Implemented and running, and to those who recommended me this.. GUYS YOU REALLY NEED TO SEE A THERAPY OR SOMETHING.. LMAO.."}, {"post_id": 28175, "ts": "2026-07-14T09:36:33Z", "hours": 2.6172, "text": "Procedural Generation unlocked, now, you can move as much as you want, and play. Current, block placing and all won’t work, but yah.. Frustum Culling is working as you can see with the culled meter."}, {"post_id": 27634, "ts": "2026-07-13T12:05:35Z", "hours": 4.9944, "text": "Added some simple tests for the ECS system and the topological sort Kahn’s Algorithm system and the Event Bus, so as to 100% confirm the workings of what is intended and what is not.. Also there was a problem with connection of gbuffers into swap chain, so had to make a custom pass called, composite pass, that will intercept and then gives us the necessary output. This might add very minute delay, but it is very unnoticable so don’t worry.."}, {"post_id": 27195, "ts": "2026-07-12T15:17:58Z", "hours": 0.6597, "text": "Sorry, ANOTHER QUICK UPDATE I KNOW.. But trust me, this took me ages to implement, and yes, had to work from backwards, because and again found out, There was nothing being connected to the swapchain for some reason.. It’s actually really not that hard to find bugs when you are used to it, like when something isn’t rendering you know, something must be wrong with renderer and all.. and a quick side step, and you understand yah, swapchain being uninitialized is the key."}, {"post_id": 27162, "ts": "2026-07-12T14:03:45Z", "hours": 0.7392, "text": "LMAO, You know, you are at the pinnacle when you are going through forums and forums of actually big stuff, that very very few people ever talk about.. Literally.."}, {"post_id": 27117, "ts": "2026-07-12T11:58:08Z", "hours": 4.5569, "text": "Been some time, and the amount of Logs that I am going through is just.. LMAO.. Crazy Crazy.. For my 67 fans, just give me like a few more moments.. Because, Now, I just want to render one block, and I will just add a sky, which will be a simple color gradient, and then I will work on whatever you that 67 thing.. This was really hectic to implement.. Literally had to go through and implement Archetype.. Yes, even I don’t know what they are… But after like learning about it, here is my understanding.. Archetype is basically a central place to keep all the components and all. Remember, we are optimizing the sheesh out of this project.. Archetypes allow us to apply the same gravity and same systems like Physics, collisions and so on, while still giving you customizabilty on if you want to enable it or not.. It’s really cool, but the amount of things I had to implement.. That’s some brutal stuff… Imagine, you forgot to plug the input system, and you are crashing out on, HOW TO FAH THE POSITION IS NOT CHANGING?? LOL, YAH 2 HOURS OF DEBUGGING WENT THERE, only to realise, I forgot to add that.. LOL.."}, {"post_id": 26687, "ts": "2026-07-11T16:55:52Z", "hours": 5.4511, "text": "I am crashing out a lot over some assets, because first of all, why is the grass block not green and a colormap, I mean, it does look cool.. BUT COME ON, THAT’S A MENTAL TRAUMA AND NOW WHICH COLOR OF GRASS SHOULD I PICK.. Furthermore, this is also a problem with water and all.. I am trying to find better ways, and actually learn about how Minecraft renders these and turns out, they just.. well.. OVERLAY A GREEN MAP or BLUE MAP over the grass.. I mean, that sounds HORRIBLE TO IMPLEMENT, MY GOD, THIS GAME SU…. IS FINE.. AND FUN.. Furthermore, thank you so so so much for all the reviewers out there.. The fact you guys appreciated my project, and said it is Fine to be using AI.. It just blew my heart.. This is the reason why I am currently working, else, I had already blew my mind with so much complex debugging, such that, I had to make my own engine, and debugger.. As with the latest you can see.. Things are tough but yah.. Also, I see you @skhsmrn on my devlog and another reviewer.. Your demands for 67 WILL BE FULFILLED SOON TM.."}, {"post_id": 25348, "ts": "2026-07-09T16:07:34Z", "hours": 1.0511, "text": "I have connected my GPU now, and details are also loading nicely.. I will working on GPU Frames and all as well now."}, {"post_id": 24257, "ts": "2026-07-07T18:18:55Z", "hours": 4.8525, "text": "I almost crashed out today. It was a hectic of a job today for me.. Basically, Today I wanted to work on Debugging tools in my original minecraft version. Though, this was hectic of a job, but now I am confident enough to say that, if anything goes wrong, my error codes will instantly trigger and stop those bugs to ever reach me, specially, If I messed up something. This is specifically made to guard rail myself (as I am a newbie in the GPU optimization and just breaks stuff way too often for comfort during my learning steps..) Now, you might be working what is so special that I did that I am being too optimistic (Specially if you know my history of crashouts LOL…) So, Basically, This time, I researched about an algorithm for dependencies.. Basically, what npm uses to keep track of all the dependencies.. You never know where knowledge might reach you LOL.. So, Basically, now each file, or system like Player, Physics, and to add, Chunks and More, will have to implement system, and each system would have a dependency tree, and then by using Kahn’s Algorithm, we can literally turn that tree upside down, and go through the data and make it work.. It literally tells you, which files are Missing in your code, that is just too good.. The only one critic is that, each time you need to be assing a new attribute, which might be tedious, but the profits are way too big to ignore at all.."}, {"post_id": 23398, "ts": "2026-07-06T10:26:26Z", "hours": 2.1028, "text": "Final few fixes before shipping, added biome support, and now I will be ready to be trying to make a project, without following tutorial, trying to optimize it, because obviously, three.js, though sounds cool and all.. Uses WebGL, which is widely supported.. but I want to use your entire GPU.. because obviously.. I PAID FOR THE ENTIRE GPU.. (BTW, I don’t even have a GPU, I have what is called Shared GPU Memory with storage but anyways.. THAT IS NOT THE POINT..)"}, {"post_id": 23315, "ts": "2026-07-06T05:58:40Z", "hours": 2.9458, "text": "Added Water, Trees, Sand and polish to my project… Like the toolbar, you can see in the bottom. Clean and Elegant.. COMMENT 67 IF YOU WANT TO SEE A 67 STRUCTURE ADDED TO MY GAME… ;)"}, {"post_id": 22734, "ts": "2026-07-05T09:50:57Z", "hours": 4.8264, "text": "I want to ask, How do you literally add shadows, and fog, and everything and that so, all in just one line of code? That is just stupid to even think about.. But anyways, now I have made it so, you can break and place blocks and also, if you render out from the world, and come back in, the blocks will still be there.. BE READY FOR ANOTHER ROUND OF 67 … OH WAIT.. NEXT DEVLOG WILL BE 67.. OR WAIT, LET ME JUST.. LOL, 100% NOT A STRUCTURE IN GAME.. (ATLEAST FOR NOW.. HEHEHEHE)"}, {"post_id": 22082, "ts": "2026-07-04T10:32:13Z", "hours": 0.3108, "text": "Guys Just imagine a world, where the whole life is actually a simulation, and God is literally using his laptop like this, to see what you are doing.. (AND YES, YOU WERE BANGING YOUR HEAD, JUST NOT ON GRASS.. DON’T LIE TO ME.. I AM SEEING YOU..)"}, {"post_id": 22052, "ts": "2026-07-04T09:31:51Z", "hours": 1.9986, "text": "Collisions are now working, with this beautiful looking icosphere as an helper. I JUST WISH WEBGPU OFFERED SUCH CUSTOMIZABILITY.. BUT TRUST ME, I AM GOING TO ADD THESE INTO THE MAIN PROJECT AS WELL.. Three.JS is just so cool.. But again, my goal is to make it the most optimized stuff and see the Entire Earth, and not be happy with just collisions.. SO Let me just complete this tutorial, but I am having a blast."}, {"post_id": 21954, "ts": "2026-07-04T04:53:29Z", "hours": 0.4147, "text": "I hate to admit it, but did I just add, literal shadows, that would have taken me, so so much hours to be working on.. And THREE.JS SOMEHOW, LITERALLY HAS A FREAKING FUNCTION.. THAT DOES THAT AUTOMATICALLY?? EXCUSE ME??? THAT’S JUST CHEATING.."}, {"post_id": 21906, "ts": "2026-07-04T02:37:42Z", "hours": 0.9956, "text": "This really feels surreal.. I am editing parameters to a game, in which people will land their beautiful foot on, ad mine ores, and do stuff, and this is like a dev mode, where I and I choose how much coal and Iron I want in my life.. Damn.."}, {"post_id": 21629, "ts": "2026-07-03T17:47:52Z", "hours": 0.6967, "text": "Umm, Why is Three.js so easy?? HELLO?? JUST MADE A SIMPLE SLIDER THINGY, AND THIS IS SO DOPE GUYS.."}, {"post_id": 21428, "ts": "2026-07-03T11:35:56Z", "hours": 1.0111, "text": "I have started following a tutorial, and I have done so much research, but it a shame that I cannot log that time. I went through some of the best documents written about WebGPU and explaining stuff.. But anyways, I have started following a tutorial on Three.js for making minecraft. It has literally made me in ease, because now I can log some actual time now.. By writing code rather than researching and for now here is my plan Continue to do this project Phase: 1 Draw a Cube with Controls, Draw 2 Cubes with Controls DRAW 64000 CUBES WITH CONTROLS.. By controls they are Orbital Controls, and then we will move on to the second part which is Working on a Naive Mesher, which will just give all the blocks its own 12 triangles on 8 edges each, and then blow up my laptop because if you realise 64000 * 12 is some sheesh work.. SO MANY TRIANGLES, AND I COULD SEE HARDLY 100.. But atleast, it will be the start, then I will work on Instancing and get me fps back up Also utilize the FrameStats which I will make for myself, like the same which well.. THREE.JS USES BUT WITH MY AKA TRUTHENTITY STYLE.. YOOOOO Then perhaps start erasing triangles that are connected through a second mesher Yes I will have multiple types of Meshers and Multiple type of Camera.. And all should follow a common Camera and everything else should be an Implementation like last time, I gave Geometry Pass the implementation of the simpler Renderer Pass, because it effectively make me plug and play with multiple different ways. This is going to be my stuff for next few days of my life."}, {"post_id": 21275, "ts": "2026-07-03T03:33:09Z", "hours": 0.5992, "text": "Guys, My very first shader, completely written by me, and it looks so sick. All it does is feed into the fragment an attribute of space, and break that space with a checker.. And this is just fascinating.. I want to hug myself.."}, {"post_id": 20908, "ts": "2026-07-02T17:05:27Z", "hours": 1.1739, "text": "Guys I can see progress.."}, {"post_id": 20214, "ts": "2026-07-01T19:23:17Z", "hours": 2.3717, "text": "It was quite easy, I mean, I am finally writing shaders, and yes, you guys have seen me make a triangle before, but that was genuinely speaking, was just a normal little trinagle.. But this triangle.. NO NO.. I have structured it so nicely that dare you break this, and my FATAL ERROR systems start to panic and trigger alarms all around.. It was a chaotic mess, and yes I did rejuvanate some parts of my old project, but yah, It’s not like I don’t know what I am doing now.. Furthermore, Sorry for my mental issues, I GOT MY FIRST SHIP’S PAYOUT, and though I was not expecting it, I am more than happy, even if it was a 13x mult and yah, I got a lot of comments regarding Z-Fighting.. I don’t really know the source of this issue, so I will be making the stuff again anyways, in my ways this time.. And hopefully, it will be better than last time.. I am so happy that I literally broke a tear when I saw I got a payout.. Thanks to everyone for so so much support… I will not be working harder than ever towards this project."}, {"post_id": 19340, "ts": "2026-06-30T16:55:33Z", "hours": 1.5981, "text": "Sorry for all my mental breakdowns.. Here is some actual progress that I did by myself.. I learnt about Assert from my last code.. And why do we need assert.. And I made my own Logger.. What are these so let me explain.. A Logger is atmost just a console.log message, but why to make it a separate class? This offers a lot of usability, as first, you can just say, this is a warning type of stuff, or this is just verbose.. Or MAYBE STOP SOMETHING IF IT IS SOMETHING VERY FATAL, AND SHOULD BE FIXED ASAP.. Not only that, often you will encounter like specially if you link something like a canvas, it might always be that well, Either you will force it using “!” in the end, or you will just do a command that eliminated undefined.. Like if (canvas !== undefined), but assert says.. OK, LET ME HAVE A CONDITION, and not only that, my asserts are special, as I have rigged it, so it will never ever return or what Typescript called a never return.. So you don’t need to write those.. Loggers also have a special use, as if the messages are verbose, instead of removing and readding all the console logs in like a stupid way.. You can declare a class and say, if the level is below fatal, like for verbose or info type of stuff, just cancel those stuff.. Just don’t show it.. It is very nice tool tbh.. Oh yah, I forgot.. Well, as these are custom, so You can literally add another parameter like context, as to what might be the reason for the breaking of the code, so if you check that code later on in life.. You will still know, what broke and where.. It’s a really handy tool in my opinion and everyone should give it a shot."}, {"post_id": 18410, "ts": "2026-06-29T15:32:03Z", "hours": 4.3344, "text": "Yesterday, I was doing research, so I don’t disappoint any of you guys. I watched some matrices manipulation videos and all, and I made this small little copy for myself to store all the findings I have. I don’t really have a lot, but these are certainly my findings, and I don’t prefer making notes on laptop, because personal preference in that. Anyways Give this a read, it is not very hard, and you will learn something new about how the GPU works and specially if you always wondered, what is the actual use of “Matrices” because I am in high school, and I always thought Matrices were silly and all. For people, who have been since the start of this project. First of all, I wanted to talk to you guys.. I don’t really know, what to do to this project. And I feel like, I am going to get banned, because even after all those iterations, remember, the whole project is widely AI made.. Though I am currently research, and have been open. But I don’t really know, how to feel about it. My stupid little Autistic Brain is really panicing that all my 100 hours of work would be gone. Honestly, I won’t be sad or anything if I get banned, because, indeed I used AI, but I just wanted to write my best shot, that atleast, I had a point to say, and then whatever the friends at StarDance decide, I will be completely fine with it. My main goal for developing this project, came from watching a tutorial, and I wanted to try to make something like Minecraft but for the web, because I was fascinated by optimizations.. This optimization, that optimization.. And I was like, Wait, these youtubers are literally rendering trillions of vertexes, why not make it in the browser, and even if I am able to render in 100s.. I still would always find it fascinating.. I never really thought before I started, and I just wanted to talk to AI, about how everything worked, and all.. I did mostly the research about optimization, and I specifically chose Gemini Pro over Claude, because Claude really does the heavy lifting for everyone, whereas I was here to learn. That’s the reason, I had so many hours invested.. (and so many reiterations on my code LOL…). I wanted to learn, but not like the code, but like how to optimize, like, I used to think.. Wait, BITWISE MAPPING.. We can map this much bytes to this, and that, and let the AI write the code for that.. I was just so invested on this project, I forgot we had a rule of “NO MORE THAN 30% AI..” Ahh, I am stupid.. That’s why, I am trying to gain myself back a lot now.. Doing stuff without hours like writing on copy, because obviously I could have written through VSC or something.. but now, I have really given hope on this project as a Retired / Banned Project…. I literally am currently working on a different repo with the name Minecraft rather than this.. I am watching youtube videos and lectures about how WebGPU works and all.. And I want to gain myself back.. As in a good person, and not like an AI slop, who breaks rules.."}, {"post_id": 17378, "ts": "2026-06-28T04:25:03Z", "hours": 0.5958, "text": "If anyone wants to understand more about what a Graphics API is, and how is it meant to work, I would highly suggest watching “Making my own 3D engine” by Inkbox https://www.youtube.com/watch?v=OJoZSRnU0is"}, {"post_id": 16728, "ts": "2026-06-27T05:24:19Z", "hours": 9.9878, "text": "IDK, How should I actually show my research in here but this is like, I have been working on, I have made 5 different notes, and as you can see by the time.. Yah, I have worked some hours on this bad boy.."}, {"post_id": 15580, "ts": "2026-06-25T10:41:26Z", "hours": 6.1003, "text": "Never in my life, I thought I would be so happy seeing a Red Triangle Render on my screen.. YAH, I WASTED LIKE 6 HOURS READING ARTICLES WRITING SHEESH, THEN ASKING AI, Obviously not to generate code, but about where to understand it better, and how to understand the concepts. And more. GUYS, STOP FOLLOWING ME.. It breaks my heart so much, that I am gonna disappoint you all, if I didn’t make this project, fully work.. Till I was trying to make stuff, and learn and sleep, and learn, I didn’t have so many followers, it was like, fine, if it broke for me, it’s completely fine with me, but now.. IT FEELS LIKE, IT IS NOT GOING TO BE FINE.. Thankfully, I am using a different repo, and that is accurately named as “Minecraft” rather than Puzzles to avoid confusion. As where did the Puzzle come from? Well, long story short, see my first ever devlog in here."}, {"post_id": 14225, "ts": "2026-06-23T07:27:20Z", "hours": 2.3678, "text": "Guys, I will be completely open, and I have said before as well, but seeing so many people keep following me. Thank you so much for following a project, that is though made by me, but it like I am owning a shop that is run by someone else. AKA, AI has helped me a ton, and so much that, I don’t know, anything afterwards, specially with Shaders, WebGPU and other creative stuff and optimizations, which let’s be honest, the optimizations like, GREEDY MESHING!!, OCCLUSION CULLING, BACK CULLING (Though it was just like a line as it was native to WebGPU), and while reading through other low level youtubers about optimizations such as, EXTREMITY BOUND CHECKING, BITWISE MANIPULATION,CACHE LOCALITY, NOISE UPSAMPLING, NOISE CASHING, RUN LENGTH ENCODING, RLE BASED RUNTIME. VOXEL DATALOOKUP TABLES, AoSoA and so on, like these just become buzz words that I ask my AI to help with, and that’s the recipe to make everything fall apart when you want to add something new. AI’s context windows are just not big enough to have a full fedged Minecraft. Seeing all you guys support, I have decided to ask AI to now teach me, and help me with the flow, and never the code, I will be coding every single word by myself. Read Papers, and try to implement it myself and so on.. This might be a big turning point for the project because, YAH, I AM WRITING THIS ENTIRE CODE ONCE AGAIN, But this time, I promise, I will be learning everything, and I will keep this as running, and make a second repo like minecraft or something, to enjoy. Sorry to everyone who thought, this is entirely made by me, because that is just not possible for such small 7 second attention span kids like us."}, {"post_id": 12912, "ts": "2026-06-21T04:32:28Z", "hours": 1.0956, "text": "Added leaves and foliage, this was arguable much easy, but I sure know, I again broke my optimizations or atleast something must be broken, because things cannot go this smooth.. AND FOR ONCE, I WROTE SOMETHING I CAN ALSO UNDERSTAND, and then AI was like Nuh Uh, SALTED TREE SIMULATOR!! USE SEED, AND FEED IT WITH SOME SALT, PUSH THAT UP A TREE, AND YOU HAVE BETTER TREES.. I am sometimes stunned that how much AI can really help you develop something, that can look this promising. I thought only top tier people, or people with tons and tons of money to burn on Claude can build this, but this is not that bad, if I am being honest. Obviously, I won’t reach the same level of achievements as that of something like Claude, but I think, I learnt so so much about Shaders, its types, like Vertex, Fragment and My fav, COMPUTE shaders.. And everything is just so cool. Still fixing some bugs here and there, because umm.. Yah, it still needs a lot, and A LOT OF OPTIMIZATIONS and polish, because my chunk generation worked better in my last attempt. Will be figuring everything out so stay tuned my dear friends.. NOTABLE MENTIONS:- YOUTUBERS Low Level Game Dev (He has some clever tricks up as well, which Vericidium didn’t) Vercidium (TRUE INSPIRATION AND GOATED, FOR MAKING MY PROJECT WORK) Frieends Rupnil (My cutiepie, NO QUESTIONS) Adamd (He helped me get funds for one of my hardware projects without asking anything in return. THANK YOU)"}, {"post_id": 12571, "ts": "2026-06-20T15:06:04Z", "hours": 3.2694, "text": "I have just added the option to save, so basically, if you make something funny like 67 on your world with water blocks, first of all, EWW… And second of all, yes it will persist and now I will hate you even more."}, {"post_id": 12374, "ts": "2026-06-20T06:15:52Z", "hours": 1.0867, "text": "Guys, I think, I broke something, but I really cannot point out, what is wrong in my minecraft? I mean.. There is something missing, but what can it be?"}, {"post_id": 12091, "ts": "2026-06-19T18:52:09Z", "hours": 2.1861, "text": "Current Lighting Rendering Engine, currently using the AO metrics that I used last time, but I never understood properly, but this time, this looks so so so cool.. This will be coming soon for you guys as well to enjoy. Stay tuned. This was a lot of trouble and back and forth. Because lighting engine, doesn’t one have to update one chunk, but four neighboring chunk as well, and idk why it took me so long to realise.."}, {"post_id": 11915, "ts": "2026-06-19T12:59:27Z", "hours": 1.8122, "text": "I am sorry, did I just get 60FPS?? I HAD TO PAUSE MY FRAME TO CAPTURE THIS MUCH OPTIMIZATION. I am not even at the peak of it. Furthermore, I was currently working on Sky Box, and I am tired to figuring out what’s wrong, so this is an early devlog of just about 2 hours. I want to rant about skyBox and what did I do to well, Make my game break.. So, what happened is that, the shaders that I am using, I was using vec3, which means sun’s direction is a vector of 3 floats, but somehow, vec3 must always start on a multiple of 16.. WHO DECIDED THAT WAS A GOOD IDEA.. WHO IS THAT MORON??? I WANT TO TAKE MY SHOTGUN OUT (TO FLEX) AND PUNCH HIM (BECAUSE WHO WASTES AMMO.. TOO EXPENSIVE LAH.) I GOT TIRED DEBUGGING THIS… Only for AI to tell me, you did everything right except everything.. I just uploaded everything. You guys might think this is a negative as no trees and grass, but TRUST THE PROCESS.. I KNOW YOU CAN, ELSE I WILL SHOW YOU MY SHOTGUN AND PUNCH YOU AS WELL!!"}, {"post_id": 11811, "ts": "2026-06-19T07:03:19Z", "hours": 1.8922, "text": "Quick Update on the progress.. I mean, FAH.. The render distance so high, and yet the FPS IS PLAYABLE, without even much optimizations. I know, the terrain has nothing for now. But don’t worry.. SOON TM.. Let me handle the optimizations first. AND DON’T YOU DARE CROSS QUESTION ME, ELSE I WILL CROSS YOUR QUESTION BACK TO YOU"}, {"post_id": 11216, "ts": "2026-06-18T11:10:03Z", "hours": 3.03, "text": "Playing Minecraft it was never meant to be LMAO.. On this, an important announcement to make here. I will not be able to add multiplayer into this build, because it adds extra complexity into the build, which I am not able to work it for now. It requires you to first have an server in the first place, and then work with streaming and all those. Latency can be a nightmare to tackle with. I am waiting for my last ship’s payout so I can push on github, all my updates. Till then, I am working on small things, like adding structures like trees, water and so on, because this is a new, and much more optimized build than the last one. You will also find it relatively pleasing to read my code, if you are nerdy enough, but isn’t that hard tbh."}, {"post_id": 11112, "ts": "2026-06-18T05:41:13Z", "hours": 4.0106, "text": "Better support for AO Voxels and lighting coming soon to this build. Stay Tunes or you might miss out. Here is a small working prototype of it. What is AO you may ask? AO means Ambient Occlusion, what it does is check in the four corners, and predict the shading based off of those corners. I mean, AO has much more, but this is like a basic and optimized version of it, that looks good, but also not performance heavy. Obviously, I am not using GAMING RTX 5090 for this.. Hell, My Laptop doesn’t even have a GPU, SO SHUT UP.. IT’S MY GAME AND I WILL DESIGN IT HOWEVER I WANT."}, {"post_id": 10666, "ts": "2026-06-17T15:05:23Z", "hours": 6.2597, "text": "Hate me as much as you want, because, I am rewriting my code once again for the idk, like 5th time, just to learn more, and finally I am able to structure my code properly. Go this was a bad plan. And I would not like to go to this hell ever again. Please god, forgive me for my sins.. But anyways, as you can see, I am currently, literally rewriting parts of the code, and organishing it, into much better folder structure, so I and you, and she who told you not to worry about his boy, can all understand this code and you don’t have to be a nerd to be changing parameters to buff yourself, to become the boy the girls needs.. IDK, I have been working too much on this project. I need therapy LMAO.."}, {"post_id": 9758, "ts": "2026-06-16T06:01:00Z", "hours": 3.4519, "text": "Currently working on WebRTC and understanding, why do I exist, but also why do computers exist, and how do computers know that my computer is not your computer and your computer is well, how is it your computer. And can they secretly interact and do goofy things with ultrasonic, and I mean, it’s technically the speed of light so.. YAH.."}, {"post_id": 9084, "ts": "2026-06-15T05:46:24Z", "hours": 5.6536, "text": "Final Finishing Touches, And I wanted to add much more, like better lighting support and all, but Now I am getting too much out of my comfort zone, and will have to work completely with AI, I have polished the UI, made an Inventory system and a bit more, but now, I am really tired, and cannot explain, how tedious it has become maintaining my own code. So I will have to halt my project now and ship it. Thanks to Stardance for giving me such a wonderful place to code at and work, and show my works and learn so so much cool stuff into the world of GPUs and Shaders."}, {"post_id": 8023, "ts": "2026-06-13T11:57:01Z", "hours": 3.1878, "text": "Umm.. Do cows have lawyers? Anyways, Today, i just worked on refactoring my code into different files, so it is easier to navigate and understand the code. Because it was getting a mess."}, {"post_id": 7405, "ts": "2026-06-12T10:32:33Z", "hours": 1.5669, "text": "Water Update with bouyancy and all.. And made everything look like Avatar.. BLUE TONED.. Because you know, Water is blue, and blue is blue, I have no clue, so make everything blue. Now, you are blue, and me is blue"}, {"post_id": 6967, "ts": "2026-06-11T18:00:49Z", "hours": 0.31, "text": "IDK, How do I show you but basically, As I have moved to a typescript focused base. So, I had to change my monorepo and all. So Now, the game is playable for anyone to enjoy."}, {"post_id": 6940, "ts": "2026-06-11T17:14:07Z", "hours": 11.7611, "text": "Guys it’s been about 12 hours and let me tell you. First of all. I am just too tired after all this. I wanted to use better optimized code like SSBOs but basically, I cannot use it due to the fact that it is not available in OpenGL ES 30 so I had to go all around and make the entire game in another GPU.. Making shaders was already hard. THIS MADE IT WORSE!! So, Currenly, my app supports two formats and if you are stupid enough that you don’t have WebGPU, so it will run normally like WebGL will get on and help. Further optimized my code and also, I will be optimizing it even further. I have added grass by then SO I CAN TOUCH IT, ATLEAST WHEN I AM SITTING AND LEARNING AND DOING THESE STUPID STUFF. Uff.. Also the I have also added moving Cows so you can see, but the texture is just stone so please don’t mind."}, {"post_id": 5711, "ts": "2026-06-09T16:39:15Z", "hours": 0.6553, "text": "Guys, I think, I found a friend.. Its not cute and all.. BUT IT’S LOVELY.. I LOVE HER SO MUCH.. YOU NAME IS WELL.. PET ROCK.. AWWWW.. YOU ARE SO LOVELY MS. PET ROCK.. Hope you don’t die the moment you fall.. 100% NOT FORESHADOWING.."}, {"post_id": 5685, "ts": "2026-06-09T15:47:02Z", "hours": 1.0764, "text": "Water is finally working and it is moving.. It is animated so you can enjoy the ambience. Furthermore, I have dialed up the variables for my night. So, the night isn’t like a horror movie. Took me a little too long then I would anticipate."}, {"post_id": 5566, "ts": "2026-06-09T12:09:32Z", "hours": 1.4347, "text": "Currently I am working on Implementing Water, and let’s just say, it’s not working out well for me."}, {"post_id": 5514, "ts": "2026-06-09T10:09:46Z", "hours": 2.4567, "text": "Guys, I think, When I meant Water, I meant to add Water not BEANS IN MINECRAFT.. LMAOO… BEANS!!!!!! BEANS MOD COMING SOON TM"}, {"post_id": 5058, "ts": "2026-06-08T18:38:13Z", "hours": 1.1131, "text": "ONLY 1% OF PEOPLE CAN FIND THE DIFFERENCE BETWEEN MY LODs LMAO XD… CAN YOU FIND THE 4 LEVELS OF LODS BECAUSE I CANNOT - DORA THE DRUG DEALER"}, {"post_id": 4955, "ts": "2026-06-08T16:20:44Z", "hours": 0.7411, "text": "Inventory Icon Update"}, {"post_id": 4933, "ts": "2026-06-08T15:19:58Z", "hours": 1.7539, "text": "Not to brag about anything, but I just rendered like over 4000 chunks with I know I know, 20 FPS, but you don’t realise, just see the CPU and GPU. It’s not even a proper GPU, Is uses VRAM from my storage no less.. For anyone wondering, Check Intel UHD Graphics, and my CPU is i3-1005G1, so it’s some antique peice, but yet, my algorithms held strong even in rendering 4000 fizzing chunks. Entities like cows coming soon."}, {"post_id": 4779, "ts": "2026-06-08T08:31:49Z", "hours": 4.2933, "text": "Rendering Pipeline Updated, to make it work with even more chunks Procedural Generation, and make it not suck. The main problem I was facing and is still facing is the fact that I am dumb, and also Lighting. Somehow, the Lighting Engine is not working out with so many parameters that I have tested with. I will probably just"}, {"post_id": 4357, "ts": "2026-06-07T17:26:03Z", "hours": 4.3622, "text": "Lighting Engine Update, And tons of optimizations added to make it work. I hope, it doesn’t crash on anyone, because, when I check the memory usage of this bad boy, it was just 56MB, I was like, FAH??? I MADE ALL OF THIS, IN 56 MB???? That’s some crazy shit. I will be working on the Menu and all next. Stay tuned."}, {"post_id": 4077, "ts": "2026-06-07T08:32:19Z", "hours": 6.5333, "text": "First of all, thanks to rufus.gordonheywood for his following, because, I forgot, I was doing star dance, I literally, went so deep into making Minecraft work. If you want, you can check, this minecraft literally has no external dependencies.. THAT IS SOME CRAZY SHIT. I recently made procedral generation, multithreading, and so much more. And I want to be brutally honest with everyone, yes I am using AI, because I just couldn’t make it work without it, the WEBGPU Shaders, the compiling languages, and so much more. I am sorry for anyone who is disappointed. BTW, Currently, I am seeing a bug, that if you fork my project and run it through live server, it is working fine, but not through github. IDK, What’s wrong, but I will get into it ASAP, and make everyone enjoy my shit."}, {"post_id": 3551, "ts": "2026-06-06T15:21:27Z", "hours": 6.1564, "text": "Don’t even ask, why I made a 32x32x32 Minecraft world, and hyperoptimized it to run on GPU and write compute shaders, and eat myself multiple times in the process.. Yah Yah, I used AI, but I wrote everything by hand and understand most of the code, apart from Shaders, just don’t ask me please.. LOL.. But, I made this run with only 40 vertices, like WHAT THE FLUFFFF???? YOOOOO"}, {"post_id": 2775, "ts": "2026-06-05T16:03:25Z", "hours": 5.2967, "text": "Worked on Procedral Glass Breaking… Please don’t ask how long it took, because IT TOOK ME THROUGH THE CORNERS OF INTERNET TO FIND SOMETHING, and then refined it with AI.. Yah AI, I want to be open, But I am not smart enough dealing with such intricate part and design"}]...
|
Title: Minecraft Web by @TruthEntity | Stardance
Title: Minecraft Web by @TruthEntity | Stardance
Devlogs:
Worked on Procedral Glass Breaking… Please don’t ask how long it took, because IT TOOK ME THROUGH THE CORNERS OF INTERNET TO FIND SOMETHING, and then refined it with AI.. Yah AI, I want to be open, But I am not smart enough dealing with such intricate part and design
Don’t even ask, why I made a 32x32x32 Minecraft world, and hyperoptimized it to run on GPU and write compute shaders, and eat myself multiple times in the process.. Yah Yah, I used AI, but I wrote everything by hand and understand most of the code, apart from Shaders, just don’t ask me please.. LOL.. But, I made this run with only 40 vertices, like WHAT THE FLUFFFF???? YOOOOO
First of all, thanks to rufus.gordonheywood for his following, because, I forgot, I was doing star dance, I literally, went so deep into making Minecraft work. If you want, you can check, this minecraft literally has no external dependencies.. THAT IS SOME CRAZY SHIT. I recently made procedral generation, multithreading, and so much more. And I want to be brutally honest with everyone, yes I am using AI, because I just couldn’t make it work without it, the WEBGPU Shaders, the compiling languages, and so much more. I am sorry for anyone who is disappointed. BTW, Currently, I am seeing a bug, that if you fork my project and run it through live server, it is working fine, but not through github. IDK, What’s wrong, but I will get into it ASAP, and make everyone enjoy my shit.
Lighting Engine Update, And tons of optimizations added to make it work. I hope, it doesn’t crash on anyone, because, when I check the memory usage of this bad boy, it was just 56MB, I was like, FAH??? I MADE ALL OF THIS, IN 56 MB???? That’s some crazy shit. I will be working on the Menu and all next. Stay tuned.
Rendering Pipeline Updated, to make it work with even more chunks Procedural Generation, and make it not suck. The main problem I was facing and is still facing is the fact that I am dumb, and also Lighting. Somehow, the Lighting Engine is not working out with so many parameters that I have tested with. I will probably just
Not to brag about anything, but I just rendered like over 4000 chunks with I know I know, 20 FPS, but you don’t realise, just see the CPU and GPU. It’s not even a proper GPU, Is uses VRAM from my storage no less.. For anyone wondering, Check Intel UHD Graphics, and my CPU is i3-1005G1, so it’s some antique peice, but yet, my algorithms held strong even in rendering 4000 fizzing chunks. Entities like cows coming soon.
Inventory Icon Update
ONLY 1% OF PEOPLE CAN FIND THE DIFFERENCE BETWEEN MY LODs LMAO XD… CAN YOU FIND THE 4 LEVELS OF LODS BECAUSE I CANNOT - DORA THE DRUG DEALER
Guys, I think, When I meant Water, I meant to add Water not BEANS IN MINECRAFT.. LMAOO… BEANS!!!!!! BEANS MOD COMING SOON TM
Currently I am working on Implementing Water, and let’s just say, it’s not working out well for me.
Water is finally working and it is moving.. It is animated so you can enjoy the ambience. Furthermore, I have dialed up the variables for my night. So, the night isn’t like a horror movie. Took me a little too long then I would anticipate.
Guys, I think, I found a friend.. Its not cute and all.. BUT IT’S LOVELY.. I LOVE HER SO MUCH.. YOU NAME IS WELL.. PET ROCK.. AWWWW.. YOU ARE SO LOVELY MS. PET ROCK.. Hope you don’t die the moment you fall.. 100% NOT FORESHADOWING..
Guys it’s been about 12 hours and let me tell you. First of all. I am just too tired after all this. I wanted to use better optimized code like SSBOs but basically, I cannot use it due to the fact that it is not available in OpenGL ES 30 so I had to go all around and make the entire game in another GPU.. Making shaders was already hard. THIS MADE IT WORSE!! So, Currenly, my app supports two formats and if you are stupid enough that you don’t have WebGPU, so it will run normally like WebGL will get on and help. Further optimized my code and also, I will be optimizing it even further. I have added grass by then SO I CAN TOUCH IT, ATLEAST WHEN I AM SITTING AND LEARNING AND DOING THESE STUPID STUFF. Uff.. Also the I have also added moving Cows so you can see, but the texture is just stone so please don’t mind.
IDK, How do I show you but basically, As I have moved to a typescript focused base. So, I had to change my monorepo and all. So Now, the game is playable for anyone to enjoy.
Water Update with bouyancy and all.. And made everything look like Avatar.. BLUE TONED.. Because you know, Water is blue, and blue is blue, I have no clue, so make everything blue. Now, you are blue, and me is blue
Umm.. Do cows have lawyers? Anyways, Today, i just worked on refactoring my code into different files, so it is easier to navigate and understand the code. Because it was getting a mess.
Final Finishing Touches, And I wanted to add much more, like better lighting support and all, but Now I am getting too much out of my comfort zone, and will have to work completely with AI, I have polished the UI, made an Inventory system and a bit more, but now, I am really tired, and cannot explain, how tedious it has become maintaining my own code. So I will have to halt my project now and ship it. Thanks to Stardance for giving me such a wonderful place to code at and work, and show my works and learn so so much cool stuff into the world of GPUs and Shaders.
Currently working on WebRTC and understanding, why do I exist, but also why do computers exist, and how do computers know that my computer is not your computer and your computer is well, how is it your computer. And can they secretly interact and do goofy things with ultrasonic, and I mean, it’s technically the speed of light so.. YAH..
Hate me as much as you want, because, I am rewriting my code once again for the idk, like 5th time, just to learn more, and finally I am able to structure my code properly. Go this was a bad plan. And I would not like to go to this hell ever again. Please god, forgive me for my sins.. But anyways, as you can see, I am currently, literally rewriting parts of the code, and organishing it, into much better folder structure, so I and you, and she who told you not to worry about his boy, can all understand this code and you don’t have to be a nerd to be changing parameters to buff yourself, to become the boy the girls needs.. IDK, I have been working too much on this project. I need therapy LMAO..
Better support for AO Voxels and lighting coming soon to this build. Stay Tunes or you might miss out. Here is a small working prototype of it. What is AO you may ask? AO means Ambient Occlusion, what it does is check in the four corners, and predict the shading based off of those corners. I mean, AO has much more, but this is like a basic and optimized version of it, that looks good, but also not performance heavy. Obviously, I am not using GAMING RTX 5090 for this.. Hell, My Laptop doesn’t even have a GPU, SO SHUT UP.. IT’S MY GAME AND I WILL DESIGN IT HOWEVER I WANT.
Playing Minecraft it was never meant to be LMAO.. On this, an important announcement to make here. I will not be able to add multiplayer into this build, because it adds extra complexity into the build, which I am not able to work it for now. It requires you to first have an server in the first place, and then work with streaming and all those. Latency can be a nightmare to tackle with. I am waiting for my last ship’s payout so I can push on github, all my updates. Till then, I am working on small things, like adding structures like trees, water and so on, because this is a new, and much more optimized build than the last one. You will also find it relatively pleasing to read my code, if you are nerdy enough, but isn’t that hard tbh.
Quick Update on the progress.. I mean, FAH.. The render distance so high, and yet the FPS IS PLAYABLE, without even much optimizations. I know, the terrain has nothing for now. But don’t worry.. SOON TM.. Let me handle the optimizations first. AND DON’T YOU DARE CROSS QUESTION ME, ELSE I WILL CROSS YOUR QUESTION BACK TO YOU
I am sorry, did I just get 60FPS?? I HAD TO PAUSE MY FRAME TO CAPTURE THIS MUCH OPTIMIZATION. I am not even at the peak of it. Furthermore, I was currently working on Sky Box, and I am tired to figuring out what’s wrong, so this is an early devlog of just about 2 hours. I want to rant about skyBox and what did I do to well, Make my game break.. So, what happened is that, the shaders that I am using, I was using vec3, which means sun’s direction is a vector of 3 floats, but somehow, vec3 must always start on a multiple of 16.. WHO DECIDED THAT WAS A GOOD IDEA.. WHO IS THAT MORON??? I WANT TO TAKE MY SHOTGUN OUT (TO FLEX) AND PUNCH HIM (BECAUSE WHO WASTES AMMO.. TOO EXPENSIVE LAH.) I GOT TIRED DEBUGGING THIS… Only for AI to tell me, you did everything right except everything.. I just uploaded everything. You guys might think this is a negative as no trees and grass, but TRUST THE PROCESS.. I KNOW YOU CAN, ELSE I WILL SHOW YOU MY SHOTGUN AND PUNCH YOU AS WELL!!
Current Lighting Rendering Engine, currently using the AO metrics that I used last time, but I never understood properly, but this time, this looks so so so cool.. This will be coming soon for you guys as well to enjoy. Stay tuned. This was a lot of trouble and back and forth. Because lighting engine, doesn’t one have to update one chunk, but four neighboring chunk as well, and idk why it took me so long to realise..
Guys, I think, I broke something, but I really cannot point out, what is wrong in my minecraft? I mean.. There is something missing, but what can it be?
I have just added the option to save, so basically, if you make something funny like 67 on your world with water blocks, first of all, EWW… And second of all, yes it will persist and now I will hate you even more.
Added leaves and foliage, this was arguable much easy, but I sure know, I again broke my optimizations or atleast something must be broken, because things cannot go this smooth.. AND FOR ONCE, I WROTE SOMETHING I CAN ALSO UNDERSTAND, and then AI was like Nuh Uh, SALTED TREE SIMULATOR!! USE SEED, AND FEED IT WITH SOME SALT, PUSH THAT UP A TREE, AND YOU HAVE BETTER TREES.. I am sometimes stunned that how much AI can really help you develop something, that can look this promising. I thought only top tier people, or people with tons and tons of money to burn on Claude can build this, but this is not that bad, if I am being honest. Obviously, I won’t reach the same level of achievements as that of something like Claude, but I think, I learnt so so much about Shaders, its types, like Vertex, Fragment and My fav, COMPUTE shaders.. And everything is just so cool. Still fixing some bugs here and there, because umm.. Yah, it still needs a lot, and A LOT OF OPTIMIZATIONS and polish, because my chunk generation worked better in my last attempt. Will be figuring everything out so stay tuned my dear friends.. NOTABLE MENTIONS:- YOUTUBERS Low Level Game Dev (He has some clever tricks up as well, which Vericidium didn’t) Vercidium (TRUE INSPIRATION AND GOATED, FOR MAKING MY PROJECT WORK) Frieends Rupnil (My cutiepie, NO QUESTIONS) Adamd (He helped me get funds for one of my hardware projects without asking anything in return. THANK YOU)
Guys, I will be completely open, and I have said before as well, but seeing so many people keep following me. Thank you so much for following a project, that is though made by me, but it like I am owning a shop that is run by someone else. AKA, AI has helped me a ton, and so much that, I don’t know, anything afterwards, specially with Shaders, WebGPU and other creative stuff and optimizations, which let’s be honest, the optimizations like, GREEDY MESHING!!, OCCLUSION CULLING, BACK CULLING (Though it was just like a line as it was native to WebGPU), and while reading through other low level youtubers about optimizations such as, EXTREMITY BOUND CHECKING, BITWISE MANIPULATION,CACHE LOCALITY, NOISE UPSAMPLING, NOISE CASHING, RUN LENGTH ENCODING, RLE BASED RUNTIME. VOXEL DATALOOKUP TABLES, AoSoA and so on, like these just become buzz words that I ask my AI to help with, and that’s the recipe to make everything fall apart when you want to add something new. AI’s context windows are just not big enough to have a full fedged Minecraft. Seeing all you guys support, I have decided to ask AI to now teach me, and help me with the flow, and never the code, I will be coding every single word by myself. Read Papers, and try to implement it myself and so on.. This might be a big turning point for the project because, YAH, I AM WRITING THIS ENTIRE CODE ONCE AGAIN, But this time, I promise, I will be learning everything, and I will keep this as running, and make a second repo like minecraft or something, to enjoy. Sorry to everyone who thought, this is entirely made by me, because that is just not possible for such small 7 second attention span kids like us.
Never in my life, I thought I would be so happy seeing a Red Triangle Render on my screen.. YAH, I WASTED LIKE 6 HOURS READING ARTICLES WRITING SHEESH, THEN ASKING AI, Obviously not to generate code, but about where to understand it better, and how to understand the concepts. And more. GUYS, STOP FOLLOWING ME.. It breaks my heart so much, that I am gonna disappoint you all, if I didn’t make this project, fully work.. Till I was trying to make stuff, and learn and sleep, and learn, I didn’t have so many followers, it was like, fine, if it broke for me, it’s completely fine with me, but now.. IT FEELS LIKE, IT IS NOT GOING TO BE FINE.. Thankfully, I am using a different repo, and that is accurately named as “Minecraft” rather than Puzzles to avoid confusion. As where did the Puzzle come from? Well, long story short, see my first ever devlog in here.
IDK, How should I actually show my research in here but this is like, I have been working on, I have made 5 different notes, and as you can see by the time.. Yah, I have worked some hours on this bad boy..
If anyone wants to understand more about what a Graphics API is, and how is it meant to work, I would highly suggest watching “Making my own 3D engine” by Inkbox https://www.youtube.com/watch?v=OJoZSRnU0is
Yesterday, I was doing research, so I don’t disappoint any of you guys. I watched some matrices manipulation videos and all, and I made this small little copy for myself to store all the findings I have. I don’t really have a lot, but these are certainly my findings, and I don’t prefer making notes on laptop, because personal preference in that. Anyways Give this a read, it is not very hard, and you will learn something new about how the GPU works and specially if you always wondered, what is the actual use of “Matrices” because I am in high school, and I always thought Matrices were silly and all. For people, who have been since the start of this project. First of all, I wanted to talk to you guys.. I don’t really know, what to do to this project. And I feel like, I am going to get banned, because even after all those iterations, remember, the whole project is widely AI made.. Though I am currently research, and have been open. But I don’t really know, how to feel about it. My stupid little Autistic Brain is really panicing that all my 100 hours of work would be gone. Honestly, I won’t be sad or anything if I get banned, because, indeed I used AI, but I just wanted to write my best shot, that atleast, I had a point to say, and then whatever the friends at StarDance decide, I will be completely fine with it. My main goal for developing this project, came from watching a tutorial, and I wanted to try to make something like Minecraft but for the web, because I was fascinated by optimizations.. This optimization, that optimization.. And I was like, Wait, these youtubers are literally rendering trillions of vertexes, why not make it in the browser, and even if I am able to render in 100s.. I still would always find it fascinating.. I never really thought before I started, and I just wanted to talk to AI, about how everything worked, and all.. I did mostly the research about optimization, and I specifically chose Gemini Pro over Claude, because Claude really does the heavy lifting for everyone, whereas I was here to learn. That’s the reason, I had so many hours invested.. (and so many reiterations on my code LOL…). I wanted to learn, but not like the code, but like how to optimize, like, I used to think.. Wait, BITWISE MAPPING.. We can map this much bytes to this, and that, and let the AI write the code for that.. I was just so invested on this project, I forgot we had a rule of “NO MORE THAN 30% AI..” Ahh, I am stupid.. That’s why, I am trying to gain myself back a lot now.. Doing stuff without hours like writing on copy, because obviously I could have written through VSC or something.. but now, I have really given hope on this project as a Retired / Banned Project…. I literally am currently working on a different repo with the name Minecraft rather than this.. I am watching youtube videos and lectures about how WebGPU works and all.. And I want to gain myself back.. As in a good person, and not like an AI slop, who breaks rules..
Sorry for all my mental breakdowns.. Here is some actual progress that I did by myself.. I learnt about Assert from my last code.. And why do we need assert.. And I made my own Logger.. What are these so let me explain.. A Logger is atmost just a console.log message, but why to make it a separate class? This offers a lot of usability, as first, you can just say, this is a warning type of stuff, or this is just verbose.. Or MAYBE STOP SOMETHING IF IT IS SOMETHING VERY FATAL, AND SHOULD BE FIXED ASAP.. Not only that, often you will encounter like specially if you link something like a canvas, it might always be that well, Either you will force it using “!” in the end, or you will just do a command that eliminated undefined.. Like if (canvas !== undefined), but assert says.. OK, LET ME HAVE A CONDITION, and not only that, my asserts are special, as I have rigged it, so it will never ever return or what Typescript called a never return.. So you don’t need to write those.. Loggers also have a special use, as if the messages are verbose, instead of removing and readding all the console logs in like a stupid way.. You can declare a class and say, if the level is below fatal, like for verbose or info type of stuff, just cancel those stuff.. Just don’t show it.. It is very nice tool tbh.. Oh yah, I forgot.. Well, as these are custom, so You can literally add another parameter like context, as to what might be the reason for the breaking of the code, so if you check that code later on in life.. You will still know, what broke and where.. It’s a really handy tool in my opinion and everyone should give it a shot.
It was quite easy, I mean, I am finally writing shaders, and yes, you guys have seen me make a triangle before, but that was genuinely speaking, was just a normal little trinagle.. But this triangle.. NO NO.. I have structured it so nicely that dare you break this, and my FATAL ERROR systems start to panic and trigger alarms all around.. It was a chaotic mess, and yes I did rejuvanate some parts of my old project, but yah, It’s not like I don’t know what I am doing now.. Furthermore, Sorry for my mental issues, I GOT MY FIRST SHIP’S PAYOUT, and though I was not expecting it, I am more than happy, even if it was a 13x mult and yah, I got a lot of comments regarding Z-Fighting.. I don’t really know the source of this issue, so I will be making the stuff again anyways, in my ways this time.. And hopefully, it will be better than last time.. I am so happy that I literally broke a tear when I saw I got a payout.. Thanks to everyone for so so much support… I will not be working harder than ever towards this project.
Guys I can see progress..
Guys, My very first shader, completely written by me, and it looks so sick. All it does is feed into the fragment an attribute of space, and break that space with a checker.. And this is just fascinating.. I want to hug myself..
I have started following a tutorial, and I have done so much research, but it a shame that I cannot log that time. I went through some of the best documents written about WebGPU and explaining stuff.. But anyways, I have started following a tutorial on Three.js for making minecraft. It has literally made me in ease, because now I can log some actual time now.. By writing code rather than researching and for now here is my plan Continue to do this project Phase: 1 Draw a Cube with Controls, Draw 2 Cubes with Controls DRAW 64000 CUBES WITH CONTROLS.. By controls they are Orbital Controls, and then we will move on to the second part which is Working on a Naive Mesher, which will just give all the blocks its own 12 triangles on 8 edges each, and then blow up my laptop because if you realise 64000 * 12 is some sheesh work.. SO MANY TRIANGLES, AND I COULD SEE HARDLY 100.. But atleast, it will be the start, then I will work on Instancing and get me fps back up Also utilize the FrameStats which I will make for myself, like the same which well.. THREE.JS USES BUT WITH MY AKA TRUTHENTITY STYLE.. YOOOOO Then perhaps start erasing triangles that are connected through a second mesher Yes I will have multiple types of Meshers and Multiple type of Camera.. And all should follow a common Camera and everything else should be an Implementation like last time, I gave Geometry Pass the implementation of the simpler Renderer Pass, because it effectively make me plug and play with multiple different ways. This is going to be my stuff for next few days of my life.
Umm, Why is Three.js so easy?? HELLO?? JUST MADE A SIMPLE SLIDER THINGY, AND THIS IS SO DOPE GUYS..
This really feels surreal.. I am editing parameters to a game, in which people will land their beautiful foot on, ad mine ores, and do stuff, and this is like a dev mode, where I and I choose how much coal and Iron I want in my life.. Damn..
I hate to admit it, but did I just add, literal shadows, that would have taken me, so so much hours to be working on.. And THREE.JS SOMEHOW, LITERALLY HAS A FREAKING FUNCTION.. THAT DOES THAT AUTOMATICALLY?? EXCUSE ME??? THAT’S JUST CHEATING..
Collisions are now working, with this beautiful looking icosphere as an helper. I JUST WISH WEBGPU OFFERED SUCH CUSTOMIZABILITY.. BUT TRUST ME, I AM GOING TO ADD THESE INTO THE MAIN PROJECT AS WELL.. Three.JS is just so cool.. But again, my goal is to make it the most optimized stuff and see the Entire Earth, and not be happy with just collisions.. SO Let me just complete this tutorial, but I am having a blast.
Guys Just imagine a world, where the whole life is actually a simulation, and God is literally using his laptop like this, to see what you are doing.. (AND YES, YOU WERE BANGING YOUR HEAD, JUST NOT ON GRASS.. DON’T LIE TO ME.. I AM SEEING YOU..)
I want to ask, How do you literally add shadows, and fog, and everything and that so, all in just one line of code? That is just stupid to even think about.. But anyways, now I have made it so, you can break and place blocks and also, if you render out from the world, and come back in, the blocks will still be there.. BE READY FOR ANOTHER ROUND OF 67 … OH WAIT.. NEXT DEVLOG WILL BE 67.. OR WAIT, LET ME JUST.. LOL, 100% NOT A STRUCTURE IN GAME.. (ATLEAST FOR NOW.. HEHEHEHE)
Added Water, Trees, Sand and polish to my project… Like the toolbar, you can see in the bottom. Clean and Elegant.. COMMENT 67 IF YOU WANT TO SEE A 67 STRUCTURE ADDED TO MY GAME… ;)
Final few fixes before shipping, added biome support, and now I will be ready to be trying to make a project, without following tutorial, trying to optimize it, because obviously, three.js, though sounds cool and all.. Uses WebGL, which is widely supported.. but I want to use your entire GPU.. because obviously.. I PAID FOR THE ENTIRE GPU.. (BTW, I don’t even have a GPU, I have what is called Shared GPU Memory with storage but anyways.. THAT IS NOT THE POINT..)
I almost crashed out today. It was a hectic of a job today for me.. Basically, Today I wanted to work on Debugging tools in my original minecraft version. Though, this was hectic of a job, but now I am confident enough to say that, if anything goes wrong, my error codes will instantly trigger and stop those bugs to ever reach me, specially, If I messed up something. This is specifically made to guard rail myself (as I am a newbie in the GPU optimization and just breaks stuff way too often for comfort during my learning steps..) Now, you might be working what is so special that I did that I am being too optimistic (Specially if you know my history of crashouts LOL…) So, Basically, This time, I researched about an algorithm for dependencies.. Basically, what npm uses to keep track of all the dependencies.. You never know where knowledge might reach you LOL.. So, Basically, now each file, or system like Player, Physics, and to add, Chunks and More, will have to implement system, and each system would have a dependency tree, and then by using Kahn’s Algorithm, we can literally turn that tree upside down, and go through the data and make it work.. It literally tells you, which files are Missing in your code, that is just too good.. The only one critic is that, each time you need to be assing a new attribute, which might be tedious, but the profits are way too big to ignore at all..
I have connected my GPU now, and details are also loading nicely.. I will working on GPU Frames and all as well now.
I am crashing out a lot over some assets, because first of all, why is the grass block not green and a colormap, I mean, it does look cool.. BUT COME ON, THAT’S A MENTAL TRAUMA AND NOW WHICH COLOR OF GRASS SHOULD I PICK.. Furthermore, this is also a problem with water and all.. I am trying to find better ways, and actually learn about how Minecraft renders these and turns out, they just.. well.. OVERLAY A GREEN MAP or BLUE MAP over the grass.. I mean, that sounds HORRIBLE TO IMPLEMENT, MY GOD, THIS GAME SU…. IS FINE.. AND FUN.. Furthermore, thank you so so so much for all the reviewers out there.. The fact you guys appreciated my project, and said it is Fine to be using AI.. It just blew my heart.. This is the reason why I am currently working, else, I had already blew my mind with so much complex debugging, such that, I had to make my own engine, and debugger.. As with the latest you can see.. Things are tough but yah.. Also, I see you @skhsmrn on my devlog and another reviewer.. Your demands for 67 WILL BE FULFILLED SOON TM..
Been some time, and the amount of Logs that I am going through is just.. LMAO.. Crazy Crazy.. For my 67 fans, just give me like a few more moments.. Because, Now, I just want to render one block, and I will just add a sky, which will be a simple color gradient, and then I will work on whatever you that 67 thing.. This was really hectic to implement.. Literally had to go through and implement Archetype.. Yes, even I don’t know what they are… But after like learning about it, here is my understanding.. Archetype is basically a central place to keep all the components and all. Remember, we are optimizing the sheesh out of this project.. Archetypes allow us to apply the same gravity and same systems like Physics, collisions and so on, while still giving you customizabilty on if you want to enable it or not.. It’s really cool, but the amount of things I had to implement.. That’s some brutal stuff… Imagine, you forgot to plug the input system, and you are crashing out on, HOW TO FAH THE POSITION IS NOT CHANGING?? LOL, YAH 2 HOURS OF DEBUGGING WENT THERE, only to realise, I forgot to add that.. LOL..
LMAO, You know, you are at the pinnacle when you are going through forums and forums of actually big stuff, that very very few people ever talk about.. Literally..
Sorry, ANOTHER QUICK UPDATE I KNOW.. But trust me, this took me ages to implement, and yes, had to work from backwards, because and again found out, There was nothing being connected to the swapchain for some reason.. It’s actually really not that hard to find bugs when you are used to it, like when something isn’t rendering you know, something must be wrong with renderer and all.. and a quick side step, and you understand yah, swapchain being uninitialized is the key.
Added some simple tests for the ECS system and the topological sort Kahn’s Algorithm system and the Event Bus, so as to 100% confirm the workings of what is intended and what is not.. Also there was a problem with connection of gbuffers into swap chain, so had to make a custom pass called, composite pass, that will intercept and then gives us the necessary output. This might add very minute delay, but it is very unnoticable so don’t worry..
Procedural Generation unlocked, now, you can move as much as you want, and play. Current, block placing and all won’t work, but yah.. Frustum Culling is working as you can see with the culled meter.
67 Structure Implemented and running, and to those who recommended me this.. GUYS YOU REALLY NEED TO SEE A THERAPY OR SOMETHING.. LMAO..
I literally been sick for 2 days, and now that I come back, I somehow see worse.. Like, I wanted to implement meshing and all.. GUESS WHAT I DONE.. YES, MESHED THE ENTIRE WORLD TO DISAPPEAR.. BALLS… I AM GUAVA AND I WILL EAT MYSELF.. That’s enough coding for today as well, signing off..
Hi Everyone, My Devlogs have been lacking a bit, and this another quick devlog, because, I am really not feeling good these days. I am having fever and not feeling great about anything. Currently, I was just searching and asking AI about chunk generation. One of the things, where AI is now needed, because I know noise generation, but I don’t really know, how to make it into reality, and specially when people want realistic chunk generation and all.. I will get into good and start fixing first of all, this light problem, and then just hope, I get well soon, because India’s heat waves are really no joke. My Indian Friends.. Please stay safe and inside house.. IDK, Why even schools are open..
Ships:
Basically, What I have made is Minecraft Web, well Minecraft but on the Website, running on your Browser. Through the Power of Optimizations and knowing how to code, and also using AI for my shader building and debugging bugs like IDK, What I have done to my life. But Basically, I made my own Engine just to prove that You don’t always need THREE.js to do your heavy lifting, and honestly, it was not that hard. You can see the source code, just a few days ago, I refactored it. Hope you love and enjoy my project.
NOTE: Please Skip Voting, if it failed to run on your system please… Hi Friends, so, I have been working on Minecraft for a long time, and Virtually touching grass LOL.. AKA, Making Minecraft, it is quite challenging to say the least, you can check my devlogs.. Basically, I want to make a very very optimized version of minecraft, that you can see through far and far, and highly optimized. I want to add lighting and all, but the banner is a bit misleading.. I will continue to work on the project, but obviously, not Three.js, because What I have learnt is that.. You can use engines like Unity and Unreal, and make goated projects, the feel of making optimized content, and making it run even on a potato, is just on another level.. Seeing the entire generation moving towards fast making and prototyping, it is always a safe bet to try something new and interesting. This is one of the prototypes that taught me a lot, from How to deal with chunks, and manage chunks, to making biomes, which was actually new.. Chunks I have worked with AI before, and it helped me a ton, and I know about those, but not here.. Hope you love my project...
|
1792983306.8702977
|
1793069706.8702977
|
|
42261
|
Prestyly by @ducki | Stardance
|
ducki
|
0
|
160.21
|
0
|
[]
|
[{"post_id": 79124, "ts": "202 [{"post_id": 79124, "ts": "2026-10-12T19:08:59Z", "hours": 6.1117, "text": "Devlog 27 Almost ready to publish This devlog I have managed to fix almost all of the bugs I know of, as well as implement a load of quality of life features Finally fixed outline width not displaying, because specific Element did not allow for outlines, landed on a fix of displaying an element which does allow outlines, behind the text. Visually it looks identical to how it would look with one element. resizing continue beyond the possible, for example dragging the top right dot, past the top left one, which should not be allowed. Decided to fix it by clamping the values. Was quite painful altering the ~300 line function. Fixed problem with text leaving the possible input box if the used typed too much, now the box automatically expands by checking the needed height to display all the lines. Added a error indicator incase of some unforseen API issue (Hopefully will not appear) Image API uses a query to get the image, a problem comes when the query is empty, causing a error, instead I decided to default the query to the cosmos to stay on the theme of stars dancing Tried to upload a video, but it took an hour just to fail, so instead here is this guy"}, {"post_id": 78393, "ts": "2026-10-10T17:08:12Z", "hours": 5.8883, "text": "Devlog 26 Mobile styling finally looks good!!!!!! I like the new design way better + the fact that it scales well with all screen sizes, while the last one had more edge cases where it breaks. The website feels way more polished on mobile Credit slide redesign Before the credit slide system used a variable of used artists, which worked fine, but needed a lot of functions, for example when removing a image or deleting a slide, to remove the images artists. A bit hard to keep up with it all, and harder to change long term. Decided to redesign it to check every slide, for every image, and then from each images url get the artist. What is left? After these 150 hours of making this one project (I thought it would take only 50 ) I only have a small list of stuff I have to do. Fix text outline sometimes not appearing Searching for empty images breaks the site Add a error notifier in case of image searching failing Publish the site Write a read me Give the site to my friends for testing"}, {"post_id": 77078, "ts": "2026-10-05T16:02:25Z", "hours": 6.535, "text": "Devlog 25 I hate bugs Programming wise and in real life. The past project time has gone into a big list of bug fixes, feature changes, and more styling. styling updated delete slide confirm pop up updated choose slide prefab page updated save presentation pop up Small addition to item aligning I realised that aligning items to the border could be useful, added it, and my first thought: “Woah this was so needed”. Way easier to get your images or text into the corners. Bug fixes Fixed items not aligning with eachoter on the y asis Fixed new variable changes getting overrided sometimes Fixed bugs with background sometimes not being able to display images"}, {"post_id": 76627, "ts": "2026-10-04T06:36:29Z", "hours": 4.0928, "text": "Devlog 24 New image and text variable editing side bar designs Added the new color pallete to them, as well as cleaned some components up a bit like sliders. As well as fixed some bugs, for example aspect ratio restoring not working, deleting photos not working, some values saving two times bug hunting continues Fixed a bug of the background color for slides not changing when switching slides, so for example making one slide blue, then choosing a new one, that one would also be blue Found a bug with horizontal alignment with other objects sometimes not working, will have to fix that Fixed bug that allowed bypassing maximal values for outline width and layer"}, {"post_id": 76350, "ts": "2026-10-03T08:35:04Z", "hours": 10.0492, "text": "Devlog 23 Huge visual changes 🦆 The previous design was a bit bland and a bit too bright for my eyes. so obviously dark designs are the best. After trying multiple different layouts and color schemes I have landed on the design seen in the images. Afterwards had to make it scale with * hopefully all computer types (Mobile coming soon) Font size works a bit wonky cause it has to scale with the presentation it is displayed on, fixed it by scaling the text based on the presentation slide size. Also changed main presentation system for bigger screen to allow up to 1920x1080 size (before was 800x450 which was small on bigger screens) Extra changes Exporting changes -> fixed exported slides not having accurate font sizes Fixed font size not saving when chaged Had to change text to allow breaks in the text, but it broke text outlines Fixed bug with images sometimes not loading Like I have most liekely said before, I was not expecting this project to take this long, but now looking back, all the needed features togheter are quite a lot. With this new improved design I am sure that it is the final one and feel like I am getting close to being finished"}, {"post_id": 72364, "ts": "2026-09-22T19:09:53Z", "hours": 3.1664, "text": "Devlog 22 Credit slide From what I have read, the API I use does not force image photographers to be credited. But I think they still deserve the credit. So I made a credit slide generator. To make it I had to add a system to save and remove photographer each time a image gets added/changed Then when generating the slide, the saved photographers get instantly placed on the slide."}, {"post_id": 71909, "ts": "2026-09-21T19:09:36Z", "hours": 4.5469, "text": "Devlog 21 Annihilating bugs!!!!! 🐛 The website has had some very annoying bugs, that had been in the website for multiple days. This devlog I have finally destroyed them. These bugs include: The color saving system was saving a value to undo/redo every frame, making one color undo require pressing ctrl + z 100 times Being able to unselected selected slides, when it should not be possible selecting already selected buttons buttons showing up 2x for some reason Mainly I am proud of the color saving multiple times, cause that is one of the most fun variable to change for text. Issue was with the react component not containing any event for closing the color wheele, so I ended up coming up with my own fix, by checking to see if the color was changed when unselecting the object and then saving it if the color was changed. Mobile functionality To my current knowledge, I have finished implementing all buttons/features, except hold tapping to duplicate slides, into the functionality. Moving slide objects, deleting slides, moving slides, all is possible on mobile now"}, {"post_id": 71272, "ts": "2026-09-20T15:41:14Z", "hours": 3.9561, "text": "Devlog 20 website adjustments for mobile I want the website to be available on mobile, so continuing on my recent mobile implementations, there are some more new ones. Prefab amounts scaled for screen size -> for example instead of displaying a 2x2 grid, like on the computer, to adjust for increased height for vertical phone use, instead the site displays a 1x3 grid font sizes adjusted for mobile devices -> added a aspect ration variable, that gets calculated when loading the site using the screen size small css styling changes"}, {"post_id": 69352, "ts": "2026-09-16T21:14:37Z", "hours": 6.5992, "text": "Devlog 19 CSS styling is starting to haunt me 👻 A presentation creation site is possibly one of the hardest thing to style for mobile . -> I have started slowly, while already continuing to make a main site style, also start creating mobile styling, just so the site is available more comfortably. Hardest thing is keeping the presentation aspect ratio, all while having it visible, which has proved quite the challenge on some phone aspect ratios. New slide prefabs Currently my idea is to have 4 slide types, one optional slide -> credit slide (for all the photos) The 4 slide types include intro slides info slides image slides outro slides Now all of them need slide prefabs, to use, so I have also began making those, starting with the intro slides."}, {"post_id": 67624, "ts": "2026-09-13T19:30:08Z", "hours": 9.2914, "text": "Devlog 18 A bit of a bigger devlog site styling I am trying out color paletes, and different positions for componets and landed on this idea of having the variable editor tab be on the right of the presentation, to save vertical space. Will this be how it is in the end? Probably, just with different colors/sizes. I am a fan of the position and think it helps keep more space verticaly for other components. Presentation exporting form I did not like how the presentation name text input looked at the top of the screen, so instead I decided to move it to a custom form when exporting the presentation to your files, to then input the presentations name. Looks a bit cleaner, less clutter Loading bar When getting a new image or exporting the presentation, sometimes a problem of wait times appears. For presentations, when exporting slides with images, they take waaaay longer to download, so I obviously needed a loading screen . And now it does not feel slow or confusing when exporting or loading new images. The main part is definetly the user getting feedback that the button process was successfull and everything is great. + some small changes to Presentation exporting Some number input styling/text saving Icon button changes 📷"}, {"post_id": 65516, "ts": "2026-09-10T18:26:01Z", "hours": 3.6967, "text": "Devlog 17 Presentation saving to files!!! With the functionality of being able to now save created presentations to files., I can say that the website is functional . The saving happens to a powerpoint file, so after saving it is easy to edit in a bunch of ways. It feels great being able to actually play around and make presentations on something I made myself :D Sadly , I had to remove corner rounding for images, because there is not a option for rounded corners through my way of saving all of the presentation slides. picture outlines Also caused a bit of an issue, there is also no option for adding pictures to slides with an outline, but for that I have built a work around, where the image is a object in the background. Now , even with this awesome new feature I am quite far from being done, mainly with styling and adding phone support, so that the website is accesible and comfortable on all devices"}, {"post_id": 64944, "ts": "2026-09-09T17:55:08Z", "hours": 6.5622, "text": "Devlog 16 Editing tab changes Failed to find any text alignment icons that I liked currently, so I shall leave that for later. I think the sliders and color scheme definetly still need work, but I wanted to start working on some more important/new features Image outlines Made the image outline system go to all sides, instead of making the picture more right and down. (goofy bug) Found out image generation was broken Took a few hours to fix it and then also connect it to data saving."}, {"post_id": 63209, "ts": "2026-09-06T21:47:43Z", "hours": 5.2225, "text": "Devlog 15 Too many bugs that I had not noticed The worst kind of coding bugs I would say are small tiny ones, well that is what I am now thinking, after having to slowly go through line by line trying to slowly fix a bunch of small bugs. Most important of the bugs fixed: changing the position of selected object sometimes updated every saved previous position of the selected object accidentally forgetting one digit in a line of code .-. Changing text color or width color, made the save system save the new color each frame -> Which now I have to create a new way to save the new chosen color, only when I believe the player would have completed their pick, which is a interesting user design to think about. What is realy the best time. Also started changing the editing tab -> Planning on adding icons, pretty buttons"}, {"post_id": 62831, "ts": "2026-09-06T11:14:17Z", "hours": 8.7775, "text": "Devlog 14 More values to ctrl z and ctrl y I decided to make more presentation changes save, so I had to rewrite some code to allow for saving even more variables. The system now also works a bit more intuitively Variable rewriting While programming I continue to realise with how big this project is starting to get, I did waaay too little planing out on how to keep it easy to add new features. That is why I took a few hours, to rewrite variable access to some scripts, as well as functions, to make it so I can easily get the needed variables in any script. This should allow me to make new features way faster extra changes some of the more prominent ones: fixed saving changes sometimes saving wrong fixed some overlapping issues"}, {"post_id": 61843, "ts": "2026-09-04T23:27:10Z", "hours": 5.1264, "text": "Devlog 13 Slide duplicating To easily keep designs the same between multiple slides it is important to be able to duplicate slides, I decided to keep this feature under a left click, left click the slide you want to duplicate instead of the regular options like copying and pasting that pop up, a custom selection box opens up, where you can either delete or duplicate the slide. ctrl c, ctrl v Slowly started working on copy and pasting functionality, works, but I want to polish it more more code rewriting Continuing my previous code cleaning, I have made more chages, to just shorten scripts, make them more readable, as well as simpler, because like a great person once said good code is simple code"}, {"post_id": 59785, "ts": "2026-09-01T18:35:45Z", "hours": 4.3758, "text": "Devlog 12 Object alignment based on other objects Presentations where text is not ordered perfectly can be infuriating, so I knew I hade to make it so you have automatic item alignment based on other item positions. Currently the it checks all 3 possible alignments on all 3 possible sides, which might end up being a bit too much when there are mutliple objects. Also made the system a bit cleaner, easy to add/change features -> a continuation of my code cleaning Half the time while making this feature it kept breaking and tranporting my object to like 10000 pixels away, but that was a funny bug"}, {"post_id": 58856, "ts": "2026-08-31T13:11:31Z", "hours": 6.715, "text": "Devlog 11 Code restructuring As the project grown in size I have been needing to take a small step back and cleanup a bunch of code. Bug fixes The app has a lot of bugs and small issues you would not like in a presentation creator. I have slowly been working on fixing them, for example selecting slides, the text objects, block the select button. new features Added new hover indicators new slide types -> When adding a new slide I want the player to have a choice from multiple types, that then give prefabs. Imagine wanting to have a big picture in the slide, well then you chose a new image slide prefab, that should allow for people to create slides as fast as possible."}, {"post_id": 52099, "ts": "2026-08-22T05:30:04Z", "hours": 6.3772, "text": "Devlog 10 New text and image object creation Just like hinted in the last devlog Now to prevent objects from stacking making multiple objects, distances them from each other, and then if it can no longer distance it down, that is when there are a lot of way to go about placing it, I decided to randomize it while making the feature had a bug in the start with new created text overriding already exsisting text Now it should not happen anymore Key binds!!! THE MOST USEFULL KEYBIND IN ANY PROGRAM ctrl+z and crtl+y I have started implementing keybind functionality, currently ctrl+z and ctrl+y already work, but they need a bit of polish also did a bunch of bug fixes and small tweaks Prestyly is slowly crawling to the finish line, hopefully I will be able to finish it in the next 50 hours put into it And it has to be polished"}, {"post_id": 51310, "ts": "2026-08-20T21:44:36Z", "hours": 3.62, "text": "Devlog 9!!! (so kind of the magical 10th) Duplicating and deleting objects Now I think it is self explanatory that it kind of sucks not being able to delete a image, if you do not want to use it, so the presentation creator needed a delete button. Simply press on the object and then press delete to delete it These functions were quite easy to add, but the code is slowly becoming very big to keep up, and sending functions between scripts is also. Started making new text object and new image creating not done fully yet, but a high chance it will be included in the next devlog Plans Every good presentation has some decorations Right now the only images I get are all with a background, so I am gonna have to think of a way to implement presentation decorations, if you have any ideas, would gradly hear it in the comments"}, {"post_id": 48464, "ts": "2026-08-16T20:23:04Z", "hours": 6.2356, "text": "Devlog 8 The magical shift key o-o Personally when I make presentation for photos I use the shift key a lot, well mainly just so they do not get stretched like cheese So that is what I have been mainly working on, All of the component scripts slowly keep getting bigger and bigger and I have to then divide them even more just so it is readable. It is very fun working on these small features that always prove to be teoretically easy, but need a bit of rewriting code to implement This is a project where a lot can be learned. Small fixes Fixed some alignment issues made slide bar display images a bunch of small bug fixes new bugs: text objects sometimes do not update when changing one of their text settings. some buttons sometimes block other buttons Every 3 fixed bugs leads to a new bug, hard to sometimes keep track of all the little possibilities."}, {"post_id": 46022, "ts": "2026-08-12T22:21:58Z", "hours": 3.9731, "text": "Devlog 7 An import feature is being able to get objects into the correct position, one of which being the center. new I added a slide moving display in the slide list, and when moving text/photos if close enough aligns to the x asis or y asis center. It was interesting to code, another very specific app detail done. Later will have to update this feature into a aligning based on other projcts."}, {"post_id": 45540, "ts": "2026-08-12T03:02:54Z", "hours": 7.9336, "text": "Devlog 6 You can now move slides :O I did not think this would be that hard of a feature, but turns out it is not that easy of a feature. And I still have to add a display that showcases where this slide will now go after letting go of your mouse. The idea is When I start moving the slide I calculate every slides global x position in the slide tab, then when the mouse moves I check the mouses global x position to then compare with the slides positions to see where it would go. Basically a bunch of position calculations slidePositions.current.map((pos, ind) => { if (newXPos < pos && found != true) { found = true; console.log(newXPos, pos); if (ind > startingSlidePos.current) { updateNewSlidePos(ind - 1); } else { updateNewSlidePos(ind); }}}); Also added image and text scaling using only one axis. Thought overview I am very excited at how the website is starting to look. And that you are already able to make real presentation slides, that look good in as little as a minute. Every single devlog I think of more and more small quality of life feature that most presentation creator tools contain, and this can quickly become a daunting project."}, {"post_id": 43915, "ts": "2026-08-09T11:17:42Z", "hours": 2.8975, "text": "Devlog 5 I possibly made my dumbest programming mistake ever! My image API gets 15 images each time, now to not have to use the API every time, I deficed that if the user enters the same prompt, the 15 images they already got would be used and just shuffled through. Now to shuffle the array I used for (let i = 0; i < arr.length * 3; i++) { const varPos1 = Math.floor(Math.random() * arr.length); const varPos2 = Math.floor(Math.random() * arr.length); const val1 = arr[varPos1]; arr[varPos1] = arr[varPos2]; arr[varPos2] = arr[VarPos1]; } console.log(arr); return arr; } It does not take an expert to find the problem, So there I sat thinking why when increasing the shown photo ID i kept getting the same image But now I should not run out of API tokens"}, {"post_id": 43546, "ts": "2026-08-08T21:33:45Z", "hours": 3.0356, "text": "devlog 4 Text can now be fancy. Mainly worked on a bar for you to edit selected text, change text color, outline. Was not too bad, but definetly need icons for Bold, italic and underline text. Thoughts I am not sure where to put this tab, below of above the main presentation display. well also does it matter, most likely will put it at the top, since that seems most popular, but otherwise, will have to test. I think it is easy to understand I like ducks from the presentation one slide made in ~2 minutes, already a success."}, {"post_id": 42827, "ts": "2026-08-07T19:18:49Z", "hours": 5.1494, "text": "movement go brrrr The website now allows you to move objects around, your text is not stuck in one position, also started working on an editing tab, for image outlines, text color, text width. problems The text moving is nice, but I can’t drag select text cause of it, so I have to think of a way to fix it. Had to write two system for how to calculate mouse movement because the first system limited me on future additions, also broke with multiple objects, which made the object wiggle wiggle between the top left corner and actual position. User interface is gonna be quite the pain on this project"}, {"post_id": 41151, "ts": "2026-08-05T05:43:25Z", "hours": 7.13, "text": "Devlog 2 For my presentation creator website to make it faster to create stuff I wish to have it cause as little decision fatigue as possible. There will still be options to choose from, but they will not be thrown at you all instantly Progress Presentation creating has way more edge cases than I first thought. Just the action of when resizing, each dot works a bit differently, as well as what if you move the dot to be on a dot side it should not be. Have I already implemented this, not at all, not yet, Plan is to first work on full functionality then get all the edge cases. Now the website also contains text and image resizing text editing slide saving slides can now contain images if you have any cool ideas for features, freely drop it in the comments"}, {"post_id": 39932, "ts": "2026-08-03T07:43:14Z", "hours": 7.6219, "text": "Devlog 1 Slowly but surely starting to work like a presentation editor. Now comes the hard part of thinking where/how to display everything, how to show what is customizable, how to tell the user what they are updating. Basicaly user experience. New Slide creating Slide displaying Slide changing A bit of slide editing Problems I have already ran into a bit of problems/weird bugs having to think about every work around. I know there will be many more bugs with all the nuances possible, but motivation is at an all time high."}, {"post_id": 38418, "ts": "2026-07-31T19:36:01Z", "hours": 5.5258, "text": "Devlog 0 I always have had a problem with presentation designs, it takes so long just to find one picture that actually works. So, I have decided to fix this problem by making a simpler way to create presentations/presentation styles. The idea A simple web page where you create your presentation style is made with you mostly just clicking, no more looking for pictures or design to edit. Choose a good looking design for each slide, get photos instatly added to your slide with just one word input, no uplading files. Then create as many slides as you wish, then being able to export the presentation to a powerpoint file to change specific details in a different website or application. The idea is to make presentation designs creatable in a short lunch break before you have to present it. progress: Mainly I have gotten a image fetching API working for text inputs as well as connected the front end and backend, to keep enviornment variables protected in the backend and later possibly add users and databases"}]...
|
Title: Prestyly by @ducki | Stardance
Devlogs:
De Title: Prestyly by @ducki | Stardance
Devlogs:
Devlog 0 I always have had a problem with presentation designs, it takes so long just to find one picture that actually works. So, I have decided to fix this problem by making a simpler way to create presentations/presentation styles. The idea A simple web page where you create your presentation style is made with you mostly just clicking, no more looking for pictures or design to edit. Choose a good looking design for each slide, get photos instatly added to your slide with just one word input, no uplading files. Then create as many slides as you wish, then being able to export the presentation to a powerpoint file to change specific details in a different website or application. The idea is to make presentation designs creatable in a short lunch break before you have to present it. progress: Mainly I have gotten a image fetching API working for text inputs as well as connected the front end and backend, to keep enviornment variables protected in the backend and later possibly add users and databases
Devlog 1 Slowly but surely starting to work like a presentation editor. Now comes the hard part of thinking where/how to display everything, how to show what is customizable, how to tell the user what they are updating. Basicaly user experience. New Slide creating Slide displaying Slide changing A bit of slide editing Problems I have already ran into a bit of problems/weird bugs having to think about every work around. I know there will be many more bugs with all the nuances possible, but motivation is at an all time high.
Devlog 2 For my presentation creator website to make it faster to create stuff I wish to have it cause as little decision fatigue as possible. There will still be options to choose from, but they will not be thrown at you all instantly Progress Presentation creating has way more edge cases than I first thought. Just the action of when resizing, each dot works a bit differently, as well as what if you move the dot to be on a dot side it should not be. Have I already implemented this, not at all, not yet, Plan is to first work on full functionality then get all the edge cases. Now the website also contains text and image resizing text editing slide saving slides can now contain images if you have any cool ideas for features, freely drop it in the comments
movement go brrrr The website now allows you to move objects around, your text is not stuck in one position, also started working on an editing tab, for image outlines, text color, text width. problems The text moving is nice, but I can’t drag select text cause of it, so I have to think of a way to fix it. Had to write two system for how to calculate mouse movement because the first system limited me on future additions, also broke with multiple objects, which made the object wiggle wiggle between the top left corner and actual position. User interface is gonna be quite the pain on this project
devlog 4 Text can now be fancy. Mainly worked on a bar for you to edit selected text, change text color, outline. Was not too bad, but definetly need icons for Bold, italic and underline text. Thoughts I am not sure where to put this tab, below of above the main presentation display. well also does it matter, most likely will put it at the top, since that seems most popular, but otherwise, will have to test. I think it is easy to understand I like ducks from the presentation one slide made in ~2 minutes, already a success.
Devlog 5 I possibly made my dumbest programming mistake ever! My image API gets 15 images each time, now to not have to use the API every time, I deficed that if the user enters the same prompt, the 15 images they already got would be used and just shuffled through. Now to shuffle the array I used for (let i = 0; i < arr.length * 3; i++) { const varPos1 = Math.floor(Math.random() * arr.length); const varPos2 = Math.floor(Math.random() * arr.length); const val1 = arr[varPos1]; arr[varPos1] = arr[varPos2]; arr[varPos2] = arr[VarPos1]; } console.log(arr); return arr; } It does not take an expert to find the problem, So there I sat thinking why when increasing the shown photo ID i kept getting the same image But now I should not run out of API tokens
Devlog 6 You can now move slides :O I did not think this would be that hard of a feature, but turns out it is not that easy of a feature. And I still have to add a display that showcases where this slide will now go after letting go of your mouse. The idea is When I start moving the slide I calculate every slides global x position in the slide tab, then when the mouse moves I check the mouses global x position to then compare with the slides positions to see where it would go. Basically a bunch of position calculations slidePositions.current.map((pos, ind) => { if (newXPos < pos && found != true) { found = true; console.log(newXPos, pos); if (ind > startingSlidePos.current) { updateNewSlidePos(ind - 1); } else { updateNewSlidePos(ind); }}}); Also added image and text scaling using only one axis. Thought overview I am very excited at how the website is starting to look. And that you are already able to make real presentation slides, that look good in as little as a minute. Every single devlog I think of more and more small quality of life feature that most presentation creator tools contain, and this can quickly become a daunting project.
Devlog 7 An import feature is being able to get objects into the correct position, one of which being the center. new I added a slide moving display in the slide list, and when moving text/photos if close enough aligns to the x asis or y asis center. It was interesting to code, another very specific app detail done. Later will have to update this feature into a aligning based on other projcts.
Devlog 8 The magical shift key o-o Personally when I make presentation for photos I use the shift key a lot, well mainly just so they do not get stretched like cheese So that is what I have been mainly working on, All of the component scripts slowly keep getting bigger and bigger and I have to then divide them even more just so it is readable. It is very fun working on these small features that always prove to be teoretically easy, but need a bit of rewriting code to implement This is a project where a lot can be learned. Small fixes Fixed some alignment issues made slide bar display images a bunch of small bug fixes new bugs: text objects sometimes do not update when changing one of their text settings. some buttons sometimes block other buttons Every 3 fixed bugs leads to a new bug, hard to sometimes keep track of all the little possibilities.
Devlog 9!!! (so kind of the magical 10th) Duplicating and deleting objects Now I think it is self explanatory that it kind of sucks not being able to delete a image, if you do not want to use it, so the presentation creator needed a delete button. Simply press on the object and then press delete to delete it These functions were quite easy to add, but the code is slowly becoming very big to keep up, and sending functions between scripts is also. Started making new text object and new image creating not done fully yet, but a high chance it will be included in the next devlog Plans Every good presentation has some decorations Right now the only images I get are all with a background, so I am gonna have to think of a way to implement presentation decorations, if you have any ideas, would gradly hear it in the comments
Devlog 10 New text and image object creation Just like hinted in the last devlog Now to prevent objects from stacking making multiple objects, distances them from each other, and then if it can no longer distance it down, that is when there are a lot of way to go about placing it, I decided to randomize it while making the feature had a bug in the start with new created text overriding already exsisting text Now it should not happen anymore Key binds!!! THE MOST USEFULL KEYBIND IN ANY PROGRAM ctrl+z and crtl+y I have started implementing keybind functionality, currently ctrl+z and ctrl+y already work, but they need a bit of polish also did a bunch of bug fixes and small tweaks Prestyly is slowly crawling to the finish line, hopefully I will be able to finish it in the next 50 hours put into it And it has to be polished
Devlog 11 Code restructuring As the project grown in size I have been needing to take a small step back and cleanup a bunch of code. Bug fixes The app has a lot of bugs and small issues you would not like in a presentation creator. I have slowly been working on fixing them, for example selecting slides, the text objects, block the select button. new features Added new hover indicators new slide types -> When adding a new slide I want the player to have a choice from multiple types, that then give prefabs. Imagine wanting to have a big picture in the slide, well then you chose a new image slide prefab, that should allow for people to create slides as fast as possible.
Devlog 12 Object alignment based on other objects Presentations where text is not ordered perfectly can be infuriating, so I knew I hade to make it so you have automatic item alignment based on other item positions. Currently the it checks all 3 possible alignments on all 3 possible sides, which might end up being a bit too much when there are mutliple objects. Also made the system a bit cleaner, easy to add/change features -> a continuation of my code cleaning Half the time while making this feature it kept breaking and tranporting my object to like 10000 pixels away, but that was a funny bug
Devlog 13 Slide duplicating To easily keep designs the same between multiple slides it is important to be able to duplicate slides, I decided to keep this feature under a left click, left click the slide you want to duplicate instead of the regular options like copying and pasting that pop up, a custom selection box opens up, where you can either delete or duplicate the slide. ctrl c, ctrl v Slowly started working on copy and pasting functionality, works, but I want to polish it more more code rewriting Continuing my previous code cleaning, I have made more chages, to just shorten scripts, make them more readable, as well as simpler, because like a great person once said good code is simple code
Devlog 14 More values to ctrl z and ctrl y I decided to make more presentation changes save, so I had to rewrite some code to allow for saving even more variables. The system now also works a bit more intuitively Variable rewriting While programming I continue to realise with how big this project is starting to get, I did waaay too little planing out on how to keep it easy to add new features. That is why I took a few hours, to rewrite variable access to some scripts, as well as functions, to make it so I can easily get the needed variables in any script. This should allow me to make new features way faster extra changes some of the more prominent ones: fixed saving changes sometimes saving wrong fixed some overlapping issues
Devlog 15 Too many bugs that I had not noticed The worst kind of coding bugs I would say are small tiny ones, well that is what I am now thinking, after having to slowly go through line by line trying to slowly fix a bunch of small bugs. Most important of the bugs fixed: changing the position of selected object sometimes updated every saved previous position of the selected object accidentally forgetting one digit in a line of code .-. Changing text color or width color, made the save system save the new color each frame -> Which now I have to create a new way to save the new chosen color, only when I believe the player would have completed their pick, which is a interesting user design to think about. What is realy the best time. Also started changing the editing tab -> Planning on adding icons, pretty buttons
Devlog 16 Editing tab changes Failed to find any text alignment icons that I liked currently, so I shall leave that for later. I think the sliders and color scheme definetly still need work, but I wanted to start working on some more important/new features Image outlines Made the image outline system go to all sides, instead of making the picture more right and down. (goofy bug) Found out image generation was broken Took a few hours to fix it and then also connect it to data saving.
Devlog 17 Presentation saving to files!!! With the functionality of being able to now save created presentations to files., I can say that the website is functional . The saving happens to a powerpoint file, so after saving it is easy to edit in a bunch of ways. It feels great being able to actually play around and make presentations on something I made myself :D Sadly , I had to remove corner rounding for images, because there is not a option for rounded corners through my way of saving all of the presentation slides. picture outlines Also caused a bit of an issue, there is also no option for adding pictures to slides with an outline, but for that I have built a work around, where the image is a object in the background. Now , even with this awesome new feature I am quite far from being done, mainly with styling and adding phone support, so that the website is accesible and comfortable on all devices
Devlog 18 A bit of a bigger devlog site styling I am trying out color paletes, and different positions for componets and landed on this idea of having the variable editor tab be on the right of the presentation, to save vertical space. Will this be how it is in the end? Probably, just with different colors/sizes. I am a fan of the position and think it helps keep more space verticaly for other components. Presentation exporting form I did not like how the presentation name text input looked at the top of the screen, so instead I decided to move it to a custom form when exporting the presentation to your files, to then input the presentations name. Looks a bit cleaner, less clutter Loading bar When getting a new image or exporting the presentation, sometimes a problem of wait times appears. For presentations, when exporting slides with images, they take waaaay longer to download, so I obviously needed a loading screen . And now it does not feel slow or confusing when exporting or loading new images. The main part is definetly the user getting feedback that the button process was successfull and everything is great. + some small changes to Presentation exporting Some number input styling/text saving Icon button changes 📷
Devlog 19 CSS styling is starting to haunt me 👻 A presentation creation site is possibly one of the hardest thing to style for mobile . -> I have started slowly, while already continuing to make a main site style, also start creating mobile styling, just so the site is available more comfortably. Hardest thing is keeping the presentation aspect ratio, all while having it visible, which has proved quite the challenge on some phone aspect ratios. New slide prefabs Currently my idea is to have 4 slide types, one optional slide -> credit slide (for all the photos) The 4 slide types include intro slides info slides image slides outro slides Now all of them need slide prefabs, to use, so I have also began making those, starting with the intro slides.
Devlog 20 website adjustments for mobile I want the website to be available on mobile, so continuing on my recent mobile implementations, there are some more new ones. Prefab amounts scaled for screen size -> for example instead of displaying a 2x2 grid, like on the computer, to adjust for increased height for vertical phone use, instead the site displays a 1x3 grid font sizes adjusted for mobile devices -> added a aspect ration variable, that gets calculated when loading the site using the screen size small css styling changes
Devlog 21 Annihilating bugs!!!!! 🐛 The website has had some very annoying bugs, that had been in the website for multiple days. This devlog I have finally destroyed them. These bugs include: The color saving system was saving a value to undo/redo every frame, making one color undo require pressing ctrl + z 100 times Being able to unselected selected slides, when it should not be possible selecting already selected buttons buttons showing up 2x for some reason Mainly I am proud of the color saving multiple times, cause that is one of the most fun variable to change for text. Issue was with the react component not containing any event for closing the color wheele, so I ended up coming up with my own fix, by checking to see if the color was changed when unselecting the object and then saving it if the color was changed. Mobile functionality To my current knowledge, I have finished implementing all buttons/features, except hold tapping to duplicate slides, into the functionality. Moving slide objects, deleting slides, moving slides, all is possible on mobile now
Devlog 22 Credit slide From what I have read, the API I use does not force image photographers to be credited. But I think they still deserve the credit. So I made a credit slide generator. To make it I had to add a system to save and remove photographer each time a image gets added/changed Then when generating the slide, the saved photographers get instantly placed on the slide.
Devlog 23 Huge visual changes 🦆 The previous design was a bit bland and a bit too bright for my eyes. so obviously dark designs are the best. After trying multiple different layouts and color schemes I have landed on the design seen in the images. Afterwards had to make it scale with * hopefully all computer types (Mobile coming soon) Font size works a bit wonky cause it has to scale with the presentation it is displayed on, fixed it by scaling the text based on the presentation slide size. Also changed main presentation system for bigger screen to allow up to 1920x1080 size (before was 800x450 which was small on bigger screens) Extra changes Exporting changes -> fixed exported slides not having accurate font sizes Fixed font size not saving when chaged Had to change text to allow breaks in the text, but it broke text outlines Fixed bug with images sometimes not loading Like I have most liekely said before, I was not expecting this project to take this long, but now looking back, all the needed features togheter are quite a lot. With this new improved design I am sure that it is the final one and feel like I am getting close to being finished
Devlog 24 New image and text variable editing side bar designs Added the new color pallete to them, as well as cleaned some components up a bit like sliders. As well as fixed some bugs, for example aspect ratio restoring not working, deleting photos not working, some values saving two times bug hunting continues Fixed a bug of the background color for slides not changing when switching slides, so for example making one slide blue, then choosing a new one, that one would also be blue Found a bug with horizontal alignment with other objects sometimes not working, will have to fix that Fixed bug that allowed bypassing maximal values for outline width and layer
Devlog 25 I hate bugs Programming wise and in real life. The past project time has gone into a big list of bug fixes, feature changes, and more styling. styling updated delete slide confirm pop up updated choose slide prefab page updated save presentation pop up Small addition to item aligning I realised that aligning items to the border could be useful, added it, and my first thought: “Woah this was so needed”. Way easier to get your images or text into the corners. Bug fixes Fixed items not aligning with eachoter on the y asis Fixed new variable changes getting overrided sometimes Fixed bugs with background sometimes not being able to display images
Devlog 26 Mobile styling finally looks good!!!!!! I like the new design way better + the fact that it scales well with all screen sizes, while the last one had more edge cases where it breaks. The website feels way more polished on mobile Credit slide redesign Before the credit slide system used a variable of used artists, which worked fine, but needed a lot of functions, for example when removing a image or deleting a slide, to remove the images artists. A bit hard to keep up with it all, and harder to change long term. Decided to redesign it to check every slide, for every image, and then from each images url get the artist. What is left? After these 150 hours of making this one project (I thought it would take only 50 ) I only have a small list of stuff I have to do. Fix text outline sometimes not appearing Searching for empty images breaks the site Add a error notifier in case of image searching failing Publish the site Write a read me Give the site to my friends for testing
Devlog 27 Almost ready to publish This devlog I have managed to fix almost all of the bugs I know of, as well as implement a load of quality of life features Finally fixed outline width not displaying, because specific Element did not allow for outlines, landed on a fix of displaying an element which does allow outlines, behind the text. Visually it looks identical to how it would look with one element. resizing continue beyond the possible, for example dragging the top right dot, past the top left one, which should not be allowed. Decided to fix it by clamping the values. Was quite painful altering the ~300 line function. Fixed problem with text leaving the possible input box if the used typed too much, now the box automatically expands by checking the needed height to display all the lines. Added a error indicator incase of some unforseen API issue (Hopefully will not appear) Image API uses a query to get the image, a problem comes when the query is empty, causing a error, instead I decided to default the query to the cosmos to stay on the theme of stars dancing Tried to upload a video, but it took an hour just to fail, so instead here is this guy...
|
1792504166.3608503
|
1793108966.3608503
|
|
14066
|
Janitor Space Program (J.S.P.) by @aloyak | Starda Janitor Space Program (J.S.P.) by @aloyak | Stardance...
|
aloyak
|
2
|
160.0
|
3078
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T13:40:57Z", "hours": 55.0, "multiplier": 18.95, "payout": 1041, "blessing": "neutral", "text": "This is my 3D exploration-sandbox game that I built with my custom game engine! I’ve added quite a lot of stuff like a simple exploration game mode that allows you to move around a hand-crafted solar system i called “Halcyon”. there are also a lot of other game modes you can try and have fun with before I finally add the campaign game mode for the final version! In the picture you can see an in-game screenshot of the player walking around the surface of the earth-like planet “Gaia”, hope you like my game! With <3, 4loyak!", "repo": "https://github.com/aloyak/jsp", "demo": "https://aloyak.itch.io/jsp"}, {"ship_num": 2, "ts": "2026-07-16T13:34:38Z", "hours": 105.0, "multiplier": 19.52, "payout": 2037, "blessing": "neutral", "text": "This is my 3D game about space exploration and kessler cascades, it has a campaign mode coming up but i havent finished that yet, for now enjoy the 3 game modes! i built this on top of my custom engine so its been a lot of hard work, please try it out!!!!", "repo": "https://github.com/aloyak/jsp", "demo": "https://aloyak.itch.io/jsp"}]...
|
[{"post_id": 48889, "ts": "202 [{"post_id": 48889, "ts": "2026-08-17T13:35:52Z", "hours": 3.9133, "text": "JSP! I’m back! and I finally have a new decent version that im probably gonna ship shortly after I publish this devlog. Its been so long since the last devlog because a number of factors, I had some vacations, my main pc is now just a steam deck connected to a monitor and also I’m kind of struggling to continue this project, I hope this isnt the last version but working on the project and adding or fixing things is very complicated and requires a lot of research to do it right, and it is exhausting What was added?? Included the new planet models to the halcyon system, you can now correctly explore them by using the new terrain system I added to the engine! Added some small help windows/hints for the new stuff before shipping! Fixed some audio bugs and added a sound effect for when you close a window Fixed the in-helmet HUD UI, the input vectors now correctly show the direction the thrust is being applied to, kinda like in Outer Wilds!! I’m most likely to be focusing on continuing the engine for a little bit, it really really does require some refactoring and I also need to clean some likely dead code or at least re-understand the code i wrote as it has lines from almost a 10 months ago! Hopefully someone could help and contribute to the project maybe or make something new out of it too! Im still planing on continuing to develop it but not at this pace considering im about to start college :))"}, {"post_id": 41224, "ts": "2026-08-05T09:35:20Z", "hours": 6.8169, "text": "J.S.P. Very exciting changes to the exploration mode yay !! I’ve been working on precisely TWO (2) things but one of them is way too early for me to be able to show you anything, more on that in the end Whats new? I’ve create a custom blender addon that lets me create procedural noise-based planets! It is really powerful and it gets you really good results for how simple it is really. In a way, its nothing but a vertex shader but coded in python lol It generates 3D spherical noise and applies it into an icosphere with a variety of parameters. Some of them arent precisely working but they are fine for now (specially the “ridged” option) You can try it yourself, its open source too! https://github.com/aloyak/JSP/blob/main/assets_src/blender/addons/planet_generator.py Terrain System I’m developing a way for the player to correctly collide with the geometry of these planets, but this is mostly engine-sided changes and I’m not very deep into it yet. I’m currently researching how to handle multi-threading async functions… more information about this in my latest engine’s devlog: https://stardance.hackclub.com/projects/1029/devlogs/34738 Known issues These are not really important right now, but for some reason I’ve realized that the splash screen takes different amounts of time depending on where you run the game?? what? A steam deck is around 3 seconds, my computer (the intended duration) is 4 seconds and in a friend’s laptop it is ~0.5 seconds"}, {"post_id": 39548, "ts": "2026-08-02T15:55:39Z", "hours": 7.1231, "text": "JSP We are SO back! I thought it would take me weeks to solve this issue but it wasnt that hard, thanks claude lol for helping. It’s not perfect just yet but its honestly crazy how my own engine managed to handle what im about to explain What took soo long The game now handles a transition from a global physics world to a new extra physics world that lives locally when the player enters a new planet (the origin of the new physics world would be the planet’s center), this means that you can perfectly walk on the surface of all the planets while they move around in the orbits without any weird behaviors This took a good amount of engine refactoring and a few changes to some systems (specially the floating origin) I need to fix a couple things like the drag when you are entering a planet, but that should be handled later on when you actually use a spaceship to enter and not just yourself with your spacesuit Other stuff that is cool Added a helmet overlay! (very inspired by outer wilds, id like some suggestions to make it more original honestly, but right now it decent). It is currently work in progress tho, and theres a lot of information missing… Small UI improvements: rounded borders, removed window’s transparency, added window close sound effects (need to find a better one tho), little better controller support… I just this idea to have vehicles but that will take super long, its added to the ideas file but thats certainty not being considered for short term, Any suggestions are welcome tho PD: video is very bad res bc i had to compress it unfortunately"}, {"post_id": 35908, "ts": "2026-07-27T17:18:56Z", "hours": 5.9792, "text": "JSP! I’ve finished porting the game to the new action based input system, its not great yet, theres a lot to polish but at least you can play 80% of the game just as good as with a keyboard/mouse (even better sometimes!) What’s the new input system? The game now asks for “actions” callbacks instead of directly asking for raw input. This new layer in the middle allows to make different devices have their own way to control each actions, so it now supports all the gamepads you probably have: xbox, playstation, steam, nintendo, generic ones too It is almost steam deck ready! Ive been playing this game on my steam deck and it works great! (you can get around 900 fps when unrestricted) Playing the game with a controller plus a little help from the little mouse trackpad really makes this game fun to play (100% coverage with this setup) Now i will finally start doing the boring physics stuff that will hopefully not take so long but idk, we’ll have to see Other stuff that was added Improved a bit the gravity based movement mode, it now adds the atmosphere’s drag gradually depending on its density, being the density higher the closer you are to the surface, this makes entering planets feel better Fixed some messed up formatting style in my code I dont know if start a new project for no more than 2 weeks and then go back, ive been having some cool new ideas but for now ill stick to this project PD: the picture is an old version (0.12.1), latest version with good controller support is 0.14.0"}, {"post_id": 34767, "ts": "2026-07-25T19:07:39Z", "hours": 8.6764, "text": "JSP Omg i need a break! just one more change bro and i will start doing the hard and boring stuff, just one more i swear! This sums up everything ive done for the past few hours, although the new improvements are actually quite important, i feel like im somewhat rushing them instead of focusing on the exploration mode New things!! Simple LOD system for planets, there wasnt a big performance change, but the model swap is very unnoticeable and nice so thats great! Added a simple spoiler warning to the exploration mode, the original idea was that you should unlock it after playing the campaign but i guess its fine lol I FIXED THE DEPTH BUFFER PRECISION ISSUE!!!! it was such a small change omg, i just dynamically changed the near plane of the camera based on how far you are to a planet, pretty nice WIP Work in progress: I’m porting the whole game to the new action-based input system so that the game supports controllers natively without any kind of steam layer on top, this is till very early and i still dont know how to make some stuff be fun to use with a controller…. I finish this, finish the two major things on the exploration mode that are 100% gonna be quick, make some decent amount of content for it, add the custom spaceship controller and launch system, make the first ~5 minutes of the campaign mode, and then SHIP THIS PROJECT (this will surely go as planned) PD: the video u see is completely controlled with my gamepad, not the best controls yet but its better than nothing!"}, {"post_id": 33389, "ts": "2026-07-23T09:24:10Z", "hours": 5.8975, "text": "JSP Worked on so many things before getting started with the complicated stuff, ill tell more about that in the bottom section, but for now, im pretty happy with what ive just added, even tho progress is pretty slow!!! What have i added? Full/complete atmospheric effect , it now not only looks good from outside, now from the inside too!!! Its a small trick but when the camera gets close enough to a planet, its atmosphere’s density scales up making the sky blue like here on earth or greatly improving the sunrises and sunsets , they do look beatiful Added floating origin: double precision was not enough so ive added a system that teleports all the entities in the scene when the player gets too far from the origin, this works surprisingly good and it was very simple to do, hopefully it wont break physics later on, but so far its great! This allows the solar system to go from ~10000 units wide to over ~3000000!! that is great! This was a engine-level change mostly tho You can finally use the planets you discover in the campaign mode in the sandbox mode Dynamic settings!!! I made it so that when you first load into the game, the UI scales to your resolution and your target fps are set to your monitor’s refresh rate, might not look like something important but this is actually HUGE Whats cooking up currently! Need a system to allow the player to be placed on top of moving planets (it currently works but breaks sometimes), and also to allow those planets to rotate. This will be achieved with a completely new physics world that will live localy on the closest planet the player is to Chunked mesh collider system i really dont know how to this, because of the terrain of my planets (TODO), collisions will be complicated to calculate, if you know about anything that could help, please send it!!! PD: I wish i could spend more time actually coding than thinking, if that were to be the case id have 300 hours+ in this project already"}, {"post_id": 32263, "ts": "2026-07-21T10:11:59Z", "hours": 8.1467, "text": "JSP This is one of the most exiting devlogs so far!! I’ve managed to get a very basic “solar system working, not all the time and of course it isnt perfect but it is really cool, heres its lore: (note that planets are placeholders right now, and distances/scale should be a lot bigger in the future) The “Halcyon” System Somewhere very very far from our current home, humanity has managed to establish a multi-planetary life in a new system after traveling for generations in their own space station The Halcyon system is composed of 5 planets (maybe more in the future) that orbit around a massive black hole (it doesnt have a name yet) “Gaia” is the earth-like planet whose own satellite, “Vesta”, is a red dwarf star that provides just enough light and heat in order to live (seen in the demo video) “Ying” and “Yan” (names will probably change), are two tiny planets that follow exact opposite orbits around the black hole, when one of them is at the perihelion, the other ones at the aphelion “Kepler” is a huge rocky planet at the outskirts of the system where small human colonies currently live Note that the campaign will be linear and happen entirely inside this place, but you will also have a “exploration” game mode that will allow you to find and see new secrets hidden… :)) Technical stuff (i.e. what was added) Created the base for the Halcyon System, planets follow a predetermined elliptical orbit in real-time. Note that for debugging, scale is around 10 to 100 times less! Added a simple physics based player controller, this took a lot of engine refactoring too. The player is affected by the gravity of the near planets and, when close enough to a planet’s surface, it is automatically aligned with the gravity vector and its also affected by the atmosphere’s drag (if theres any), this was by far the most difficult thing to do Added a little Free Camera controller as well What will be added in the future This is only the start . Theres still a few complicated things to do: Add double precision and floating origin to solve the problems that will appear when distances become as big as id like them to be Add a chunked collision mesh system for planets with complex geometry, like mountains or things like that. Right now they are all controlled by a simple kinematic sphere collider This system currently breaks the player movement when planets are moving, this is why i set “time scale” to 0. To fix this ive been thinking of creating a local physics world that sets the planet you are on to be the origin of the physics, making it look like if the planet was static, this will by by far what will take the most amount of work probably i also wanna update the atmospheric shader as it is by far the thing worsening the game’s performance, and id like to make the sky fully tint when your inside it PD: Thank you so much for all the people that support/follow this project, it already has 21 followers . thank you, really!"}, {"post_id": 30589, "ts": "2026-07-18T09:11:03Z", "hours": 8.3614, "text": "JSP I want to dedicate this devlog to @Rupnil as he always says that devlogs need to be 3-4 hours max, so i can explain why thats not always possible. Out of the 8 hours i devlog today, around 7.5 of them were spent ONLY debugging ONE SINGLE BUG for 2 whole days. I started losing my mind lmfao the bug: All the built-in and embedded textures became completely broken and ONLY on super specific conditions on certain parts and game modes. But the worst part was that rolling back to a version from days ago DID NOT solve the issue at all . I even considered that my GPU gave up on my and it was just showing gpu artifact slop in my screen the fix: Apparently there was a small bug with gpu memory allocation in the backend of dear imgui (apparently ONLY in the SDL2-OpenGL backend lmfao) and only for the docking branch of the repo. Rolling back to an old dear imgui version from the main branch solved the issue but damn. Ive also reported the issue as much as i could in the official repo. Pretty much, updating the engine to the latest version automatically updated its dependencies and thus leaked the bug to my game Appart from that I’ve spent a little bit on starting to develop the open-universe system where you can travel around planets! More on that in the next devlog probably. I already have though about the planet’s names, positions and stuff! pretty exiting!! PD: In the mean time ive also being updating the engine at the same time to improve the physics system, which is a lot better right now!"}, {"post_id": 29477, "ts": "2026-07-16T13:30:28Z", "hours": 4.3869, "text": "JSP Pre-ship checklist is complete! I’m so ready to ship the first version and start developing the campaign, which is the main thing of this game. I’ve actually started it a little bit, it now has an interior level system completely different to the gamemode system i had for the rest of the game, this is pretty exiting! stuff that ive done before shipping Built the game for windows, took a little bit but performance is 1:1 and everything works perfectly, the only thing was that i had to change the backend of the audio engine to use something else but that was fairly quick! Reduced the size of the game MASSIVELY , it went from around 350MB to ~35MB , thats literally 10 times less!! managed to do this by compressing the audio files, although the change is almost unnoticeable, and also making the engine bake some textures on build time, just like real fancy engines do! Changed a bit the main menu/ campaing mode but for now it is all a placeholder Created a new itch.io banner Made the HELP menu show up by default, i dont really like this but i think its probably the best for people to rate it nicely, wont be in the final version… Added a input mode (another one) to the spaceship building mode that allows you to hover the attachment points and it will tell you with a little popup what category of part can go there If you are rating my project, please ishowspeed i need this now in all fairness i hope people like my game! im not even close to finishing it lol Right after this first ship i will work on updating the engine to support new features that the campaign mode will certainty need 100%, like a working physics engine, ive thought of porting what i currently have to use a new one i found and that is getting very popular called “Box3D”, we’ll see, byeeeeeee"}, {"post_id": 27751, "ts": "2026-07-13T16:07:37Z", "hours": 7.2142, "text": "JSP https://github.com/aloyak/JSP https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc I feel like im getting very close to a first ever release and finally start with the campaign mode! I finished some polishing stuff and fixed a bit, i dont think the spacecraft builder mode is ready 100% but ill use it in the campaing mode either way so ill have to update it regardless I’ve officially published the github repository where you can check out the huge amount of code this project already has lol. I’ve also created a new itchio page, this is the secret link (for feedback): https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc added things: Published the github repo and the itchio page! With a lot of new screenshots and art. I’ve also added the source files of the textures (.xfc gimp files, including the itchio banners) as well as the 3D models I’ve made (in blender) which can all be found in the assets_src/ folder Added a way to delete different parts in the spaceship building mode Added a few new parts to the spaceship building mode, refactored the whole system to make it “easier” (not really) to add new parts and things Added a full README + LICENSE to the repo Added a new shader , it is the small fog that you see in the vide when building a spaceship in order to hide the lack of detail in the exterior, the shader fades out the more you look up so you can see the beautiful skybox Added load/saving to the spacecraft building game mode, you can now save your ship’s to load them later just like with planets and sandboxes Fix some memory management problems where i forgot to delete some pointers => no memory leaks or crashes! I dont think this will be the last devlog before the first ship, but maybe, who knows right? Looking forward to you all trying my game! (the part that is done) PD: 100 hours"}, {"post_id": 25218, "ts": "2026-07-09T10:34:55Z", "hours": 3.7989, "text": "JSP Can’t really express enough how much I enjoy making shaders, the look really good. i might make a video about it with the new hackclub video challenge, we might see, I’m kinda shy for these sort of things :)) Today’s devlog is pretty much to show only one thing. I’ve been doing some really small changes to UI, a few bug fixes but the important thing is the new Central Body system for the sandbox mode (the code is pretty rough right now but hopefully ill improve it), this now allows you to choose the central body that your planets will orbit around So now, instead of having only the sun in the middle you can now select a BLACK HOLE instead, which i think its a lot cooler. Note that the whole black hole is completely done by a single glsl fragment shader, how cool is that? I’ve reused a small amount of code from the atmosphere shader and then researched a bit on similar projects Apart from this I’ve also added a new “extra” option to allow the player to change the tint of the skybox, so you can create even weirder solar systems, any new suggestions on what else to add are welcome! After this im gonna do a small refactoring change that is really stupid and needs to be changed in the entire code base, its just a small thing with the new language system"}, {"post_id": 24594, "ts": "2026-07-08T09:29:46Z", "hours": 8.8931, "text": "JSP Worked on polishing and improving a few quality of life features and overall stability, also I took my time to translate every single text in the game to spanish, although the new dynamic language system should work for adding any new language fairly quickly. this is a very important change because doing this after the campaign would be a nightmare. language is also saved to settings new stuff Added a dynamic language system and support for playing the game in spanish, if you want any new languages or help translate and thus be added to the credits please reach out Added a full credits panel where it shows all the licenses and 3rd party code/art used, AI disclosure and other stuff Fixed some weird seg faults when going back to main menu from the blueprint view Updated all icons, all of them were used in the sandbox game mode Added some new settings to the blueprint view inside the spaceship building game mode What I wanna do now is to finally finish the spaceship sandbox finally but its taking longer than expected and it requires a lot of brainpower that many times is less appealing to do compared to playing persona 5 royal lmao. Note: once the source code is published, sending feedback, playtesting or translating would maybe mean that i put you in the credits! fr i might need some help tho"}, {"post_id": 22329, "ts": "2026-07-04T19:06:08Z", "hours": 7.0856, "text": "JSP I really enjoy creating and coding shaders and so i started adding some cool effects to the spacecraft editor, didnt really add any new parts but i think that what i added was pretty interesting. I’ve also been working on improving a bit the user experience and making things obvious to use without explaining anything, this is probably the most fun i had doing this project in a while :) what was added Added “Blueprint” view for your spaceship, watch the video to see what it is! currently very early version tho Added a help window that changes based on the gamemode Added geometry center (blue) and center of mass (yellow) to the spaceship Small fixes to transition between movesets Added a border shader to mark the bounds of the building workspace Added a few icons that really need some improvement The idea of the blueprint mode is to edit different things from the spaceship, and also to see the different stages of your little ship! more on this later, im not specially creative enough to write a lot today lol Ill also probably add a dynamic cursor system but idk"}, {"post_id": 20638, "ts": "2026-07-02T08:56:03Z", "hours": 6.5689, "text": "JSP Been working on the spaceship builder gamemode and its pretty fun! right now the system is very simple but solid. i had to model a couple test things and fix many bugs but it is going quite fast. The current system is a simple attachment-part system where each attachment holds up information about allowed part’s categories to attach and the normal vector of the attachment. Unfortunately removing parts is not really an option yet cuz i need to see how i will make that possible later on summary on new features: started the actual spaceship building gamemode, currently it features just basic part placement logic small changes to sound effects and music (not shown in the video) Apart from obvious structural changes, id also want to add some sort of customization to your spaceships, with different colors, flags, sigils idk. I dont want to make building a spaceship something hard but just a simple thing you do to have your own individual experience, obviously you wont be able to make some cursed stuff as it wont just fly into space without an engine, but the idea is that everything with enough parts should work"}, {"post_id": 18642, "ts": "2026-06-29T20:39:49Z", "hours": 3.7319, "text": "JSP Unfortunately hackatime doesnt support blender so the ~2.5 hours i spent modeling the assembly building for the spacecraft editor sandbox will not count but its fine. I’ve also done some deep debugging to the engine as it now supports embedded materials even when they dont have any texture, before this change everything looked like a wierd artifact in black/purple colors (check out the second image if ud like to see it, its pretty in a way) what was added/changed Created a not-final but decent model for the assembly building you will be creating your custom spaceship in Added first person camera control, that is used by this gamemode to get a different “perspective” on your awesome creation. you can toggle between the normal orbital view and the fp view some engine-level optimizations This now means im FREE… to actually start developing the spacecraft building sandbox, so we are back to it lol. im hoping it doesnt take me that much but i still need to finish to understand how exactly i want this to be as this is probably the only shared code that the campaign game mode will use, so i better make it good as it “counts” double PD: already said this, but the second screenshot is just so you comprehend what ive been struggling with for the past 48 hours :("}, {"post_id": 17110, "ts": "2026-06-27T19:42:28Z", "hours": 9.6172, "text": "JSP Huge progress!! (yes, really) I’ve made some cool stuff an this game now looks a lot more professional, these last changes we’re surprisingly fast and fun to do (finally for once lmao), although the following changes, most of them, are still work in progress. I’ve officially decided that I’m not gonna be updating the engine’s repository solely for this project as im a bit more focused on making my game work rather than making the engine reliable and well-structured for any usecase, even tho the engine will still recieve updates any way cuz i really need them for the game, but the main focus is to not suffocate the engine with specific jsp stuff. new stuff audio system: custom imgui wrapper that lets me make sound effects for buttons on hover and press + background music system that lets me control simple fade out and transition to other songs, currently only in the main menu user settings: instead of making the same json slop ive made for the rest of the load/saving stuff, i made a fancy system that lives in the engine’s core and that lets you save any kind of settings a lot easier. user settings are now correctly saved when changed on user/settings.json created a simple intro text for the first run that explains a some information made the settings window accessible from anywhere, not tied to the main menu anymore FANCY TRANSITIONS between gamemodes, it now fades in/out to black with a little loading icon in the bottom right corner, this took longer than id like to explain unfortunately added a color history for the paint tool in the planet sandbox improved atmosphere UI controls in the planet sandbox fix water shader sometimes rendering on top of an atmosphere As you might be able to guess, some of these changes weren’t really necessary but im sort of procrastinating so that i dont have to model the assembly building for the next game mode cuz i really suck at it and will be painful most likely I’ve though of adding a “first person view” move mode to the spacecraft sandbox as it would be cool to see your creation from an engineer’s point of view and also because that way i already will have coded the controls for the campaign :))"}, {"post_id": 15575, "ts": "2026-06-25T10:26:14Z", "hours": 5.6989, "text": "JSP Currently finishing the gravity sandbox gamemode! I still need to make quite a big change as im thinking of unifying the “gravity body” struct i use in the sandbox with the “planet component” i use in the rest of the game, so this will probably take a while but, for now, the sandbox game mode seems to be the next thing to be finished! new stuff! the gravity sandbox now has gravity!!!! note that it is not super realistic nasa-level simulation, i was thinking of something a lot more arcade. this is very well reflected in the fictional scale (its around 1:100000), because games must be fun first, then realistic if possible separated the gravity sandbox file to hold the built-in planet’s registry in a different file (its around ~1300 lines of code rn lol, after the simplification…) added a nice destroy animation for the planets, improved the velocity tool and made the selection tool follow the planets the intro animation now locks into the sun, which is now the origin of the scene + changes to the style of the sun added trails to the planets in the simulation (that you can toggle, of course) small UI improvements Whats next u say? applying the same load/save system that i used in the planet builder sandbox, only that now i wont have to create a vertex data to file system (yay) Im also starting to 3d model in blender the “assembly building” where you will be able to build your spaceships in the other game mode, but im really bad at it so ill leave it for later, once the spacecraft builder game mode is finished i will probably ship the first version"}, {"post_id": 13151, "ts": "2026-06-21T14:56:42Z", "hours": 10.1961, "text": "JSP I’ve officially finished the planet builder sandbox gamemode finally, probably will tweak a lot of things but the main stuff is done. i spent quite a lot trying to fix a problem with the depth texture that isnt even fixed right now lmao, quick explanation: distances are huge and so the depth texture loses a lot of precision, to combat this i decide to add reverse-z to the engine’s renderer but this didnt really solve the issue as it probably needs even more work adding an inifinite “far” plane or logarithmic depth but i think its fine for now, ill explain this more in depth with the next devlog on the origin engine. new features added oceans to the planet builder, very simple for now but as a first version i think it works just fine, i spent at least 8 hours with this already lol, added basic controls to the ui to modify the shader’s uniforms and hopefully its good enough added loading/saving to the planet builder and to the sandbox, you can now save your projects using json serialization, a geometry-to-file algorithm and a texture-to file algorithm. note that the planets you create in the planet builder can also be used in the gravity sandbox added the terrain tool so you can now modify the geometry of your planet as you like, creating mountains, valleys or oceans Next up is to finish the gravity sandbox gamemode, hopefully that should be a lot quicker as most of it is already done, but you know how this usually goes HELP: if you have any ideas on how to make the depth texture more precise given the huge distances please let me know, theres not a lot of information out there"}, {"post_id": 11875, "ts": "2026-06-19T10:45:42Z", "hours": 5.4583, "text": "JSP I’ve been stuck with a super upsetting bug with the engine’s render class and the ownership of the output buffer that made the engine’s sandbox editor be completely unusable for however long this “postprocessing pipeline update” lasted. it is now fixed and i could continue developing this game finally. As the engine now supports adding many layers of postprocessing on top of the main render pipeline, i started cooking up atmospheric and star shaders, although only the first one is finished. i ported the atmosphere shader from a tutorial posted by nvidia on atmospheric scattering from a many years ago but the end result is honestly amazing, way better than what i had in mind. This is supposed to give the same feeling as the atmospheres from outer wilds, which is part of my inspiration for this project (and also my fav game in general) new features add “Has atmosphere” option to the planet builder mode, with a lot of options and parameters to control and make your own planets, showcased in the video… made all entities with the planet component now have an option to show an atmosphere, although it is disabled by default. this results on the earth shown in the main menu to now also have a atmosphere I will be focusing on finishing the planet builder game mode first, as it is ~60% done (probably less), i just need to add the entire terrain tool and save the planet settings to a file to be able to use it later or use it in the gravity sandbox PD: i know it seems like im focusing too much into the small/extra gamemodes but this is supposed to function as a base for the campaign mode, which i dont think will be released in the first public version unfortunately"}, {"post_id": 10582, "ts": "2026-06-17T12:03:21Z", "hours": 4.9575, "text": "JSP Good but slow progress (im not finishing this game before stardance ends probably) I want to focus on having the 4 main gamemodes ready to have a good base for the camping, which is gonna be epic! new features/changes: wrote the story for the campaign mode, yet to be showcased, but it is pretty cool, more on that later removed the explore mode, this was a thing i had in mind at the very beginning of the development but it doesnt really fit my view right now, will make a comeback at some point, but the previous implementation was just a bunch of dead code created a simple spaceship building scene, wip as you can see in the video added a very simple splash screen improved the planet creation sandbox, now with a paint tool (a bit buggy, for now) that lets you generate a real-time texture and save it to a png file, biggest progress here was made in the engine itself actually. This took so much time fighting with translation of screen-space coords to world-space coords to UV coords, im actually impressed it even works lmao. this was almost gonna get scrapped till i realized the UV unwrapping of the sphere was a cubic projection and that was messing everything up I am struggling so much with blender and my sandbox, it looks like they hate each other, also WHY DOES BLENDER USE Z+ UP, anyway, stay tuned! Its hard to make devlogs when progress is so slow but i hope you like it PD: I just fixed the colors looking like confetti (look at the color of the blue paint brush), apparently i was multiplying the alpha channel by 255 in the texture class because of a previous implementation and that was causing some sort of overflow in the shaders, thus the weird colors, so paint tool is officially finished, hopefully"}, {"post_id": 9425, "ts": "2026-06-15T19:45:20Z", "hours": 8.1431, "text": "J.S.P. I’ve been making some progress in every direction while i find out exactly what i want this game to be. ive started writing the story for the campaign mode that i hope is about 3 to 4 hours. Overall the main progress of this devlog is summarized in a finished early version of the sandbox, although theres a lot to fix in it, the main stuff is done. Ive also started with the planet creation sandbox and focused on working into instancing even though it is not quite there yet (im thinking of removing the explore mode entirely or do it completely different) new features: improved sandbox mode with actual simulation (very early), a new intro animation, different tools to select, move and change the starting velocity of each planet set a base for both the planet and spacecraft creation sandboxes as these mechanics will make the development of the campaign a bit easier, hopefully created a simple logo, probably to be changed, i dont really like it but id appreciate feedback refactored the scale system to make working with different distances and planet’s radius a lot easier, this new system is so clean i actually love it As you can see progress is extremely slow, i want to make this right and also make sure that the project is well structured enough to hold up. Also did a simple check on performance and after a couple tweaks, average fps sit around 3000, fr, on my little rtx 3060 so thats great"}, {"post_id": 7522, "ts": "2026-06-12T15:45:45Z", "hours": 5.6847, "text": "JSP Today’s devlog is not so much focus into the progress but into some design decisions that made me had to restructure the project a quite a lot, ive got a new view of the project that i think will make it a lot more fun gamemodes: campaign: top secret for now explore: you can explore, find, filter and search up real-life satellites at their real position, this is mostly done already but i need to work on adding instancing to the engine because rendering ~14000 satellites is not something my little tiny engine can really handle right now, performance drops from ~1700 fps to 9 fps lol sandbox: no more real life stuff, distances are too big and not fun to play with, this is the main change. this means that the idea is to now not only allow to play around with 3d gravity and make solar systems, but also to create and design custom planets and spacecrafts (and save/load them to a custom json file that you can share or reuse) new features I want to showcase how the current sandbox mode is like right now, this is only a part of the final sandbox mode tho (read the previous paragraph for more info). I added this cool animation from the main menu, simple movement that scales with distance, and a placing-editing system that took way too long (i had to do matrix calculations lol, math does be useful sometimes), right now the only object you can place is the Earth, but you will be able to place pretty much anything and modify their mass, velocity or anything really I will now start with making instancing something real and not just a dead branch in the engine’s repo, but this means im gonna have to read some opengl documentation :( PD: the visual bug in the video is completely intentional"}, {"post_id": 6769, "ts": "2026-06-11T10:36:15Z", "hours": 7.2383, "text": "JSP I’ve been working on a lot of things and the project is taking a really nice shape! ive organized the game into different game modes that independently manage their needs in an organized way. Also ive made some progress with the real life satellites and made some nice main menu! new features: WIP: explore real time satellites and see them move as they are in real life, with custom orbit calculations, still in the works, getting fetched directly from the internet and cached every 24 hours Added a main menu, as the engine doesnt have any in-house UI system, Im using a modified dear imgui version that is holding up nicely, also added some placeholders for settings etc… Started a new gamemode: gravity sandbox, where you can play around with custom objects and real life planets and their gravitational interactions I also had to update the engine a bit to make it be able to handle quads and their operations. the idea is to finalize a working sandbox gamemode as that would set the base for many more complex features incoming"}, {"post_id": 6120, "ts": "2026-06-10T09:09:05Z", "hours": 6.2383, "text": "JSP A 3D pixelart videogame about space exploration where you have to save humanity from the Kessler effect, currently working on the “exploration” mode where you can find and explore all the satellites of earth (and later on the solar system) at their real time location. Current Features! I’ve made a simple system that gets the real life data of these satellites from CelesTrak’s Public TLE Text Files, which than caches them and are refreshed every 24 hours, so you can see the real-life position of, for example, the ISS Built using my own custom engine, actually been updating the engine while creating this because, lets say the engine isnt very “mature” yet, but its holding up nicely! Check out the ORIGIN engine at: https://origin.aloyak.dev The game will feature this little 3d pixel art style that i really like honestly. The hardest thing to do so far was to setup a fork of the engine so that i could work on the game without actually contributing to the engine itself at all. All these models used currently are from NASA themselves, so they should be pretty accurate! I’m thinking of maybe adding a web build but the more i try to make it work the more it breaks lol :( 🚀🚀"}]...
|
Title: Janitor Space Program (J.S.P.) by @aloyak | Title: Janitor Space Program (J.S.P.) by @aloyak | Stardance
Devlogs:
JSP A 3D pixelart videogame about space exploration where you have to save humanity from the Kessler effect, currently working on the “exploration” mode where you can find and explore all the satellites of earth (and later on the solar system) at their real time location. Current Features! I’ve made a simple system that gets the real life data of these satellites from CelesTrak’s Public TLE Text Files, which than caches them and are refreshed every 24 hours, so you can see the real-life position of, for example, the ISS Built using my own custom engine, actually been updating the engine while creating this because, lets say the engine isnt very “mature” yet, but its holding up nicely! Check out the ORIGIN engine at: https://origin.aloyak.dev The game will feature this little 3d pixel art style that i really like honestly. The hardest thing to do so far was to setup a fork of the engine so that i could work on the game without actually contributing to the engine itself at all. All these models used currently are from NASA themselves, so they should be pretty accurate! I’m thinking of maybe adding a web build but the more i try to make it work the more it breaks lol :( 🚀🚀
JSP I’ve been working on a lot of things and the project is taking a really nice shape! ive organized the game into different game modes that independently manage their needs in an organized way. Also ive made some progress with the real life satellites and made some nice main menu! new features: WIP: explore real time satellites and see them move as they are in real life, with custom orbit calculations, still in the works, getting fetched directly from the internet and cached every 24 hours Added a main menu, as the engine doesnt have any in-house UI system, Im using a modified dear imgui version that is holding up nicely, also added some placeholders for settings etc… Started a new gamemode: gravity sandbox, where you can play around with custom objects and real life planets and their gravitational interactions I also had to update the engine a bit to make it be able to handle quads and their operations. the idea is to finalize a working sandbox gamemode as that would set the base for many more complex features incoming
JSP Today’s devlog is not so much focus into the progress but into some design decisions that made me had to restructure the project a quite a lot, ive got a new view of the project that i think will make it a lot more fun gamemodes: campaign: top secret for now explore: you can explore, find, filter and search up real-life satellites at their real position, this is mostly done already but i need to work on adding instancing to the engine because rendering ~14000 satellites is not something my little tiny engine can really handle right now, performance drops from ~1700 fps to 9 fps lol sandbox: no more real life stuff, distances are too big and not fun to play with, this is the main change. this means that the idea is to now not only allow to play around with 3d gravity and make solar systems, but also to create and design custom planets and spacecrafts (and save/load them to a custom json file that you can share or reuse) new features I want to showcase how the current sandbox mode is like right now, this is only a part of the final sandbox mode tho (read the previous paragraph for more info). I added this cool animation from the main menu, simple movement that scales with distance, and a placing-editing system that took way too long (i had to do matrix calculations lol, math does be useful sometimes), right now the only object you can place is the Earth, but you will be able to place pretty much anything and modify their mass, velocity or anything really I will now start with making instancing something real and not just a dead branch in the engine’s repo, but this means im gonna have to read some opengl documentation :( PD: the visual bug in the video is completely intentional
J.S.P. I’ve been making some progress in every direction while i find out exactly what i want this game to be. ive started writing the story for the campaign mode that i hope is about 3 to 4 hours. Overall the main progress of this devlog is summarized in a finished early version of the sandbox, although theres a lot to fix in it, the main stuff is done. Ive also started with the planet creation sandbox and focused on working into instancing even though it is not quite there yet (im thinking of removing the explore mode entirely or do it completely different) new features: improved sandbox mode with actual simulation (very early), a new intro animation, different tools to select, move and change the starting velocity of each planet set a base for both the planet and spacecraft creation sandboxes as these mechanics will make the development of the campaign a bit easier, hopefully created a simple logo, probably to be changed, i dont really like it but id appreciate feedback refactored the scale system to make working with different distances and planet’s radius a lot easier, this new system is so clean i actually love it As you can see progress is extremely slow, i want to make this right and also make sure that the project is well structured enough to hold up. Also did a simple check on performance and after a couple tweaks, average fps sit around 3000, fr, on my little rtx 3060 so thats great
JSP Good but slow progress (im not finishing this game before stardance ends probably) I want to focus on having the 4 main gamemodes ready to have a good base for the camping, which is gonna be epic! new features/changes: wrote the story for the campaign mode, yet to be showcased, but it is pretty cool, more on that later removed the explore mode, this was a thing i had in mind at the very beginning of the development but it doesnt really fit my view right now, will make a comeback at some point, but the previous implementation was just a bunch of dead code created a simple spaceship building scene, wip as you can see in the video added a very simple splash screen improved the planet creation sandbox, now with a paint tool (a bit buggy, for now) that lets you generate a real-time texture and save it to a png file, biggest progress here was made in the engine itself actually. This took so much time fighting with translation of screen-space coords to world-space coords to UV coords, im actually impressed it even works lmao. this was almost gonna get scrapped till i realized the UV unwrapping of the sphere was a cubic projection and that was messing everything up I am struggling so much with blender and my sandbox, it looks like they hate each other, also WHY DOES BLENDER USE Z+ UP, anyway, stay tuned! Its hard to make devlogs when progress is so slow but i hope you like it PD: I just fixed the colors looking like confetti (look at the color of the blue paint brush), apparently i was multiplying the alpha channel by 255 in the texture class because of a previous implementation and that was causing some sort of overflow in the shaders, thus the weird colors, so paint tool is officially finished, hopefully
JSP I’ve been stuck with a super upsetting bug with the engine’s render class and the ownership of the output buffer that made the engine’s sandbox editor be completely unusable for however long this “postprocessing pipeline update” lasted. it is now fixed and i could continue developing this game finally. As the engine now supports adding many layers of postprocessing on top of the main render pipeline, i started cooking up atmospheric and star shaders, although only the first one is finished. i ported the atmosphere shader from a tutorial posted by nvidia on atmospheric scattering from a many years ago but the end result is honestly amazing, way better than what i had in mind. This is supposed to give the same feeling as the atmospheres from outer wilds, which is part of my inspiration for this project (and also my fav game in general) new features add “Has atmosphere” option to the planet builder mode, with a lot of options and parameters to control and make your own planets, showcased in the video… made all entities with the planet component now have an option to show an atmosphere, although it is disabled by default. this results on the earth shown in the main menu to now also have a atmosphere I will be focusing on finishing the planet builder game mode first, as it is ~60% done (probably less), i just need to add the entire terrain tool and save the planet settings to a file to be able to use it later or use it in the gravity sandbox PD: i know it seems like im focusing too much into the small/extra gamemodes but this is supposed to function as a base for the campaign mode, which i dont think will be released in the first public version unfortunately
JSP I’ve officially finished the planet builder sandbox gamemode finally, probably will tweak a lot of things but the main stuff is done. i spent quite a lot trying to fix a problem with the depth texture that isnt even fixed right now lmao, quick explanation: distances are huge and so the depth texture loses a lot of precision, to combat this i decide to add reverse-z to the engine’s renderer but this didnt really solve the issue as it probably needs even more work adding an inifinite “far” plane or logarithmic depth but i think its fine for now, ill explain this more in depth with the next devlog on the origin engine. new features added oceans to the planet builder, very simple for now but as a first version i think it works just fine, i spent at least 8 hours with this already lol, added basic controls to the ui to modify the shader’s uniforms and hopefully its good enough added loading/saving to the planet builder and to the sandbox, you can now save your projects using json serialization, a geometry-to-file algorithm and a texture-to file algorithm. note that the planets you create in the planet builder can also be used in the gravity sandbox added the terrain tool so you can now modify the geometry of your planet as you like, creating mountains, valleys or oceans Next up is to finish the gravity sandbox gamemode, hopefully that should be a lot quicker as most of it is already done, but you know how this usually goes HELP: if you have any ideas on how to make the depth texture more precise given the huge distances please let me know, theres not a lot of information out there
JSP Currently finishing the gravity sandbox gamemode! I still need to make quite a big change as im thinking of unifying the “gravity body” struct i use in the sandbox with the “planet component” i use in the rest of the game, so this will probably take a while but, for now, the sandbox game mode seems to be the next thing to be finished! new stuff! the gravity sandbox now has gravity!!!! note that it is not super realistic nasa-level simulation, i was thinking of something a lot more arcade. this is very well reflected in the fictional scale (its around 1:100000), because games must be fun first, then realistic if possible separated the gravity sandbox file to hold the built-in planet’s registry in a different file (its around ~1300 lines of code rn lol, after the simplification…) added a nice destroy animation for the planets, improved the velocity tool and made the selection tool follow the planets the intro animation now locks into the sun, which is now the origin of the scene + changes to the style of the sun added trails to the planets in the simulation (that you can toggle, of course) small UI improvements Whats next u say? applying the same load/save system that i used in the planet builder sandbox, only that now i wont have to create a vertex data to file system (yay) Im also starting to 3d model in blender the “assembly building” where you will be able to build your spaceships in the other game mode, but im really bad at it so ill leave it for later, once the spacecraft builder game mode is finished i will probably ship the first version
JSP Huge progress!! (yes, really) I’ve made some cool stuff an this game now looks a lot more professional, these last changes we’re surprisingly fast and fun to do (finally for once lmao), although the following changes, most of them, are still work in progress. I’ve officially decided that I’m not gonna be updating the engine’s repository solely for this project as im a bit more focused on making my game work rather than making the engine reliable and well-structured for any usecase, even tho the engine will still recieve updates any way cuz i really need them for the game, but the main focus is to not suffocate the engine with specific jsp stuff. new stuff audio system: custom imgui wrapper that lets me make sound effects for buttons on hover and press + background music system that lets me control simple fade out and transition to other songs, currently only in the main menu user settings: instead of making the same json slop ive made for the rest of the load/saving stuff, i made a fancy system that lives in the engine’s core and that lets you save any kind of settings a lot easier. user settings are now correctly saved when changed on user/settings.json created a simple intro text for the first run that explains a some information made the settings window accessible from anywhere, not tied to the main menu anymore FANCY TRANSITIONS between gamemodes, it now fades in/out to black with a little loading icon in the bottom right corner, this took longer than id like to explain unfortunately added a color history for the paint tool in the planet sandbox improved atmosphere UI controls in the planet sandbox fix water shader sometimes rendering on top of an atmosphere As you might be able to guess, some of these changes weren’t really necessary but im sort of procrastinating so that i dont have to model the assembly building for the next game mode cuz i really suck at it and will be painful most likely I’ve though of adding a “first person view” move mode to the spacecraft sandbox as it would be cool to see your creation from an engineer’s point of view and also because that way i already will have coded the controls for the campaign :))
JSP Unfortunately hackatime doesnt support blender so the ~2.5 hours i spent modeling the assembly building for the spacecraft editor sandbox will not count but its fine. I’ve also done some deep debugging to the engine as it now supports embedded materials even when they dont have any texture, before this change everything looked like a wierd artifact in black/purple colors (check out the second image if ud like to see it, its pretty in a way) what was added/changed Created a not-final but decent model for the assembly building you will be creating your custom spaceship in Added first person camera control, that is used by this gamemode to get a different “perspective” on your awesome creation. you can toggle between the normal orbital view and the fp view some engine-level optimizations This now means im FREE… to actually start developing the spacecraft building sandbox, so we are back to it lol. im hoping it doesnt take me that much but i still need to finish to understand how exactly i want this to be as this is probably the only shared code that the campaign game mode will use, so i better make it good as it “counts” double PD: already said this, but the second screenshot is just so you comprehend what ive been struggling with for the past 48 hours :(
JSP Been working on the spaceship builder gamemode and its pretty fun! right now the system is very simple but solid. i had to model a couple test things and fix many bugs but it is going quite fast. The current system is a simple attachment-part system where each attachment holds up information about allowed part’s categories to attach and the normal vector of the attachment. Unfortunately removing parts is not really an option yet cuz i need to see how i will make that possible later on summary on new features: started the actual spaceship building gamemode, currently it features just basic part placement logic small changes to sound effects and music (not shown in the video) Apart from obvious structural changes, id also want to add some sort of customization to your spaceships, with different colors, flags, sigils idk. I dont want to make building a spaceship something hard but just a simple thing you do to have your own individual experience, obviously you wont be able to make some cursed stuff as it wont just fly into space without an engine, but the idea is that everything with enough parts should work
JSP I really enjoy creating and coding shaders and so i started adding some cool effects to the spacecraft editor, didnt really add any new parts but i think that what i added was pretty interesting. I’ve also been working on improving a bit the user experience and making things obvious to use without explaining anything, this is probably the most fun i had doing this project in a while :) what was added Added “Blueprint” view for your spaceship, watch the video to see what it is! currently very early version tho Added a help window that changes based on the gamemode Added geometry center (blue) and center of mass (yellow) to the spaceship Small fixes to transition between movesets Added a border shader to mark the bounds of the building workspace Added a few icons that really need some improvement The idea of the blueprint mode is to edit different things from the spaceship, and also to see the different stages of your little ship! more on this later, im not specially creative enough to write a lot today lol Ill also probably add a dynamic cursor system but idk
JSP Worked on polishing and improving a few quality of life features and overall stability, also I took my time to translate every single text in the game to spanish, although the new dynamic language system should work for adding any new language fairly quickly. this is a very important change because doing this after the campaign would be a nightmare. language is also saved to settings new stuff Added a dynamic language system and support for playing the game in spanish, if you want any new languages or help translate and thus be added to the credits please reach out Added a full credits panel where it shows all the licenses and 3rd party code/art used, AI disclosure and other stuff Fixed some weird seg faults when going back to main menu from the blueprint view Updated all icons, all of them were used in the sandbox game mode Added some new settings to the blueprint view inside the spaceship building game mode What I wanna do now is to finally finish the spaceship sandbox finally but its taking longer than expected and it requires a lot of brainpower that many times is less appealing to do compared to playing persona 5 royal lmao. Note: once the source code is published, sending feedback, playtesting or translating would maybe mean that i put you in the credits! fr i might need some help tho
JSP Can’t really express enough how much I enjoy making shaders, the look really good. i might make a video about it with the new hackclub video challenge, we might see, I’m kinda shy for these sort of things :)) Today’s devlog is pretty much to show only one thing. I’ve been doing some really small changes to UI, a few bug fixes but the important thing is the new Central Body system for the sandbox mode (the code is pretty rough right now but hopefully ill improve it), this now allows you to choose the central body that your planets will orbit around So now, instead of having only the sun in the middle you can now select a BLACK HOLE instead, which i think its a lot cooler. Note that the whole black hole is completely done by a single glsl fragment shader, how cool is that? I’ve reused a small amount of code from the atmosphere shader and then researched a bit on similar projects Apart from this I’ve also added a new “extra” option to allow the player to change the tint of the skybox, so you can create even weirder solar systems, any new suggestions on what else to add are welcome! After this im gonna do a small refactoring change that is really stupid and needs to be changed in the entire code base, its just a small thing with the new language system
JSP https://github.com/aloyak/JSP https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc I feel like im getting very close to a first ever release and finally start with the campaign mode! I finished some polishing stuff and fixed a bit, i dont think the spacecraft builder mode is ready 100% but ill use it in the campaing mode either way so ill have to update it regardless I’ve officially published the github repository where you can check out the huge amount of code this project already has lol. I’ve also created a new itchio page, this is the secret link (for feedback): https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc added things: Published the github repo and the itchio page! With a lot of new screenshots and art. I’ve also added the source files of the textures (.xfc gimp files, including the itchio banners) as well as the 3D models I’ve made (in blender) which can all be found in the assets_src/ folder Added a way to delete different parts in the spaceship building mode Added a few new parts to the spaceship building mode, refactored the whole system to make it “easier” (not really) to add new parts and things Added a full README + LICENSE to the repo Added a new shader , it is the small fog that you see in the vide when building a spaceship in order to hide the lack of detail in the exterior, the shader fades out the more you look up so you can see the beautiful skybox Added load/saving to the spacecraft building game mode, you can now save your ship’s to load them later just like with planets and sandboxes Fix some memory management problems where i forgot to delete some pointers => no memory leaks or crashes! I dont think this will be the last devlog before the first ship, but maybe, who knows right? Looking forward to you all trying my game! (the part that is done) PD: 100 hours
JSP Pre-ship checklist is complete! I’m so ready to ship the first version and start developing the campaign, which is the main thing of this game. I’ve actually started it a little bit, it now has an interior level system completely different to the gamemode system i had for the rest of the game, this is pretty exiting! stuff that ive done before shipping Built the game for windows, took a little bit but performance is 1:1 and everything works perfectly, the only thing was that i had to change the backend of the audio engine to use something else but that was fairly quick! Reduced the size of the game MASSIVELY , it went from around 350MB to ~35MB , thats literally 10 times less!! managed to do this by compressing the audio files, although the change is almost unnoticeable, and also making the engine bake some textures on build time, just like real fancy engines do! Changed a bit the main menu/ campaing mode but for now it is all a placeholder Created a new itch.io banner Made the HELP menu show up by default, i dont really like this but i think its probably the best for people to rate it nicely, wont be in the final version… Added a input mode (another one) to the spaceship building mode that allows you to hover the attachment points and it will tell you with a little popup what category of part can go there If you are rating my project, please ishowspeed i need this now in all fairness i hope people like my game! im not even close to finishing it lol Right after this first ship i will work on updating the engine to support new features that the campaign mode will certainty need 100%, like a working physics engine, ive thought of porting what i currently have to use a new one i found and that is getting very popular called “Box3D”, we’ll see, byeeeeeee
JSP I want to dedicate this devlog to @Rupnil as he always says that devlogs need to be 3-4 hours max, so i can explain why thats not always possible. Out of the 8 hours i devlog today, around 7.5 of them were spent ONLY debugging ONE SINGLE BUG for 2 whole days. I started losing my mind lmfao the bug: All the built-in and embedded textures became completely broken and ONLY on super specific conditions on certain parts and game modes. But the worst part was that rolling back to a version from days ago DID NOT solve the issue at all . I even considered that my GPU gave up on my and it was just showing gpu artifact slop in my screen the fix: Apparently there was a small bug with gpu memory allocation in the backend of dear imgui (apparently ONLY in the SDL2-OpenGL backend lmfao) and only for the docking branch of the repo. Rolling back to an old dear imgui version from the main branch solved the issue but damn. Ive also reported the issue as much as i could in the official repo. Pretty much, updating the engine to the latest version automatically updated its dependencies and thus leaked the bug to my game Appart from that I’ve spent a little bit on starting to develop the open-universe system where you can travel around planets! More on that in the next devlog probably. I already have though about the planet’s names, positions and stuff! pretty exiting!! PD: In the mean time ive also being updating the engine at the same time to improve the physics system, which is a lot better right now!
JSP This is one of the most exiting devlogs so far!! I’ve managed to get a very basic “solar system working, not all the time and of course it isnt perfect but it is really cool, heres its lore: (note that planets are placeholders right now, and distances/scale should be a lot bigger in the future) The “Halcyon” System Somewhere very very far from our current home, humanity has managed to establish a multi-planetary life in a new system after traveling for generations in their own space station The Halcyon system is composed of 5 planets (maybe more in the future) that orbit around a massive black hole (it doesnt have a name yet) “Gaia” is the earth-like planet whose own satellite, “Vesta”, is a red dwarf star that provides just enough light and heat in order to live (seen in the demo video) “Ying” and “Yan” (names will probably change), are two tiny planets that follow exact opposite orbits around the black hole, when one of them is at the perihelion, the other ones at the aphelion “Kepler” is a huge rocky planet at the outskirts of the system where small human colonies currently live Note that the campaign will be linear and happen entirely inside this place, but you will also have a “exploration” game mode that will allow you to find and see new secrets hidden… :)) Technical stuff (i.e. what was added) Created the base for the Halcyon System, planets follow a predetermined elliptical orbit in real-time. Note that for debugging, scale is around 10 to 100 times less! Added a simple physics based player controller, this took a lot of engine refactoring too. The player is affected by the gravity of the near planets and, when close enough to a planet’s surface, it is automatically aligned with the gravity vector and its also affected by the atmosphere’s drag (if theres any), this was by far the most difficult thing to do Added a little Free Camera controller as well What will be added in the future This is only the start . Theres still a few complicated things to do: Add double precision and floating origin to solve the problems that will appear when distances become as big as id like them to be Add a chunked collision mesh system for planets with complex geometry, like mountains or things like that. Right now they are all controlled by a simple kinematic sphere collider This system currently breaks the player movement when planets are moving, this is why i set “time scale” to 0. To fix this ive been thinking of creating a local physics world that sets the planet you are on to be the origin of the physics, making it look like if the planet was static, this will by by far what will take the most amount of work probably i also wanna update the atmospheric shader as it is by far the thing worsening the game’s performance, and id like to make the sky fully tint when your inside it PD: Thank you so much for all the people that support/follow this project, it already has 21 followers . thank you, really!
JSP Worked on so many things before getting started with the complicated stuff, ill tell more about that in the bottom section, but for now, im pretty happy with what ive just added, even tho progress is pretty slow!!! What have i added? Full/complete atmospheric effect , it now not only looks good from outside, now from the inside too!!! Its a small trick but when the camera gets close enough to a planet, its atmosphere’s density scales up making the sky blue like here on earth or greatly improving the sunrises and sunsets , they do look beatiful Added floating origin: double precision was not enough so ive added a system that teleports all the entities in the scene when the player gets too far from the origin, this works surprisingly good and it was very simple to do, hopefully it wont break physics later on, but so far its great! This allows the solar system to go from ~10000 units wide to over ~3000000!! that is great! This was a engine-level change mostly tho You can finally use the planets you discover in the campaign mode in the sandbox mode Dynamic settings!!! I made it so that when you first load into the game, the UI scales to your resolution and your target fps are set to your monitor’s refresh rate, might not look like something important but this is actually HUGE Whats cooking up currently! Need a system to allow the player to be placed on top of moving planets (it currently works but breaks sometimes), and also to allow those planets to rotate. This will be achieved with a completely new physics world that will live localy on the closest planet the player is to Chunked mesh collider system i really dont know how to this, because of the terrain of my planets (TODO), collisions will be complicated to calculate, if you know about anything that could help, please send it!!! PD: I wish i could spend more time actually coding than thinking, if that were to be the case id have 300 hours+ in this project already
JSP Omg i need a break! just one more change bro and i will start doing the hard and boring stuff, just one more i swear! This sums up everything ive done for the past few hours, although the new improvements are actually quite important, i feel like im somewhat rushing them instead of focusing on the exploration mode New things!! Simple LOD system for planets, there wasnt a big performance change, but the model swap is very unnoticeable and nice so thats great! Added a simple spoiler warning to the exploration mode, the original idea was that you should unlock it after playing the campaign but i guess its fine lol I FIXED THE DEPTH BUFFER PRECISION ISSUE!!!! it was such a small change omg, i just dynamically changed the near plane of the camera based on how far you are to a planet, pretty nice WIP Work in progress: I’m porting the whole game to the new action-based input system so that the game supports controllers natively without any kind of steam layer on top, this is till very early and i still dont know how to make some stuff be fun to use with a controller…. I finish this, finish the two major things on the exploration mode that are 100% gonna be quick, make some decent amount of content for it, add the custom spaceship controller and launch system, make the first ~5 minutes of the campaign mode, and then SHIP THIS PROJECT (this will surely go as planned) PD: the video u see is completely controlled with my gamepad, not the best controls yet but its better than nothing!
JSP! I’ve finished porting the game to the new action based input system, its not great yet, theres a lot to polish but at least you can play 80% of the game just as good as with a keyboard/mouse (even better sometimes!) What’s the new input system? The game now asks for “actions” callbacks instead of directly asking for raw input. This new layer in the middle allows to make different devices have their own way to control each actions, so it now supports all the gamepads you probably have: xbox, playstation, steam, nintendo, generic ones too It is almost steam deck ready! Ive been playing this game on my steam deck and it works great! (you can get around 900 fps when unrestricted) Playing the game with a controller plus a little help from the little mouse trackpad really makes this game fun to play (100% coverage with this setup) Now i will finally start doing the boring physics stuff that will hopefully not take so long but idk, we’ll have to see Other stuff that was added Improved a bit the gravity based movement mode, it now adds the atmosphere’s drag gradually depending on its density, being the density higher the closer you are to the surface, this makes entering planets feel better Fixed some messed up formatting style in my code I dont know if start a new project for no more than 2 weeks and then go back, ive been having some cool new ideas but for now ill stick to this project PD: the picture is an old version (0.12.1), latest version with good controller support is 0.14.0
JSP We are SO back! I thought it would take me weeks to solve this issue but it wasnt that hard, thanks claude lol for helping. It’s not perfect just yet but its honestly crazy how my own engine managed to handle what im about to explain What took soo long The game now handles a transition from a global physics world to a new extra physics world that lives locally when the player enters a new planet (the origin of the new physics world would be the planet’s center), this means that you can perfectly walk on the surface of all the planets while they move around in the orbits without any weird behaviors This took a good amount of engine refactoring and a few changes to some systems (specially the floating origin) I need to fix a couple things like the drag when you are entering a planet, but that should be handled later on when you actually use a spaceship to enter and not just yourself with your spacesuit Other stuff that is cool Added a helmet overlay! (very inspired by outer wilds, id like some suggestions to make it more original honestly, but right now it decent). It is currently work in progress tho, and theres a lot of information missing… Small UI improvements: rounded borders, removed window’s transparency, added window close sound effects (need to find a better one tho), little better controller support… I just this idea to have vehicles but that will take super long, its added to the ideas file but thats certainty not being considered for short term, Any suggestions are welcome tho PD: video is very bad res bc i had to compress it unfortunately
J.S.P. Very exciting changes to the exploration mode yay !! I’ve been working on precisely TWO (2) things but one of them is way too early for me to be able to show you anything, more on that in the end Whats new? I’ve create a custom blender addon that lets me create procedural noise-based planets! It is really powerful and it gets you really good results for how simple it is really. In a way, its nothing but a vertex shader but coded in python lol It generates 3D spherical noise and applies it into an icosphere with a variety of parameters. Some of them arent precisely working but they are fine for now (specially the “ridged” option) You can try it yourself, its open source too! https://github.com/aloyak/JSP/blob/main/assets_src/blender/addons/planet_generator.py Terrain System I’m developing a way for the player to correctly collide with the geometry of these planets, but this is mostly engine-sided changes and I’m not very deep into it yet. I’m currently researching how to handle multi-threading async functions… more information about this in my latest engine’s devlog: https://stardance.hackclub.com/projects/1029/devlogs/34738 Known issues These are not really important right now, but for some reason I’ve realized that the splash screen takes different amounts of time depending on where you run the game?? what? A steam deck is around 3 seconds, my computer (the intended duration) is 4 seconds and in a friend’s laptop it is ~0.5 seconds
JSP! I’m back! and I finally have a new decent version that im probably gonna ship shortly after I publish this devlog. Its been so long since the last devlog because a number of factors, I had some vacations, my main pc is now just a steam deck connected to a monitor and also I’m kind of struggling to continue this project, I hope this isnt the last version but working on the project and adding or fixing things is very complicated and requires a lot of research to do it right, and it is exhausting What was added?? Included the new planet models to the halcyon system, you can now correctly explore them by using the new terrain system I added to the engine! Added some small help windows/hints for the new stuff before shipping! Fixed some audio bugs and added a sound effect for when you close a window Fixed the in-helmet HUD UI, the input vectors now correctly show the direction the thrust is being applied to, kinda like in Outer Wilds!! I’m most likely to be focusing on continuing the engine for a little bit, it really really does require some refactoring and I also need to clean some likely dead code or at least re-understand the code i wrote as it has lines from almost a 10 months ago! Hopefully someone could help and contribute to the project maybe or make something new out of it too! Im still planing on continuing to develop it but not at this pace considering im about to start college :))
Ships:
This is my 3D game about space exploration and kessler cascades, it has a campaign mode coming up but i havent finished that yet, for now enjoy the 3 game modes! i built this on top of my custom engine so its been a lot of hard work, please try it out!!!!
This is my 3D exploration-sandbox game that I built with my custom game engine! I’ve added quite a lot of stuff like a simple exploration game mode that allows you to move around a hand-crafted solar system i called “Halcyon”. there are also a lot of other game modes you can try and have fun with before I finally add the campaign game mode for the final version! In the picture you can see an in-game screenshot of the player walking around the surface of the earth-like planet “Gaia”, hope you like my game! With <3, 4loyak!...
|
1792979275.338712
|
1793065675.338712
|
|
24310
|
BitDrop by @thestarviper | Stardance
|
thestarviper
|
1
|
160.0
|
3167
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-10T09:55:31Z", "hours": 160.0, "multiplier": 19.75, "payout": 3167, "blessing": "neutral", "text": "PLEASE READ THE HINTS SO YOU KNOW HOW TO PLAY I made a pachinko roguelite game that is inspired by balatro, slay the spire, and ultrapool. The game is a web game that is hosted on itch.io so no need to download anything. Have fun!", "repo": "https://github.com/TheStarViper/Bitdrop", "demo": "https://thestarviper.itch.io/bitdrop"}]...
|
[{"post_id": 44510, "ts": "202 [{"post_id": 44510, "ts": "2026-08-10T09:53:13Z", "hours": 1.0939, "text": "UPDATE #32 FIREFOX SUCKS Summary FIREFOX SUCKS. anyways i added a buncha sfx and ct5 found a bug where the game done goofy mode on firefox so i had to fix that breakdown map hover sfx shop buy sfx cashout sfx basket score sfx node pin sfx louder on playtester request used playtester feedback: this game on firefox compiled weird goofy its up on itchio now wowie #SHIP TIME YAYAYAYAYAYAYAY"}, {"post_id": 44482, "ts": "2026-08-10T08:38:47Z", "hours": 1.9064, "text": "UPDATE #31 Balancing Summary ITS ALL COMING TOGETHER RAHHHHH. I added like 10 new daemons changed icons and balanced the prices along with sending my project into the hackclub slack for playtesting. breakdown added 10 new daemons changed icons of every daemon since they shared the same icon balanced prices of consumables and daemons used playtester feedback: some things were confusing so i added more hints used playtester feedback: a button in the shop was unintuative so i made it so that it worked more intuiatively used playtester feedback: playtester found a bug with one of the new daemons that destroyed itself didnt free up a slot NEXT UPDATE IS JUST SOUND EFFECTS AND MAYBE FEEDBACK FROM SLACK THEN I SHIP YAY IM GETTING THIS DONE BEFORE I SLEEP"}, {"post_id": 44442, "ts": "2026-08-10T06:02:41Z", "hours": 4.5892, "text": "UPDATE #30 A little bit of everything Summary added a loss screen, another pin modifier, changed clone pin graphic, added music, changed map nodes, added overload mechanic breakdown added a loss screen with a loss sound effect added another pin mod called “Amplify” which just gives 1.5x score on hit to the ball changed clone pin graphic to show the pull distance and changes with leveling added main menu music and gameplay music changed map nodes by renaming them and changing colors around made final boss node bigger than it was originally for emphasis added overload mechanic that basically is a multiplier that increases by .08x per pin hit and decreases by .4x per second and adds the multiplier on scoring Things to polish before shipping daemons consumables balancing sfx"}, {"post_id": 43180, "ts": "2026-08-08T09:27:38Z", "hours": 2.7903, "text": "UPDATE #29 Polish Polish Polish Summary added a few consumables and added basket mods breakdown added a consumable to multiply a basket’s mult by 1.5x permanently added a consumable to lower quota on a level by 25% added a pin modifier that makes balls gravitate towards it made it so that consumables in shop can have weights Things to polish before shipping daemons consumables pin mods screenshake more tutorial steps music / sfx balancing"}, {"post_id": 43020, "ts": "2026-08-08T01:57:36Z", "hours": 2.4019, "text": "UPDATE #28 Endless Mode Summary added a win screen for when you win with a button to go endless mode called “ascensions” breakdown made endless mode made win screen (prolly should make it look better) fixed bug where you clicking back in a submenu in escmenu would double click and exit out of esc menu entirely fixed bug where you couldnt exit stats menu in escmenu from main menu Roadmap in order of completion add consumables for baskets to multiply basket mult re-org code before polish and balance cuz its kinda goofy spaghetti silly polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods add more screenshakes cuz i only have a few screenshakes music"}, {"post_id": 42465, "ts": "2026-08-07T06:51:18Z", "hours": 3.2836, "text": "UPDATE #27 Tutorial Summary made a hint based tutorial system every time you encounter a new mechanic breakdown made it so that in 1-2ish lines of code you can add a new hint to any aspect of the game hints pop up only on the first time you encounter a mechanic hints darken the background and go away with a glitch effect and sound effect after clicking “got it” button Roadmap in order of completion fix some of the bugs i have noted down in a personal doc that are hard to explain endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music"}, {"post_id": 42369, "ts": "2026-08-07T01:41:28Z", "hours": 2.8478, "text": "UPDATE #26 Main Menu Summary made a main menu breakdown took the grid background from the map and put it in the main menu took the tri-circle spinning animation from the map and put it in the main menu reused the button class i use everywhere settings button just goes to the settings menu i already made stats button just goes to the stats menu but i think ill change it to a tutorial button terminate button just gives a popup that says “its a web game silly” Roadmap in order of completion add tutorial endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music"}, {"post_id": 41791, "ts": "2026-08-06T06:19:51Z", "hours": 4.7828, "text": "UPDATE #25 Escape Menu three Summary added settings and stats page to the esc menu thing breakdown made it so that you can add more stats and settings with just one line of code to control or display a variable added a gamespeed notched slider added volume slider added screenshake toggle added a bunch of stats in the stats page moved back button to the bottom of the menu since we are nearing the phase where i ship this project i already have set a roadmap of things i need to do so i figure i could just share it here: add main menu maybe add consumables for baskets still not decided add tutorial endless mode daemon synergies polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music"}, {"post_id": 41566, "ts": "2026-08-05T21:07:59Z", "hours": 4.3561, "text": "UPDATE #24 Escape Menu two Summary pin mods now show what level they are aswell as all the other mods on the pin in the form of colors and dots and hovering shows it more detailed also escape menu has buttons now. breakdown escape menu now has buttons and a different color back button when opening esc menu theres a glitch effect now along with a sound effect and closing does same thing putting a mod on the pin outlines the pin with the color of the mod and a dot for every level of the mod putting multiple mods on a pin divides the outline into multiple parts Next update plan add stats menu add settings menu add main menu maybe add consumables for baskets aswell but prolly the update after this one"}, {"post_id": 41090, "ts": "2026-08-05T01:46:24Z", "hours": 8.2328, "text": "UPDATE #23 Escape Menu Summary modularized code for pin mods, added levels and max levels, started work on an escape menu for settings. breakdown hover on nodes now shows level of the modifier on the node nodes like clone level 1 have it so the payout is split between the two balls and level 2 has it so that it isnt split between the two added menu button next to balance display modularized code for pin modifiers so its easier to add conflicts and such in the future and new features esc puts you in an esc menu to quit run new run settings optinos etc the same as the menu button esc menu stops time and physics aswell as all interaction in game until you unpause fixed issue where reroll text would overflow outside of the reroll box so now it resizes to fit inside of the reroll button node modifiers were also split into a different file Next update plan I got sidequested again for the escape menu so ill be working on that in tandem with the modifiers code and stuff make pins on modifiers visually distinct that can be stacked ontop of each other more work on esc menu"}, {"post_id": 40371, "ts": "2026-08-03T20:39:02Z", "hours": 6.2458, "text": "UPDATE #22 consumable board editor TWOOOO Summary made is so you can stack mods on pins and some are incompatible with others breakdown you can stack mods of different types on pins some mods are incompatible with each other if you modify a pin with an incompatible modifier it will just remove the conflicting modifier from the pin red alert text on consumables with conflicting modifiers hover shows the pins modifiers Next update plan you can stack modifiers on the same pin to level it up more pin modifier types make pins on modifiers visually distinct that can be stacked ontop of each other"}, {"post_id": 39200, "ts": "2026-08-02T00:08:00Z", "hours": 5.2997, "text": "UPDATE #21 consumable board editor Summary added new consumables that modified pins on the board to do different things breakdown added system where you can select nodes now added system where you can select multiple things to modify with a consumable added pin effect “mitosis” splits node into two added pin effect “overclock pin” makes pin valued at 1.5mb instead of 1mb prolly changing this this was just testing added pin effect “volitile pin” makes pin add a random payload from 1-10mb also was just testing prolly will modify this Next update plan add more sound effects make it so mitosis is called miosis and splits the value of the ball into half between the two balls make it so you can modify a pin with multiple modifiers and hovering shows what mods it has make pin modifiers like minecraft enchantments where you can apply some modifiers not with each other like mending + infinity isnt possible in minecraft or fortune + silk touch type thing"}, {"post_id": 38025, "ts": "2026-07-31T05:20:46Z", "hours": 3.1969, "text": "UPDATE #20 more animations Summary got sidetracked from original plan and made daemons look better along with making the map have velocity that keeps momentum after you stop scrolling breakdown made daemons look better using a dual layer system map has velocity that decreasese in speed after you stop scrolling with mouse click or scroll wheel dual layer daemon graphics I think this is kinda cool so basically i have the empty daemon slot image and when a daemon slot is empty it just keeps that sprite up and adds text ontop of that that says empty daemon slot (number). But when you get a daemon it uses the same hueshift function i have from the shop daemons and consumables and hueshifts an overlay with a transparent interior to add color and stuff. Empty daemon slot: empty daemon sprite layered text saying slot number and that it’s empty Occupied daemon slot: empty daemon sprite occupied daemon overlay with hue shift title and description text overlay + level overlay then put hover effects and stuff ontop Next update plan add more sound effects expand consumables system"}, {"post_id": 37419, "ts": "2026-07-30T03:53:05Z", "hours": 2.9794, "text": "UPDATE #19 more animations Summary added buy and sell animations along with fixing a few bugs it was alot faster than initially planned cuz it was just re-purposing existing code breakdown added buy animation for deamons and consumables added sell animations for daemons and consumablse fixed bug where shop didnt refresh when you re-enter after beating a level fixed bug where boss levels had a smaller quota than normal levels screenshake helper function implemented so i can just put screenshake(intensity,duration); anywhere and add screenshake with one line added a glitch location helper function based off my glitch transition code so now you can do TriggerGlitchAt(bounding-box-using-raylib-rectangle, duration); to glitch effect a location for a duration Next update plan maybe 6 hours for this update add more sound effects expand consumables system maybe make daemons look better but that might be for the update after this one"}, {"post_id": 36874, "ts": "2026-07-29T07:14:51Z", "hours": 4.0314, "text": "UPDATE #18 Shop Graphics Update pt 2 Summary updated shop graphics for consumables and made a custom class to make custom shaped polygons breakdown made consumables look better made consumables have a full consumables slot graphic and a not enough money alert made consumables have a background thingy in the shop that looks cool same hue shift graphic trick applied to the consumables like the daemons made insufficient funds for the daemons larger and more clear made a custom class for making polygons with an arbitrary number of vertexs so its faster to make polygons instead of the original way i used which was draw triangle fan made it so the class also detects hovers and clicks built in to make it easier Next update plan im hoping this next update can be completed in like 5 hrs or less to keep the pace of more frequent devlogs add buy animations add sell animations screen shake helper function"}, {"post_id": 36228, "ts": "2026-07-28T05:20:56Z", "hours": 4.4294, "text": "UPDATE #17 Shop Graphics Update pt 1 Summary updated shop graphics and animation breakdown used ai to generate a shop item slot and polished it in microsoft paint you can hover buttons and the main part and plays sfx buttons now have 6 vertexes daemons only get bought on left click release instead of on click since the shop items use sprites now instead of vector drawing i now hue shift the sprite to acheive different colors from one sprite (this took a while) reduced shop to have 4 items instead of 5 for balance and to fit the graphics nicer Next update plan update the consumables section of the shop to look better add buy animations"}, {"post_id": 35691, "ts": "2026-07-27T09:09:29Z", "hours": 3.3542, "text": "UPDATE #16 Map Graphics Update Summary updated the nodes in the map to look better and custom icons along with making the pathways more distinct from the background breakdown swirling things around node passively gliched nodes have funky movement with their animation which i find cool made pathways more distinct from background lines color nodes now have icons instead of text Next steps I currently plan to dedicate the next few updates to improving graphics before i continue with the gameplay changes i have listed below balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations"}, {"post_id": 35028, "ts": "2026-07-26T05:56:26Z", "hours": 4.0314, "text": "UPDATE #15 Consumables Shop Summary Added consumables to the shop and reduced consumables slots breakdown you can buy and reroll consumables in shop reroll animation rerolls consumables too the consumables are a different shape then daemons in shop i gotta figure out the colors to be more different tho two consumable slots instead of four Next steps i came up with alot more ideas to implement balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations"}, {"post_id": 34387, "ts": "2026-07-25T02:01:05Z", "hours": 6.0822, "text": "UPDATE #14 Consumables 2 Summary Added two consumables, changed price of rerolls and did some code restructuring. breakdown added a consumable “flash sale” is basically temperance from balatro and gives sell value of all your daemons into your balance added a consumable “dycrypt” and it decrypts unknown nodes so you know what they are moved the payout ball orb stuff to a different file moved the transitions stuff to a different file you can now sell consumables and it adds to the balance aswell two types of consumable one is instant use and one requires selecting something to effect i will use this later on nodes Next steps balancing more consumables more sfx more animations"}, {"post_id": 33390, "ts": "2026-07-23T09:24:36Z", "hours": 3.9456, "text": "UPDATE #13 Consumables Summary Added consumables slots graphics and the use/sell buttons that do nothing so far mainly ripped from the daemon code along with basic backend structure for consumables. also fixed a bug where hovering sfx never stopped playing on glitched nodes Next steps balancing consumables actions more sfx more animations"}, {"post_id": 32852, "ts": "2026-07-22T08:34:06Z", "hours": 5.7922, "text": "UPDATE #12 Audio Summary Added sound effects and shop polish breakdown transition sound (my favorite) bounce sound (need a better one) hover glitched node sound hover daemon sound hover shop item sound hover shop items for more interactivity Next steps balancing consumables more sfx more animations"}, {"post_id": 32205, "ts": "2026-07-21T06:57:06Z", "hours": 1.8539, "text": "UPDATE #11 Graphics Summary Added moving daemon animation and added encrypted nodes into the map that are a mystery of what it is until you click on them Next steps balancing consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 30986, "ts": "2026-07-19T00:25:17Z", "hours": 6.2539, "text": "UPDATE #10 Graphics Summary Added money adding animation, 4 new daemons, and a reroll animation Finer Details rerolls have a glitch animation money scoring summons energy balls that glitch into balance 1 for each remaining ball and 1 for the money winning the level fixed bug where you could have over 5 daemons new daemon “Honeypot Trap” 30% chance to duplicate score new daemon “Firmware Backdoor” +5MB per node hit new daemon “Proxy Chain” multiplier per daemon owned (1.2x,1.4x,1.6x) new daemon “Rootkit Persistence” every 3rd ball scores 3x Next steps balancing consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 30395, "ts": "2026-07-17T21:48:54Z", "hours": 6.2739, "text": "UPDATE #9 Map PT 3 Summary Added menu transitions, fixeds a few bugs Finer Details changes orange glow on current column to green made the nodes offset on the y and x axis a bit so it looks less grid-like added a glitch menu transition fixed bug where you couldnt interact with daemons in the map menu fixed map generation that generates stray nodes fixed map generate that generated incomplete paths level name it now displayed on box on hover light path that shows a path you can take to get to the node if you hover a future node from current node nodes no longer mostly connect to every single other node Next steps consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 29365, "ts": "2026-07-16T08:28:25Z", "hours": 8.6403, "text": "UPDATE #8 The Map PT 2 Summary Polished the map more and added it into the gameplay loop so that it sets the quota and adds money still no animations for these Finer Details levels give money now levels have a random amount of money that increase as you go levels interact with setting rewards and score requirements quota and reward are displayed on hover corner brackets appear with easing in and out size on hover aswell changed based unit to MB from KB cuz KB of data are kinda smol fixed some frame update bugs where the stuff updates after selection making it look weird for a frame faint orange glow on the column of levels you are on Next steps you can’t sell daemons in the map for some reason map polish level node entry point map path generation sometimes generates a void where you cant progress and also every node connects to every other consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 28533, "ts": "2026-07-14T20:51:02Z", "hours": 9.1822, "text": "UPDATE #7 The Map Summary I made it so rerolls cost money, empty daemon slots have a graphic now and started the start of a level map/selector. Finer Details made a hacking style map based on slay the spire’s level selector map currently randomly generates nodes and connections map scrolls using left or right click along with scroll wheel nodes also have random descriptions as ive yet to come up with names for enemies and bosses i thought NETWATCH from cyberpunk 2077 would be cool if you can’t afford a reroll the button gets darker to signal Next steps you can’t sell daemons in the map for some reason finish map to link to game consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 26490, "ts": "2026-07-11T09:42:24Z", "hours": 5.0842, "text": "UPDATE #6 The Black Market part 2 Summary I started finishing the shop system i started last devlog. I added rerolls to the shop aswell as a next round button. I also added 2 new Daemons. Finer Details New Daemon “Schrodinger’s Basket” 50% chance of 2.5x points 50% chance of .5x points New Daemon “Dark Web Node” 5% chance for 15x points on scoring made it so when you buy a daemon it gets sold out instead of infinite stock daemons you have dont show up in shop next button currently goes back to normal game but i want it to go to a levels screen/map like slay the spire made credits balance have a thousands seperator of “ “ instead of nothing and no comma cuz a spacebar looks cooler Next steps I want to add a graphic for empty daemon slots and add consumables of some sort and the upgrading daemon system along with the slay the spire level map. shop could use more polish with hovers and icons."}, {"post_id": 25812, "ts": "2026-07-10T08:45:53Z", "hours": 9.7839, "text": "UPDATE #5 The Shop part 1 Summary I started work on a shop system and have item purchases up now. I added a few new daemons and squashed a few new bugs. Fine Details New Daemon “Loyalty Points” 2x points every 5 pins hit New Daemon “Mesh Network” 1.5x score for every ball in play somehow made it so that the description variables werent being assigned in the class and took an hour to hunt that one down added a shop screen with the ability to buy a daemon extracted button logic from multiple places to a function to draw the button instead increased max score from -9.22 × 10^18 to 1.7 x 10^308 bytes made scores that are extremely large get formmated to scientific notation Next steps Still considering that hands system for later maybe in 3 devlogs I want to add a graphic for empty daemon slots and have you a bought item graphic so you cant buy it again in the same shop. reroll and next round button in shop."}, {"post_id": 24451, "ts": "2026-07-08T00:39:27Z", "hours": 6.2844, "text": "UPDATE #4 The Daemon Frontend Overview I made Daemons almost fully functional and made them affect the gamestate. I also added a visual so you know which ball is being effected by which daemon. Fine Details i accidentally used ^ instead of std::pow for one of my functions so it took a while to debug i added text wrapping to Daemon descriptions so that long descriptions dont overflow added a sell value to daemons and linked it to the credits display lines between daemons and balls fade out made is so that the line picks a random starting point on the left side of the daemon Next steps I’m thinking of making a hands system where you choose how many balls you drop at the start and then you have to wait till they all score before you can drop more balls. I want to add a graphic for empty daemon slots and add a shop system which pops up after you pass the score threshold and all balls finish scoring."}, {"post_id": 23373, "ts": "2026-07-06T09:29:37Z", "hours": 8.7297, "text": "UPDATE #3 The Daemon Backend Overview just worked on backend this update and minor graphical changes. I made it so you can click on the daemons and move them up and down aswell as sell them. Fine Details i also changed the level of the daemon indicator location, added the graphic for overclocking (buff past max level planned in future basically), and made it easier to make daemons. Next steps i wanna add a sell value to the daemons to add to credit balance and make the credit balance actually exist. animations and making the daemons do stuff is next step then get back to pachinko"}, {"post_id": 21983, "ts": "2026-07-04T06:24:52Z", "hours": 7.4675, "text": "UPDATE #2 Overview added a class system for my daemons to try to be able to implement a large amount of them including daemon level, color, effects, etc. Made the balls bounce on pegs with animation and hover animation on daemons. also added the balls have a value shown and when scored the scored data is moved upwards a bit until it disappears Next steps the next steps i hope to achieve before the next devlog is that i hope to have a partly functional daemon system that works with the game or atleast be able to reorder and sell them before next update. AI USE had ai generate the daemons vector graphic"}, {"post_id": 21233, "ts": "2026-07-03T02:04:38Z", "hours": 5.1572, "text": "UPDATE #1 so this is the start of my game “BitDrop” it’s a pachinko roguelike that takes inspiration from games like balatro,slay the spire, ultrapool. How it works Your ball starts with a starting score of something i havent figured out the value of yet and gains score to and cashes out at the bottom. The 5 things on the right are jokers from balatro but like 100% original totally not jokers and are called daemons. There is a target Quota score measured in bytes with the base unit being a kilobyte and so on. The plan currently the plan is to have a limited amount of balls per turn and if you put multiple balls at the same time you gain a higher score multiplier but if you have balls leftover you get more money. The pegs i think would be able to be upgraded and the balls aswell. The baskets will prolly be the same throughout and the daemons will assist with scoring higher What i have so far graphics balls drop have have physics balls bounce off pegs everything else not listed is placeholder graphics but yeaaaaa thats about it and the idea for the gameeeeee thank youuuuuu"}]...
|
Title: BitDrop by @thestarviper | Stardance
Devlo Title: BitDrop by @thestarviper | Stardance
Devlogs:
UPDATE #1 so this is the start of my game “BitDrop” it’s a pachinko roguelike that takes inspiration from games like balatro,slay the spire, ultrapool. How it works Your ball starts with a starting score of something i havent figured out the value of yet and gains score to and cashes out at the bottom. The 5 things on the right are jokers from balatro but like 100% original totally not jokers and are called daemons. There is a target Quota score measured in bytes with the base unit being a kilobyte and so on. The plan currently the plan is to have a limited amount of balls per turn and if you put multiple balls at the same time you gain a higher score multiplier but if you have balls leftover you get more money. The pegs i think would be able to be upgraded and the balls aswell. The baskets will prolly be the same throughout and the daemons will assist with scoring higher What i have so far graphics balls drop have have physics balls bounce off pegs everything else not listed is placeholder graphics but yeaaaaa thats about it and the idea for the gameeeeee thank youuuuuu
UPDATE #2 Overview added a class system for my daemons to try to be able to implement a large amount of them including daemon level, color, effects, etc. Made the balls bounce on pegs with animation and hover animation on daemons. also added the balls have a value shown and when scored the scored data is moved upwards a bit until it disappears Next steps the next steps i hope to achieve before the next devlog is that i hope to have a partly functional daemon system that works with the game or atleast be able to reorder and sell them before next update. AI USE had ai generate the daemons vector graphic
UPDATE #3 The Daemon Backend Overview just worked on backend this update and minor graphical changes. I made it so you can click on the daemons and move them up and down aswell as sell them. Fine Details i also changed the level of the daemon indicator location, added the graphic for overclocking (buff past max level planned in future basically), and made it easier to make daemons. Next steps i wanna add a sell value to the daemons to add to credit balance and make the credit balance actually exist. animations and making the daemons do stuff is next step then get back to pachinko
UPDATE #4 The Daemon Frontend Overview I made Daemons almost fully functional and made them affect the gamestate. I also added a visual so you know which ball is being effected by which daemon. Fine Details i accidentally used ^ instead of std::pow for one of my functions so it took a while to debug i added text wrapping to Daemon descriptions so that long descriptions dont overflow added a sell value to daemons and linked it to the credits display lines between daemons and balls fade out made is so that the line picks a random starting point on the left side of the daemon Next steps I’m thinking of making a hands system where you choose how many balls you drop at the start and then you have to wait till they all score before you can drop more balls. I want to add a graphic for empty daemon slots and add a shop system which pops up after you pass the score threshold and all balls finish scoring.
UPDATE #5 The Shop part 1 Summary I started work on a shop system and have item purchases up now. I added a few new daemons and squashed a few new bugs. Fine Details New Daemon “Loyalty Points” 2x points every 5 pins hit New Daemon “Mesh Network” 1.5x score for every ball in play somehow made it so that the description variables werent being assigned in the class and took an hour to hunt that one down added a shop screen with the ability to buy a daemon extracted button logic from multiple places to a function to draw the button instead increased max score from -9.22 × 10^18 to 1.7 x 10^308 bytes made scores that are extremely large get formmated to scientific notation Next steps Still considering that hands system for later maybe in 3 devlogs I want to add a graphic for empty daemon slots and have you a bought item graphic so you cant buy it again in the same shop. reroll and next round button in shop.
UPDATE #6 The Black Market part 2 Summary I started finishing the shop system i started last devlog. I added rerolls to the shop aswell as a next round button. I also added 2 new Daemons. Finer Details New Daemon “Schrodinger’s Basket” 50% chance of 2.5x points 50% chance of .5x points New Daemon “Dark Web Node” 5% chance for 15x points on scoring made it so when you buy a daemon it gets sold out instead of infinite stock daemons you have dont show up in shop next button currently goes back to normal game but i want it to go to a levels screen/map like slay the spire made credits balance have a thousands seperator of “ “ instead of nothing and no comma cuz a spacebar looks cooler Next steps I want to add a graphic for empty daemon slots and add consumables of some sort and the upgrading daemon system along with the slay the spire level map. shop could use more polish with hovers and icons.
UPDATE #7 The Map Summary I made it so rerolls cost money, empty daemon slots have a graphic now and started the start of a level map/selector. Finer Details made a hacking style map based on slay the spire’s level selector map currently randomly generates nodes and connections map scrolls using left or right click along with scroll wheel nodes also have random descriptions as ive yet to come up with names for enemies and bosses i thought NETWATCH from cyberpunk 2077 would be cool if you can’t afford a reroll the button gets darker to signal Next steps you can’t sell daemons in the map for some reason finish map to link to game consumables shop polish with hovers sfx near the end more animations
UPDATE #8 The Map PT 2 Summary Polished the map more and added it into the gameplay loop so that it sets the quota and adds money still no animations for these Finer Details levels give money now levels have a random amount of money that increase as you go levels interact with setting rewards and score requirements quota and reward are displayed on hover corner brackets appear with easing in and out size on hover aswell changed based unit to MB from KB cuz KB of data are kinda smol fixed some frame update bugs where the stuff updates after selection making it look weird for a frame faint orange glow on the column of levels you are on Next steps you can’t sell daemons in the map for some reason map polish level node entry point map path generation sometimes generates a void where you cant progress and also every node connects to every other consumables shop polish with hovers sfx near the end more animations
UPDATE #9 Map PT 3 Summary Added menu transitions, fixeds a few bugs Finer Details changes orange glow on current column to green made the nodes offset on the y and x axis a bit so it looks less grid-like added a glitch menu transition fixed bug where you couldnt interact with daemons in the map menu fixed map generation that generates stray nodes fixed map generate that generated incomplete paths level name it now displayed on box on hover light path that shows a path you can take to get to the node if you hover a future node from current node nodes no longer mostly connect to every single other node Next steps consumables shop polish with hovers sfx near the end more animations
UPDATE #10 Graphics Summary Added money adding animation, 4 new daemons, and a reroll animation Finer Details rerolls have a glitch animation money scoring summons energy balls that glitch into balance 1 for each remaining ball and 1 for the money winning the level fixed bug where you could have over 5 daemons new daemon “Honeypot Trap” 30% chance to duplicate score new daemon “Firmware Backdoor” +5MB per node hit new daemon “Proxy Chain” multiplier per daemon owned (1.2x,1.4x,1.6x) new daemon “Rootkit Persistence” every 3rd ball scores 3x Next steps balancing consumables shop polish with hovers sfx near the end more animations
UPDATE #11 Graphics Summary Added moving daemon animation and added encrypted nodes into the map that are a mystery of what it is until you click on them Next steps balancing consumables shop polish with hovers sfx near the end more animations
UPDATE #12 Audio Summary Added sound effects and shop polish breakdown transition sound (my favorite) bounce sound (need a better one) hover glitched node sound hover daemon sound hover shop item sound hover shop items for more interactivity Next steps balancing consumables more sfx more animations
UPDATE #13 Consumables Summary Added consumables slots graphics and the use/sell buttons that do nothing so far mainly ripped from the daemon code along with basic backend structure for consumables. also fixed a bug where hovering sfx never stopped playing on glitched nodes Next steps balancing consumables actions more sfx more animations
UPDATE #14 Consumables 2 Summary Added two consumables, changed price of rerolls and did some code restructuring. breakdown added a consumable “flash sale” is basically temperance from balatro and gives sell value of all your daemons into your balance added a consumable “dycrypt” and it decrypts unknown nodes so you know what they are moved the payout ball orb stuff to a different file moved the transitions stuff to a different file you can now sell consumables and it adds to the balance aswell two types of consumable one is instant use and one requires selecting something to effect i will use this later on nodes Next steps balancing more consumables more sfx more animations
UPDATE #15 Consumables Shop Summary Added consumables to the shop and reduced consumables slots breakdown you can buy and reroll consumables in shop reroll animation rerolls consumables too the consumables are a different shape then daemons in shop i gotta figure out the colors to be more different tho two consumable slots instead of four Next steps i came up with alot more ideas to implement balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations
UPDATE #16 Map Graphics Update Summary updated the nodes in the map to look better and custom icons along with making the pathways more distinct from the background breakdown swirling things around node passively gliched nodes have funky movement with their animation which i find cool made pathways more distinct from background lines color nodes now have icons instead of text Next steps I currently plan to dedicate the next few updates to improving graphics before i continue with the gameplay changes i have listed below balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations
UPDATE #17 Shop Graphics Update pt 1 Summary updated shop graphics and animation breakdown used ai to generate a shop item slot and polished it in microsoft paint you can hover buttons and the main part and plays sfx buttons now have 6 vertexes daemons only get bought on left click release instead of on click since the shop items use sprites now instead of vector drawing i now hue shift the sprite to acheive different colors from one sprite (this took a while) reduced shop to have 4 items instead of 5 for balance and to fit the graphics nicer Next update plan update the consumables section of the shop to look better add buy animations
UPDATE #18 Shop Graphics Update pt 2 Summary updated shop graphics for consumables and made a custom class to make custom shaped polygons breakdown made consumables look better made consumables have a full consumables slot graphic and a not enough money alert made consumables have a background thingy in the shop that looks cool same hue shift graphic trick applied to the consumables like the daemons made insufficient funds for the daemons larger and more clear made a custom class for making polygons with an arbitrary number of vertexs so its faster to make polygons instead of the original way i used which was draw triangle fan made it so the class also detects hovers and clicks built in to make it easier Next update plan im hoping this next update can be completed in like 5 hrs or less to keep the pace of more frequent devlogs add buy animations add sell animations screen shake helper function
UPDATE #19 more animations Summary added buy and sell animations along with fixing a few bugs it was alot faster than initially planned cuz it was just re-purposing existing code breakdown added buy animation for deamons and consumables added sell animations for daemons and consumablse fixed bug where shop didnt refresh when you re-enter after beating a level fixed bug where boss levels had a smaller quota than normal levels screenshake helper function implemented so i can just put screenshake(intensity,duration); anywhere and add screenshake with one line added a glitch location helper function based off my glitch transition code so now you can do TriggerGlitchAt(bounding-box-using-raylib-rectangle, duration); to glitch effect a location for a duration Next update plan maybe 6 hours for this update add more sound effects expand consumables system maybe make daemons look better but that might be for the update after this one
UPDATE #20 more animations Summary got sidetracked from original plan and made daemons look better along with making the map have velocity that keeps momentum after you stop scrolling breakdown made daemons look better using a dual layer system map has velocity that decreasese in speed after you stop scrolling with mouse click or scroll wheel dual layer daemon graphics I think this is kinda cool so basically i have the empty daemon slot image and when a daemon slot is empty it just keeps that sprite up and adds text ontop of that that says empty daemon slot (number). But when you get a daemon it uses the same hueshift function i have from the shop daemons and consumables and hueshifts an overlay with a transparent interior to add color and stuff. Empty daemon slot: empty daemon sprite layered text saying slot number and that it’s empty Occupied daemon slot: empty daemon sprite occupied daemon overlay with hue shift title and description text overlay + level overlay then put hover effects and stuff ontop Next update plan add more sound effects expand consumables system
UPDATE #21 consumable board editor Summary added new consumables that modified pins on the board to do different things breakdown added system where you can select nodes now added system where you can select multiple things to modify with a consumable added pin effect “mitosis” splits node into two added pin effect “overclock pin” makes pin valued at 1.5mb instead of 1mb prolly changing this this was just testing added pin effect “volitile pin” makes pin add a random payload from 1-10mb also was just testing prolly will modify this Next update plan add more sound effects make it so mitosis is called miosis and splits the value of the ball into half between the two balls make it so you can modify a pin with multiple modifiers and hovering shows what mods it has make pin modifiers like minecraft enchantments where you can apply some modifiers not with each other like mending + infinity isnt possible in minecraft or fortune + silk touch type thing
UPDATE #22 consumable board editor TWOOOO Summary made is so you can stack mods on pins and some are incompatible with others breakdown you can stack mods of different types on pins some mods are incompatible with each other if you modify a pin with an incompatible modifier it will just remove the conflicting modifier from the pin red alert text on consumables with conflicting modifiers hover shows the pins modifiers Next update plan you can stack modifiers on the same pin to level it up more pin modifier types make pins on modifiers visually distinct that can be stacked ontop of each other
UPDATE #23 Escape Menu Summary modularized code for pin mods, added levels and max levels, started work on an escape menu for settings. breakdown hover on nodes now shows level of the modifier on the node nodes like clone level 1 have it so the payout is split between the two balls and level 2 has it so that it isnt split between the two added menu button next to balance display modularized code for pin modifiers so its easier to add conflicts and such in the future and new features esc puts you in an esc menu to quit run new run settings optinos etc the same as the menu button esc menu stops time and physics aswell as all interaction in game until you unpause fixed issue where reroll text would overflow outside of the reroll box so now it resizes to fit inside of the reroll button node modifiers were also split into a different file Next update plan I got sidequested again for the escape menu so ill be working on that in tandem with the modifiers code and stuff make pins on modifiers visually distinct that can be stacked ontop of each other more work on esc menu
UPDATE #24 Escape Menu two Summary pin mods now show what level they are aswell as all the other mods on the pin in the form of colors and dots and hovering shows it more detailed also escape menu has buttons now. breakdown escape menu now has buttons and a different color back button when opening esc menu theres a glitch effect now along with a sound effect and closing does same thing putting a mod on the pin outlines the pin with the color of the mod and a dot for every level of the mod putting multiple mods on a pin divides the outline into multiple parts Next update plan add stats menu add settings menu add main menu maybe add consumables for baskets aswell but prolly the update after this one
UPDATE #25 Escape Menu three Summary added settings and stats page to the esc menu thing breakdown made it so that you can add more stats and settings with just one line of code to control or display a variable added a gamespeed notched slider added volume slider added screenshake toggle added a bunch of stats in the stats page moved back button to the bottom of the menu since we are nearing the phase where i ship this project i already have set a roadmap of things i need to do so i figure i could just share it here: add main menu maybe add consumables for baskets still not decided add tutorial endless mode daemon synergies polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music
UPDATE #26 Main Menu Summary made a main menu breakdown took the grid background from the map and put it in the main menu took the tri-circle spinning animation from the map and put it in the main menu reused the button class i use everywhere settings button just goes to the settings menu i already made stats button just goes to the stats menu but i think ill change it to a tutorial button terminate button just gives a popup that says “its a web game silly” Roadmap in order of completion add tutorial endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music
UPDATE #27 Tutorial Summary made a hint based tutorial system every time you encounter a new mechanic breakdown made it so that in 1-2ish lines of code you can add a new hint to any aspect of the game hints pop up only on the first time you encounter a mechanic hints darken the background and go away with a glitch effect and sound effect after clicking “got it” button Roadmap in order of completion fix some of the bugs i have noted down in a personal doc that are hard to explain endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music
UPDATE #28 Endless Mode Summary added a win screen for when you win with a button to go endless mode called “ascensions” breakdown made endless mode made win screen (prolly should make it look better) fixed bug where you clicking back in a submenu in escmenu would double click and exit out of esc menu entirely fixed bug where you couldnt exit stats menu in escmenu from main menu Roadmap in order of completion add consumables for baskets to multiply basket mult re-org code before polish and balance cuz its kinda goofy spaghetti silly polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods add more screenshakes cuz i only have a few screenshakes music
UPDATE #29 Polish Polish Polish Summary added a few consumables and added basket mods breakdown added a consumable to multiply a basket’s mult by 1.5x permanently added a consumable to lower quota on a level by 25% added a pin modifier that makes balls gravitate towards it made it so that consumables in shop can have weights Things to polish before shipping daemons consumables pin mods screenshake more tutorial steps music / sfx balancing
UPDATE #30 A little bit of everything Summary added a loss screen, another pin modifier, changed clone pin graphic, added music, changed map nodes, added overload mechanic breakdown added a loss screen with a loss sound effect added another pin mod called “Amplify” which just gives 1.5x score on hit to the ball changed clone pin graphic to show the pull distance and changes with leveling added main menu music and gameplay music changed map nodes by renaming them and changing colors around made final boss node bigger than it was originally for emphasis added overload mechanic that basically is a multiplier that increases by .08x per pin hit and decreases by .4x per second and adds the multiplier on scoring Things to polish before shipping daemons consumables balancing sfx
UPDATE #31 Balancing Summary ITS ALL COMING TOGETHER RAHHHHH. I added like 10 new daemons changed icons and balanced the prices along with sending my project into the hackclub slack for playtesting. breakdown added 10 new daemons changed icons of every daemon since they shared the same icon balanced prices of consumables and daemons used playtester feedback: some things were confusing so i added more hints used playtester feedback: a button in the shop was unintuative so i made it so that it worked more intuiatively used playtester feedback: playtester found a bug with one of the new daemons that destroyed itself didnt free up a slot NEXT UPDATE IS JUST SOUND EFFECTS AND MAYBE FEEDBACK FROM SLACK THEN I SHIP YAY IM GETTING THIS DONE BEFORE I SLEEP
UPDATE #32 FIREFOX SUCKS Summary FIREFOX SUCKS. anyways i added a buncha sfx and ct5 found a bug where the game done goofy mode on firefox so i had to fix that breakdown map hover sfx shop buy sfx cashout sfx basket score sfx node pin sfx louder on playtester request used playtester feedback: this game on firefox compiled weird goofy its up on itchio now wowie #SHIP TIME YAYAYAYAYAYAYAY
Ships:
PLEASE READ THE HINTS SO YOU KNOW HOW TO PLAY I made a pachinko roguelite game that is inspired by balatro, slay the spire, and ultrapool. The game is a web game that is hosted on itch.io so no need to download anything. Have fun!...
|
1792961570.7231257
|
1793047970.7231257
|
|
55
|
Vestige by @Rupnil | Stardance
|
Rupnil
|
0
|
157.82
|
0
|
[]
|
[{"post_id": 54465, "ts": "202 [{"post_id": 54465, "ts": "2026-08-25T14:08:25Z", "hours": 9.6325, "text": "(v0.5.4-beta) VESTIGES ARE ALIVE! Changelog: (v0.5.4-beta) Vestige 7 Animation : Les goo! another task checked off from the todo list! Completed all the animations of the vestiges that forms the backbone of the game- This was the final one (on the path). Next lwk i think ill do sound design maybe Lapsed (v0.5.3-beta) Vestige 6 Animation : I got stuck in this session cuz of a simple bug :skul what happened was that the animation player in the wheelchair scene was changing the position of the root and so it messed everything up- Took me a while to solve it lol. Added some movement and wheel rotation. Lapsed (v0.5.2-beta) Vestiges 3,4,5 Animation : I thought i would complete making the animations today but clearly I failed- Oh well I fixed a LOT of things and FULY completete the third forth and fifth vestiges Lapsed (v0.5.1-beta) Vestiges 1,2,3 Animation : Since I completed modelling and texturing the vestiges the only logical next step is to incorporate them into the game, and thats what ive been doing! Integrated the first 3 vestiges and added some simple animations associated w em Lapsed (v0.4.14-beta) Vestige 4,5,6,7 Texturing : Oh my god- Finished all ALL the texturing- I really wanted thisto be finished faster lol. Anyways in the next session I would make the animations and placements of the vestiges! Lapsed (v0.4.13-beta) Vestige 1,2,3 Texturing : Completed texturing vestiges 1, 2 and 3- i.e. the crib the swing and the tent. Were a lot of fun to see the white models come to life lol. I really like how they are turning out Lapsed (v0.4.12-beta) Models Finalizing : Last day I completed modelling all the vestiges and now only the texturing is left. In this session I finalized the models and meshes and next ill texture them! Lapsed Next Step(s): Vestiges Vestiges animations Watch Tower Furniture Sound Effects Notes: Yippie I completed all the vestiges progression and their associated animations! Idk what ill work on next but maybe sound design? idrk tho"}, {"post_id": 50528, "ts": "2026-08-19T18:30:38Z", "hours": 9.7806, "text": "(v0.4.11-beta) Lantern, & VESTIGESSS Changelog: (v0.4.11-beta) Vestige 7 Model) : FINALLY FIALTLTJkdas I completed all the vestiges! The final one was the mirror and the chair. Im so tried cya Lapsed (v0.4.10-beta) Vestige 6 Model : Made another model– the wheel chair i am trying to complete this first so ill add the more niche things like umbrellas later Lapsed (v0.4.9-beta) Vestige 5 Model : Okay fifth one down! TWO MOREW i repeat 2 MORE- i wanna complete them asap but lets see! This was a pretty challenging one dawg- the piano was insane BUT it looks so good now Lapsed (v0.4.8-beta) Vestige 4 Model : Made the fourth model– the table, chair, cups and the candles! next up is the musical item- idk how i will make the piano but oh well lets see! Lapsed (v0.4.7-beta) Vestige 3 Model (1) : Erm this is the 3rd model that im doing- ik the uv will be fked uop but oh well. Made the tent, wooden logs and the camfire Lapsed (v0.4.6-beta) Vestige 2 Model : Oh god it is so late but yet im pushing it- I did like 30 more minutes im going to eep now- Anyways in this session i made the swing! Only model tho Lapsed (v0.4.5-beta) Vestige 1 Modelling : In this session I just modelled the crib and the teddy as fast as i could- I need to ramp up my speed here- I dont got much time Lapsed (v0.4.4-beta) Hanging Lanterns & Placement : Modelled the hanging lantern and placed it around the map especially the bunker porttions Lapsed (v0.4.3-beta) Lantern Model : In about 2-ish hours i cooked up this absolutely BEAUTIFUL and awesome lantern model. I just have no words– its just perfect! also added some particle effects and yeah! looks pretty cool Lapsed (v0.4.2-beta) Vestige: Pointer : A point at the center of the screen. yes Lapsed Next Step(s): Ending Bench interaction Bunker and Tunnel Models Watch Tower Furniture Vestiges Vestiges animations Notes: Im so so so close to completing this! so I need pick up the pace here! Completed all the vestiges here"}, {"post_id": 47607, "ts": "2026-08-15T16:42:37Z", "hours": 8.1083, "text": "(v0.4.1-beta) Ending, Credits n Modeling Changelog: (v0.4.1-beta) Bunker/Tunnel Model & Texturing) : Oh finally! I am finished with the alpha versions and i moved on to the beta stage! In this session I completed modelling and texturing the bunker as well as the tunnel models! Lapsed (v0.3.9-alpha) Placement, Playtesting & Exporting : Oh my! I am really finished with alpha versions! I will be now moving on to the beta stage. In this session I placed trees, playtested and exported for the alpha release. Lapsed (v0.3.8-alpha) Credits (3) : Yippie i completed the credit scene although the “press anmything to conitnue” doesnt work as of now– but ill add it on my todo for later! Lapsed (v0.3.7-alpha) Credits (2) : THe second lapse/commit of me workin on the credits! I am ALMOSt complete i js need one more session to finalize some stuff Lapsed (v0.3.6-alpha) Bug Fixes & Credits (1) : Fixed an annoying bug where the top of the watch tower was affected by the stair aread3d. Now an invisible wall prevents jumping. Also Added the basic Credits scene. Lapsed (v0.3.5-alpha) Bench Camera Animation, Interaction (2,3) : Aha! I think i am really done with the ending animations! Now the E to interact only works when u are looking directly at the bench. I think i might change the blinking animation tho- Lapsed (v0.3.4-alpha) Bench Camera Animation (1) : Right now I’m Adding the animation and controls for the bench interaction and the cut scene. Added some blinking thing and location changes and movement- Will make the cutscene next! Lapsed Next Step(s): Ending Bench interaction Bunker and Tunnel Models Watch Tower Furniture Vestiges Notes: Yesterday I released the alpha version! the 0.3.9, for win, mac as well as linux! I completed my first priority things and i have moved on to the beta!"}, {"post_id": 45302, "ts": "2026-08-11T17:45:17Z", "hours": 10.4367, "text": "(v0.3.3-alpha) Bunker & Interaction Changelog: (v0.3.3-alpha) Player Interaction (2) : Me add raycast to the face of player, poke poke thing, thing cry, raycat know what it did, raycast say name, i hear, i do something; In a nutshell the raycast detects the collider and if its the bench it enables the e to interact thing Lapsed (v0.3.2-alpha) Player Interaction (1) : Set up the basic of the player interaction– ill work on it more tmrw Lapsed (v0.3.1-alpha) Map Positioning (Ending) : Positioned the map so that the dead space is directly below the drop chute- and other fixes and tests Lapsed (v0.2.13-alpha) Bunker: More models & logics (7) : Improved model to include a turn and a drop, finally added more mechanics and animations. The bunker now dissapears if u look away. fixed some other logics Lapsed (v0.2.12-alpha) Bunker: Mechanics; Showing Maps (6) : When player enters the doors closes and then the original map dissapears, you keep walking forward and the secondary map is spawned. As u come out of the other side the tunnel leads you to the secondary map. Lapsed (v0.2.11-alpha) Bunker Prototype: Door Mechanics & Stairs (5) : made the door open and close animations actually happen with the players actions. Also added an AREA3D which allows the stair logic to kick in. Added the map thing but will animation and add the mechanics in the next update! Lapsed (v0.2.10-alpha) Bunker Prototype: Model & Animations (4) : experimented with another map and stuff. Modelled the top portion and added a simple animation for the doors Lapsed (v0.2.9-alpha) Bunker Prototype: Model (3) : completed the bunker modelling – mostly protype rn but yeah! Next up i think imma make the mechanism of the bunker mm Lapsed (v0.2.8-alpha) Weeping Silhouette: Animation (2) : Les goo i finally completed the weeping silhouette thing! Now it explodeds kinda when u go near it and leaves the player stranded they player has to navigate their way into the next parts! Lapsed (v0.2.7-alpha) Weeping Silhouette (1) : modelled the weeping silhouette and placed it where its supposed to- in the next update I’ll add the animations and stuff! Lapsed (v0.2.6-alpha) Bunker Prototype (1+2) : Well i tried making the bunker prototype but erm i didnt realise how tuff this is gonna be skull. I will try again cuz Im so sick to think straight- ill try to do some other thing toda Lapsed Next Step(s): Bunker prototype Ending Bench interaction Notes: Ive almost completed the FULL game sequence! like ik its using prototype things but the core fucntionality is almost done! super excited"}, {"post_id": 41473, "ts": "2026-08-05T18:12:00Z", "hours": 9.2175, "text": "(v0.2.5-alpha) Memory/Vestige Chains (Prototype) Changelog: (v0.2.5-alpha) Vestige Chain (4) : Les goo i completed the full chain of vestiges currently they are just cubes but i will def make models for them later! Lapsed (v0.2.4-alpha) Placement + Vestige Chain (3) : Ok i placed all of the vestiges and currently made the animation till the Vestige 4 – 4 moire to go (counting the watchtower). Idk i think i did some other stuff that i prolly forgot lmfao. Lapsed (v0.2.3-alpha) Particle Fix + Vestige Chain (2) : So previously there was this thing that the particles were all dark and glomy cuz of the exposure thing- Fixed that in this lapse/commit. Also i added the 2nd vestige prototype! Lapsed (v0.2.2-alpha) Vestige Chain: Starting (1) : Yay so i started the next priority in the todo list! I started the vestige chain using only a cube lmao! i will model them later – this is the prototype phase Lapsed (v0.2.1-alpha) Vestiges brain storming : So previously there was this thing that the particles were all dark and glomy cuz of the exposure thing- Fixed that in this lapse/commit. Also i added the 2nd vestige prototype! (v0.1.6.3-alpha) Todo Cleanup : Yep so the thing was that I was too disorganized and too overwhelmed. I sat down today and wrote down everything I think i have a clear picture of what I want to do now! (v0.1.6.2-alpha) Rename & Bunker Prototype + Optimization : I renamed everything. I think i said yesterday that The story is now one single cohesive storyline so I renamed everything to match the new thing. Also I made a hole in the ground (for the bunker) and added a mesh just to visualize it lol. Lapsed (v0.1.6.1-alpha) Story + Optimizations : Right so as i mentioned yesterday i had finalized the plot, in this commit/lapse I wrote it down! Oh also I did something that Ive kept in my todo for a long time lol – I optimized the flower and grass models Next Step(s): Rewriting the todos & story Prototype Vestige Chain Bunker prototype Notes: Wow im speeding up here! i actually finished the entire vestiges sequence Next up imma prototype the bunker"}, {"post_id": 39581, "ts": "2026-08-02T17:16:03Z", "hours": 6.3994, "text": "(v0.1.5-alpha) Better Movement, Stealth & Environment! Changelog: (v0.1.5-alpha) Environment Rework & Jitter Fix : Since i completed the lore/plot finally trust me (not written but thought of) I needed to change the environement a bit kjust to match the vibe i am going for now! it is now a whitish dusk and not pitch black. ALso i think i fixed the jitter thing. Lapsed (v0.1.4(J)-alpha) Player Movement Rework: Crouching (8) : I have completed reworking the player movement for now– next up ill actually focus ont he core gameplay. In this comit/lapse i have added a crouch functionaility and fixed some other logical stuff that im not going deep into Lapsed (v0.1.4(I)-alpha) Player Movement Rework: Area3D (7) : OKsy! so i and @seb figured out a way to fix the issue i talked about in the previous commit/lapse/. The fix was pretty neat! i added an area 3d on the stairs and the smoothing only work iin this area! i also turned off jumping here Lapsed (v0.1.4(H)-alpha) Player Movement Rework: Smoothness (6) : Fixed the erm “smoothing problem” Previously it was hella snappy and awful to look at - now I added a smoothing thing in the _process but uhhh another problem now – the jumping feels floaty and walk is smoothed out :/ Lapsed Next Step(s): Watch Tower Model Watch Tower Texture Auto Jump on Stairs Core Gameplay Rewriting the todos & story (final istg) Notes: Finally thought of a cohesive plot. I do not have much time or energy to make another chapter – so ive decided to merge everything into one gameplay – the prologue. So yeah! we’ll see how it turns out (i have high hopes tho)"}, {"post_id": 38338, "ts": "2026-07-31T17:47:47Z", "hours": 5.8597, "text": "(v0.1.4(G)-alpha) Moving & Jumping on the Stairs (Passed!) Changelog: (v0.1.4(G)-alpha) Player Movement Rework: Auto-jump (5) : Ok i kinda cheesed it ngl- I was literally being ragebaited because it was NOT working any how. I am using a not so beautiful method but hey it works and thats what counts – ill polish it later dw. Lapsed (v0.1.4(F)-alpha) Player Movement Rework: ?? (4) : wtf? what happened? what did i do? this is insane i really dont know………. soo erm climbing stairs doesnt work and there are some pretty bad bugs like being able to fly- lwk i might revert this session Lapsed (v0.1.4(E)-alpha) Player Movement Rework: Noclip (3) : added a pretty peak thing. Ok so added a noclip feature – this is like the spectator mode in minecraft lmfao. Ive been meant to do this for a long time but here i am! finally added this – this will help me a ton i js know it lol Lapsed (v0.1.4(D)-alpha) Player Movement Rework (2) : Yoo so added a bunch of new things such as air friction, acceleration deceleration and more. I am having one tiny bug tho – that is i cannot turn when jumping but dw ill figure out a way to fix it! Also if u forgot Im doing the player rework just to make the autojump thing Lapsed (v0.1.4(C)-alpha) Player Movement Rework (1) : Okay So i realised it wwill be extremely difficult for me to figure it out on my own, and even the big ones ( @seb ) had no freaking idea lmao. SO what i am doing bnow is following a player/fps controller tutorial where they add this autojump feature :3 Lapsed Next Step(s): Watch Tower Model Watch Tower Texture Auto Jump on Stairs (Done but polishing left) Interior Design of the Watch Tower Core Gameplay Notes: These sessions were lwk ragebait – i will NOT talk about the 4th session cuz i have no freaking idea about it. I found a weird way and workaround to do the auto jump. Although it might not be the most beautiful but it works and thats what counts"}, {"post_id": 37110, "ts": "2026-07-29T16:22:46Z", "hours": 5.7036, "text": "(v0.1.4(B)-alpha) Walking on the Watch Tower (Failed) Changelog: (v0.1.4(B)-alpha) Walking on Stairs (2) : Lwk I just messed around for the whole time I literally do not know wht to do at this point I will revisit this tommorow (I dmed my fwend Seb lmao). I tried many methods but i couldnt seem to be able to make this work tho Lapsed (v0.1.4(A)-alpha) Walking on Stairs (1) : Yo gang I tried my to do the stairs walking thing but as you would expect I completely failed lmfAaooo. Uh I really dont know how to move next but ill try my best Lapsed (v0.1.3-alpha) Mountains Texture Fix : So erm as i completed the watch tower im moving on to other thigns– first i saw that this was in my todo for a while so fixed it lol Lapsed (v0.1.2(K)-alpha) Watch Tower Texturing (4.4) : Shalalala sha boinky! I actually finished the (skeleton) of the watch tower model! Omg i dont believe it! I am feeling a large weight off my shoulders lmfao! But hey its not done yet! I have so so so sos os so much more to do- next up ill fix the stair walking and oh a story redesign! Lapsed (v0.1.2(J)-alpha) Watch Tower Texturing (4.3) : Finally completed texturing the stairs – the railings and the beams are still remaining but ill try to do them soon enough 👍 Lapsed (v0.1.2(I)-alpha) Watch Tower Texturing (4.2) : oh my GOD BRO this is so painful i really hope i could do something else to speed this up but yeah idk- So nothing other than UV unwrap stuff NOT EVEN ONE mesh and i have 2 more to go- I am dying :D Lapsed Next Step(s): Watch Tower Model Watch Tower Texture Auto Jump on Stairs Interior Design of the Watch Tower Notes: Gang I tried my best I literally cannot seem to be able to be able to find a way to make the auto jump thing I need to call the big guns now! ( @seb ) Anyways, I obv completed the watch tower texturing"}, {"post_id": 35856, "ts": "2026-07-27T15:49:43Z", "hours": 7.2233, "text": "(v0.1.2(H)-alpha) Watch Tower Texturing (90%) Changelog: (v0.1.2(H)-alpha) Watch Tower Texturing (4.1) : Okay so nothing but I joined a hell lot of meshes and objects- i mean the stairs portion. And then unwrapped the UV this took me some time but i finished it! next imma fix the UV and then COMPLETE this FOR ONCE AND ALL! Lapsed (v0.1.2(G)-alpha) Watch Tower Texturing (3.4) : Ayy so i completed the Leg section of the watch tower! i agree most of the work is uv unwrapping because of the faces and all yk. But yeah! im making progress only the stairs section left ig!!!! Lapsed (v0.1.2(F)-alpha) Watch Tower Texturing (3.3) : Teeny tiny lapse! just combined and unwrapped the support beams- ill prolly texture it tommorw and then move on to the stairs section Lapsed (v0.1.2(E)-alpha) Watch Tower Texturing (3.1+3.2) : Holy smokes! What a productive day! got so so so much done today – So I completed the Legs, and support beams in this lapse so only the cross supports are left! Also blender crashed like 300 times today– i really need the macbook gng i got the signs already! Lapsed (v0.1.2(D)-alpha) Watch Tower Texturing (2) : Oh another milestone i suppose! I completed the UV unwrapping of the fence and also textured it! I dont have any more stuff to talk about gng im so tired and busy nowadays Lapsed —## Next Step(s): Watch Tower Model Watch Tower Texture (WIP GNG ALMOST) Notes:OK LISTEN! LISTEN I swore to @Keyboard that I wont devlog until I have completed the whole texturing BUT its getting too ridiculous not to- im alr at 7 hours and yeah. Also big ass devlog-"}, {"post_id": 33972, "ts": "2026-07-24T10:35:59Z", "hours": 4.6819, "text": "(v0.1.2(C)-alpha) Watch Tower Texturing (45%) Changelog: (v0.1.2(A)-alpha) Watch Tower Texturing (1.5) : Yay so i made the Floor section completely- the floor and the uhh supprts ig lol. THis was fun Ill work more tmrw Lapsed (v0.1.2(A)-alpha) Watch Tower Texturing (1.2 + 1.3 + 1.4) : 1. So nothing much to brag about here- I completed texturing the roof. It was pretty easy ngl - anyways I’ll do the UV unwrapping of the walls next ig. 2. So I unwrapped the UV layout of the walls and its Horrible! It will take so much time to manually fix everything lmao. I did like 50% of the unwrapping today NOT THE TEXTURNG BTW! so we will see tmrw! gn. 3. Completed the UV unwrapping of the walls and also the texturing of the walls! the room section of the texturing is done! moving on to the floor and stairs! Lapsed Next Step(s): Watch Tower Model Watch Tower Texture (WIP) Notes: Aww man i couldnt really focus on this project for the last few days i had so much work! had 2 assignments- submitted them today so i think i can focus in more today!!"}, {"post_id": 32257, "ts": "2026-07-21T09:49:57Z", "hours": 3.5792, "text": "(v0.1.2(A)-alpha) Watch Tower Texturing (2%) Changelog: (v0.1.2(A)-alpha) Watch Tower Texturing (1.1) : Yay so i moved on to the texturing part of the watch toweeeeerr. Just made the door for now but I will accelerate the work from tmrw trust Lapsed (v0.1.1(Q)-alpha) Watch Tower Modelling (11) : oh my gosh! im done with the modelling! well i mean i may add the window margins stuff later but yeah! i am now starting the texturing! i made the glass and experimented with some stuff Lapsed (v0.1.1(P)-alpha) Watch Tower Modelling (10.4) : ok i am being for REAL right now. and u HAVe to believe me when i say that i am FInALLY COMPLETE with the freaking fencing stuff i am NOT doing that again 💀 ok now the only thing left is the window panes and THEn i can finally move on to the texture- Lapsed Next Step(s): Watch Tower Model Watch Tower Texture (WIP) Notes: Yooooo so I finally completed the modelling of the watch tower and started texturing it recently. I have some work to do today so idk how long i can code- Ill try my best tho!"}, {"post_id": 31170, "ts": "2026-07-19T10:42:47Z", "hours": 3.8003, "text": "(v0.1.1(O)-alpha) Watch Tower Modelling (90%)! Changelog: (v0.1.1(O)-alpha) Watch Tower Modelling (10.3) : hell yeah! completed the guard rails– now uhh some more fences are remaining i promise it wil be done very soon im trying my bestttt Lapsed (v0.1.1(N)-alpha) Watch Tower Modelling (10.2) : Made another layer of guard rails beside the stairs - yeah just that 💀 i have no more words to write here Lapsed (v0.1.1(M)-alpha) Watch Tower Modelling (10.1) : I might work again later after coming back from art classes- but im not sure as i have some tuition work to do :( I also have some pending ssignments! yikes!!! anyways here’s what i did: Made the rails of the stairs with some bars - first and second stairs. did some desmos stuff- Lapsed Next Step(s): Watch Tower Model (WIP) Watch Tower Texture Notes: ok i dont really know what to write hereeee nowwww- maybe the next time"}, {"post_id": 30545, "ts": "2026-07-18T06:28:52Z", "hours": 5.045, "text": "(v0.1.1(L)-alpha) Watch Tower Modelling (75%)! Changelog: (v0.1.1(L)-alpha) Watch Tower Modelling (9.3) : Joined a lot of meshes together for efficiency and ease of use. Oh also made the raining v1 for the first layer of the stairs. I have my prize distribution and investiture ceremony so yeah! see ya laterrrrr Lapsed (v0.1.1(K)-alpha) Watch Tower Modelling (9.1 + 9.2) : 1. omg omg omg! stairs in progressssss! Made two flights of stairs- what i mean is i made one flight of stairs and then copied it 💀 Anyways I’m almost done with the modelling i think- The stairs and the windows are the only things are left (oh maybe more optimization :p) 2. Added much More stairs and the topmost layer. I will make the integration of the stairs to the floor tommorow, ALSO i will add the railings and all tmrw I am sleepy as frick! Lapsed (v0.1.1(J)-alpha) Watch Tower Modelling (8) : Wow! what a productive session! Ok so a lot of thing was done. Here’s what i did in short: The legs of the watch tower was made before but in this session i added the supports and support beams! i again followed the model as an inspiration and made the supports! Looks prety cool! Lapsed — Next Step(s): Watch Tower Model (WIP) Watch Tower Texture Notes: um holy shit i am doing a 4? or 5 hour devlog 💀 this is unreal! Anyways this is draggin me sooo muchh but i think im super close to finishing this"}, {"post_id": 29396, "ts": "2026-07-16T10:12:50Z", "hours": 3.5758, "text": "(v0.1.1(I)-alpha) Watch Tower Modelling (60%)! Changelog: (v0.1.1(I)-alpha) Watch Tower Modelling (7) : Nothing much just edited the fences a bit and resized them in order to prevent overlapping. Oh also I made the roof – needs polishing ik but its a start lmao- i want to complete the modelling as soon as possible lwk- Lapsed (v0.1.1(H)-alpha) Watch Tower Modelling (6) : Yoo moving from vertices selection to something different felt awesome! anyways i made the fence? i think thats what its called- On all four sides. I am following a model for inspiration and im pretty happy on how it is turning out! Lapsed (v0.1.1(G)-alpha) Watch Tower Modelling (5.3) : FINALLY FINALLY! I have completed optimizing the walls of the watch tower. What i mean is I reduced the number of vertices and faces in the model. This will help me immensely while texturing the UV. I created another backup just in case lmao Lapsed (v0.1.1(F)-alpha) Watch Tower Modelling (5.1 + 5.2) : I tried cleaning up the Watch Tower model but idk how it all got messed up anyways I will try again ONE LAST TIME tommorow if it works it works otherwise i have to roll back to the backup and just forget about cleaning up- i messed up yeah Lapsed Next Step(s): Watch Tower Model (WIP) Watch Tower Texture Notes: i NEED to finish modelling this ASAP gng 💀 wish me luck ill be lockin in today 🔥"}, {"post_id": 28297, "ts": "2026-07-14T13:43:26Z", "hours": 3.3656, "text": "(v0.1.1(E)-alpha) Watch Tower (40%)! Changelog: (v0.1.1(E)-alpha) Watch Tower Modelling (4) : erm so nothing productive just me fixing the HUMONGOUS number of vertices that have been created for god knows what. Lmfao i messed up at the end and i have to go back to the last backup Oh well i have tuitions now will do more stuff later Lapsed (v0.1.1(D)-alpha) Watch Tower Modelling (3) : Ah yes, guess why there is no lapse for this update- thats right! Lookout messed up and I cannot recover the lost footage and publish it in lapse. I lwk forgot what i did in this update 💀 You are gonna guess it (v0.1.1(B&C)-alpha) Watch Tower Modelling (1&2) : Guess who forgot to commit THATS RIGHT ITS ME- In this lapse I made the skeleton of the watch tower that is going to be the main attraction of the prologue. I do not have much time and hence i am ending this session prematurely! See you tmrw! More modelling of the watch tower, made the top thing the uhh room? ig tested the model size with the player size in godot and i found that it was a bit small so i fixed that! Made some windows for the watchtower so that everything is visible Lapsed Next Step(s): Watch Tower Model (WIP) Walking animation Story Redesign Improved Silhouette Mechanics — Notes: Ah yes I lost like 30 minutes of lapse yesterdat cuz lookout servers died oh welp! here i am again!"}, {"post_id": 27139, "ts": "2026-07-12T12:55:30Z", "hours": 3.9608, "text": "(v0.1.1(A)-alpha) Map Redesign and Improved mechanics! Changelog: (v0.1.1(A)-alpha) Improved Silhouette Mechanics : oh my! it looks so sick! il definitely play test this once more but heres what i did in brief: Previously there used to be different silhouttes but NOW theres only one that “teleports” when u reach it as if guiding you somewhere – to the watchtower :3 Lapsed (v0.0.10(E)-alpha) Map Redesigning (4) : I think i am done with the forest/map layout for now im pretty happy! plugged off some paths that i didnt want the player to go through- removed a ton of legacy code. Next up i think ill work on the silhouette mechanics which i cooked up in the new narrative! wish me luck! Lapsed (v0.0.10(D)-alpha) Story + Map Redesigning (3) : Again one of the shortest lapses i have made but its enough for me to get the 1 hour streak lmao- I promise Ill work honestly from tmrw, Exams finished just today and im exhausted asf- Please excuse me! Made updates to the story too Next Step(s): Watch Tower Model Walking animation Story Redesign Improved Silhouette Mechanics Notes: Holy moly! the silhouette (YES SINGULAR) works wonderfully now! its like its guiding you! im really happy with the result i think ill model the watch tower."}, {"post_id": 26446, "ts": "2026-07-11T07:48:49Z", "hours": 1.8575, "text": "(v0.0.10(C)-alpha) Story and Map Redesign Changelog: (v0.0.10(C)-alpha) Story + Map Redesigning (2) : So as i am changing the narrative i need to update the map accordingly, A very small update because my mouse stopped wrking but oh well i just changed some textures and added trees. Also making a story narrative in 2nd person ig? Lapsed (v0.0.10(B)-alpha) Story Redesign (1) : Brainstormed a lot of stuff- and rewrote the prologue storyline- the old one was pretty basic i like the new one more and I mostly changed it because i am thinking of the next chapter too and i want a seamless transition- just hang on with me ill cook something truly epic :3 Next Step(s): Boulders / Rocks (WIP) Walking animation Story Redesign (WIP) Notes: OKay today ill lock tf in my exams just finished!"}, {"post_id": 25183, "ts": "2026-07-09T07:50:16Z", "hours": 2.7572, "text": "(v0.0.10(A)-alpha) Walk and Map Redesign Changelog: (v0.0.10(A)-alpha) Map Redesigning (1) : I think im going to go on a different direction with the prologue scene! i changed the pathways because i think it was too complex and looping- I am also thinking of turning the log cabin into an watch tower for more ominous feel! im working on the story hopefully i can figure it out! Lapsed (v0.0.9(F)-alpha) Walk Animation (Camera Shake) : Yoooo! holy smokes this look epic spent a good chunk figuring out how to make the walk animation turns out its easier to do it through code- thats why i ended the lapse prematurely and worked on it in Rider IDE! it look so cool rn it has head bobbing in all three dimensions! Lapsed Next Step(s): Boulders / Rocks (WIP) Walking animation Story Redesign Notes: I had some different ideas about the story and im working on it- redesigned the map a bit! i think ill do more stuff"}, {"post_id": 24010, "ts": "2026-07-07T09:18:07Z", "hours": 3.4614, "text": "(v0.0.9(E)-alpha) More erm Animations! Changelog: (v0.0.9(E)-alpha) Silhouette Spawning, Flickering Animations (2) : Yay i finally made the silhouette spawning animation! it looks sick! the way it slowly comes into view- really cool i also did a bunch of things here and there that im not going into detail :3 Lapsed (v0.0.9(D)-alpha) Silhouette Spawning (1) : Erm uhh idk- i experimented with both script and animationplayer animations but i couldnt seem to get them to work - the script seemed to fail completely while the animation player got me some success but not enough- I will look in to this tmrw! Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations Complete Death animation Walking animation Notes: yoo gng i had my regional language and physics exam today and i lwk think i did pretty well! Anyways i did some work and i think ill do more now!"}, {"post_id": 23334, "ts": "2026-07-06T07:01:47Z", "hours": 2.5928, "text": "(v0.0.9(B)-alpha) Animations! Changelog: (v0.0.9(B)-alpha) Waking up & Counter Animation : So added the waking up animation - this was a new thing for me that i think i leanrt! the animation player is a really cool feature! Also now the silhouette counter shows up only after the first silhouette is found Lapsed (v0.0.9(A)-alpha) Death Animation : Fixed a bug (ig? idk if u can call it that) that made it so whenever u looked away from the silhouette the animation would completely freeze. Turns out there was a VisibleOnScreenEnabler3D child which froze the process- Its fixed now! Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations Complete Death animation Walking animation Notes: uhh i dont know what to say this time- my exams starts from tmrw so updates may be slow asf BUT i will try to do atleast 1 hour per day"}, {"post_id": 22782, "ts": "2026-07-05T11:19:46Z", "hours": 4.0697, "text": "(v0.0.8(G)-pre-alpha) More Optimization Changelog: (v0.0.8(G)-pre-alpha) Optimization (5) : Omg omg i think i actually did it! what i did was kinda brilliant ngl- So here we go: 1. Whenvever the trees/models are outside the players view they are removed! so like they are not rendered!! Saves cpu and gpu. 2. The snowfall thing is not static now it moves with the player so that only a small area is gettingg the snowfall and a lot less particles is rendered! Lapsed (v0.0.8(F)-pre-alpha) Optimization (4) : I dont even know at this point what i did but i think i increased the frame rates a bit? but i learnt that voxelGI was not performant for my use case so i removed that- also changed the visibility ranges a bit and more i forgo Lapsed (v0.0.8(E)-pre-alpha) Optimization (3) & FPS : A nice session where i sat down and did more optimization- ah yes optimization is the key to life and happiness, I am really shocked that i optimized it so hard that it runs smoothly in my poopc with good graphics! SubViewport and TextureRect for the win, also added fps counter Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations Complete Death animation Notes: HOLY SMOKES! (no pun intended) IM PUSHING 40 FPS!! when i compiled. Normally im getting like 36fps! thats a huge improvement from 9fps that i was getting initally! finally i can do some other stuff lmao"}, {"post_id": 22175, "ts": "2026-07-04T14:38:40Z", "hours": 4.7792, "text": "(v0.0.8(D)-pre-alpha) Particles (and) Optimization Changelog: (v0.0.8(D)-pre-alpha) Optimization (2) : Okay hol’up wait a min- I think i might have actually pulled it! The game is SOOO much optimized now! Not completed but its almost there. So i prebaked the lighting, reduced the scale of the screen cuz i was already doing it in the shader, decreased the shadow radius and more stuff that i may or may not have forgotten in the 3/4 hours that i worked CONTINUOUSLY- Lapsed (v0.0.8(C)-pre-alpha) Death Particles : Okay so for a long time ive been trying to do this but havent (silly me) but here we go- added particle effects for when the silhouettes are “found” they are yellowish and spread out i plan on making some sound effects. Also i did something for the macOS compilation lmao Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations (WIP! close to finishing ig) Notes: Thats so crazy! The game finally runs smoothly on my godforsaken pc. I had to do a LOT of stuff and research, but ngl ChatGPT also came in clutch!"}, {"post_id": 21500, "ts": "2026-07-03T14:21:19Z", "hours": 2.5083, "text": "(v0.0.8(B)-pre-alpha) Models and Optimization(?) Changelog: (v0.0.8(B)-pre-alpha) Particle Optimization (1) : wild stuff- so i wanted to optimize it but guess what i think i did the complete opposite oh well i did reduce the particle count by a ton- we’ll see what happens Lapsed (v0.0.8(A)-pre-alpha) Boulder, Grass, Flowers & Fireflies : Pretty productive session! separated the boulder, flower and grass models. but ngl the boulder gave me a hard ass time idk why 💀 Anyways i cooked up the fireflies scene which i am SUPER proud of (since i didnt use any external help- okay u got me just a bit tho) Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations (WIP) Notes: OKay yo- idk what but i did something 💀"}, {"post_id": 21337, "ts": "2026-07-03T07:02:01Z", "hours": 1.4731, "text": "(v0.0.7(I)-pre-alpha) Spooky Scary Silhouettes Changelog: (v0.0.7(I)-pre-alpha) Silhouette (4) - The Special One : So yesterday I couldnt seem to add the special silhouette in the game but oh well added it in this short session Lapsed (v0.0.7(H)-pre-alpha) Silhouette (3) - Placement : Did a lot of minor stuff (like fixing the material of the log cabin) but the major thing done was the silhouettes’ placement- there are 9 silhouettes, 8 in the wild and one in the cabin, ill make the one in the cabin “special” tmrw! Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks Particle Optimizations Notes: Scawy Scawy Silhouettes! Tiny devlog/journal lolz will work more today"}, {"post_id": 20742, "ts": "2026-07-02T13:07:31Z", "hours": 3.7628, "text": "(v0.0.7(G)-pre-alpha) Scary Silhouettes Changelog: (v0.0.7(G)-pre-alpha) Silhouette (2) - Functionality : OMG OMGO MGOMGOMGOpfjhnguiklhdstg- IDK HOW! but whatever i wanted to has been done! Im really shocked at this! but yeah i gotta thank chatgpt a ton but i got through each line of code and did NOT blindly copy them- I think next time i can do this by my own Lapsed (v0.0.7(F)-pre-alpha) Silhouette (1) - Modeling : I’ve been waiting to make this model for sooo sooo long and finally i made it! Def took some inspiration from the SCP 096 and the models by Seb for his game. Other than the model I also made the scene with a light and fog which seems crazy good ingame Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks Particle Optimizations Notes: Holy lockin! i did like 4 hours today- i need to lock in like this moreeeeeeeeeee AAA- i may get burnt out but yeah only 60 more days to go"}, {"post_id": 20142, "ts": "2026-07-01T18:04:51Z", "hours": 0.9325, "text": "(0.0.7(E)-pre-alpha) Foggy fog Changelog: (v0.0.7(E)-pre-alpha) Volumetric Fog & Polishes : Added Volumetric Fog as per the request of Hridya! Also made numerous tiny polishes to the group texture, snowfall particle effects. I experimented with the snowfall thing with the player but it did NOT look good so i had to revert back to the normal thing :P Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks Particle Optimizations Notes: ahh i couldnt work on this yesterday because i was so swamped- hopefully i can work a lot tmrw!"}, {"post_id": 19345, "ts": "2026-06-30T16:57:13Z", "hours": 2.0328, "text": "(0.0.7(D)-pre-alpha) Snowfalllllllllllllll Changelog: (v0.0.7(D)-pre-alpha) Snowfall (1.2) : Finally managed to fix the issue that was causing the glitched snowfall rendering (again, ty seb) Edited the materials thingy and adjusted the settings in general made it so that it looks good! i really like it Lapsed (v0.0.7(C)-pre-alpha) Snowfall (1.1) : Added the snowfall particles (GPU) but it is kinda bugged right now. I am pushing premature scene because @seb will help me out on this :3 Lets hope we can troubleshoot and fix this together! Lapsed v0.0.7(B)-pre-alpha) Mountains (2) - Texture : I did the UV mapping and the texturing for the mountain model, Had to take a bit of help from my friend @seb for the UV wrapping settings but yeah! did all the stuff by myself! Lapsed Next Step(s): Wooden Torch model Mountains Silhouettes! Sounds Notes: Im so chopped rn- Barely keeping my eyes open… Will devlog properly tmrw"}, {"post_id": 18205, "ts": "2026-06-29T08:31:00Z", "hours": 3.5006, "text": "(0.0.7(A)-pre-alpha) High Mountains Changelog: (v0.0.7(A)-pre-alpha) Mountains (1) - Modelling : really really like the model i have cooked up here, though the texturing is left the base model is looking really cool. The spiky nature kinda symbolizes danger and overall i just think its perfect Lapsed (v0.0.6(I)-pre-alpha) Torches (Placement - 3) : got a lot of work done- the torches are now placed along the path! I’ve done something that i think is really cool. here we go! So i added more torches on the main path to subsconsciously provoke the players to follow the path, on the other hand the tributaries have less! Lapsed Next Step(s): Wooden Torch model Mountains IN PROGRESS!! Silhouettes! Sounds Blizzard (Storms!) Notes: Didnt go to school today cuz i was studying at home lol but got some great work done! ill make the textures next"}, {"post_id": 17570, "ts": "2026-06-28T12:36:02Z", "hours": 2.8669, "text": "(0.0.6(H)-pre-alpha) One stick and a Coal ore Changelog: (0.0.6(H)-pre-alpha) Toggle Shaders : Accidentally paused the shaders in the previous commit so here we go! Re enabling them (0.0.6(G)-pre-alpha) Torches (Placement - 2) : Added several torches in the scene BUT its not completed yet! I spent a good chunk of this time wondering why i was having some lag and low fps but i coudlnt seem to solve em so i left it as a problem for future me Lapsed (0.0.6(F)-pre-alpha) Torches (Model - 1) : I added the torch model! It has a smoke particle effet and a subtle yellowish lighting. The smoke part was truly trivial and i had to use a yt tutorial to make it. BUT the torch model is made all by myself and im pretty satisfied with it! Lapsed Next Step(s): Wooden Torch model Placements left More models and stuff Silhouettes! Sounds Blizzard (Storms!) Notes: I really love the torch model and texture and the lighting- ykw everything in general. I have some optimizations to worry about tho (particles n stuff)"}, {"post_id": 16785, "ts": "2026-06-27T07:54:27Z", "hours": 1.37, "text": "(0.0.6(E)-pre-alpha) Shader, Shader, and Shader! Changelog: (0.0.6(E)-pre-alpha) Shaders (3) : Finalized the shaders setting to make it look peak. hid the extreme blur effect, dither and noise. Made it look more pleasing and not annoying. (0.0.6(D)-pre-alpha) Shaders (2) : New shader now, the previous shader was eh so i found a new one and then modified it a lot! I love each and evey part of it EXCEPT the vignetting i feel like something is wrong. Ill fix it soon tm. also ngl i used chatgpt to understand how these stuff works so yeah :P but dw its not more than 30% ai Next Step(s): Wooden Torch model More models and stuff Silhouettes! Sounds Blizzard (Storms!) Notes: I wasnt happy with the previous shader because there were some irritating artifacts so i switched up the shader to one that i like!"}, {"post_id": 15124, "ts": "2026-06-24T16:05:08Z", "hours": 2.2731, "text": "(0.0.6(C)-pre-alpha) Nighttime & Shaders!! Changelog: (0.0.6(C)-pre-alpha) Shaders (1) : After a lot of trial and errors I finally added the Shader! The environment or the atmosphere ia really taking shape! Im telling u this is gonna be epic!! I am liking the development process a ton though it feels a bit overwhelming sometimes Lapsed (0.0.6(B)-pre-alpha) Nighttime & Fog : This is lowkey peak u cant argue with ts bruh. I know that the lighting and the fog isnt perfect but hey! im slowly learning everything! Today I made the game into a night scene with some fog! looks cool ngl Lapsed (0.0.6(A)-pre-alpha) Upgrade to Godot 4.7 : Nothing much, just upgraded Godot version to 4.7 - the latest one because: 1. I can 2. You cannot stop me 3. Yes Next Step(s): Add trees More models and stuff “3. Shaders Night Time Silhouettes! Sounds Blizzard (Storms!) Notes: I really really love how the game is turning into! THough i know the lore (kinda) and have an idea for the chapter 0 i.e. the prologue I am not sure how to progress it into chapter 1. Well i do have an idea but nly time will tell!"}, {"post_id": 13076, "ts": "2026-06-21T12:04:09Z", "hours": 1.5281, "text": "(v0.0.5(F)-pre-alpha) Forest Design (3) Changelog: (v0.0.5(F)-pre-alpha) Forest Design (Part-3) : Last and final lapse of the forest! The pine/taiga forest has been completed. Nowww- its time for me to add shaders, make it fog, making it night time, etc., This was extremely tiring :/ but was worth it :D Lapsed - Next Step(s): Add trees More models and stuff Shaders Night Time Notes: After so so long time I worked on Vestige again! Looking forward to making more devlogs soon!"}, {"post_id": 9159, "ts": "2026-06-15T10:40:23Z", "hours": 0.8175, "text": "(v0.0.5(E)-pre-alpha) Forest Design (2) Changelog: (v0.0.5(E)-pre-alpha) Forest Design (Part-2) : Did a bit more of the forest, slowly increases the forest cover! Since my school has opened im working a bit less :/. No worries ill slowly keep doing stuff. Added some TODOS Lapsed Next Step(s): Add trees (in progress) More models and stuff Shaders Notes: School started from today so less work :/"}, {"post_id": 8650, "ts": "2026-06-14T11:34:12Z", "hours": 1.6194, "text": "(v0.0.5(D)-pre-alpha) Forest Design && Polishing Changelog: (v0.0.5(D)-pre-alpha) Forest Design (Part-1) : After polishing and giving the finishing touches to the tree models and the chapter 0 map, I am now in the process of level design. Firstly ill make the forest and then go on to the cabin, other models, shaders and gameplay stuff. Its slowly coming together frfrfrfr. Lapsed (v0.0.5(C)-pre-alpha) Polishing (some) Models : hey woud you look at that! im back 🔥anyywayyssss in this lapse i polished the tree models such that the leaves are collision free and then I also changed the texture mode to seem more pixelated. Changed the map a bit to make the trails better. Lapsed Next Step(s): Add trees (in progress) More models and stuff Shaders Notes: Im coming back after soo soo long because of two main reasons: 1) I was skeptical of Lapse(it was bugging) ANDD 2) i was very bust these days. Welp my school starts tmrw"}, {"post_id": 6122, "ts": "2026-06-10T09:17:02Z", "hours": 3.6831, "text": "(v0.0.5(B)-pre-alpha) Log Cabin Changelog: (v0.0.5(B)-pre-alpha) Log Cabin : Very very happy with the log cabin model. But it took soooo sooo mucj time omg. I am too tired to write more. Sorry. Vestige: Log Cabin : holy moly, this is crazy! I LITERALLY SPENT 3 HOURS of my life making a log cabin… Wow. Hey it was kinda worth it! I imported this into godot but uhh its doing quirky things lets see if i can fix! Next Step(s): Add trees Shaders Log Cabin Model Notes: The UV on the log cabin was hell. omfg"}, {"post_id": 5410, "ts": "2026-06-09T05:07:59Z", "hours": 2.4636, "text": "(v0.0.5(A)-pre-alpha) PLaying the Map! Changelog: (v0.0.5(A)-pre-alpha) Map + Player : OKay we are stepping up to the big guns now! In this commit I have added a Map for chapter 0 AND also added the player model! I KNOW that the grass and trail textures are not the great and they look “not good” but I think ill polish it when the core game mechanics is done!z Vestige: Map & Player : Wow this is SO COOLL! I am really enjoying blender AND godot. So here I made the map for chapter 0 (prologue) and a player character! Definitely cooking Next Step(s): Add trees Shaders Log Cabin Model Notes: Okay! I am starting to learn blender! I am really enjoyying the process!"}, {"post_id": 4175, "ts": "2026-06-07T12:14:44Z", "hours": 2.5375, "text": "(v0.0.4-pre-alpha) Model & design Changelog: (v0.0.4-pre-alpha) Level Design + Bench Model : Designed the chapter 0– like a mind map, now its time for me to start 3d modelling and making the game. And a bench model for chapter 0 Vestige: Chapter 0- Level Design : Just designed the chapter 0– like a mind map, now its time for me to start 3d modelling and making the game Vestige: Bench Model : This is a bench model for chapter 0. I spent so much time making this. i think i gained experience and the next models will be faster Next Step(s): Start Modeling Make ground Make a player object and controller. Notes: OH MY GOD! I MODELED THAT? I really really dont believe it! It looks soooo good."}, {"post_id": 3428, "ts": "2026-06-06T11:18:54Z", "hours": 1.6908, "text": "(v0.0.3(A)-pre-alpha) Think, Write, Repeat. Changelog: (v0.0.3(B)-pre-alpha) Game Design: Chapter 0 : Oh my gawd! The prologue sequence is so so so cool! I just love it. Ive laid out a complete map of chapter 0! NOW i can finally start working on the first chaapter without procrastinating more lol. (v0.0.3(A)-pre-alpha) Story: Chapter 0 & 1 : Yoooo finally wrote the complete chapter 0 (the prologue) and polished chapter1 even more. Its really coming together. Now I will move on to the game design. Like each action and tiny details. After I’m done with Chapter 0 gamedesign ill start making it Next Step(s): Complete Storyline for Ch0 and Ch1 Create a Script for Chapter 0 Start modeling Notes: THis is SOOO time and energy consuming! Storyboarding is NOT easy lmao. Anyways i finished the story for Ch0 and Ch1 and script for Ch0. Now ill start modeling. frfr"}, {"post_id": 2834, "ts": "2026-06-05T17:46:32Z", "hours": 1.7725, "text": "(v0.0.3-pre-alpha) Modeling and Writing! Changelog: (v0.0.3-pre-alpha) Test Model: Nightstand : OKAY this my first time using blender and I used a tutorial to guide me through. THough it looks, well, “okay” im not satisfied. Ill make a better one. Just trust me on this (v0.0.2(B)-pre-alpha) Chapter 1: Story : Okay! I’ve polished and completed the chapter1 story line. Ive tweaked the backstory a bit to stay realistic. I really really like the direction im going for while keeping the scope uhh managable. Ive so many places where I can improve upon! ive kept it open ended because i have chapter 2 planned 🔥 Next Step(s): Complete Storyline for Ch1 Create a Script for Chapter 1 Start modeling Notes: OKayy i really liked modeling, i think im getting a hang of it! AALSOOOO im super proud of the story line im cooking rn"}, {"post_id": 898, "ts": "2026-06-02T16:57:43Z", "hours": 1.0978, "text": "(v0.0.2(A)-pre-alpha) Setup and Narrative! Changelog: (v0.0.2(A)-pre-alpha) Narrative (Lore) and Versioning : Okay so added a one line plot and brain stormed and wrote a mini story which is the internal plot which should NOT be read as the player. This only serves to streamline the development. Anyways the plot may be subject to change. (v0.0.1-pre-alpha) Godot Setup! : Nothing crazy just setup Godot (first time btw!) (v0.0.0-pre-alpha) Initial Commit : Initial commit- what else do u expect me to say?? (/s i love yall) Next Step(s): Complete Storyline Create a Script for Chapter 1 Start modelling Notes: To be absolutely honest with yall this is my first time making a game (by myself) and Im super excited! Cant wait to start modelling and making the game!"}]...
|
Title: Vestige by @Rupnil | Stardance
Devlogs:
(v Title: Vestige by @Rupnil | Stardance
Devlogs:
(v0.0.2(A)-pre-alpha) Setup and Narrative! Changelog: (v0.0.2(A)-pre-alpha) Narrative (Lore) and Versioning : Okay so added a one line plot and brain stormed and wrote a mini story which is the internal plot which should NOT be read as the player. This only serves to streamline the development. Anyways the plot may be subject to change. (v0.0.1-pre-alpha) Godot Setup! : Nothing crazy just setup Godot (first time btw!) (v0.0.0-pre-alpha) Initial Commit : Initial commit- what else do u expect me to say?? (/s i love yall) Next Step(s): Complete Storyline Create a Script for Chapter 1 Start modelling Notes: To be absolutely honest with yall this is my first time making a game (by myself) and Im super excited! Cant wait to start modelling and making the game!
(v0.0.3-pre-alpha) Modeling and Writing! Changelog: (v0.0.3-pre-alpha) Test Model: Nightstand : OKAY this my first time using blender and I used a tutorial to guide me through. THough it looks, well, “okay” im not satisfied. Ill make a better one. Just trust me on this (v0.0.2(B)-pre-alpha) Chapter 1: Story : Okay! I’ve polished and completed the chapter1 story line. Ive tweaked the backstory a bit to stay realistic. I really really like the direction im going for while keeping the scope uhh managable. Ive so many places where I can improve upon! ive kept it open ended because i have chapter 2 planned 🔥 Next Step(s): Complete Storyline for Ch1 Create a Script for Chapter 1 Start modeling Notes: OKayy i really liked modeling, i think im getting a hang of it! AALSOOOO im super proud of the story line im cooking rn
(v0.0.3(A)-pre-alpha) Think, Write, Repeat. Changelog: (v0.0.3(B)-pre-alpha) Game Design: Chapter 0 : Oh my gawd! The prologue sequence is so so so cool! I just love it. Ive laid out a complete map of chapter 0! NOW i can finally start working on the first chaapter without procrastinating more lol. (v0.0.3(A)-pre-alpha) Story: Chapter 0 & 1 : Yoooo finally wrote the complete chapter 0 (the prologue) and polished chapter1 even more. Its really coming together. Now I will move on to the game design. Like each action and tiny details. After I’m done with Chapter 0 gamedesign ill start making it Next Step(s): Complete Storyline for Ch0 and Ch1 Create a Script for Chapter 0 Start modeling Notes: THis is SOOO time and energy consuming! Storyboarding is NOT easy lmao. Anyways i finished the story for Ch0 and Ch1 and script for Ch0. Now ill start modeling. frfr
(v0.0.4-pre-alpha) Model & design Changelog: (v0.0.4-pre-alpha) Level Design + Bench Model : Designed the chapter 0– like a mind map, now its time for me to start 3d modelling and making the game. And a bench model for chapter 0 Vestige: Chapter 0- Level Design : Just designed the chapter 0– like a mind map, now its time for me to start 3d modelling and making the game Vestige: Bench Model : This is a bench model for chapter 0. I spent so much time making this. i think i gained experience and the next models will be faster Next Step(s): Start Modeling Make ground Make a player object and controller. Notes: OH MY GOD! I MODELED THAT? I really really dont believe it! It looks soooo good.
(v0.0.5(A)-pre-alpha) PLaying the Map! Changelog: (v0.0.5(A)-pre-alpha) Map + Player : OKay we are stepping up to the big guns now! In this commit I have added a Map for chapter 0 AND also added the player model! I KNOW that the grass and trail textures are not the great and they look “not good” but I think ill polish it when the core game mechanics is done!z Vestige: Map & Player : Wow this is SO COOLL! I am really enjoying blender AND godot. So here I made the map for chapter 0 (prologue) and a player character! Definitely cooking Next Step(s): Add trees Shaders Log Cabin Model Notes: Okay! I am starting to learn blender! I am really enjoyying the process!
(v0.0.5(B)-pre-alpha) Log Cabin Changelog: (v0.0.5(B)-pre-alpha) Log Cabin : Very very happy with the log cabin model. But it took soooo sooo mucj time omg. I am too tired to write more. Sorry. Vestige: Log Cabin : holy moly, this is crazy! I LITERALLY SPENT 3 HOURS of my life making a log cabin… Wow. Hey it was kinda worth it! I imported this into godot but uhh its doing quirky things lets see if i can fix! Next Step(s): Add trees Shaders Log Cabin Model Notes: The UV on the log cabin was hell. omfg
(v0.0.5(D)-pre-alpha) Forest Design && Polishing Changelog: (v0.0.5(D)-pre-alpha) Forest Design (Part-1) : After polishing and giving the finishing touches to the tree models and the chapter 0 map, I am now in the process of level design. Firstly ill make the forest and then go on to the cabin, other models, shaders and gameplay stuff. Its slowly coming together frfrfrfr. Lapsed (v0.0.5(C)-pre-alpha) Polishing (some) Models : hey woud you look at that! im back 🔥anyywayyssss in this lapse i polished the tree models such that the leaves are collision free and then I also changed the texture mode to seem more pixelated. Changed the map a bit to make the trails better. Lapsed Next Step(s): Add trees (in progress) More models and stuff Shaders Notes: Im coming back after soo soo long because of two main reasons: 1) I was skeptical of Lapse(it was bugging) ANDD 2) i was very bust these days. Welp my school starts tmrw
(v0.0.5(E)-pre-alpha) Forest Design (2) Changelog: (v0.0.5(E)-pre-alpha) Forest Design (Part-2) : Did a bit more of the forest, slowly increases the forest cover! Since my school has opened im working a bit less :/. No worries ill slowly keep doing stuff. Added some TODOS Lapsed Next Step(s): Add trees (in progress) More models and stuff Shaders Notes: School started from today so less work :/
(v0.0.5(F)-pre-alpha) Forest Design (3) Changelog: (v0.0.5(F)-pre-alpha) Forest Design (Part-3) : Last and final lapse of the forest! The pine/taiga forest has been completed. Nowww- its time for me to add shaders, make it fog, making it night time, etc., This was extremely tiring :/ but was worth it :D Lapsed - Next Step(s): Add trees More models and stuff Shaders Night Time Notes: After so so long time I worked on Vestige again! Looking forward to making more devlogs soon!
(0.0.6(C)-pre-alpha) Nighttime & Shaders!! Changelog: (0.0.6(C)-pre-alpha) Shaders (1) : After a lot of trial and errors I finally added the Shader! The environment or the atmosphere ia really taking shape! Im telling u this is gonna be epic!! I am liking the development process a ton though it feels a bit overwhelming sometimes Lapsed (0.0.6(B)-pre-alpha) Nighttime & Fog : This is lowkey peak u cant argue with ts bruh. I know that the lighting and the fog isnt perfect but hey! im slowly learning everything! Today I made the game into a night scene with some fog! looks cool ngl Lapsed (0.0.6(A)-pre-alpha) Upgrade to Godot 4.7 : Nothing much, just upgraded Godot version to 4.7 - the latest one because: 1. I can 2. You cannot stop me 3. Yes Next Step(s): Add trees More models and stuff “3. Shaders Night Time Silhouettes! Sounds Blizzard (Storms!) Notes: I really really love how the game is turning into! THough i know the lore (kinda) and have an idea for the chapter 0 i.e. the prologue I am not sure how to progress it into chapter 1. Well i do have an idea but nly time will tell!
(0.0.6(E)-pre-alpha) Shader, Shader, and Shader! Changelog: (0.0.6(E)-pre-alpha) Shaders (3) : Finalized the shaders setting to make it look peak. hid the extreme blur effect, dither and noise. Made it look more pleasing and not annoying. (0.0.6(D)-pre-alpha) Shaders (2) : New shader now, the previous shader was eh so i found a new one and then modified it a lot! I love each and evey part of it EXCEPT the vignetting i feel like something is wrong. Ill fix it soon tm. also ngl i used chatgpt to understand how these stuff works so yeah :P but dw its not more than 30% ai Next Step(s): Wooden Torch model More models and stuff Silhouettes! Sounds Blizzard (Storms!) Notes: I wasnt happy with the previous shader because there were some irritating artifacts so i switched up the shader to one that i like!
(0.0.6(H)-pre-alpha) One stick and a Coal ore Changelog: (0.0.6(H)-pre-alpha) Toggle Shaders : Accidentally paused the shaders in the previous commit so here we go! Re enabling them (0.0.6(G)-pre-alpha) Torches (Placement - 2) : Added several torches in the scene BUT its not completed yet! I spent a good chunk of this time wondering why i was having some lag and low fps but i coudlnt seem to solve em so i left it as a problem for future me Lapsed (0.0.6(F)-pre-alpha) Torches (Model - 1) : I added the torch model! It has a smoke particle effet and a subtle yellowish lighting. The smoke part was truly trivial and i had to use a yt tutorial to make it. BUT the torch model is made all by myself and im pretty satisfied with it! Lapsed Next Step(s): Wooden Torch model Placements left More models and stuff Silhouettes! Sounds Blizzard (Storms!) Notes: I really love the torch model and texture and the lighting- ykw everything in general. I have some optimizations to worry about tho (particles n stuff)
(0.0.7(A)-pre-alpha) High Mountains Changelog: (v0.0.7(A)-pre-alpha) Mountains (1) - Modelling : really really like the model i have cooked up here, though the texturing is left the base model is looking really cool. The spiky nature kinda symbolizes danger and overall i just think its perfect Lapsed (v0.0.6(I)-pre-alpha) Torches (Placement - 3) : got a lot of work done- the torches are now placed along the path! I’ve done something that i think is really cool. here we go! So i added more torches on the main path to subsconsciously provoke the players to follow the path, on the other hand the tributaries have less! Lapsed Next Step(s): Wooden Torch model Mountains IN PROGRESS!! Silhouettes! Sounds Blizzard (Storms!) Notes: Didnt go to school today cuz i was studying at home lol but got some great work done! ill make the textures next
(0.0.7(D)-pre-alpha) Snowfalllllllllllllll Changelog: (v0.0.7(D)-pre-alpha) Snowfall (1.2) : Finally managed to fix the issue that was causing the glitched snowfall rendering (again, ty seb) Edited the materials thingy and adjusted the settings in general made it so that it looks good! i really like it Lapsed (v0.0.7(C)-pre-alpha) Snowfall (1.1) : Added the snowfall particles (GPU) but it is kinda bugged right now. I am pushing premature scene because @seb will help me out on this :3 Lets hope we can troubleshoot and fix this together! Lapsed v0.0.7(B)-pre-alpha) Mountains (2) - Texture : I did the UV mapping and the texturing for the mountain model, Had to take a bit of help from my friend @seb for the UV wrapping settings but yeah! did all the stuff by myself! Lapsed Next Step(s): Wooden Torch model Mountains Silhouettes! Sounds Notes: Im so chopped rn- Barely keeping my eyes open… Will devlog properly tmrw
(0.0.7(E)-pre-alpha) Foggy fog Changelog: (v0.0.7(E)-pre-alpha) Volumetric Fog & Polishes : Added Volumetric Fog as per the request of Hridya! Also made numerous tiny polishes to the group texture, snowfall particle effects. I experimented with the snowfall thing with the player but it did NOT look good so i had to revert back to the normal thing :P Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks Particle Optimizations Notes: ahh i couldnt work on this yesterday because i was so swamped- hopefully i can work a lot tmrw!
(v0.0.7(G)-pre-alpha) Scary Silhouettes Changelog: (v0.0.7(G)-pre-alpha) Silhouette (2) - Functionality : OMG OMGO MGOMGOMGOpfjhnguiklhdstg- IDK HOW! but whatever i wanted to has been done! Im really shocked at this! but yeah i gotta thank chatgpt a ton but i got through each line of code and did NOT blindly copy them- I think next time i can do this by my own Lapsed (v0.0.7(F)-pre-alpha) Silhouette (1) - Modeling : I’ve been waiting to make this model for sooo sooo long and finally i made it! Def took some inspiration from the SCP 096 and the models by Seb for his game. Other than the model I also made the scene with a light and fog which seems crazy good ingame Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks Particle Optimizations Notes: Holy lockin! i did like 4 hours today- i need to lock in like this moreeeeeeeeeee AAA- i may get burnt out but yeah only 60 more days to go
(v0.0.7(I)-pre-alpha) Spooky Scary Silhouettes Changelog: (v0.0.7(I)-pre-alpha) Silhouette (4) - The Special One : So yesterday I couldnt seem to add the special silhouette in the game but oh well added it in this short session Lapsed (v0.0.7(H)-pre-alpha) Silhouette (3) - Placement : Did a lot of minor stuff (like fixing the material of the log cabin) but the major thing done was the silhouettes’ placement- there are 9 silhouettes, 8 in the wild and one in the cabin, ill make the one in the cabin “special” tmrw! Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks Particle Optimizations Notes: Scawy Scawy Silhouettes! Tiny devlog/journal lolz will work more today
(v0.0.8(B)-pre-alpha) Models and Optimization(?) Changelog: (v0.0.8(B)-pre-alpha) Particle Optimization (1) : wild stuff- so i wanted to optimize it but guess what i think i did the complete opposite oh well i did reduce the particle count by a ton- we’ll see what happens Lapsed (v0.0.8(A)-pre-alpha) Boulder, Grass, Flowers & Fireflies : Pretty productive session! separated the boulder, flower and grass models. but ngl the boulder gave me a hard ass time idk why 💀 Anyways i cooked up the fireflies scene which i am SUPER proud of (since i didnt use any external help- okay u got me just a bit tho) Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations (WIP) Notes: OKay yo- idk what but i did something 💀
(v0.0.8(D)-pre-alpha) Particles (and) Optimization Changelog: (v0.0.8(D)-pre-alpha) Optimization (2) : Okay hol’up wait a min- I think i might have actually pulled it! The game is SOOO much optimized now! Not completed but its almost there. So i prebaked the lighting, reduced the scale of the screen cuz i was already doing it in the shader, decreased the shadow radius and more stuff that i may or may not have forgotten in the 3/4 hours that i worked CONTINUOUSLY- Lapsed (v0.0.8(C)-pre-alpha) Death Particles : Okay so for a long time ive been trying to do this but havent (silly me) but here we go- added particle effects for when the silhouettes are “found” they are yellowish and spread out i plan on making some sound effects. Also i did something for the macOS compilation lmao Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations (WIP! close to finishing ig) Notes: Thats so crazy! The game finally runs smoothly on my godforsaken pc. I had to do a LOT of stuff and research, but ngl ChatGPT also came in clutch!
(v0.0.8(G)-pre-alpha) More Optimization Changelog: (v0.0.8(G)-pre-alpha) Optimization (5) : Omg omg i think i actually did it! what i did was kinda brilliant ngl- So here we go: 1. Whenvever the trees/models are outside the players view they are removed! so like they are not rendered!! Saves cpu and gpu. 2. The snowfall thing is not static now it moves with the player so that only a small area is gettingg the snowfall and a lot less particles is rendered! Lapsed (v0.0.8(F)-pre-alpha) Optimization (4) : I dont even know at this point what i did but i think i increased the frame rates a bit? but i learnt that voxelGI was not performant for my use case so i removed that- also changed the visibility ranges a bit and more i forgo Lapsed (v0.0.8(E)-pre-alpha) Optimization (3) & FPS : A nice session where i sat down and did more optimization- ah yes optimization is the key to life and happiness, I am really shocked that i optimized it so hard that it runs smoothly in my poopc with good graphics! SubViewport and TextureRect for the win, also added fps counter Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations Complete Death animation Notes: HOLY SMOKES! (no pun intended) IM PUSHING 40 FPS!! when i compiled. Normally im getting like 36fps! thats a huge improvement from 9fps that i was getting initally! finally i can do some other stuff lmao
(v0.0.9(B)-alpha) Animations! Changelog: (v0.0.9(B)-alpha) Waking up & Counter Animation : So added the waking up animation - this was a new thing for me that i think i leanrt! the animation player is a really cool feature! Also now the silhouette counter shows up only after the first silhouette is found Lapsed (v0.0.9(A)-alpha) Death Animation : Fixed a bug (ig? idk if u can call it that) that made it so whenever u looked away from the silhouette the animation would completely freeze. Turns out there was a VisibleOnScreenEnabler3D child which froze the process- Its fixed now! Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations Complete Death animation Walking animation Notes: uhh i dont know what to say this time- my exams starts from tmrw so updates may be slow asf BUT i will try to do atleast 1 hour per day
(v0.0.9(E)-alpha) More erm Animations! Changelog: (v0.0.9(E)-alpha) Silhouette Spawning, Flickering Animations (2) : Yay i finally made the silhouette spawning animation! it looks sick! the way it slowly comes into view- really cool i also did a bunch of things here and there that im not going into detail :3 Lapsed (v0.0.9(D)-alpha) Silhouette Spawning (1) : Erm uhh idk- i experimented with both script and animationplayer animations but i couldnt seem to get them to work - the script seemed to fail completely while the animation player got me some success but not enough- I will look in to this tmrw! Lapsed Next Step(s): Models of the silhouettes Boulders / Rocks (WIP) Particle Optimizations Complete Death animation Walking animation Notes: yoo gng i had my regional language and physics exam today and i lwk think i did pretty well! Anyways i did some work and i think ill do more now!
(v0.0.10(A)-alpha) Walk and Map Redesign Changelog: (v0.0.10(A)-alpha) Map Redesigning (1) : I think im going to go on a different direction with the prologue scene! i changed the pathways because i think it was too complex and looping- I am also thinking of turning the log cabin into an watch tower for more ominous feel! im working on the story hopefully i can figure it out! Lapsed (v0.0.9(F)-alpha) Walk Animation (Camera Shake) : Yoooo! holy smokes this look epic spent a good chunk figuring out how to make the walk animation turns out its easier to do it through code- thats why i ended the lapse prematurely and worked on it in Rider IDE! it look so cool rn it has head bobbing in all three dimensions! Lapsed Next Step(s): Boulders / Rocks (WIP) Walking animation Story Redesign Notes: I had some different ideas about the story and im working on it- redesigned the map a bit! i think ill do more stuff
(v0.0.10(C)-alpha) Story and Map Redesign Changelog: (v0.0.10(C)-alpha) Story + Map Redesigning (2) : So as i am changing the narrative i need to update the map accordingly, A very small update because my mouse stopped wrking but oh well i just changed some textures and added trees. Also making a story narrative in 2nd person ig? Lapsed (v0.0.10(B)-alpha) Story Redesign (1) : Brainstormed a lot of stuff- and rewrote the prologue storyline- the old one was pretty basic i like the new one more and I mostly changed it because i am thinking of the next chapter too and i want a seamless transition- just hang on with me ill cook something truly epic :3 Next Step(s): Boulders / Rocks (WIP) Walking animation Story Redesign (WIP) Notes: OKay today ill lock tf in my exams just finished!
(v0.1.1(A)-alpha) Map Redesign and Improved mechanics! Changelog: (v0.1.1(A)-alpha) Improved Silhouette Mechanics : oh my! it looks so sick! il definitely play test this once more but heres what i did in brief: Previously there used to be different silhouttes but NOW theres only one that “teleports” when u reach it as if guiding you somewhere – to the watchtower :3 Lapsed (v0.0.10(E)-alpha) Map Redesigning (4) : I think i am done with the forest/map layout for now im pretty happy! plugged off some paths that i didnt want the player to go through- removed a ton of legacy code. Next up i think ill work on the silhouette mechanics which i cooked up in the new narrative! wish me luck! Lapsed (v0.0.10(D)-alpha) Story + Map Redesigning (3) : Again one of the shortest lapses i have made but its enough for me to get the 1 hour streak lmao- I promise Ill work honestly from tmrw, Exams finished just today and im exhausted asf- Please excuse me! Made updates to the story too Next Step(s): Watch Tower Model Walking animation Story Redesign Improved Silhouette Mechanics Notes: Holy moly! the silhouette (YES SINGULAR) works wonderfully now! its like its guiding you! im really happy with the result i think ill model the watch tower.
(v0.1.1(E)-alpha) Watch Tower (40%)! Changelog: (v0.1.1(E)-alpha) Watch Tower Modelling (4) : erm so nothing productive just me fixing the HUMONGOUS number of vertices that have been created for god knows what. Lmfao i messed up at the end and i have to go back to the last backup Oh well i have tuitions now will do more stuff later Lapsed (v0.1.1(D)-alpha) Watch Tower Modelling (3) : Ah yes, guess why there is no lapse for this update- thats right! Lookout messed up and I cannot recover the lost footage and publish it in lapse. I lwk forgot what i did in this update 💀 You are gonna guess it (v0.1.1(B&C)-alpha) Watch Tower Modelling (1&2) : Guess who forgot to commit THATS RIGHT ITS ME- In this lapse I made the skeleton of the watch tower that is going to be the main attraction of the prologue. I do not have much time and hence i am ending this session prematurely! See you tmrw! More modelling of the watch tower, made the top thing the uhh room? ig tested the model size with the player size in godot and i found that it was a bit small so i fixed that! Made some windows for the watchtower so that everything is visible Lapsed Next Step(s): Watch Tower Model (WIP) Walking animation Story Redesign Improved Silhouette Mechanics — Notes: Ah yes I lost like 30 minutes of lapse yesterdat cuz lookout servers died oh welp! here i am again!
(v0.1.1(I)-alpha) Watch Tower Modelling (60%)! Changelog: (v0.1.1(I)-alpha) Watch Tower Modelling (7) : Nothing much just edited the fences a bit and resized them in order to prevent overlapping. Oh also I made the roof – needs polishing ik but its a start lmao- i want to complete the modelling as soon as possible lwk- Lapsed (v0.1.1(H)-alpha) Watch Tower Modelling (6) : Yoo moving from vertices selection to something different felt awesome! anyways i made the fence? i think thats what its called- On all four sides. I am following a model for inspiration and im pretty happy on how it is turning out! Lapsed (v0.1.1(G)-alpha) Watch Tower Modelling (5.3) : FINALLY FINALLY! I have completed optimizing the walls of the watch tower. What i mean is I reduced the number of vertices and faces in the model. This will help me immensely while texturing the UV. I created another backup just in case lmao Lapsed (v0.1.1(F)-alpha) Watch Tower Modelling (5.1 + 5.2) : I tried cleaning up the Watch Tower model but idk how it all got messed up anyways I will try again ONE LAST TIME tommorow if it works it works otherwise i have to roll back to the backup and just forget about cleaning up- i messed up yeah Lapsed Next Step(s): Watch Tower Model (WIP) Watch Tower Texture Notes: i NEED to finish modelling this ASAP gng 💀 wish me luck ill be lockin in today 🔥
(v0.1.1(L)-alpha) Watch Tower Modelling (75%)! Changelog: (v0.1.1(L)-alpha) Watch Tower Modelling (9.3) : Joined a lot of meshes together for efficiency and ease of use. Oh also made the raining v1 for the first layer of the stairs. I have my prize distribution and investiture ceremony so yeah! see ya laterrrrr Lapsed (v0.1.1(K)-alpha) Watch Tower Modelling (9.1 + 9.2) : 1. omg omg omg! stairs in progressssss! Made two flights of stairs- what i mean is i made one flight of stairs and then copied it 💀 Anyways I’m almost done with the modelling i think- The stairs and the windows are the only things are left (oh maybe more optimization :p) 2. Added much More stairs and the topmost layer. I will make the integration of the stairs to the floor tommorow, ALSO i will add the railings and all tmrw I am sleepy as frick! Lapsed (v0.1.1(J)-alpha) Watch Tower Modelling (8) : Wow! what a productive session! Ok so a lot of thing was done. Here’s what i did in short: The legs of the watch tower was made before but in this session i added the supports and support beams! i again followed the model as an inspiration and made the supports! Looks prety cool! Lapsed — Next Step(s): Watch Tower Model (WIP) Watch Tower Texture Notes: um holy shit i am doing a 4? or 5 hour devlog 💀 this is unreal! Anyways this is draggin me sooo muchh but i think im super close to finishing this
(v0.1.1(O)-alpha) Watch Tower Modelling (90%)! Changelog: (v0.1.1(O)-alpha) Watch Tower Modelling (10.3) : hell yeah! completed the guard rails– now uhh some more fences are remaining i promise it wil be done very soon im trying my bestttt Lapsed (v0.1.1(N)-alpha) Watch Tower Modelling (10.2) : Made another layer of guard rails beside the stairs - yeah just that 💀 i have no more words to write here Lapsed (v0.1.1(M)-alpha) Watch Tower Modelling (10.1) : I might work again later after coming back from art classes- but im not sure as i have some tuition work to do :( I also have some pending ssignments! yikes!!! anyways here’s what i did: Made the rails of the stairs with some bars - first and second stairs. did some desmos stuff- Lapsed Next Step(s): Watch Tower Model (WIP) Watch Tower Texture Notes: ok i dont really know what to write hereeee nowwww- maybe the next time
(v0.1.2(A)-alpha) Watch Tower Texturing (2%) Changelog: (v0.1.2(A)-alpha) Watch Tower Texturing (1.1) : Yay so i moved on to the texturing part of the watch toweeeeerr. Just made the door for now but I will accelerate the work from tmrw trust Lapsed (v0.1.1(Q)-alpha) Watch Tower Modelling (11) : oh my gosh! im done with the modelling! well i mean i may add the window margins stuff later but yeah! i am now starting the texturing! i made the glass and experimented with some stuff Lapsed (v0.1.1(P)-alpha) Watch Tower Modelling (10.4) : ok i am being for REAL right now. and u HAVe to believe me when i say that i am FInALLY COMPLETE with the freaking fencing stuff i am NOT doing that again 💀 ok now the only thing left is the window panes and THEn i can finally move on to the texture- Lapsed Next Step(s): Watch Tower Model Watch Tower Texture (WIP) Notes: Yooooo so I finally completed the modelling of the watch tower and started texturing it recently. I have some work to do today so idk how long i can code- Ill try my best tho!
(v0.1.2(C)-alpha) Watch Tower Texturing (45%) Changelog: (v0.1.2(A)-alpha) Watch Tower Texturing (1.5) : Yay so i made the Floor section completely- the floor and the uhh supprts ig lol. THis was fun Ill work more tmrw Lapsed (v0.1.2(A)-alpha) Watch Tower Texturing (1.2 + 1.3 + 1.4) : 1. So nothing much to brag about here- I completed texturing the roof. It was pretty easy ngl - anyways I’ll do the UV unwrapping of the walls next ig. 2. So I unwrapped the UV layout of the walls and its Horrible! It will take so much time to manually fix everything lmao. I did like 50% of the unwrapping today NOT THE TEXTURNG BTW! so we will see tmrw! gn. 3. Completed the UV unwrapping of the walls and also the texturing of the walls! the room section of the texturing is done! moving on to the floor and stairs! Lapsed Next Step(s): Watch Tower Model Watch Tower Texture (WIP) Notes: Aww man i couldnt really focus on this project for the last few days i had so much work! had 2 assignments- submitted them today so i think i can focus in more today!!
(v0.1.2(H)-alpha) Watch Tower Texturing (90%) Changelog: (v0.1.2(H)-alpha) Watch Tower Texturing (4.1) : Okay so nothing but I joined a hell lot of meshes and objects- i mean the stairs portion. And then unwrapped the UV this took me some time but i finished it! next imma fix the UV and then COMPLETE this FOR ONCE AND ALL! Lapsed (v0.1.2(G)-alpha) Watch Tower Texturing (3.4) : Ayy so i completed the Leg section of the watch tower! i agree most of the work is uv unwrapping because of the faces and all yk. But yeah! im making progress only the stairs section left ig!!!! Lapsed (v0.1.2(F)-alpha) Watch Tower Texturing (3.3) : Teeny tiny lapse! just combined and unwrapped the support beams- ill prolly texture it tommorw and then move on to the stairs section Lapsed (v0.1.2(E)-alpha) Watch Tower Texturing (3.1+3.2) : Holy smokes! What a productive day! got so so so much done today – So I completed the Legs, and support beams in this lapse so only the cross supports are left! Also blender crashed like 300 times today– i really need the macbook gng i got the signs already! Lapsed (v0.1.2(D)-alpha) Watch Tower Texturing (2) : Oh another milestone i suppose! I completed the UV unwrapping of the fence and also textured it! I dont have any more stuff to talk about gng im so tired and busy nowadays Lapsed —## Next Step(s): Watch Tower Model Watch Tower Texture (WIP GNG ALMOST) Notes:OK LISTEN! LISTEN I swore to @Keyboard that I wont devlog until I have completed the whole texturing BUT its getting too ridiculous not to- im alr at 7 hours and yeah. Also big ass devlog-
(v0.1.4(B)-alpha) Walking on the Watch Tower (Failed) Changelog: (v0.1.4(B)-alpha) Walking on Stairs (2) : Lwk I just messed around for the whole time I literally do not know wht to do at this point I will revisit this tommorow (I dmed my fwend Seb lmao). I tried many methods but i couldnt seem to be able to make this work tho Lapsed (v0.1.4(A)-alpha) Walking on Stairs (1) : Yo gang I tried my to do the stairs walking thing but as you would expect I completely failed lmfAaooo. Uh I really dont know how to move next but ill try my best Lapsed (v0.1.3-alpha) Mountains Texture Fix : So erm as i completed the watch tower im moving on to other thigns– first i saw that this was in my todo for a while so fixed it lol Lapsed (v0.1.2(K)-alpha) Watch Tower Texturing (4.4) : Shalalala sha boinky! I actually finished the (skeleton) of the watch tower model! Omg i dont believe it! I am feeling a large weight off my shoulders lmfao! But hey its not done yet! I have so so so sos os so much more to do- next up ill fix the stair walking and oh a story redesign! Lapsed (v0.1.2(J)-alpha) Watch Tower Texturing (4.3) : Finally completed texturing the stairs – the railings and the beams are still remaining but ill try to do them soon enough 👍 Lapsed (v0.1.2(I)-alpha) Watch Tower Texturing (4.2) : oh my GOD BRO this is so painful i really hope i could do something else to speed this up but yeah idk- So nothing other than UV unwrap stuff NOT EVEN ONE mesh and i have 2 more to go- I am dying :D Lapsed Next Step(s): Watch Tower Model Watch Tower Texture Auto Jump on Stairs Interior Design of the Watch Tower Notes: Gang I tried my best I literally cannot seem to be able to be able to find a way to make the auto jump thing I need to call the big guns now! ( @seb ) Anyways, I obv completed the watch tower texturing
(v0.1.4(G)-alpha) Moving & Jumping on the Stairs (Passed!) Changelog: (v0.1.4(G)-alpha) Player Movement Rework: Auto-jump (5) : Ok i kinda cheesed it ngl- I was literally being ragebaited because it was NOT working any how. I am using a not so beautiful method but hey it works and thats what counts – ill polish it later dw. Lapsed (v0.1.4(F)-alpha) Player Movement Rework: ?? (4) : wtf? what happened? what did i do? this is insane i really dont know………. soo erm climbing stairs doesnt work and there are some pretty bad bugs like being able to fly- lwk i might revert this session Lapsed (v0.1.4(E)-alpha) Player Movement Rework: Noclip (3) : added a pretty peak thing. Ok so added a noclip feature – this is like the spectator mode in minecraft lmfao. Ive been meant to do this for a long time but here i am! finally added this – this will help me a ton i js know it lol Lapsed (v0.1.4(D)-alpha) Player Movement Rework (2) : Yoo so added a bunch of new things such as air friction, acceleration deceleration and more. I am having one tiny bug tho – that is i cannot turn when jumping but dw ill figure out a way to fix it! Also if u forgot Im doing the player rework just to make the autojump thing Lapsed (v0.1.4(C)-alpha) Player Movement Rework (1) : Okay So i realised it wwill be extremely difficult for me to figure it out on my own, and even the big ones ( @seb ) had no freaking idea lmao. SO what i am doing bnow is following a player/fps controller tutorial where they add this autojump feature :3 Lapsed Next Step(s): Watch Tower Model Watch Tower Texture Auto Jump on Stairs (Done but polishing left) Interior Design of the Watch Tower Core Gameplay Notes: These sessions were lwk ragebait – i will NOT talk about the 4th session cuz i have no freaking idea about it. I found a weird way and workaround to do the auto jump. Although it might not be the most beautiful but it works and thats what counts
(v0.1.5-alpha) Better Movement, Stealth & Environment! Changelog: (v0.1.5-alpha) Environment Rework & Jitter Fix : Since i completed the lore/plot finally trust me (not written but thought of) I needed to change the environement a bit kjust to match the vibe i am going for now! it is now a whitish dusk and not pitch black. ALso i think i fixed the jitter thing. Lapsed (v0.1.4(J)-alpha) Player Movement Rework: Crouching (8) : I have completed reworking the player movement for now– next up ill actually focus ont he core gameplay. In this comit/lapse i have added a crouch functionaility and fixed some other logical stuff that im not going deep into Lapsed (v0.1.4(I)-alpha) Player Movement Rework: Area3D (7) : OKsy! so i and @seb figured out a way to fix the issue i talked about in the previous commit/lapse/. The fix was pretty neat! i added an area 3d on the stairs and the smoothing only work iin this area! i also turned off jumping here Lapsed (v0.1.4(H)-alpha) Player Movement Rework: Smoothness (6) : Fixed the erm “smoothing problem” Previously it was hella snappy and awful to look at - now I added a smoothing thing in the _process but uhhh another problem now – the jumping feels floaty and walk is smoothed out :/ Lapsed Next Step(s): Watch Tower Model Watch Tower Texture Auto Jump on Stairs Core Gameplay Rewriting the todos & story (final istg) Notes: Finally thought of a cohesive plot. I do not have much time or energy to make another chapter – so ive decided to merge everything into one gameplay – the prologue. So yeah! we’ll see how it turns out (i have high hopes tho)
(v0.2.5-alpha) Memory/Vestige Chains (Prototype) Changelog: (v0.2.5-alpha) Vestige Chain (4) : Les goo i completed the full chain of vestiges currently they are just cubes but i will def make models for them later! Lapsed (v0.2.4-alpha) Placement + Vestige Chain (3) : Ok i placed all of the vestiges and currently made the animation till the Vestige 4 – 4 moire to go (counting the watchtower). Idk i think i did some other stuff that i prolly forgot lmfao. Lapsed (v0.2.3-alpha) Particle Fix + Vestige Chain (2) : So previously there was this thing that the particles were all dark and glomy cuz of the exposure thing- Fixed that in this lapse/commit. Also i added the 2nd vestige prototype! Lapsed (v0.2.2-alpha) Vestige Chain: Starting (1) : Yay so i started the next priority in the todo list! I started the vestige chain using only a cube lmao! i will model them later – this is the prototype phase Lapsed (v0.2.1-alpha) Vestiges brain storming : So previously there was this thing that the particles were all dark and glomy cuz of the exposure thing- Fixed that in this lapse/commit. Also i added the 2nd vestige prototype! (v0.1.6.3-alpha) Todo Cleanup : Yep so the thing was that I was too disorganized and too overwhelmed. I sat down today and wrote down everything I think i have a clear picture of what I want to do now! (v0.1.6.2-alpha) Rename & Bunker Prototype + Optimization : I renamed everything. I think i said yesterday that The story is now one single cohesive storyline so I renamed everything to match the new thing. Also I made a hole in the ground (for the bunker) and added a mesh just to visualize it lol. Lapsed (v0.1.6.1-alpha) Story + Optimizations : Right so as i mentioned yesterday i had finalized the plot, in this commit/lapse I wrote it down! Oh also I did something that Ive kept in my todo for a long time lol – I optimized the flower and grass models Next Step(s): Rewriting the todos & story Prototype Vestige Chain Bunker prototype Notes: Wow im speeding up here! i actually finished the entire vestiges sequence Next up imma prototype the bunker
(v0.3.3-alpha) Bunker & Interaction Changelog: (v0.3.3-alpha) Player Interaction (2) : Me add raycast to the face of player, poke poke thing, thing cry, raycat know what it did, raycast say name, i hear, i do something; In a nutshell the raycast detects the collider and if its the bench it enables the e to interact thing Lapsed (v0.3.2-alpha) Player Interaction (1) : Set up the basic of the player interaction– ill work on it more tmrw Lapsed (v0.3.1-alpha) Map Positioning (Ending) : Positioned the map so that the dead space is directly below the drop chute- and other fixes and tests Lapsed (v0.2.13-alpha) Bunker: More models & logics (7) : Improved model to include a turn and a drop, finally added more mechanics and animations. The bunker now dissapears if u look away. fixed some other logics Lapsed (v0.2.12-alpha) Bunker: Mechanics; Showing Maps (6) : When player enters the doors closes and then the original map dissapears, you keep walking forward and the secondary map is spawned. As u come out of the other side the tunnel leads you to the secondary map. Lapsed (v0.2.11-alpha) Bunker Prototype: Door Mechanics & Stairs (5) : made the door open and close animations actually happen with the players actions. Also added an AREA3D which allows the stair logic to kick in. Added the map thing but will animation and add the mechanics in the next update! Lapsed (v0.2.10-alpha) Bunker Prototype: Model & Animations (4) : experimented with another map and stuff. Modelled the top portion and added a simple animation for the doors Lapsed (v0.2.9-alpha) Bunker Prototype: Model (3) : completed the bunker modelling – mostly protype rn but yeah! Next up i think imma make the mechanism of the bunker mm Lapsed (v0.2.8-alpha) Weeping Silhouette: Animation (2) : Les goo i finally completed the weeping silhouette thing! Now it explodeds kinda when u go near it and leaves the player stranded they player has to navigate their way into the next parts! Lapsed (v0.2.7-alpha) Weeping Silhouette (1) : modelled the weeping silhouette and placed it where its supposed to- in the next update I’ll add the animations and stuff! Lapsed (v0.2.6-alpha) Bunker Prototype (1+2) : Well i tried making the bunker prototype but erm i didnt realise how tuff this is gonna be skull. I will try again cuz Im so sick to think straight- ill try to do some other thing toda Lapsed Next Step(s): Bunker prototype Ending Bench interaction Notes: Ive almost completed the FULL game sequence! like ik its using prototype things but the core fucntionality is almost done! super excited
(v0.4.1-beta) Ending, Credits n Modeling Changelog: (v0.4.1-beta) Bunker/Tunnel Model & Texturing) : Oh finally! I am finished with the alpha versions and i moved on to the beta stage! In this session I completed modelling and texturing the bunker as well as the tunnel models! Lapsed (v0.3.9-alpha) Placement, Playtesting & Exporting : Oh my! I am really finished with alpha versions! I will be now moving on to the beta stage. In this session I placed trees, playtested and exported for the alpha release. Lapsed (v0.3.8-alpha) Credits (3) : Yippie i completed the credit scene although the “press anmything to conitnue” doesnt work as of now– but ill add it on my todo for later! Lapsed (v0.3.7-alpha) Credits (2) : THe second lapse/commit of me workin on the credits! I am ALMOSt complete i js need one more session to finalize some stuff Lapsed (v0.3.6-alpha) Bug Fixes & Credits (1) : Fixed an annoying bug where the top of the watch tower was affected by the stair aread3d. Now an invisible wall prevents jumping. Also Added the basic Credits scene. Lapsed (v0.3.5-alpha) Bench Camera Animation, Interaction (2,3) : Aha! I think i am really done with the ending animations! Now the E to interact only works when u are looking directly at the bench. I think i might change the blinking animation tho- Lapsed (v0.3.4-alpha) Bench Camera Animation (1) : Right now I’m Adding the animation and controls for the bench interaction and the cut scene. Added some blinking thing and location changes and movement- Will make the cutscene next! Lapsed Next Step(s): Ending Bench interaction Bunker and Tunnel Models Watch Tower Furniture Vestiges Notes: Yesterday I released the alpha version! the 0.3.9, for win, mac as well as linux! I completed my first priority things and i have moved on to the beta!
(v0.4.11-beta) Lantern, & VESTIGESSS Changelog: (v0.4.11-beta) Vestige 7 Model) : FINALLY FIALTLTJkdas I completed all the vestiges! The final one was the mirror and the chair. Im so tried cya Lapsed (v0.4.10-beta) Vestige 6 Model : Made another model– the wheel chair i am trying to complete this first so ill add the more niche things like umbrellas later Lapsed (v0.4.9-beta) Vestige 5 Model : Okay fifth one down! TWO MOREW i repeat 2 MORE- i wanna complete them asap but lets see! This was a pretty challenging one dawg- the piano was insane BUT it looks so good now Lapsed (v0.4.8-beta) Vestige 4 Model : Made the fourth model– the table, chair, cups and the candles! next up is the musical item- idk how i will make the piano but oh well lets see! Lapsed (v0.4.7-beta) Vestige 3 Model (1) : Erm this is the 3rd model that im doing- ik the uv will be fked uop but oh well. Made the tent, wooden logs and the camfire Lapsed (v0.4.6-beta) Vestige 2 Model : Oh god it is so late but yet im pushing it- I did like 30 more minutes im going to eep now- Anyways in this session i made the swing! Only model tho Lapsed (v0.4.5-beta) Vestige 1 Modelling : In this session I just modelled the crib and the teddy as fast as i could- I need to ramp up my speed here- I dont got much time Lapsed (v0.4.4-beta) Hanging Lanterns & Placement : Modelled the hanging lantern and placed it around the map especially the bunker porttions Lapsed (v0.4.3-beta) Lantern Model : In about 2-ish hours i cooked up this absolutely BEAUTIFUL and awesome lantern model. I just have no words– its just perfect! also added some particle effects and yeah! looks pretty cool Lapsed (v0.4.2-beta) Vestige: Pointer : A point at the center of the screen. yes Lapsed Next Step(s): Ending Bench interaction Bunker and Tunnel Models Watch Tower Furniture Vestiges Vestiges animations Notes: Im so so so close to completing this! so I need pick up the pace here! Completed all the vestiges here
(v0.5.4-beta) VESTIGES ARE ALIVE! Changelog: (v0.5.4-beta) Vestige 7 Animation : Les goo! another task checked off from the todo list! Completed all the animations of the vestiges that forms the backbone of the game- This was the final one (on the path). Next lwk i think ill do sound design maybe Lapsed (v0.5.3-beta) Vestige 6 Animation : I got stuck in this session cuz of a simple bug :skul what happened was that the animation player in the wheelchair scene was changing the position of the root and so it messed everything up- Took me a while to solve it lol. Added some movement and wheel rotation. Lapsed (v0.5.2-beta) Vestiges 3,4,5 Animation : I thought i would complete making the animations today but clearly I failed- Oh well I fixed a LOT of things and FULY completete the third forth and fifth vestiges Lapsed (v0.5.1-beta) Vestiges 1,2,3 Animation : Since I completed modelling and texturing the vestiges the only logical next step is to incorporate them into the game, and thats what ive been doing! Integrated the first 3 vestiges and added some simple animations associated w em Lapsed (v0.4.14-beta) Vestige 4,5,6,7 Texturing : Oh my god- Finished all ALL the texturing- I really wanted thisto be finished faster lol. Anyways in the next session I would make the animations and placements of the vestiges! Lapsed (v0.4.13-beta) Vestige 1,2,3 Texturing : Completed texturing vestiges 1, 2 and 3- i.e. the crib the swing and the tent. Were a lot of fun to see the white models come to life lol. I really like how they are turning out Lapsed (v0.4.12-beta) Models Finalizing : Last day I completed modelling all the vestiges and now only the texturing is left. In this session I finalized the models and meshes and next ill texture them! Lapsed Next Step(s): Vestiges Vestiges animations Watch Tower Furniture Sound Effects Notes: Yippie I completed all the vestiges progression and their associated animations! Idk what ill work on next but maybe sound design? idrk tho...
|
1792760023.0626469
|
1793364823.0626469
|
|
44107
|
Pitch by @mincych | Stardance
|
mincych
|
0
|
157.54
|
0
|
[]
|
[{"post_id": 80080, "ts": "202 [{"post_id": 80080, "ts": "2026-10-16T05:40:23Z", "hours": 9.7833, "text": "pure hell of trial and error I am actually unsure if this will even work properly now. But fear not freinds, “BECAUSE I AM HERE” mha reference btw. I will actually take it a bit slow now, and ship in 10 days. Promise, no more delays."}, {"post_id": 79144, "ts": "2026-10-12T20:04:48Z", "hours": 9.1331, "text": "bug fixing session, no exciting updates, the more i think im coming close oto finishing it, more the work remains."}, {"post_id": 75106, "ts": "2026-09-29T04:40:22Z", "hours": 10.2189, "text": "Progres Report Simulated a hand from data in 2d space X axis is found from TDOA cross-correlation Y axis is found from doppler shift and EMA decay integration. -It’s not the best, but it works 70% of the time. The project is almost finished, but i’m not happy with the accuracy, so ill work on making it better. As good as it can be."}, {"post_id": 74329, "ts": "2026-09-27T05:38:08Z", "hours": 11.3422, "text": "#Code is not working. After the last post, I made some changes, and maybe messed up. Now something is wrong and im not able to figure it out. Since no AI is used in this project, this is becoming really hard."}, {"post_id": 73313, "ts": "2026-09-24T20:41:58Z", "hours": 13.1786, "text": "Progress Update Tried moving hand towards and away from laptop at known velocities. Tried to receive doppler shifted audio from the movement of hand. Extracted frequency shift from each tone independently using FFT. Did some more math and started losing my brain because it wasn’t working at the start. Now i’ll fuse methods, and get x and y coordinates for the plane."}, {"post_id": 72339, "ts": "2026-09-22T18:15:44Z", "hours": 6.7961, "text": "#Progress so far played a short pulse first from left speaker alone, then right one. Measured the angles of arrival, then calculated distance of how far apart these speaker and microphones are. This system can be used for any laptop, allowing for a general approach to be taken further. Yea next ill just verify two tone doppler separation."}, {"post_id": 71901, "ts": "2026-09-21T18:54:05Z", "hours": 7.9728, "text": "JUST WAIT FOR THE PROGRESS REPORT A BIT MORE, IM HAVING TROUBLE WITH THIS LAPTOP SPEAKER SEPERATION DETECTION. WHY IS THIS STUFF SO HARD"}, {"post_id": 71407, "ts": "2026-09-20T19:22:26Z", "hours": 15.3811, "text": "I was in the middle of making the distance calculator. So i’ll complete it and post my next devpost explaining it, this time limit of 10h is kinda annoying tbh. lol"}, {"post_id": 70197, "ts": "2026-09-18T18:00:14Z", "hours": 11.1686, "text": "Tried to merge FFT and doppler shift implementations finally Yea….. This is the only thing done in past 10 hours of work, but lemme explain how hard it is. This will be a weird analogy but hear me out. Imagine a robot, it can use sonar to keep a map of things around it and use the change in reflections and finally knows its own change in position. It’s absolute for knowing the surroundings around you, but it drifts overtime. Meanwhile a simple tracker using wheel can tell you change in location. But you can’t get information about surroundings. So they both are merged so that the drifting of sonar is stopped. I’m applying doppler shift in the same way, since it detects only the change, we can use it to correct the positions acquired by FFT implementation. Hope you all get it, ofcourse its not correctly working right now, so i’ll work on it."}, {"post_id": 68475, "ts": "2026-09-15T05:27:53Z", "hours": 21.5444, "text": "Updates : Heres another fun photo actually Actually tested with multiple laptops to see how much differently the same signals behave. A little bit different yes. Tested with 2 other ways just in case they were better. No and kinda?? 2/3 FFT implementation done Yes i am doing that doppler shift thing too now"}, {"post_id": 65776, "ts": "2026-09-11T04:26:53Z", "hours": 8.3614, "text": "Hardware obstacle faced btw heres a cool monster can gun i made in my free time ive been testing with sounds all this time. But i didnt realise that different laptops have different sound systems. Like downwards firing speakers and upwards firing speakers. So i have decided that this wont be able to be made for all laptops. So i definitely will have to create a video for this. lol. Im on fire!"}, {"post_id": 64028, "ts": "2026-09-08T04:24:03Z", "hours": 9.3717, "text": "THIS IS HELL I have nothing new to show, since im still working on the same thing for 2 devposts now. So heres a cool photo Anyway, after successfully implementing this FFT, I’ll move on to integrate doppler shift as well, like those robots that although have a lidar, still have that internal tracking system. Since lidar drifts, the internal tracking system corrects it. Atleast thats the vision. And implementing doppler shift isnt easy AT ALL, atleast for left to right motion. im actually tired of failing and trying some solution without using AI. It would have made it a lot easier but, I’m kinda stupid and egoistic ig?"}, {"post_id": 63139, "ts": "2026-09-06T19:33:16Z", "hours": 9.9097, "text": "Made significant progress on FFT implementation I’m maybe 1/3rd the way to implement FFT ig? This is getting pretty hard. I’m spending most of the time just writing, running and testing the code of this implementation. As it turns out laptops arent really the best at this stuff. And stuff like this being done by actual companies, makes sense now. It’s way too difficult."}, {"post_id": 53968, "ts": "2026-08-24T17:57:15Z", "hours": 6.7728, "text": "Worked more on the implementation of FFT The picture attached is just when there is forward or backward movement of hand, it glows brighter. Cus I tested with doppler shift a little. So, I learnt a few more concepts required to make this. Applied FFT a bit more nicely and neatly. ALSO I LEARNT COMPLEX FFT WHICH IS AMAZING TBH. Yea, so far its just applying what I’m learning. Not easy for a 16 year old to do college shit."}, {"post_id": 51177, "ts": "2026-08-20T17:57:49Z", "hours": 6.6025, "text": "Implemented a basic distance detector using laptop speaker and microphones Tbh all these difficult concepts, you understand them, do their maths, and then boom, you just implement it using a library. WHY DID I SPEND SO MUCH TIME UNDERSTANDING THEM IN THE FIRST PLACE. I AM A 16 YEAR OLD, ITS REALLY HARD FOR ME TO UNDERSTAND COLLEGE LEVEL SIGNAL PROCESSING, I STILL HAVE FFT AND TO UNDERSTAND!!!! anyway I’ve been working on a project that basically sees without seeing. So far, i’ve understood concepts like convolution, sampling rate, correlation, stuff to basically find a sound we want from a sample. I then wrote a code to send out a linear increasing list of frequencies from 10000 to 15000. Then do a convolution of the recieved sound with the target sample to detect where in the recieved sound lies the target sample."}]...
|
Title: Pitch by @mincych | Stardance
Devlogs:
Imp Title: Pitch by @mincych | Stardance
Devlogs:
Implemented a basic distance detector using laptop speaker and microphones Tbh all these difficult concepts, you understand them, do their maths, and then boom, you just implement it using a library. WHY DID I SPEND SO MUCH TIME UNDERSTANDING THEM IN THE FIRST PLACE. I AM A 16 YEAR OLD, ITS REALLY HARD FOR ME TO UNDERSTAND COLLEGE LEVEL SIGNAL PROCESSING, I STILL HAVE FFT AND TO UNDERSTAND!!!! anyway I’ve been working on a project that basically sees without seeing. So far, i’ve understood concepts like convolution, sampling rate, correlation, stuff to basically find a sound we want from a sample. I then wrote a code to send out a linear increasing list of frequencies from 10000 to 15000. Then do a convolution of the recieved sound with the target sample to detect where in the recieved sound lies the target sample.
Worked more on the implementation of FFT The picture attached is just when there is forward or backward movement of hand, it glows brighter. Cus I tested with doppler shift a little. So, I learnt a few more concepts required to make this. Applied FFT a bit more nicely and neatly. ALSO I LEARNT COMPLEX FFT WHICH IS AMAZING TBH. Yea, so far its just applying what I’m learning. Not easy for a 16 year old to do college shit.
Made significant progress on FFT implementation I’m maybe 1/3rd the way to implement FFT ig? This is getting pretty hard. I’m spending most of the time just writing, running and testing the code of this implementation. As it turns out laptops arent really the best at this stuff. And stuff like this being done by actual companies, makes sense now. It’s way too difficult.
THIS IS HELL I have nothing new to show, since im still working on the same thing for 2 devposts now. So heres a cool photo Anyway, after successfully implementing this FFT, I’ll move on to integrate doppler shift as well, like those robots that although have a lidar, still have that internal tracking system. Since lidar drifts, the internal tracking system corrects it. Atleast thats the vision. And implementing doppler shift isnt easy AT ALL, atleast for left to right motion. im actually tired of failing and trying some solution without using AI. It would have made it a lot easier but, I’m kinda stupid and egoistic ig?
Hardware obstacle faced btw heres a cool monster can gun i made in my free time ive been testing with sounds all this time. But i didnt realise that different laptops have different sound systems. Like downwards firing speakers and upwards firing speakers. So i have decided that this wont be able to be made for all laptops. So i definitely will have to create a video for this. lol. Im on fire!
Updates : Heres another fun photo actually Actually tested with multiple laptops to see how much differently the same signals behave. A little bit different yes. Tested with 2 other ways just in case they were better. No and kinda?? 2/3 FFT implementation done Yes i am doing that doppler shift thing too now
Tried to merge FFT and doppler shift implementations finally Yea….. This is the only thing done in past 10 hours of work, but lemme explain how hard it is. This will be a weird analogy but hear me out. Imagine a robot, it can use sonar to keep a map of things around it and use the change in reflections and finally knows its own change in position. It’s absolute for knowing the surroundings around you, but it drifts overtime. Meanwhile a simple tracker using wheel can tell you change in location. But you can’t get information about surroundings. So they both are merged so that the drifting of sonar is stopped. I’m applying doppler shift in the same way, since it detects only the change, we can use it to correct the positions acquired by FFT implementation. Hope you all get it, ofcourse its not correctly working right now, so i’ll work on it.
I was in the middle of making the distance calculator. So i’ll complete it and post my next devpost explaining it, this time limit of 10h is kinda annoying tbh. lol
JUST WAIT FOR THE PROGRESS REPORT A BIT MORE, IM HAVING TROUBLE WITH THIS LAPTOP SPEAKER SEPERATION DETECTION. WHY IS THIS STUFF SO HARD
#Progress so far played a short pulse first from left speaker alone, then right one. Measured the angles of arrival, then calculated distance of how far apart these speaker and microphones are. This system can be used for any laptop, allowing for a general approach to be taken further. Yea next ill just verify two tone doppler separation.
Progress Update Tried moving hand towards and away from laptop at known velocities. Tried to receive doppler shifted audio from the movement of hand. Extracted frequency shift from each tone independently using FFT. Did some more math and started losing my brain because it wasn’t working at the start. Now i’ll fuse methods, and get x and y coordinates for the plane.
#Code is not working. After the last post, I made some changes, and maybe messed up. Now something is wrong and im not able to figure it out. Since no AI is used in this project, this is becoming really hard.
Progres Report Simulated a hand from data in 2d space X axis is found from TDOA cross-correlation Y axis is found from doppler shift and EMA decay integration. -It’s not the best, but it works 70% of the time. The project is almost finished, but i’m not happy with the accuracy, so ill work on making it better. As good as it can be.
bug fixing session, no exciting updates, the more i think im coming close oto finishing it, more the work remains.
pure hell of trial and error I am actually unsure if this will even work properly now. But fear not freinds, “BECAUSE I AM HERE” mha reference btw. I will actually take it a bit slow now, and ship in 10 days. Promise, no more delays....
|
1792572841.2805002
|
1793177641.2805002
|
|
87
|
Pterodactyl Panel (Android App) by @stefdp | Stard Pterodactyl Panel (Android App) by @stefdp | Stardance...
|
stefdp
|
1
|
157.29
|
1608
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T14:34:43Z", "hours": 106.0, "multiplier": 15.23, "payout": 1608, "blessing": "neutral", "text": "For rating & testing the project, please first read all of the text in the release. I made an Android app to manage your self-hosted Pterodactyl Panel instance (Currently only the client side, later I’ll also add the admin side). For who doesn’t know, Pterodactyl Panel is a panel usually used to manage game servers, but it can run anything, each server is just a docker container. The most challenging part was prob downloading files, and it still confuses me tbh because on the Android Studio emulator it works fine, but when if I try it on my actual phone (Samsung A55 5G) it randomly stops after a few seconds and I can’t seem to understand why", "repo": "https://git.stefdp.com/Stef/Pterodactyl-Panel-Android-App", "demo": "https://git.stefdp.com/Stef/Pterodactyl-Panel-Android-App/releases/latest"}]...
|
[{"post_id": 55643, "ts": "202 [{"post_id": 55643, "ts": "2026-08-27T16:32:55Z", "hours": 2.5833, "text": "Added updated checking For F-Droid flavor it doesn’t do anything For APK flavor it checks my git repo For Play Store flavor it uses play store com.google.android.play:app-update library Updated the app site, available at https://ptero.stefdp.com Updated the changelog & app images in the fastlane folder Added an animation when switching between loading states with circular loading"}, {"post_id": 55485, "ts": "2026-08-27T11:17:55Z", "hours": 1.5147, "text": "Added optional biometric authentication so people can lock their app behind phone code or biometric verification (like fingerprint etc.)"}, {"post_id": 54826, "ts": "2026-08-25T23:53:13Z", "hours": 3.245, "text": "Created nests, nest & nest egg screens For nest egg screen, created 3 tabs: Configuration Variables Install Script it was pretty easy and quick to create those cuz they’re read-only as there’s no API endpoint to edit/delete them Added a back handler in the tabbed screens so that back button now goes to the previous tab instead of the entire previous screen In the client servers screen added a switch to see others’ server (admin only) Fixed capitalization in the getNestEgg function ( eggid -> eggId )"}, {"post_id": 54513, "ts": "2026-08-25T15:20:42Z", "hours": 2.9808, "text": "Created users & user screen Updated the AGP (Android Gradle Plugin) Table headers now properly support multi line text (previously if one text was multiline while everything else wasn’t, all the divider would have a gap on the bottom except for the multiline one) In the client server screen, settings tab the UUID is now aligned to the right Improved screen change when deleting a server/node/user/location (instead of navController.popBackStack() (which basically acts as the back button) i specifically navigate to generic screen (eg. “user” -> “users”) and remove current screen from the back history so in the case that there is no screen to back into (eg if the app is opened via a deep link or stuff like that) it will go to the generic tab anyway) Added pull to refresh in the location screen"}, {"post_id": 53949, "ts": "2026-08-24T17:33:07Z", "hours": 1.9753, "text": "Created server manage tab (only reinstall & suspend/unsuspend cuz there seem to be no API endpoint to toggle install status & transfer) Created server delete tab Added 2 new button types, SUCCESS (green) and WARNING (yellow) In the admin server screen now most tabs are hidden whent he server is installing"}, {"post_id": 53378, "ts": "2026-08-23T22:08:42Z", "hours": 1.3206, "text": "Created the admin server databases tab (it only supports resetting the password and deleting the databases because for creating a database i need the hosts IDs, which there seem to be no API endpoint to get them) Added a modifier param to the Container component In the client server screen added a param to directly switch to the databases tab (this is used when the user goes from the admin server screen to the client server screen) Fixed “Missing Server ID” notification when client server is opened with databases tab as first tab"}, {"post_id": 52489, "ts": "2026-08-22T17:05:09Z", "hours": 1.9144, "text": "Created the server startup tab Changed the way Container components are spaced in the Build Configuration tab and create server popup In the create server popup disabled the docker image select when only 1 image is available"}, {"post_id": 52173, "ts": "2026-08-22T08:15:57Z", "hours": 4.4989, "text": "Created server screen with its: About tab Details tab Build Configuration tab Fixed pull to reload, it was updating the refreshIndex variable before the main resource actually refreshed and this caused the tabs not to refresh unless the user pulled to refresh twice CodeText component now uses default text style & font weight instead of pre-defined ones (for some reasons with pre-defined ones, in the ScrollableTabRow component it adds like a margin on the bottom of the blue active indicator) Updated UpdateServerDetailsBody to mark required fields as non-nullable In the server owner select, fixed the selected user disappearing if it was not in the search results In the allocation selects: Made the UI use alias:port when an alias is available, otherwise will default to ip:port Moved the ip:port text to a variable to avoid writing the same thing twice"}, {"post_id": 50274, "ts": "2026-08-19T13:03:15Z", "hours": 2.3186, "text": "Added server creation Added a searchable property in the Select component that adds a text input to filter the options Created a regex to check node & server names"}, {"post_id": 49934, "ts": "2026-08-18T22:04:46Z", "hours": 1.0625, "text": "All *Include enums are now chainable so doing ListNodesQueryInclude.SERVERS + ListServersQueryInclude.USER returns servers.user Also now instead of <enum>.toQueryString(...) (like ListServersQueryInclude.toQueryString(...) ) i do listOf(...).toQueryString() Used the new include enum chaining in 2 places: node servers tab: it now makes way less HTTP requests since the user, nest & egg are directly returned with the server, saving me from making multiple HTTP requests to fetch all users, nests & eggs (which would’ve taken a long time on a large server that for example has thousands of users, since it was fetching at a rate of 50 users per HTTP request, and it being a mobile app, internet might not be fast too) servers screen, now it fetches the egg variable together with the nest instead of having to fetch the egg’s data Moved ApiErrorResponse in a models folder for better organization this is a code only change so ig i’ll show pics of the code"}, {"post_id": 49856, "ts": "2026-08-18T20:07:04Z", "hours": 5.0992, "text": "Created the servers screen (WIP, inputs are untested and creating servers is not implemented yet) Created node servers tab Added pagination to the list nests HTTP request response Removed useless reset of the allocations in the node allocations tab In the created node popup, switched some inputs description from \"quoted\" test to actual inline code blocks CodeText component now uses CharSequence instead of String so it also supports annotated strings Switched main components from Text to CodeText Application server status is now an enum Updated list nests query to include eggs variables too (i just found out i can do this so i’m gonna prob do in in all the other ones in the next devlog too)"}, {"post_id": 48195, "ts": "2026-08-16T14:20:45Z", "hours": 4.3858, "text": "Created the node allocations tab The servers screen now shows the server description when available The 2FA check now considers 2FA as enabled even if the status code is 400 other than checking the error message (ptero got no way of knowing if 2FA is enabled other than that ) Update the TextInput component to allow showing optional suggestions (used in the assign new allocations popup, IP Address input) The Checkbox component now is more transparent when disabled (from 0.5 to 0.2 alpha) Changed how padding works in the Pager component Updated the Table component to add a param to disable lazy loading (for some reason it was laggier) Updated the libs"}, {"post_id": 47489, "ts": "2026-08-15T13:07:23Z", "hours": 2.2333, "text": "Created the node configuration tab Renamed the CodeText component to CodeBlockText and added params to highlight the content with a specific language Created the CodeText component to have both normal text and inline code text (kinda like markdown when you do this )"}, {"post_id": 47046, "ts": "2026-08-14T17:23:43Z", "hours": 1.6747, "text": "Create the settings tab in the node screen Added enabled state to all the inputs & switches in the create node popup Updated the updateNode function’s body & params since some required params were marked as nullable"}, {"post_id": 46843, "ts": "2026-08-14T11:23:01Z", "hours": 2.9253, "text": "Created the node screen & its about tab Moved node specific endpoints to their own ApiService instead of having them in the ApplicationApiService and added 2 endpoints to respectively fetch system data in v1 and v2 Made it so create new node button is disabled until all locations are fetched"}, {"post_id": 45978, "ts": "2026-08-12T20:16:10Z", "hours": 2.9544, "text": "Created the popup to create a node When fetching the node lists, now it also fetches all the locations (needed for a select in the create popup) Added fastlane metadata (will be used for F-Droid in the future) The Popup component now has a scrollbar Updated the scrollbar so now it only shows up when the container has enough contents to be scrollable Added an arrangement property in the Table ’s headers & row cells so that i can center certain things Updated TextInput and Switch components to make their description text color customizable Updated the workflow to automatically push the .aab file to play store after it’s built and made the release (hopefully, i didn’t test it) Fixed create location popup not clearing the inputs upon closing"}, {"post_id": 45461, "ts": "2026-08-11T23:00:38Z", "hours": 0.5592, "text": "Fixed admins not being able to manage servers subusers’ permissions Fixed not being aple to open sub-directories in the file browser Fixed create location popup not closing after creating the location"}, {"post_id": 45335, "ts": "2026-08-11T18:39:18Z", "hours": 1.6944, "text": "Created nodes screen (missing the popup to create a node for now) App name is now dynamically generated in the build.gradle.kts file (so debug build get the (Debug) suffix) Added an HTTP endpoint to check a node status"}, {"post_id": 45109, "ts": "2026-08-11T11:53:58Z", "hours": 0.4881, "text": "Created a CodeText component to display text as code (kinda like this ) and applied it in all the places where I previously just copy pasted same code Creating an API key now copies the key to the clipboard"}, {"post_id": 45061, "ts": "2026-08-11T10:17:04Z", "hours": 5.8633, "text": "Created the locations screen Created the location screen Took and modified to adapt to this app the Table component, originally from my Zipline app Fixed the pull to refresh, when calling onRefresh it didn’t actually set isRefreshing to true so the spinner would immediately disappear instead of swithcing to the spinner state till it finished loading Removed the page property from functions since the page is already stored in the viewModel so it made no sense to retrieve it from the viewModel just to send it to a function in the viewModel Fixed the formatDate function, it was crashing the app on older Android versions (<= 13) because the date time parser couldn’t understand the timezone (it expected a date like 2026-08-08-T15:43:30Z instead of 2026-08-08-T15:43:30+02:00 ) Added a new primary color variant that looks good enough on light bgs Fixed some multi-line TextInput s being marked as singleLine"}, {"post_id": 42647, "ts": "2026-08-07T14:13:23Z", "hours": 0.4458, "text": "Fixed the pull to refresh box having incorrect padding, so the circle was being hidden by the header and by the time it was out, it was already fully pulled and so it would refresh Updated the README also did some tests with downloading but i failed so i just undid them without committing or anything"}, {"post_id": 42285, "ts": "2026-08-06T22:21:15Z", "hours": 2.0292, "text": "Created a website for the app & a privacy policy (that was needed for the play store app), it’s available at https://ptero.stefdp.com Added a prompt to request the notification permission in the login screen and a button in the settings in case you want to enable notification in a second moment Improved the eventDescription variable in the ActivityDisplay component (i didn’t even know that was possible, i found it out cuz i made a _count variable and android studio suggested me to put it directly in the when , lmao) Updated versioning to follow SemVer ( 1.0 -> 1.0.0 )"}, {"post_id": 41895, "ts": "2026-08-06T12:09:27Z", "hours": 3.0606, "text": "in the account settings screen added a tab for the app settings Fixed some activity log event having incorrect names and causing the app to crash Added an action to build the app when the commit is prefixed with [build] or [release] Moved the *Scrollbar modifiers above any padding modifier so they look better Switch ScrollableTabRow to a normal Row instead of LazyRow since it’ll never have enough items to cause any lag Updated the README Removed the admin input in the login screen since it’s currently not available"}, {"post_id": 41497, "ts": "2026-08-05T19:00:04Z", "hours": 1.0289, "text": "In the account settings screen created the activity tab (i think i finished all the client side of the app , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that) Moved ActivityDisplay in the general components as it’s used in the accoutn activity too Updated ActivityDisplay to include the user agent button when available"}, {"post_id": 41417, "ts": "2026-08-05T16:42:56Z", "hours": 0.65, "text": "In the account settings screen added the SSH Keys tab (basically a almost full copy paste of the API Credentials for the frontend) Fixed capitalization of a variable & function in the api key tab"}, {"post_id": 41037, "ts": "2026-08-04T23:29:22Z", "hours": 2.9483, "text": "In the account settings screen created the API credentials tab Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab). Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name ) Applied same changes as above to the account settings screen Updated the formatDate function to include a param to toggle the year in the date"}, {"post_id": 40669, "ts": "2026-08-04T11:04:30Z", "hours": 5.4211, "text": "Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done ) in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added Now each warning popup in the server screen has its own icon instead of all using the suspended icon in all places, replaced refreshIndex += 1 with refreshIndex++ The app now no longer shows “Missing Server ID” toast as soon as you open a server Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded (without /disable it acts as enable endpoint)) Fixed get qr code response as it was different from what the API docs listed In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on … shitty API fr) Added a simple regex to parse emails (so the change email button is enabled only if this regex passes) Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page) Same as above for the server screen activity tab (jusy 25 logs per page) Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages ( .total ) instead of the total number of pages ( .totalPages ), idk how i missed that ) Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret"}, {"post_id": 39547, "ts": "2026-08-02T15:55:34Z", "hours": 5.2503, "text": "Created the activity tab (finally finished all server tabs :D) along with a function to parse the variables in the logs’ description Improved loading for schedules, backup and databases tabs Fixed JSON text highlighting not highlighting strings inside of arrays Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components In the settings tab added a popup to confirm the reinstallation of the server Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it Renamed AccountActivity to ActivityLog as it’s used in server activity too Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid ) add .trim() to all user inputs Now tabs refresh only when the server ID changes instead of anything in the server object"}, {"post_id": 39101, "ts": "2026-08-01T20:10:32Z", "hours": 4.3317, "text": "Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place Added the pull to refresh gesture to servers list & server details screens Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that) In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.) The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge) The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times Moved StartupContainer to a more general Container Moved ServerStatus enum to Server.Status Removed navController from all tabs as it was unused"}, {"post_id": 38795, "ts": "2026-08-01T11:14:01Z", "hours": 2.0736, "text": "Created the startup tab Made startup variable description nullable as it’s an optional property"}, {"post_id": 38468, "ts": "2026-07-31T21:10:19Z", "hours": 0.7469, "text": "Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes Doubled hamburger menu icon left padding to match the avatar padding on the right Doubled the gaps between the cards in the backups & network tabs Halved the gaps between the cards in the schedules tab I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back"}, {"post_id": 38370, "ts": "2026-07-31T18:28:20Z", "hours": 1.9514, "text": "Added the network tab to manage server allocations Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀) Fixed allocation endpoints using String instead of Long Moved backup popups outside of the padded Column Updated my github username in the readme"}, {"post_id": 36009, "ts": "2026-07-27T20:28:50Z", "hours": 0.4436, "text": "After i tested more the additions of the last devlog i found some issues so here i fixed them Fixed backups downloading as .gz instead of .tar.gz Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all) Disabled inputs in the restore & create popups when respectively restoring and creating Removed the enabled param in the BackupDisplay as it was basically useless"}, {"post_id": 35992, "ts": "2026-07-27T19:54:26Z", "hours": 4.4839, "text": "Finished the users tab Made the backups tab Made all popup’s horizontal padding equal When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list Disabled the “Create Database” button when at the limit Renamed File to FileDisplay for consistency with other components Fixed edit & create user body still using String instead of ServerSubuser.Permission Fixed the deleteServerBackup function which was marked as GET instead of DELETE Made the truncate param required in the restoreServerBackup function as it’s required in the API"}, {"post_id": 34673, "ts": "2026-07-25T16:12:15Z", "hours": 5.4628, "text": "Started making the users tab but it’s really WIP, none of the buttons except create new user works) Handled subuser permissions for all current tabs Added a LabeledCheckbox component Removed some function params that were pointless to have Installed the Gravatar SDK for the subusers’ avatar I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine"}, {"post_id": 34147, "ts": "2026-07-24T17:24:53Z", "hours": 3.77, "text": "Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.) Added a function to convert ISO date strings in human-readable strings Added a missing endpoint to execute a schedule Added a missing only_when_online property in the ServerSchedule data class Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs) Fixed ScrollableTabRow not using all the horizontal space when in landscape mode"}, {"post_id": 33800, "ts": "2026-07-24T00:56:20Z", "hours": 2.5242, "text": "Finished the UI side of the schedule details popup (still WIP for backend like button handling) Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files Changed task action from a normal screen to an enum Took the formatDate function from my Zipline app"}, {"post_id": 33067, "ts": "2026-07-22T17:17:14Z", "hours": 4.2242, "text": "Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management) Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one Improved code layout by using return s in some places instead of many if else blocks Fixed ScrollableTabRow component improperly placing icons when there was no text Moved ‘linked’ data class es inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits"}, {"post_id": 32681, "ts": "2026-07-22T00:08:40Z", "hours": 5.6317, "text": "Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw Added the databases tab with handling for creation, deletion and rotation of the password Fixed rotateServerDatabasePassword and deleteServerDatabase , they were using the wrong endpoint ( /server instead of /servers ) Made each tab independently scrollable instead of making the parent component scrollable Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that) Changed the Notification object component’s background color"}, {"post_id": 31859, "ts": "2026-07-20T16:06:12Z", "hours": 2.1247, "text": "FInished file handling (handled edit & save files & create new file) Added file highlighting for .env files Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string) Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag"}, {"post_id": 31721, "ts": "2026-07-20T10:47:03Z", "hours": 2.645, "text": "Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file) Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace On the login screen i disabled the application api key input till the admin side is actually done"}, {"post_id": 31407, "ts": "2026-07-19T19:00:46Z", "hours": 4.4347, "text": "(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB) In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive Filled the File component’s “more actions” menu (before it was empty) Updated uploadServerFiles to be able to upload multiple files at once Added a function to convert linux string permissions (like drwxr-xr-x ) to int/octal (like 755 ) Added a regex for the linux int/octal permission Took the Popup component and Storage object form my Zipline app Updated the SecureStorage class to add the file download folder variable"}, {"post_id": 30962, "ts": "2026-07-18T23:42:06Z", "hours": 2.1631, "text": "Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn) Created a File component to avoid repeating same code Added a new color surfaceContainer used in notifications Took the “More Actions” component from my Zipline app Took the “Checkbox” component from my Zipline app and modified it to be toggleable In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)"}, {"post_id": 30840, "ts": "2026-07-18T19:40:14Z", "hours": 3.5069, "text": "Added charts to the console tab of the server screen Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting Created a component for the chart container & top scrollbar to avoid repetition Added AI declaration in the readme cuz i only found out now that it’s required Removed a double new line the Button component"}, {"post_id": 29863, "ts": "2026-07-17T00:51:22Z", "hours": 3.43, "text": "Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity) The server screen itself is WIP as it’s missing the buttons to switch between the sections The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O) (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep ) Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)"}, {"post_id": 29055, "ts": "2026-07-15T18:23:36Z", "hours": 2.9633, "text": "Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header) Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display Also suspended servers’ names now are grayed out Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭) Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list Created a object to easily access the WebSocketManager from a ViewModel class Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished"}, {"post_id": 28568, "ts": "2026-07-14T21:58:36Z", "hours": 3.9736, "text": "Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage) Added pterodactyl panel colors to be used in the server status (red, green and yellow) Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl , then after it threw an error i googled it and realized i just had to put . ) Updated getServerResources response class, now the server state uses a enum instead of a generic string Updated Server class to better fix some typed and add 1 missing key Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭 Improved login process to handle the case when the user logged with just an application api key and not a client one Added application API key validation for the same reason as the login Took shimmerable modifier from my Zipline app to make skeleton loading Added definitions & placeholders for all screens until i make them"}, {"post_id": 28257, "ts": "2026-07-14T12:33:25Z", "hours": 2.8692, "text": "Created Loading and Login Screen After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login"}, {"post_id": 27777, "ts": "2026-07-13T17:06:27Z", "hours": 2.8914, "text": "Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars) (except for the download* ones, i took those from my other app Zipline) I also took the Transfer Service from my Zipline app Updated all the libraries Set target SDK to 37 (Android 17) now i gotta do the frontend part"}, {"post_id": 27272, "ts": "2026-07-12T18:21:50Z", "hours": 0.7419, "text": "Finished creating the methods to call the application API (basically just copy pasted same code and changed the method & the fuction vars) Now i gotta make the same thing for the client API"}, {"post_id": 27163, "ts": "2026-07-12T14:07:41Z", "hours": 1.4042, "text": "Started creating methods to call the API endpoints easily Took the Header component from one of my other apps"}, {"post_id": 26528, "ts": "2026-07-11T12:05:14Z", "hours": 0.8058, "text": "Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app) Added some util modules that i also use in my other apps Created an empty login screen"}, {"post_id": 26500, "ts": "2026-07-11T10:27:23Z", "hours": 0.9733, "text": "I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now Added the WebSocket handling (untested) Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6"}, {"post_id": 26100, "ts": "2026-07-10T18:05:31Z", "hours": 0.6336, "text": "Finished adding the application API HTTP requests (added application/servers/{serverId}/databases , application/nests and application/nests/{nestId}/eggs ) Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭 you can see them in the commit here even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts"}, {"post_id": 26051, "ts": "2026-07-10T17:14:07Z", "hours": 2.1628, "text": "Added more application API HTTP requests (all the application/nodes/{nodeId}/allocations , application/locations and application/servers endpoints) you can see them in the commit here"}, {"post_id": 21431, "ts": "2026-07-03T11:41:26Z", "hours": 2.1569, "text": "Added more application API HTTP requests (all the /application/user and /application/nodes endpoints) you can see them in the commit here"}, {"post_id": 7486, "ts": "2026-06-12T14:24:53Z", "hours": 1.1056, "text": "Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys) Fixed some wrong or missing types Finished adding the HTTP requests for the client API Started adding the HTTP requests for the application API"}, {"post_id": 7451, "ts": "2026-06-12T12:46:34Z", "hours": 1.6653, "text": "Added more HTTP requests (ngl am too lazy to list them all, just watch them in the commit here )"}, {"post_id": 4342, "ts": "2026-06-07T16:58:23Z", "hours": 4.2092, "text": "Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations…. anyway i added: GET /api/client/account/activity GET /api/client/account/ssh-keys POST /api/client/account/ssh-keys POST /api/client/account/ssh-keys/remove GET /api/client/servers/{identifier} GET /api/client/servers/{identifier}/resources POST /api/client/servers/{identifier}/command POST /api/client/servers/{identifier}/power GET /api/client/servers/{identifier}/databases POST /api/client/servers/{identifier}/databases POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier} GET /api/client/servers/{identifier}/files/list GET /api/client/servers/{identifier}/files/contents GET /api/client/servers/{identifier}/files/download POST /api/client/servers/{identifier}/files/write POST /api/client/servers/{identifier}/files/create-folder POST /api/client/servers/{identifier}/files/copy PUT /api/client/servers/{identifier}/files/rename POST /api/client/servers/{identifier}/files/compress POST /api/client/servers/{identifier}/files/decompress POST /api/client/servers/{identifier}/files/delete GET /api/client/servers/{identifier}/files/upload POST /api/client/servers/{identifier}/files/chmod GET /api/client/servers/{identifier}/schedules GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{identifier}/schedules POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier} DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} Writing all these took alot of time"}, {"post_id": 3759, "ts": "2026-06-06T20:13:46Z", "hours": 1.5667, "text": "Started adding some HTTP requests typedef, still missing alot tho for now i added: GET /api/client GET /api/client/permissions GET /api/client/account GET /api/client/account/two-factor POST /api/client/account/two-factor (enable) POST /api/client/account/two-factor (disable) PUT /api/client/account/email PUT /api/client/account/password GET /api/client/account/api-keys DELETE /api/client/account/api-keys/{identifier} POST /api/client/account/api-keys no frontend yet, i’m doing the backend first"}, {"post_id": 3611, "ts": "2026-06-06T16:44:59Z", "hours": 0.7236, "text": "Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now) now working on writing the code for HTTP requests to the pterodactyl API and their response types"}]...
|
Title: Pterodactyl Panel (Android App) by @stefdp Title: Pterodactyl Panel (Android App) by @stefdp | Stardance
Devlogs:
Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now) now working on writing the code for HTTP requests to the pterodactyl API and their response types
Started adding some HTTP requests typedef, still missing alot tho for now i added: GET /api/client GET /api/client/permissions GET /api/client/account GET /api/client/account/two-factor POST /api/client/account/two-factor (enable) POST /api/client/account/two-factor (disable) PUT /api/client/account/email PUT /api/client/account/password GET /api/client/account/api-keys DELETE /api/client/account/api-keys/{identifier} POST /api/client/account/api-keys no frontend yet, i’m doing the backend first
Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations…. anyway i added: GET /api/client/account/activity GET /api/client/account/ssh-keys POST /api/client/account/ssh-keys POST /api/client/account/ssh-keys/remove GET /api/client/servers/{identifier} GET /api/client/servers/{identifier}/resources POST /api/client/servers/{identifier}/command POST /api/client/servers/{identifier}/power GET /api/client/servers/{identifier}/databases POST /api/client/servers/{identifier}/databases POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier} GET /api/client/servers/{identifier}/files/list GET /api/client/servers/{identifier}/files/contents GET /api/client/servers/{identifier}/files/download POST /api/client/servers/{identifier}/files/write POST /api/client/servers/{identifier}/files/create-folder POST /api/client/servers/{identifier}/files/copy PUT /api/client/servers/{identifier}/files/rename POST /api/client/servers/{identifier}/files/compress POST /api/client/servers/{identifier}/files/decompress POST /api/client/servers/{identifier}/files/delete GET /api/client/servers/{identifier}/files/upload POST /api/client/servers/{identifier}/files/chmod GET /api/client/servers/{identifier}/schedules GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{identifier}/schedules POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier} DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} Writing all these took alot of time
Added more HTTP requests (ngl am too lazy to list them all, just watch them in the commit here )
Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys) Fixed some wrong or missing types Finished adding the HTTP requests for the client API Started adding the HTTP requests for the application API
Added more application API HTTP requests (all the /application/user and /application/nodes endpoints) you can see them in the commit here
Added more application API HTTP requests (all the application/nodes/{nodeId}/allocations , application/locations and application/servers endpoints) you can see them in the commit here
Finished adding the application API HTTP requests (added application/servers/{serverId}/databases , application/nests and application/nests/{nestId}/eggs ) Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭 you can see them in the commit here even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts
I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now Added the WebSocket handling (untested) Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6
Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app) Added some util modules that i also use in my other apps Created an empty login screen
Started creating methods to call the API endpoints easily Took the Header component from one of my other apps
Finished creating the methods to call the application API (basically just copy pasted same code and changed the method & the fuction vars) Now i gotta make the same thing for the client API
Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars) (except for the download* ones, i took those from my other app Zipline) I also took the Transfer Service from my Zipline app Updated all the libraries Set target SDK to 37 (Android 17) now i gotta do the frontend part
Created Loading and Login Screen After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login
Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage) Added pterodactyl panel colors to be used in the server status (red, green and yellow) Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl , then after it threw an error i googled it and realized i just had to put . ) Updated getServerResources response class, now the server state uses a enum instead of a generic string Updated Server class to better fix some typed and add 1 missing key Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭 Improved login process to handle the case when the user logged with just an application api key and not a client one Added application API key validation for the same reason as the login Took shimmerable modifier from my Zipline app to make skeleton loading Added definitions & placeholders for all screens until i make them
Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header) Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display Also suspended servers’ names now are grayed out Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭) Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list Created a object to easily access the WebSocketManager from a ViewModel class Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished
Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity) The server screen itself is WIP as it’s missing the buttons to switch between the sections The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O) (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep ) Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)
Added charts to the console tab of the server screen Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting Created a component for the chart container & top scrollbar to avoid repetition Added AI declaration in the readme cuz i only found out now that it’s required Removed a double new line the Button component
Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn) Created a File component to avoid repeating same code Added a new color surfaceContainer used in notifications Took the “More Actions” component from my Zipline app Took the “Checkbox” component from my Zipline app and modified it to be toggleable In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)
(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB) In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive Filled the File component’s “more actions” menu (before it was empty) Updated uploadServerFiles to be able to upload multiple files at once Added a function to convert linux string permissions (like drwxr-xr-x ) to int/octal (like 755 ) Added a regex for the linux int/octal permission Took the Popup component and Storage object form my Zipline app Updated the SecureStorage class to add the file download folder variable
Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file) Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace On the login screen i disabled the application api key input till the admin side is actually done
FInished file handling (handled edit & save files & create new file) Added file highlighting for .env files Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string) Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag
Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw Added the databases tab with handling for creation, deletion and rotation of the password Fixed rotateServerDatabasePassword and deleteServerDatabase , they were using the wrong endpoint ( /server instead of /servers ) Made each tab independently scrollable instead of making the parent component scrollable Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that) Changed the Notification object component’s background color
Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management) Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one Improved code layout by using return s in some places instead of many if else blocks Fixed ScrollableTabRow component improperly placing icons when there was no text Moved ‘linked’ data class es inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits
Finished the UI side of the schedule details popup (still WIP for backend like button handling) Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files Changed task action from a normal screen to an enum Took the formatDate function from my Zipline app
Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.) Added a function to convert ISO date strings in human-readable strings Added a missing endpoint to execute a schedule Added a missing only_when_online property in the ServerSchedule data class Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs) Fixed ScrollableTabRow not using all the horizontal space when in landscape mode
Started making the users tab but it’s really WIP, none of the buttons except create new user works) Handled subuser permissions for all current tabs Added a LabeledCheckbox component Removed some function params that were pointless to have Installed the Gravatar SDK for the subusers’ avatar I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine
Finished the users tab Made the backups tab Made all popup’s horizontal padding equal When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list Disabled the “Create Database” button when at the limit Renamed File to FileDisplay for consistency with other components Fixed edit & create user body still using String instead of ServerSubuser.Permission Fixed the deleteServerBackup function which was marked as GET instead of DELETE Made the truncate param required in the restoreServerBackup function as it’s required in the API
After i tested more the additions of the last devlog i found some issues so here i fixed them Fixed backups downloading as .gz instead of .tar.gz Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all) Disabled inputs in the restore & create popups when respectively restoring and creating Removed the enabled param in the BackupDisplay as it was basically useless
Added the network tab to manage server allocations Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀) Fixed allocation endpoints using String instead of Long Moved backup popups outside of the padded Column Updated my github username in the readme
Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes Doubled hamburger menu icon left padding to match the avatar padding on the right Doubled the gaps between the cards in the backups & network tabs Halved the gaps between the cards in the schedules tab I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back
Created the startup tab Made startup variable description nullable as it’s an optional property
Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place Added the pull to refresh gesture to servers list & server details screens Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that) In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.) The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge) The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times Moved StartupContainer to a more general Container Moved ServerStatus enum to Server.Status Removed navController from all tabs as it was unused
Created the activity tab (finally finished all server tabs :D) along with a function to parse the variables in the logs’ description Improved loading for schedules, backup and databases tabs Fixed JSON text highlighting not highlighting strings inside of arrays Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components In the settings tab added a popup to confirm the reinstallation of the server Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it Renamed AccountActivity to ActivityLog as it’s used in server activity too Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid ) add .trim() to all user inputs Now tabs refresh only when the server ID changes instead of anything in the server object
Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done ) in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added Now each warning popup in the server screen has its own icon instead of all using the suspended icon in all places, replaced refreshIndex += 1 with refreshIndex++ The app now no longer shows “Missing Server ID” toast as soon as you open a server Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded (without /disable it acts as enable endpoint)) Fixed get qr code response as it was different from what the API docs listed In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on … shitty API fr) Added a simple regex to parse emails (so the change email button is enabled only if this regex passes) Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page) Same as above for the server screen activity tab (jusy 25 logs per page) Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages ( .total ) instead of the total number of pages ( .totalPages ), idk how i missed that ) Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret
In the account settings screen created the API credentials tab Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab). Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name ) Applied same changes as above to the account settings screen Updated the formatDate function to include a param to toggle the year in the date
In the account settings screen added the SSH Keys tab (basically a almost full copy paste of the API Credentials for the frontend) Fixed capitalization of a variable & function in the api key tab
In the account settings screen created the activity tab (i think i finished all the client side of the app , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that) Moved ActivityDisplay in the general components as it’s used in the accoutn activity too Updated ActivityDisplay to include the user agent button when available
in the account settings screen added a tab for the app settings Fixed some activity log event having incorrect names and causing the app to crash Added an action to build the app when the commit is prefixed with [build] or [release] Moved the *Scrollbar modifiers above any padding modifier so they look better Switch ScrollableTabRow to a normal Row instead of LazyRow since it’ll never have enough items to cause any lag Updated the README Removed the admin input in the login screen since it’s currently not available
Created a website for the app & a privacy policy (that was needed for the play store app), it’s available at https://ptero.stefdp.com Added a prompt to request the notification permission in the login screen and a button in the settings in case you want to enable notification in a second moment Improved the eventDescription variable in the ActivityDisplay component (i didn’t even know that was possible, i found it out cuz i made a _count variable and android studio suggested me to put it directly in the when , lmao) Updated versioning to follow SemVer ( 1.0 -> 1.0.0 )
Fixed the pull to refresh box having incorrect padding, so the circle was being hidden by the header and by the time it was out, it was already fully pulled and so it would refresh Updated the README also did some tests with downloading but i failed so i just undid them without committing or anything
Created the locations screen Created the location screen Took and modified to adapt to this app the Table component, originally from my Zipline app Fixed the pull to refresh, when calling onRefresh it didn’t actually set isRefreshing to true so the spinner would immediately disappear instead of swithcing to the spinner state till it finished loading Removed the page property from functions since the page is already stored in the viewModel so it made no sense to retrieve it from the viewModel just to send it to a function in the viewModel Fixed the formatDate function, it was crashing the app on older Android versions (<= 13) because the date time parser couldn’t understand the timezone (it expected a date like 2026-08-08-T15:43:30Z instead of 2026-08-08-T15:43:30+02:00 ) Added a new primary color variant that looks good enough on light bgs Fixed some multi-line TextInput s being marked as singleLine
Created a CodeText component to display text as code (kinda like this ) and applied it in all the places where I previously just copy pasted same code Creating an API key now copies the key to the clipboard
Created nodes screen (missing the popup to create a node for now) App name is now dynamically generated in the build.gradle.kts file (so debug build get the (Debug) suffix) Added an HTTP endpoint to check a node status
Fixed admins not being able to manage servers subusers’ permissions Fixed not being aple to open sub-directories in the file browser Fixed create location popup not closing after creating the location
Created the popup to create a node When fetching the node lists, now it also fetches all the locations (needed for a select in the create popup) Added fastlane metadata (will be used for F-Droid in the future) The Popup component now has a scrollbar Updated the scrollbar so now it only shows up when the container has enough contents to be scrollable Added an arrangement property in the Table ’s headers & row cells so that i can center certain things Updated TextInput and Switch components to make their description text color customizable Updated the workflow to automatically push the .aab file to play store after it’s built and made the release (hopefully, i didn’t test it) Fixed create location popup not clearing the inputs upon closing
Created the node screen & its about tab Moved node specific endpoints to their own ApiService instead of having them in the ApplicationApiService and added 2 endpoints to respectively fetch system data in v1 and v2 Made it so create new node button is disabled until all locations are fetched
Create the settings tab in the node screen Added enabled state to all the inputs & switches in the create node popup Updated the updateNode function’s body & params since some required params were marked as nullable
Created the node configuration tab Renamed the CodeText component to CodeBlockText and added params to highlight the content with a specific language Created the CodeText component to have both normal text and inline code text (kinda like markdown when you do this )
Created the node allocations tab The servers screen now shows the server description when available The 2FA check now considers 2FA as enabled even if the status code is 400 other than checking the error message (ptero got no way of knowing if 2FA is enabled other than that ) Update the TextInput component to allow showing optional suggestions (used in the assign new allocations popup, IP Address input) The Checkbox component now is more transparent when disabled (from 0.5 to 0.2 alpha) Changed how padding works in the Pager component Updated the Table component to add a param to disable lazy loading (for some reason it was laggier) Updated the libs
Created the servers screen (WIP, inputs are untested and creating servers is not implemented yet) Created node servers tab Added pagination to the list nests HTTP request response Removed useless reset of the allocations in the node allocations tab In the created node popup, switched some inputs description from "quoted" test to actual inline code blocks CodeText component now uses CharSequence instead of String so it also supports annotated strings Switched main components from Text to CodeText Application server status is now an enum Updated list nests query to include eggs variables too (i just found out i can do this so i’m gonna prob do in in all the other ones in the next devlog too)
All *Include enums are now chainable so doing ListNodesQueryInclude.SERVERS + ListServersQueryInclude.USER returns servers.user Also now instead of <enum>.toQueryString(...) (like ListServersQueryInclude.toQueryString(...) ) i do listOf(...).toQueryString() Used the new include enum chaining in 2 places: node servers tab: it now makes way less HTTP requests since the user, nest & egg are directly returned with the server, saving me from making multiple HTTP requests to fetch all users, nests & eggs (which would’ve taken a long time on a large server that for example has thousands of users, since it was fetching at a rate of 50 users per HTTP request, and it being a mobile app, internet might not be fast too) servers screen, now it fetches the egg variable together with the nest instead of having to fetch the egg’s data Moved ApiErrorResponse in a models folder for better organization this is a code only change so ig i’ll show pics of the code
Added server creation Added a searchable property in the Select component that adds a text input to filter the options Created a regex to check node & server names
Created server screen with its: About tab Details tab Build Configuration tab Fixed pull to reload, it was updating the refreshIndex variable before the main resource actually refreshed and this caused the tabs not to refresh unless the user pulled to refresh twice CodeText component now uses default text style & font weight instead of pre-defined ones (for some reasons with pre-defined ones, in the ScrollableTabRow component it adds like a margin on the bottom of the blue active indicator) Updated UpdateServerDetailsBody to mark required fields as non-nullable In the server owner select, fixed the selected user disappearing if it was not in the search results In the allocation selects: Made the UI use alias:port when an alias is available, otherwise will default to ip:port Moved the ip:port text to a variable to avoid writing the same thing twice
Created the server startup tab Changed the way Container components are spaced in the Build Configuration tab and create server popup In the create server popup disabled the docker image select when only 1 image is available
Created the admin server databases tab (it only supports resetting the password and deleting the databases because for creating a database i need the hosts IDs, which there seem to be no API endpoint to get them) Added a modifier param to the Container component In the client server screen added a param to directly switch to the databases tab (this is used when the user goes from the admin server screen to the client server screen) Fixed “Missing Server ID” notification when client server is opened with databases tab as first tab
Created server manage tab (only reinstall & suspend/unsuspend cuz there seem to be no API endpoint to toggle install status & transfer) Created server delete tab Added 2 new button types, SUCCESS (green) and WARNING (yellow) In the admin server screen now most tabs are hidden whent he server is installing
Created users & user screen Updated the AGP (Android Gradle Plugin) Table headers now properly support multi line text (previously if one text was multiline while everything else wasn’t, all the divider would have a gap on the bottom except for the multiline one) In the client server screen, settings tab the UUID is now aligned to the right Improved screen change when deleting a server/node/user/location (instead of navController.popBackStack() (which basically acts as the back button) i specifically navigate to generic screen (eg. “user” -> “users”) and remove current screen from the back history so in the case that there is no screen to back into (eg if the app is opened via a deep link or stuff like that) it will go to the generic tab anyway) Added pull to refresh in the location screen
Created nests, nest & nest egg screens For nest egg screen, created 3 tabs: Configuration Variables Install Script it was pretty easy and quick to create those cuz they’re read-only as there’s no API endpoint to edit/delete them Added a back handler in the tabbed screens so that back button now goes to the previous tab instead of the entire previous screen In the client servers screen added a switch to see others’ server (admin only) Fixed capitalization in the getNestEgg function ( eggid -> eggId )
Added optional biometric authentication so people can lock their app behind phone code or biometric verification (like fingerprint etc.)
Added updated checking For F-Droid flavor it doesn’t do anything For APK flavor it checks my git repo For Play Store flavor it uses play store com.google.android.play:app-update library Updated the app site, available at https://ptero.stefdp.com Updated the changelog & app images in the fastlane folder Added an animation when switching between loading states with circular loading
Ships:
For rating & testing the project, please first read all of the text in the release. I made an Android app to manage your self-hosted Pterodactyl Panel instance (Currently only the client side, later I’ll also add the admin side). For who doesn’t know, Pterodactyl Panel is a panel usually used to manage game servers, but it can run anything, each server is just a docker container. The most challenging part was prob downloading files, and it still confuses me tbh because on the Android Studio emulator it works fine, but when if I try it on my actual phone (Samsung A55 5G) it randomly stops after a few seconds and I can’t seem to understand why...
|
1792961446.2727244
|
1793047846.2727244
|
|
43641
|
JJK Minecraft Mod by @qstorm | Stardance
|
qstorm
|
1
|
157.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-26T18:29:09Z", "hours": 157.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "FULL SHOWCASE HERE This is a Minecraft mod based on the power system from Jujitsu Kaisen. It contains a combo system where if you press a number of keys in the right order, the power will activate. as well as lots of room for expansion with other powers thanks to how it’s built. Currently there are 5 functional abilities: The innate technique which slows down entities around the player; the blue technique which attracts entities to a ball; the red technique which repels enemies away from the user; the purple technique which destroys everything in it’s path; and the domain which sends enemies to a dimension where they are unable to do anything At first I had just planned on using this project as a blank slate to learn how to mod Minecraft, but eventually I got inspired to make more interesting things, and it led to me making one of my personal favorite fictional power systems, the JJK cursed techniques. It took a while to figure things out, I spend many hours looking through Minecraft source code and other peoples code as well as tutorials but eventually I figured out how to do different things. This was easily the most challenging part of the project, compared to a mathematically intensive project like openGL. I’m proud of so many things with this project. For one it is the first fun project I made (both to code and to play). I also made very good code. After studying Minecraft code and making tons of mistakes, I eventually learned how to make code that was both expandable and readable. I believe that given another week, I would have been able to create 5 other abilities. If you want to try the project, make sure to look through the readMe and install the mod on the 1.21.11M branch. The README provides critical information about how to use and install the mod.", "repo": "https://github.com/qstorm1/PracticeMod/tree/1.21.11M", "demo": "https://modrinth.com/project/jjk-abilities/settings/versions"}]...
|
[{"post_id": 74103, "ts": "202 [{"post_id": 74103, "ts": "2026-09-26T17:59:56Z", "hours": 0.5408, "text": "Build and Read me update"}, {"post_id": 74084, "ts": "2026-09-26T17:10:20Z", "hours": 4.5536, "text": "JJK Mod in minecraft This is the final devlog here is a youtube link to the showcase: Showcase After finishing the backend, I got a lot of progress done! I recommend watching the showcase but I managed to easily get all the abilities to a semi functional state. Thanks to the hard work of previous me, this wasn’t a hard task and I had no major problems. One interesting thing I did was how I worked with red. I used dot products to make red more usable, it actually pushes enemies back like in the show if they are in the same area as the direction red is moving. Other then that the systems were pretty easy to make. A big reason it took so long to get here was because I had no idea how to mod. Unfortunately in order to get everything done today, I had to cut a few corners, meaning that the power renderer is still a particle system. I could go on and on about what i want to add though (that will be in the ship) so I’ll just end it here"}, {"post_id": 73911, "ts": "2026-09-26T09:41:04Z", "hours": 11.1103, "text": "Near completion! It’s weird getting a feeling of satisfaction when deleting the most important part of my code. Thats what I felt when deleting the static variables that stored my data. All of the internal systems are now working and my code is so much cleaner. Now entity data is saved successfully, if you die, leave the world or exit the game. In order to do this I had to learn how to use interfaces well. Turns out casting is a lot more useful then one might expect. You can cast interfaces into classes and vise versa and you can use interfaces with getter and setter methods to get data from classes. I always though interfaces were a useless thing that people use to make better looking code but they are helpful. Anyway, I faced a few major bugs throughout the transition into CCA, the main one being the fact that I had to put an entrypoint in the fabric.mod.json file to render entities. It took a long time and I only found it because of some random reddit thread I found. The main issue was that when I implemented an interface, it was supposed to save data for that class in all entities. Heres a tip, if something is wrong and you can’t find the issue, think about whats happening under the hood. For me, I assumed that the entity data would automatically be initialized but interfaces can’t do that. I’m probably explaining it wrong (I’m a little tired rn with coding and college apps). Anyway, theres a lot more I want to do and I wish that stardance had lasted another week so that I could show you all my cool Ideas. I’ll make the final devlog and ship my project later today. So hopefully it works well :D (I worked on a lot of other stuff in these 10 hours but none are finished enough to devlog about; images have a peak)"}, {"post_id": 72944, "ts": "2026-09-24T02:46:16Z", "hours": 11.0214, "text": "Finished Cardinal Component re-design. It was really weird to get it working because I needed to use an interface and cast variables which I used to avoid doing. Nothing new unfortunately, next update will go into more detail on how I did this! (with new system this /stats command works :D)"}, {"post_id": 71437, "ts": "2026-09-20T20:24:18Z", "hours": 9.7322, "text": "Sorry, this update will probably be really boring. I’ve been sick for the past 3ish days but have still been trying to code. Unfortunately, that means most of my code is pretty bad. The basic rundown of what’s been happening is a realization that player data was being handled really stupidly. I wasn’t even saving things to files meaning once the server shut down, all the information would be deleted. Now I thought at first I could pretty easily deal with this after finishing the mod so I ignored it, but then I started having issues that came from synchronization with client and server. To those of you who looked at my previous devlogs, you can see that I constantly rewrote a lot of my code. This is because sometimes the client and server use the same static variables while other times they don’t. As a result of these two things, I decided to use a library to handle it called Cardinal Components. For most of my coding projects I’ve always wanted to ignore libraries to the best of my abilities and make stuff myself. I believe it’s a good to learn how the internals of a system work but the problem with me was that I would always stay low level. As I learned more about minecraft development, I learned how important it is to have both high and low level skills in order to make bigger projects. There will probably be only 2 or 3 more devlogs before I ship so I’ll try to get as much cool stuff done before then as possible. Big things are coming!"}, {"post_id": 69112, "ts": "2026-09-16T12:12:50Z", "hours": 10.1767, "text": "Limitless Innate Upgrades [upgrades showcase] ( https://youtu.be/m7zWsrxv2mA ) uh the devlog link is broken lol (or im just bad idk). I could talk about the things that I worked on behind the scenes unrelated to the innate upgrades but that’s very boring and I talked about them before, the main thing that I fixed was the handling of non-Living Entities with the limitless innate. Basically I used mixins to edit the move code as well as added some things to the client code. I talked a lot about how this worked in a previous devlog, but it took a lot of reading and understanding code to learn how to fix it. Unfortunately my command blocks were broken so I couldn’t showcase the projectile innate system, but otherwise most of the info is in the video"}, {"post_id": 67057, "ts": "2026-09-13T03:11:16Z", "hours": 10.8842, "text": "MY CODE IS SO TRASH! I was working on fixing my innate technique for limitless. The bug in question was an issue where falling non-living entities would end up rubber-banding before sometimes hitting the ground. (I’m not making a showcase video for this use the screenshot and ur imagination) The issue ended up being due to 2 things, one was that minecraft runs the move() function right after applyGravity() so my code would never get the chance to change the gravity. The second was the fact that move() calls are run both by the server and client. The first issue was relatively simple to fix, I just had to learn about advanced mixins and using @ModifyVariable correctly. However the second issue meant that I either had to send a ton of data with packets, or I could do what I had always wanted to do but knew it would take forever… code in client side compatibility. Anyway as of right now I am “almost” done with getting it working. I swear one of these days I am going to share something cool. probably next update or the one after, it’ll come out by Monday if I lock in."}, {"post_id": 65123, "ts": "2026-09-10T01:16:08Z", "hours": 9.3792, "text": "Blue Kinda Works! Video Showcase The showcase above includes some of the older versions, skip to 0:40 for official version (it was lagging at the time of recording though) The hardest part of this step was the value adjustments. Given my mod gives each player a random value for cursed energy and , a player needs to feel the diffrence between a weak sorcerer and a strong one. I’ll probably continue tweaking the settings for blue until I believe it is good enough. Anyway right now blue isn’t very complicated, it just detects all entities in a certain radius and gives them a velocity based on the gravitational force which is calculated based on radius and constants. I tried using the real life equations but had trouble with them. Finally, in case your wondering, I am planning on switching the particle renderer that is super laggy with a LWJGL openGL sphere renderer or maybe a block display but in order to do that I need to get good at rendering and make a client linear interpolate to simulate smooth movement and overall I really don’t want to but its gotta happen. Next update will either be a finished blue, or me whining about how trash my code is"}, {"post_id": 62746, "ts": "2026-09-06T08:09:20Z", "hours": 9.1467, "text": "I got the first power to work! you can find a showcase here: https://youtu.be/t6oah7P1Fyk it may not seem like much, but this means the lower level systems are working, and I can start focusing on making cool stuff. Other then that I also made the combo system more advanced by having it so u can run actions mid combo and you can detect how fast you did the combo. There are a few more things I want to add to the combo system and tbh I thought about re-coding it again (which is a pretty annoying habit that I’ve gotten #OCD) Next update if I can do it in under 10 hours is gonna be really cool and probably coming tomorrow, following might let u see it earlier :D"}, {"post_id": 61210, "ts": "2026-09-04T01:08:40Z", "hours": 6.9719, "text": "I finalized the system! The idea is that most of the boring stuff happens in semi-abstract classes like the Sorcery class and the Ability class, which handle server side management and universal methods. Meanwhile, I can initialize real logic through child classes such as the Limitless calss which extends sorcery or the Blue class which extends Ability. I copied the idea from minecrafts Entity system. I’ve also managed to get nearly all of the key binds to work including scrolling (I used a mixin for scrolling). A lot of the hours that were described in this update actually ended up in the previous devlog so in reality it took about 9ish hours of work. Anyway, mostly a programming update, but next time I’m going to start actually adding powers to my modpack!"}, {"post_id": 60678, "ts": "2026-09-03T06:09:23Z", "hours": 14.2872, "text": "The hud system is officially complete! I meant to post this devlog earlier but I had some problems :/ I spent a ton of time figuring out how to render images and I realized it was much easier to just make very specific math that draws lines to the HUD (It doesn’t help that you can’t draw curvy or diagnol lines) I fixed a ton of other problems as well that you can’t read in my commit history I think. This devlog was supposed to be posted a lot earlier but I ended up forgeting to post after writing it lmao. For that reason, I also have to say that the structure of the power system is done and now I’m working on bug fixes as well as making working powers. I really wish I could post a video showing you guys, I’ll try to do so next devlog using something less powerful then OBS. See ya"}, {"post_id": 56835, "ts": "2026-08-28T19:41:22Z", "hours": 10.6292, "text": "The main summery for today is mindless progress, I’ve continued to work on the Hud system for my combo system but faced multiple issues that took hours to fix (hence the lack of progress) for starters, somewhere during my modding jurney, I forgot that identifiers can’t have uppercase letters, leading me to try remaking the system multiple times. Additionally, while in my original system I added hud elements to the registry when updating, and removed hud elements when reseting, in the new system, I replace that with static variables and if loops. If I don’t face any more major bugs, the HUD system should be done by the next devlog!"}, {"post_id": 54766, "ts": "2026-08-25T21:25:00Z", "hours": 9.4258, "text": "I’ve been creating a HUD system, though it’s pretty boring so I get distracted and do other stuff. Anyway the combo system is fully functional. Through this I learned that static maps are completely unnecessary as static variables update in each client side jvm. I won’t get into the implementation of my HUD system or the other stuff I’m working on because they’re unfinished so this is more of a minor update"}, {"post_id": 52729, "ts": "2026-08-23T01:48:59Z", "hours": 9.7422, "text": "I made a combo system! right now it’s really buggy but what it does is similar to street fighter system, you can make a combo and then assign key’s to it. You need to press the key’s in the required number of time for the combo to work. there are a lot of problems with reset rn but the base system is there. Each player has a value called a “combo key” which have a timer that increase by one every tick and resets to 0 when the kye is pressed. these are values that are mapped to each player and only one instance of each key is allowed per player (for better latency and client2server stuff) A combo is created using a bunch of if logic. I used a builder sytem for object creation so instead of new object() you do Combo.build().key1(timeNeeded to press).key2… Each combo can be used for abilities that I’m going to work on next. Speaking about abilities I decided what my mod would be based on, Jujitsu Kaisen! While i’m not a diehard fan of the show, the power system is one of the coolest in all of fiction, so I thought it would be fun to try and implement some abilities (hence the pocket dimention my screenshots are in) anyway, gonna fix the combo system and then work on a simple power see ya!"}, {"post_id": 49994, "ts": "2026-08-19T00:51:50Z", "hours": 4.3547, "text": "Made Laser Eyes! When you click the laser button which you can change in the controls menu, a particle will appear (which is purely visual) and it will make a raycast, targeting the nearest entity/block. It will damage an entity and turn the block into a redstone block (temporary until i feel like making ash). It also works in multiplayer, where the particles are summoned from the eye of the shooter from everyones persepective except the shooter who only sees the beam if a few blocks away that way they don’t get blinded by particles (the pictures use free cam and i have no friends so I can’t show this but u can see how it works in the code) My project didn’t have documentation so it was difficult figuring out how to make a raycast (combination of .clip and .getEntityHitResult) and how to tell if the player really pressed the laser button which requires client to server packet management."}, {"post_id": 49285, "ts": "2026-08-18T00:21:25Z", "hours": 3.7019, "text": "the first devlog has a large number of hours on it because of some issues with git and project stuff (you didn’t miss any updates other then reading don’t worry), Anyway, I’m chilling in my new dimention with my new potion effect that I get after using a new item (with iron helmet texture cause i’m bad). I’ve been trying to get a raycasting system to work I just wanted to update the project so that my hours can be counted correctely, future update coming soon!"}, {"post_id": 44947, "ts": "2026-08-11T01:33:50Z", "hours": 21.76, "text": "I looked through minecrafts source code, The version of minecraft I am coding is 1.21.11 and on fabric there are two “mappings” or interpretations of minecrafts source code. the first version is the community one called yarn which was the one that I was planning on using when I was watching a tutorial series on Youtube however the documentation uses the other mappings called the “mojang mappings”. I switched to the mojang mappings and looked through minecrafts source code using that. I figured out how to handle terrain generation, add new things to minecrafts registry system, and access player data. My next goal is to look through some real applications of mods and this is how I recommend others who are interested to do so to!"}]...
|
Title: JJK Minecraft Mod by @qstorm | Stardance
D Title: JJK Minecraft Mod by @qstorm | Stardance
Devlogs:
I looked through minecrafts source code, The version of minecraft I am coding is 1.21.11 and on fabric there are two “mappings” or interpretations of minecrafts source code. the first version is the community one called yarn which was the one that I was planning on using when I was watching a tutorial series on Youtube however the documentation uses the other mappings called the “mojang mappings”. I switched to the mojang mappings and looked through minecrafts source code using that. I figured out how to handle terrain generation, add new things to minecrafts registry system, and access player data. My next goal is to look through some real applications of mods and this is how I recommend others who are interested to do so to!
the first devlog has a large number of hours on it because of some issues with git and project stuff (you didn’t miss any updates other then reading don’t worry), Anyway, I’m chilling in my new dimention with my new potion effect that I get after using a new item (with iron helmet texture cause i’m bad). I’ve been trying to get a raycasting system to work I just wanted to update the project so that my hours can be counted correctely, future update coming soon!
Made Laser Eyes! When you click the laser button which you can change in the controls menu, a particle will appear (which is purely visual) and it will make a raycast, targeting the nearest entity/block. It will damage an entity and turn the block into a redstone block (temporary until i feel like making ash). It also works in multiplayer, where the particles are summoned from the eye of the shooter from everyones persepective except the shooter who only sees the beam if a few blocks away that way they don’t get blinded by particles (the pictures use free cam and i have no friends so I can’t show this but u can see how it works in the code) My project didn’t have documentation so it was difficult figuring out how to make a raycast (combination of .clip and .getEntityHitResult) and how to tell if the player really pressed the laser button which requires client to server packet management.
I made a combo system! right now it’s really buggy but what it does is similar to street fighter system, you can make a combo and then assign key’s to it. You need to press the key’s in the required number of time for the combo to work. there are a lot of problems with reset rn but the base system is there. Each player has a value called a “combo key” which have a timer that increase by one every tick and resets to 0 when the kye is pressed. these are values that are mapped to each player and only one instance of each key is allowed per player (for better latency and client2server stuff) A combo is created using a bunch of if logic. I used a builder sytem for object creation so instead of new object() you do Combo.build().key1(timeNeeded to press).key2… Each combo can be used for abilities that I’m going to work on next. Speaking about abilities I decided what my mod would be based on, Jujitsu Kaisen! While i’m not a diehard fan of the show, the power system is one of the coolest in all of fiction, so I thought it would be fun to try and implement some abilities (hence the pocket dimention my screenshots are in) anyway, gonna fix the combo system and then work on a simple power see ya!
I’ve been creating a HUD system, though it’s pretty boring so I get distracted and do other stuff. Anyway the combo system is fully functional. Through this I learned that static maps are completely unnecessary as static variables update in each client side jvm. I won’t get into the implementation of my HUD system or the other stuff I’m working on because they’re unfinished so this is more of a minor update
The main summery for today is mindless progress, I’ve continued to work on the Hud system for my combo system but faced multiple issues that took hours to fix (hence the lack of progress) for starters, somewhere during my modding jurney, I forgot that identifiers can’t have uppercase letters, leading me to try remaking the system multiple times. Additionally, while in my original system I added hud elements to the registry when updating, and removed hud elements when reseting, in the new system, I replace that with static variables and if loops. If I don’t face any more major bugs, the HUD system should be done by the next devlog!
The hud system is officially complete! I meant to post this devlog earlier but I had some problems :/ I spent a ton of time figuring out how to render images and I realized it was much easier to just make very specific math that draws lines to the HUD (It doesn’t help that you can’t draw curvy or diagnol lines) I fixed a ton of other problems as well that you can’t read in my commit history I think. This devlog was supposed to be posted a lot earlier but I ended up forgeting to post after writing it lmao. For that reason, I also have to say that the structure of the power system is done and now I’m working on bug fixes as well as making working powers. I really wish I could post a video showing you guys, I’ll try to do so next devlog using something less powerful then OBS. See ya
I finalized the system! The idea is that most of the boring stuff happens in semi-abstract classes like the Sorcery class and the Ability class, which handle server side management and universal methods. Meanwhile, I can initialize real logic through child classes such as the Limitless calss which extends sorcery or the Blue class which extends Ability. I copied the idea from minecrafts Entity system. I’ve also managed to get nearly all of the key binds to work including scrolling (I used a mixin for scrolling). A lot of the hours that were described in this update actually ended up in the previous devlog so in reality it took about 9ish hours of work. Anyway, mostly a programming update, but next time I’m going to start actually adding powers to my modpack!
I got the first power to work! you can find a showcase here: https://youtu.be/t6oah7P1Fyk it may not seem like much, but this means the lower level systems are working, and I can start focusing on making cool stuff. Other then that I also made the combo system more advanced by having it so u can run actions mid combo and you can detect how fast you did the combo. There are a few more things I want to add to the combo system and tbh I thought about re-coding it again (which is a pretty annoying habit that I’ve gotten #OCD) Next update if I can do it in under 10 hours is gonna be really cool and probably coming tomorrow, following might let u see it earlier :D
Blue Kinda Works! Video Showcase The showcase above includes some of the older versions, skip to 0:40 for official version (it was lagging at the time of recording though) The hardest part of this step was the value adjustments. Given my mod gives each player a random value for cursed energy and , a player needs to feel the diffrence between a weak sorcerer and a strong one. I’ll probably continue tweaking the settings for blue until I believe it is good enough. Anyway right now blue isn’t very complicated, it just detects all entities in a certain radius and gives them a velocity based on the gravitational force which is calculated based on radius and constants. I tried using the real life equations but had trouble with them. Finally, in case your wondering, I am planning on switching the particle renderer that is super laggy with a LWJGL openGL sphere renderer or maybe a block display but in order to do that I need to get good at rendering and make a client linear interpolate to simulate smooth movement and overall I really don’t want to but its gotta happen. Next update will either be a finished blue, or me whining about how trash my code is
MY CODE IS SO TRASH! I was working on fixing my innate technique for limitless. The bug in question was an issue where falling non-living entities would end up rubber-banding before sometimes hitting the ground. (I’m not making a showcase video for this use the screenshot and ur imagination) The issue ended up being due to 2 things, one was that minecraft runs the move() function right after applyGravity() so my code would never get the chance to change the gravity. The second was the fact that move() calls are run both by the server and client. The first issue was relatively simple to fix, I just had to learn about advanced mixins and using @ModifyVariable correctly. However the second issue meant that I either had to send a ton of data with packets, or I could do what I had always wanted to do but knew it would take forever… code in client side compatibility. Anyway as of right now I am “almost” done with getting it working. I swear one of these days I am going to share something cool. probably next update or the one after, it’ll come out by Monday if I lock in.
Limitless Innate Upgrades [upgrades showcase] ( https://youtu.be/m7zWsrxv2mA ) uh the devlog link is broken lol (or im just bad idk). I could talk about the things that I worked on behind the scenes unrelated to the innate upgrades but that’s very boring and I talked about them before, the main thing that I fixed was the handling of non-Living Entities with the limitless innate. Basically I used mixins to edit the move code as well as added some things to the client code. I talked a lot about how this worked in a previous devlog, but it took a lot of reading and understanding code to learn how to fix it. Unfortunately my command blocks were broken so I couldn’t showcase the projectile innate system, but otherwise most of the info is in the video
Sorry, this update will probably be really boring. I’ve been sick for the past 3ish days but have still been trying to code. Unfortunately, that means most of my code is pretty bad. The basic rundown of what’s been happening is a realization that player data was being handled really stupidly. I wasn’t even saving things to files meaning once the server shut down, all the information would be deleted. Now I thought at first I could pretty easily deal with this after finishing the mod so I ignored it, but then I started having issues that came from synchronization with client and server. To those of you who looked at my previous devlogs, you can see that I constantly rewrote a lot of my code. This is because sometimes the client and server use the same static variables while other times they don’t. As a result of these two things, I decided to use a library to handle it called Cardinal Components. For most of my coding projects I’ve always wanted to ignore libraries to the best of my abilities and make stuff myself. I believe it’s a good to learn how the internals of a system work but the problem with me was that I would always stay low level. As I learned more about minecraft development, I learned how important it is to have both high and low level skills in order to make bigger projects. There will probably be only 2 or 3 more devlogs before I ship so I’ll try to get as much cool stuff done before then as possible. Big things are coming!
Finished Cardinal Component re-design. It was really weird to get it working because I needed to use an interface and cast variables which I used to avoid doing. Nothing new unfortunately, next update will go into more detail on how I did this! (with new system this /stats command works :D)
Near completion! It’s weird getting a feeling of satisfaction when deleting the most important part of my code. Thats what I felt when deleting the static variables that stored my data. All of the internal systems are now working and my code is so much cleaner. Now entity data is saved successfully, if you die, leave the world or exit the game. In order to do this I had to learn how to use interfaces well. Turns out casting is a lot more useful then one might expect. You can cast interfaces into classes and vise versa and you can use interfaces with getter and setter methods to get data from classes. I always though interfaces were a useless thing that people use to make better looking code but they are helpful. Anyway, I faced a few major bugs throughout the transition into CCA, the main one being the fact that I had to put an entrypoint in the fabric.mod.json file to render entities. It took a long time and I only found it because of some random reddit thread I found. The main issue was that when I implemented an interface, it was supposed to save data for that class in all entities. Heres a tip, if something is wrong and you can’t find the issue, think about whats happening under the hood. For me, I assumed that the entity data would automatically be initialized but interfaces can’t do that. I’m probably explaining it wrong (I’m a little tired rn with coding and college apps). Anyway, theres a lot more I want to do and I wish that stardance had lasted another week so that I could show you all my cool Ideas. I’ll make the final devlog and ship my project later today. So hopefully it works well :D (I worked on a lot of other stuff in these 10 hours but none are finished enough to devlog about; images have a peak)
JJK Mod in minecraft This is the final devlog here is a youtube link to the showcase: Showcase After finishing the backend, I got a lot of progress done! I recommend watching the showcase but I managed to easily get all the abilities to a semi functional state. Thanks to the hard work of previous me, this wasn’t a hard task and I had no major problems. One interesting thing I did was how I worked with red. I used dot products to make red more usable, it actually pushes enemies back like in the show if they are in the same area as the direction red is moving. Other then that the systems were pretty easy to make. A big reason it took so long to get here was because I had no idea how to mod. Unfortunately in order to get everything done today, I had to cut a few corners, meaning that the power renderer is still a particle system. I could go on and on about what i want to add though (that will be in the ship) so I’ll just end it here
Build and Read me update
Ships:
FULL SHOWCASE HERE This is a Minecraft mod based on the power system from Jujitsu Kaisen. It contains a combo system where if you press a number of keys in the right order, the power will activate. as well as lots of room for expansion with other powers thanks to how it’s built. Currently there are 5 functional abilities: The innate technique which slows down entities around the player; the blue technique which attracts entities to a ball; the red technique which repels enemies away from the user; the purple technique which destroys everything in it’s path; and the domain which sends enemies to a dimension where they are unable to do anything At first I had just planned on using this project as a blank slate to learn how to mod Minecraft, but eventually I got inspired to make more interesting things, and it led to me making one of my personal favorite fictional power systems, the JJK cursed techniques. It took a while to figure things out, I spend many hours looking through Minecraft source code and other peoples code as well as tutorials but eventually I figured out how to do different things. This was easily the most challenging part of the project, compared to a mathematically intensive project like openGL. I’m proud of so many things with this project. For one it is the first fun project I made (both to code and to play). I also made very good code. After studying Minecraft code and making tons of mistakes, I eventually learned how to make code that was both expandable and readable. I believe that given another week, I would have been able to create 5 other abilities. If you want to try the project, make sure to look through the readMe and install the mod on the 1.21.11M branch. The README provides critical information about how to use and install the mod....
|
1792853457.152559
|
1792939857.152559
|
|
46498
|
Bugatti Destrier by @nejenabinupa | Stardance
|
nejenabinupa
|
1
|
155.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-13T06:24:33Z", "hours": 155.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my fest car model I make from scratch and I make it in to a cool video to share with you guys, hope you enjoy it :). all the details are in the Readme.", "repo": "https://github.com/binupax6699/BUGATTI-DESTRIER-3D-MODEL-CINEMATIC", "demo": "https://youtu.be/0gfVzRgbG9k?si=vrqBCMsIrrrFTEiZ"}]...
|
[{"post_id": 76883, "ts": "202 [{"post_id": 76883, "ts": "2026-10-04T22:42:10Z", "hours": 3.3019, "text": "Modle and the video is all set now"}, {"post_id": 57506, "ts": "2026-08-29T17:53:22Z", "hours": 4.6228, "text": "In the modle the head lights didn’t look right so I fixed it and I finshed all of the animations now jest need to render it"}, {"post_id": 56434, "ts": "2026-08-28T06:21:57Z", "hours": 6.4069, "text": "I admitted sum cool shots and work on refining sum animations"}, {"post_id": 54990, "ts": "2026-08-26T12:45:25Z", "hours": 8.5239, "text": "I rig the car to animate and put in to the map and I’m starting to animating it"}, {"post_id": 54010, "ts": "2026-08-24T19:07:52Z", "hours": 10.4875, "text": "I heavily modified existing map custom textures, terrain/topology edits, foliage, mountains by me. to animate the car."}, {"post_id": 53277, "ts": "2026-08-23T18:46:47Z", "hours": 11.6706, "text": "Finish the interior room so long and so much effect, and need to adjust sum small theing around the body of the car"}, {"post_id": 51875, "ts": "2026-08-21T19:14:48Z", "hours": 3.8514, "text": "I lost around 10h off work because the house not recoded in the Stardance page, Add so much material normal maps and and good amount of stuff to make it the thing"}, {"post_id": 51637, "ts": "2026-08-21T12:42:44Z", "hours": 9.3028, "text": "Add texture/materials to the car and it look good and added normal maps to everything i think to give so much depth and detail"}, {"post_id": 50972, "ts": "2026-08-20T13:26:09Z", "hours": 24.4308, "text": "I close completing the interior and I make the rim design for the car,"}, {"post_id": 49163, "ts": "2026-08-17T20:02:34Z", "hours": 9.635, "text": "I work on the interior and som small sections of the car and I need to finalize the interior too and small details and things"}, {"post_id": 48516, "ts": "2026-08-16T22:18:10Z", "hours": 7.3842, "text": "Cut out sum sections and cut out the headlights and add things and i guess finally i make the engine bay caret this time, because i remake this engine bay around 4 time because i didn’t had much reference images to make it."}, {"post_id": 47928, "ts": "2026-08-16T06:11:42Z", "hours": 9.1111, "text": "Cut out sections and add things like the horse shoe grill and now remaking the engine bet with new reference images."}, {"post_id": 46936, "ts": "2026-08-14T14:32:31Z", "hours": 6.9164, "text": "Today I make the front part of the Bugatti and the it look so good, I need to model the saids and the cut out"}, {"post_id": 46523, "ts": "2026-08-13T20:12:03Z", "hours": 8.2425, "text": "I make the engine bed and the roof scoop and added the things from the things. And I also make the topology much more good"}, {"post_id": 45928, "ts": "2026-08-12T18:25:02Z", "hours": 10.4517, "text": "Make the said skirt and remake the body because the topography got bad."}, {"post_id": 45341, "ts": "2026-08-11T18:47:59Z", "hours": 9.6428, "text": "Make the rare diffuser, and also ajest the topology so much better body flow and to get details after the general shape come."}, {"post_id": 44782, "ts": "2026-08-10T19:53:31Z", "hours": 11.3414, "text": "I’m making the Bugatti Destriel from scratch and I want it be like the real thing, and I’m only did the back part of it and there is long way to go."}]...
|
Title: Bugatti Destrier by @nejenabinupa | Stardan Title: Bugatti Destrier by @nejenabinupa | Stardance
Devlogs:
I’m making the Bugatti Destriel from scratch and I want it be like the real thing, and I’m only did the back part of it and there is long way to go.
Make the rare diffuser, and also ajest the topology so much better body flow and to get details after the general shape come.
Make the said skirt and remake the body because the topography got bad.
I make the engine bed and the roof scoop and added the things from the things. And I also make the topology much more good
Today I make the front part of the Bugatti and the it look so good, I need to model the saids and the cut out
Cut out sections and add things like the horse shoe grill and now remaking the engine bet with new reference images.
Cut out sum sections and cut out the headlights and add things and i guess finally i make the engine bay caret this time, because i remake this engine bay around 4 time because i didn’t had much reference images to make it.
I work on the interior and som small sections of the car and I need to finalize the interior too and small details and things
I close completing the interior and I make the rim design for the car,
Add texture/materials to the car and it look good and added normal maps to everything i think to give so much depth and detail
I lost around 10h off work because the house not recoded in the Stardance page, Add so much material normal maps and and good amount of stuff to make it the thing
Finish the interior room so long and so much effect, and need to adjust sum small theing around the body of the car
I heavily modified existing map custom textures, terrain/topology edits, foliage, mountains by me. to animate the car.
I rig the car to animate and put in to the map and I’m starting to animating it
I admitted sum cool shots and work on refining sum animations
In the modle the head lights didn’t look right so I fixed it and I finshed all of the animations now jest need to render it
Modle and the video is all set now
Ships:
This is my fest car model I make from scratch and I make it in to a cool video to share with you guys, hope you enjoy it :). all the details are in the Readme....
|
1792957934.1147797
|
1793044334.1147797
|
|
10038
|
Prometheus by @rishithc | Stardance
|
rishithc
|
1
|
154.99
|
82
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T15:56:14Z", "hours": 17.0, "multiplier": 5.0, "payout": 82, "blessing": "neutral", "text": "I made an autonomous drone. The most challenging part was the soldering. The soldering was quite hard for me and there were times where i burnt my hand", "repo": "https://github.com/rishith-c/Prometheus", "demo": ""}]...
|
[{"post_id": 29001, "ts": "202 [{"post_id": 29001, "ts": "2026-07-15T17:26:17Z", "hours": 10.9361, "text": "Devlog #18: A GREAT way to start working on your project again 😩 I’ve taken a break these past few days, realizing that a vacation exists for a reason! Today, however, I didn’t want to fall behind schedule. Since I also want grants to use a premium carbon fiber frame and all I need is to finish my PCB, I spent the day working in KiCad. Truth be told, the best way to learn is by doing—I thought the same about CAD, and I feel the same about PCB design. I made the executive decision to make a double-sided PCB rather than adding more layers, as it will be much simpler. Anyway, here are my final mockups."}, {"post_id": 23548, "ts": "2026-07-06T16:03:13Z", "hours": 9.0567, "text": "Devlog #17: I tested a lot tdy as well as designed new components I submitted my project, as is, to the Outpost fund, and I got some feedback. Mostly everything was good except for some issues with funding an NVDIA devkit :))), but the biggest issue was that I couldn’t buy a flight controller. In an devlog before, I mentioned and shows a picture of me designing a custom pcb, but I have not worked on that since. So today I fired up Kikad and designed layer 2 of my FC (easier, layer one has a lot of components that I need to import). I also spent a good chunk of today refining my 3d model, I used Air Shaper and SimScale and I aerodynamic tested all of the designs, I also asked claude for some ideas of how to make my .stls better. @vrunchil7 is da goat frfr he taught me how and what kikad is."}, {"post_id": 21535, "ts": "2026-07-03T15:40:49Z", "hours": 9.8875, "text": "Devlog #16: I probably should have done this earlier :( yea so while on vacation I decided to rework the weight and thrust ratios that the motors were producing with 11x7 props. I found out that my drone will not be able to fly SMOOTHLY. So I decided too look into why, one of the big reasons were that it was heavy, and two it wasn’t aerodynamic. So today I tried to kill two birds with one stone, (I also worked on my ML for a good portion of the time, but I feel this is more important). I ran digital wind tunnel tests and kept redesigning and testing until I landed on what I have now. I plan to make this out of carbon fiber which will be expensive, but ig that’s part of the process."}, {"post_id": 19917, "ts": "2026-07-01T11:05:00Z", "hours": 4.57, "text": "Devlog #15: training my own model wasn’t the move yea so training my own model wasnt the best idea. after hours of clicking through my webscraper’s image results and marking them, i ran a benchmark myself by putting on youtube videos of wildfires from a sky perspective. it saw the smoke in the distance and gave that as the fire, when the real fire was miles away. it also found the sun and clouds as a fire. so, false positives everywhere. so today i basically tested and worked with existing solutions instead, like this one: https://github.com/AlimTleuliyev/wildfire-detection , plus other open source alternatives on kaggle. but yea, overall today i felt retrogressed, and i’m thinking of going back to CV. This article also helped a lot https://www.mdpi.com/2571-6255/7/4/140 ."}, {"post_id": 19265, "ts": "2026-06-30T15:04:27Z", "hours": 9.0494, "text": "Devlog #14: building the dataset + training a tensorflow model spent today on the data side of fire detection, which is half the battle with ML. to train a model to recognize fire i need a solid labeled dataset, so first i built an image scraper. it crawls the web usinf breadth first search, going level by level through pages and pulling images as it goes. i used bidirectional bfs to expand the search from two fronts and cover more ground instead of just crawling one direction. ended up pulling a bunch of images, including a lot of tricky ones like trees and random orange stuff that a fire model could easily get confused by. then i built a small labeling tool to actually tag all of it. it shows me one image at a time, a tree, an orange object, an actual fire, and i just mark it as fire or no fire. way faster than sorting through folders by hand, and getting those confusing orange non-fire images labeled is exactly what stops the model from false triggering later. with some data labeled i started training a tensorflow model on it, mostly experimenting at this point to see how it behaves and what works. early days, but it’s a real step toward a model that actually learns what fire looks like instead of just matching colors. good progress on the part of this project."}, {"post_id": 18514, "ts": "2026-06-29T18:09:54Z", "hours": 18.7639, "text": "Devlog #13 : built a fire detection system for my drone’s Pi i genuinely lost my sanity working on ts (Everything is on gh) started on the payload for my autonomous quad: real time fire detection running on the Raspberry Pi. went classical CV with OpenCV instead of training a model. Since it has to run fully offline on the drone (no internet up there) so a heavy ML model was out. turns out you get pretty far with just color + motion. how it works: grabs the warm/bright pixels (orange/red/yellow in HSV, plus an R≥G≥B rule so it’s actually fire toned, not just bright) flicker analysis over a few frames. ts is the part that matters. real flame shimmers frame to frame, a static orange thing (a ball, a jacket, a sunset) doesn’t, so it won’t false trigger on every orange object it sees debounces over several frames so one noisy frame can’t trip it spits out a 0-100% confidence from area + flicker + persistence the two bits that do the work. color mask first: # warm/bright flame colors warm = cv2 . inRange ( hsv , ( 0 , sat_min , val_min ), ( 35 , 255 , 255 )) warm |= cv2 . inRange ( hsv , ( 170 , sat_min , val_min ), ( 179 , 255 , 255 )) # fire skews R >= G >= B with a real red lead, not just any bright pixel b , g , r = cv2 . split ( bgr . astype ( np . int16 )) order = (( r >= g ) & ( g >= b ) & ( r > 150 ) & (( r - b ) > 28 )). astype ( np . uint8 ) * 255 warm = cv2 . bitwise_and ( warm , order ) then the flicker check. just how much the fire region changed since last frame: diff = cv2 . absdiff ( mask , prev_mask ) flicker = np . count_nonzero ( diff ) / max ( fire_area , 1 ) # static orange object -> ~0 real flame -> way higher built a web dashboard for it too (Flask). same code runs on my laptop off the webcam to test, then goes straight on the Pi headless and i open it from my laptop browser over wifi. console sits calm/cyan while scanning, goes full red + pulsing + beeping the sec it locks fire. got live sliders to tune sensitivity so i’m not editing code every time. tested 4k fireplace video, locks on clean. waved random orange stuff it’s not certified or anything. classical CV WILL false trigger in harsh light so next: wire the “fire detected” event to grab the GPS coord off the flight controller and trigger a loiter so the drone marks the spot. btw if anyone’s done fire/smoke detection on a Pi 4 lmk if you went CV or tflite, curious what fps you got. 🫡"}, {"post_id": 16925, "ts": "2026-06-27T14:18:40Z", "hours": 11.3347, "text": "Devlog #12 : scrapped my CV code, went full YOLO ok!! so i went on a learning spree today and a LOT happened. ngl one of those days where you start the morning thinking you know stuff and end it realizing you knew nothing. ##i was doing my CV wrong so my old fire detection was classical CV, just color matching + flicker. cool little hack and it technically worked, but tbh it was way too fragile. anything orange in bright light could set it off, and it’s is supposed to fly on a drone in the sun, so that’s not happening. so i did the painful thing and scrapped the whole lot. felt bad deleting code that “worked” but it was never gonna be reliable enough out in the real world. went down the YOLO rabbit hole spent basically the whole day researching YOLO (you only look once, the object detection one). instead of me hand coding what fire “looks like” with color rules, the model actually learns it from examples. way more robust to lighting, angles, all the randome stuff a drone is gonna run into. got a basic YOLO model up and running. its rough rn but its already a different league from the color matching. side quest: mediapipe body tracking also messed around with mediapipe today as a practice project, tracked my own body/pose in real time. wasnt strictly for the drone, just wanted to get comfortable with actual CV pipelines and see how the landmark tracking works under the hood. hardware: turned my ceiling into a drone im on vacation so no real flying, but i still wanted to test from a drone’s POV. so i straight up taped a webcam to my ceiling pointing straight down. now i can test the CV from that top down birds eye angle, which is way closer to what the drone actually sees than my laptop cam pointed at my face. next up train the YOLO model on a proper fire dataset run it against the ceiling cam footage check fps on my laptop vs what i’ll realistically get on the Pi 🫡"}, {"post_id": 16627, "ts": "2026-06-27T01:24:09Z", "hours": 16.1558, "text": "Devlog #11: started the new CV code, deciding on the approach got through about half the CV code today, good progress on the rewrite. right now i’m deciding between two routes for the actual fire recognition: tensorflow + mobilenet-SSD — a proper deep learning object detector. heavier, but it actually learns what fire looks like, so it should handle different lighting and angles way better. regular opencv + a few libraries — lighter and simpler, runs easy on the Pi, but less robust. still weighing it. mobilenet-SSD is probably the stronger long term call since it generalizes better, but opencv is much lighter on the Pi, so i want to see what framerate i actually get before committing to either. next: benchmark both and pick one."}, {"post_id": 12308, "ts": "2026-06-20T02:48:00Z", "hours": 8.32, "text": "Devlog #10: motor test issues and a flight controller swap not gonna lie, things went downhill pretty fast today. i celebrated a bit early. all my motors spun fine on the individual motor test, so i figured i was basically there. then i hit “test all” and only 2 of the 4 motors spun. and it kept happening. i was sure it was a software/parameter thing at first, so i spent hours over the past few days going through ardupilot params trying to get all 4 to fire at once. couldn’t get it. every motor spins perfectly on its own, but only 2 ever spin on the test all. after sitting with it for a while, i’m pretty sure the issue comes down to the flight controller. i’d been running a cheap board that’s really built for fixed wing, and going through the ardupilot docs it just wasn’t the right fit for what i’m doing. so i’ve ordered a proper flight controller to swap in. the timing isn’t great. i leave for my trip the day after tomorrow, so for the next month i’m stuck on just the software side, no hardware. the new FC is on its way but realistically i can’t promise the drone actually flies until the end of july. bit of a setback, but at least i’ve got a direction now. onwards."}, {"post_id": 11790, "ts": "2026-06-19T05:52:36Z", "hours": 10.8169, "text": "Devlog #9: learning the AI side + designing a custom PCB really good, productive session today. spent the whole day learning. first half went into the machine learning side. since i want the algorithm to actually find and report fires properly, i went down a full rabbit hole on how AI works under the hood, neural networks, all of it. wanted to actually understand what’s going on instead of just copy pasting a model i don’t really get. second half i switched gears to hardware and started designing a PCB. right now my gps/compass, the SBC, and the ESC are all separate boards basically taped to a surface, which is messy and not great for an actual flying build. the plan is to get all of them onto one clean board instead. good mix of software and hardware today, feels like things are starting to come together."}, {"post_id": 11141, "ts": "2026-06-18T07:06:04Z", "hours": 4.8339, "text": "Devlog #8: it finally works oh my gosh. amazing and relieving day today. i’d been pretty down about this for a while. my motors just wouldn’t spin during the bench test, and i’d already ordered three ESCs, new motors, and new wires trying to fix it. none of it worked, so i returned all of it. today my new ESC finally showed up. i leave for india on sunday for a month, so these next few days are my only window to get any hardware done. so i sat down and meticulously (and painfully) soldered every joint, checking continuity with my multimeter over and over. a few connections literally fell apart while i was hooking up the wires, so i had to stop and resolder them. just wanted the wiring to be perfect this time. then the worst moment: i tested it and nothing worked. again. i was genuinely gutted. but then i noticed an orange cable just sitting there, not plugged in, and it clicked, that was the ground (GND). i connected the ESC ground to the FC ground, ran the motor test, and everything spun. all of it. no errors except some OSD stuff, which is just a missing SD card. massive relief. that one unplugged ground wire was the whole thing. next month in india i’ll be working on the code side of the drone, then test for flight again when i get back."}, {"post_id": 9775, "ts": "2026-06-16T06:54:09Z", "hours": 6.1247, "text": "Devlog #7: new ESC, somehow worse wow, rough day. got my new ESC in and resoldered every connection as cleanly as i could. but somehow it went the wrong way, instead of just one motor not working, now none of them work. so that’s fun. i’ve ordered another one. before i jump to blaming the flight controller this time, i want to go back through the wiring really meticulously and rule that out first. feels like it’s something small i keep missing. annoying timing too. i’m away from the 20th to the 20th, basically a month, so i’ll be forced to work on just the software side until i’m back. wish me luck pls."}, {"post_id": 7324, "ts": "2026-06-12T06:19:40Z", "hours": 4.2369, "text": "Devlog #6: down to a board problem today was a sad one. my new wires finally came and i swapped them all in, but the one motor still wouldn’t work. after that i’ve basically narrowed it down to a board problem. either i damaged the FC with my rough soldering, or it had some issue before i even started. so i’ve ordered a new board. i’m going on vacation soon, and i can only hope it arrives before i leave. if it doesn’t, i’ll be left to just improve, fine tune, and perfect the ML and software side until i’m back. not the day i wanted, but at least i think i know where the problem is now."}, {"post_id": 6395, "ts": "2026-06-10T19:14:57Z", "hours": 5.2294, "text": "Devlog #5: still chasing the one dead motor tested the drone with the battery again and the one motor still wouldn’t spin. while i was at it i calibrated most of the sensors, the accelerometer, GPS, and compass, so at least that side is sorted now. then i swapped the motor out again just to rule it out, and it still didn’t work. at this point i’m fairly sure it’s either an ESC problem or a wiring issue. my new wires come tomorrow, so i’ll be able to narrow it down properly and do what i can to fix it. slow progress, but i’m closing in on it."}, {"post_id": 6012, "ts": "2026-06-10T02:29:49Z", "hours": 8.6739, "text": "Devlog #4: chasing the dead motor + first autonomous code plugged in the battery and ran a test today, found a few bugs. the main one: one of the motors still wouldn’t work. so i went through it properly this time. resoldered all the connections, swapped in a known-working motor, still no spin. then i uncapped the battery pull going to that motor to check if it was a power issue, and still nothing. resoldered everything one more time, and it still wouldn’t spin. at that point i figured it has to be the bullet plug connectors, so i’ve ordered new ones. on the software side i actually made some progress, wrote some of the python autonomous flight code by SSHing into the raspberry pi. nice to move the code forward while the hardware’s still being stubborn."}, {"post_id": 4293, "ts": "2026-06-07T15:37:37Z", "hours": 9.2333, "text": "Devlog #3: designed and printed the entire drone chassis big hardware milestone today, i designed and 3d printed the entire drone chassis. did the whole design in onshape. spent a good while on the layout because the chassis has to hold everything: the flight controller, the ESC, the motor arms, the battery, the raspberry pi, and the gps/compass. i measured each component so i could put proper mounting holes and slots for all of them instead of just taping stuff to a plate. the motor arm spacing and overall geometry took the most back and forth, it has to be symmetric and square or the drone won’t fly right. M after a few tweaks to the model i sent it to the printer. next up is mounting everything onto it and starting the wiring."}, {"post_id": 3984, "ts": "2026-06-07T03:54:56Z", "hours": 6.7931, "text": "Designed and assembled the legs for my drone. I also soldered some electronic connections to the ESC (Electronic Speed Controller)."}, {"post_id": 3801, "ts": "2026-06-06T21:04:18Z", "hours": 0.8586, "text": "Devlog #1: designing and printing the arms kicking off a new project, an autonomous fire detecting and firefighting drone. the goal is a drone that can find and report fires on its own. starting with the hardware, so today i designed and printed the arms. did the design in onshape. the arms are carbon fiber tubes for the length and stiffness, paired with 3d printed plastic attachments that clamp onto the tubes and hold the motors out at the ends. carbon fiber keeps them light and rigid, which is exactly what you want for the arms, and the printed parts let me make mounts that actually fit my motors and bolt onto the frame. this session was mostly the build and assembly side, getting the carbon fiber pieces and the plastic attachments fitted together. feels good to have the first structural parts of the drone done. solid start, the skeleton’s starting to take shape."}]...
|
Title: Prometheus by @rishithc | Stardance
Devlog Title: Prometheus by @rishithc | Stardance
Devlogs:
Devlog #1: designing and printing the arms kicking off a new project, an autonomous fire detecting and firefighting drone. the goal is a drone that can find and report fires on its own. starting with the hardware, so today i designed and printed the arms. did the design in onshape. the arms are carbon fiber tubes for the length and stiffness, paired with 3d printed plastic attachments that clamp onto the tubes and hold the motors out at the ends. carbon fiber keeps them light and rigid, which is exactly what you want for the arms, and the printed parts let me make mounts that actually fit my motors and bolt onto the frame. this session was mostly the build and assembly side, getting the carbon fiber pieces and the plastic attachments fitted together. feels good to have the first structural parts of the drone done. solid start, the skeleton’s starting to take shape.
Designed and assembled the legs for my drone. I also soldered some electronic connections to the ESC (Electronic Speed Controller).
Devlog #3: designed and printed the entire drone chassis big hardware milestone today, i designed and 3d printed the entire drone chassis. did the whole design in onshape. spent a good while on the layout because the chassis has to hold everything: the flight controller, the ESC, the motor arms, the battery, the raspberry pi, and the gps/compass. i measured each component so i could put proper mounting holes and slots for all of them instead of just taping stuff to a plate. the motor arm spacing and overall geometry took the most back and forth, it has to be symmetric and square or the drone won’t fly right. M after a few tweaks to the model i sent it to the printer. next up is mounting everything onto it and starting the wiring.
Devlog #4: chasing the dead motor + first autonomous code plugged in the battery and ran a test today, found a few bugs. the main one: one of the motors still wouldn’t work. so i went through it properly this time. resoldered all the connections, swapped in a known-working motor, still no spin. then i uncapped the battery pull going to that motor to check if it was a power issue, and still nothing. resoldered everything one more time, and it still wouldn’t spin. at that point i figured it has to be the bullet plug connectors, so i’ve ordered new ones. on the software side i actually made some progress, wrote some of the python autonomous flight code by SSHing into the raspberry pi. nice to move the code forward while the hardware’s still being stubborn.
Devlog #5: still chasing the one dead motor tested the drone with the battery again and the one motor still wouldn’t spin. while i was at it i calibrated most of the sensors, the accelerometer, GPS, and compass, so at least that side is sorted now. then i swapped the motor out again just to rule it out, and it still didn’t work. at this point i’m fairly sure it’s either an ESC problem or a wiring issue. my new wires come tomorrow, so i’ll be able to narrow it down properly and do what i can to fix it. slow progress, but i’m closing in on it.
Devlog #6: down to a board problem today was a sad one. my new wires finally came and i swapped them all in, but the one motor still wouldn’t work. after that i’ve basically narrowed it down to a board problem. either i damaged the FC with my rough soldering, or it had some issue before i even started. so i’ve ordered a new board. i’m going on vacation soon, and i can only hope it arrives before i leave. if it doesn’t, i’ll be left to just improve, fine tune, and perfect the ML and software side until i’m back. not the day i wanted, but at least i think i know where the problem is now.
Devlog #7: new ESC, somehow worse wow, rough day. got my new ESC in and resoldered every connection as cleanly as i could. but somehow it went the wrong way, instead of just one motor not working, now none of them work. so that’s fun. i’ve ordered another one. before i jump to blaming the flight controller this time, i want to go back through the wiring really meticulously and rule that out first. feels like it’s something small i keep missing. annoying timing too. i’m away from the 20th to the 20th, basically a month, so i’ll be forced to work on just the software side until i’m back. wish me luck pls.
Devlog #8: it finally works oh my gosh. amazing and relieving day today. i’d been pretty down about this for a while. my motors just wouldn’t spin during the bench test, and i’d already ordered three ESCs, new motors, and new wires trying to fix it. none of it worked, so i returned all of it. today my new ESC finally showed up. i leave for india on sunday for a month, so these next few days are my only window to get any hardware done. so i sat down and meticulously (and painfully) soldered every joint, checking continuity with my multimeter over and over. a few connections literally fell apart while i was hooking up the wires, so i had to stop and resolder them. just wanted the wiring to be perfect this time. then the worst moment: i tested it and nothing worked. again. i was genuinely gutted. but then i noticed an orange cable just sitting there, not plugged in, and it clicked, that was the ground (GND). i connected the ESC ground to the FC ground, ran the motor test, and everything spun. all of it. no errors except some OSD stuff, which is just a missing SD card. massive relief. that one unplugged ground wire was the whole thing. next month in india i’ll be working on the code side of the drone, then test for flight again when i get back.
Devlog #9: learning the AI side + designing a custom PCB really good, productive session today. spent the whole day learning. first half went into the machine learning side. since i want the algorithm to actually find and report fires properly, i went down a full rabbit hole on how AI works under the hood, neural networks, all of it. wanted to actually understand what’s going on instead of just copy pasting a model i don’t really get. second half i switched gears to hardware and started designing a PCB. right now my gps/compass, the SBC, and the ESC are all separate boards basically taped to a surface, which is messy and not great for an actual flying build. the plan is to get all of them onto one clean board instead. good mix of software and hardware today, feels like things are starting to come together.
Devlog #10: motor test issues and a flight controller swap not gonna lie, things went downhill pretty fast today. i celebrated a bit early. all my motors spun fine on the individual motor test, so i figured i was basically there. then i hit “test all” and only 2 of the 4 motors spun. and it kept happening. i was sure it was a software/parameter thing at first, so i spent hours over the past few days going through ardupilot params trying to get all 4 to fire at once. couldn’t get it. every motor spins perfectly on its own, but only 2 ever spin on the test all. after sitting with it for a while, i’m pretty sure the issue comes down to the flight controller. i’d been running a cheap board that’s really built for fixed wing, and going through the ardupilot docs it just wasn’t the right fit for what i’m doing. so i’ve ordered a proper flight controller to swap in. the timing isn’t great. i leave for my trip the day after tomorrow, so for the next month i’m stuck on just the software side, no hardware. the new FC is on its way but realistically i can’t promise the drone actually flies until the end of july. bit of a setback, but at least i’ve got a direction now. onwards.
Devlog #11: started the new CV code, deciding on the approach got through about half the CV code today, good progress on the rewrite. right now i’m deciding between two routes for the actual fire recognition: tensorflow + mobilenet-SSD — a proper deep learning object detector. heavier, but it actually learns what fire looks like, so it should handle different lighting and angles way better. regular opencv + a few libraries — lighter and simpler, runs easy on the Pi, but less robust. still weighing it. mobilenet-SSD is probably the stronger long term call since it generalizes better, but opencv is much lighter on the Pi, so i want to see what framerate i actually get before committing to either. next: benchmark both and pick one.
Devlog #12 : scrapped my CV code, went full YOLO ok!! so i went on a learning spree today and a LOT happened. ngl one of those days where you start the morning thinking you know stuff and end it realizing you knew nothing. ##i was doing my CV wrong so my old fire detection was classical CV, just color matching + flicker. cool little hack and it technically worked, but tbh it was way too fragile. anything orange in bright light could set it off, and it’s is supposed to fly on a drone in the sun, so that’s not happening. so i did the painful thing and scrapped the whole lot. felt bad deleting code that “worked” but it was never gonna be reliable enough out in the real world. went down the YOLO rabbit hole spent basically the whole day researching YOLO (you only look once, the object detection one). instead of me hand coding what fire “looks like” with color rules, the model actually learns it from examples. way more robust to lighting, angles, all the randome stuff a drone is gonna run into. got a basic YOLO model up and running. its rough rn but its already a different league from the color matching. side quest: mediapipe body tracking also messed around with mediapipe today as a practice project, tracked my own body/pose in real time. wasnt strictly for the drone, just wanted to get comfortable with actual CV pipelines and see how the landmark tracking works under the hood. hardware: turned my ceiling into a drone im on vacation so no real flying, but i still wanted to test from a drone’s POV. so i straight up taped a webcam to my ceiling pointing straight down. now i can test the CV from that top down birds eye angle, which is way closer to what the drone actually sees than my laptop cam pointed at my face. next up train the YOLO model on a proper fire dataset run it against the ceiling cam footage check fps on my laptop vs what i’ll realistically get on the Pi 🫡
Devlog #13 : built a fire detection system for my drone’s Pi i genuinely lost my sanity working on ts (Everything is on gh) started on the payload for my autonomous quad: real time fire detection running on the Raspberry Pi. went classical CV with OpenCV instead of training a model. Since it has to run fully offline on the drone (no internet up there) so a heavy ML model was out. turns out you get pretty far with just color + motion. how it works: grabs the warm/bright pixels (orange/red/yellow in HSV, plus an R≥G≥B rule so it’s actually fire toned, not just bright) flicker analysis over a few frames. ts is the part that matters. real flame shimmers frame to frame, a static orange thing (a ball, a jacket, a sunset) doesn’t, so it won’t false trigger on every orange object it sees debounces over several frames so one noisy frame can’t trip it spits out a 0-100% confidence from area + flicker + persistence the two bits that do the work. color mask first: # warm/bright flame colors warm = cv2 . inRange ( hsv , ( 0 , sat_min , val_min ), ( 35 , 255 , 255 )) warm |= cv2 . inRange ( hsv , ( 170 , sat_min , val_min ), ( 179 , 255 , 255 )) # fire skews R >= G >= B with a real red lead, not just any bright pixel b , g , r = cv2 . split ( bgr . astype ( np . int16 )) order = (( r >= g ) & ( g >= b ) & ( r > 150 ) & (( r - b ) > 28 )). astype ( np . uint8 ) * 255 warm = cv2 . bitwise_and ( warm , order ) then the flicker check. just how much the fire region changed since last frame: diff = cv2 . absdiff ( mask , prev_mask ) flicker = np . count_nonzero ( diff ) / max ( fire_area , 1 ) # static orange object -> ~0 real flame -> way higher built a web dashboard for it too (Flask). same code runs on my laptop off the webcam to test, then goes straight on the Pi headless and i open it from my laptop browser over wifi. console sits calm/cyan while scanning, goes full red + pulsing + beeping the sec it locks fire. got live sliders to tune sensitivity so i’m not editing code every time. tested 4k fireplace video, locks on clean. waved random orange stuff it’s not certified or anything. classical CV WILL false trigger in harsh light so next: wire the “fire detected” event to grab the GPS coord off the flight controller and trigger a loiter so the drone marks the spot. btw if anyone’s done fire/smoke detection on a Pi 4 lmk if you went CV or tflite, curious what fps you got. 🫡
Devlog #14: building the dataset + training a tensorflow model spent today on the data side of fire detection, which is half the battle with ML. to train a model to recognize fire i need a solid labeled dataset, so first i built an image scraper. it crawls the web usinf breadth first search, going level by level through pages and pulling images as it goes. i used bidirectional bfs to expand the search from two fronts and cover more ground instead of just crawling one direction. ended up pulling a bunch of images, including a lot of tricky ones like trees and random orange stuff that a fire model could easily get confused by. then i built a small labeling tool to actually tag all of it. it shows me one image at a time, a tree, an orange object, an actual fire, and i just mark it as fire or no fire. way faster than sorting through folders by hand, and getting those confusing orange non-fire images labeled is exactly what stops the model from false triggering later. with some data labeled i started training a tensorflow model on it, mostly experimenting at this point to see how it behaves and what works. early days, but it’s a real step toward a model that actually learns what fire looks like instead of just matching colors. good progress on the part of this project.
Devlog #15: training my own model wasn’t the move yea so training my own model wasnt the best idea. after hours of clicking through my webscraper’s image results and marking them, i ran a benchmark myself by putting on youtube videos of wildfires from a sky perspective. it saw the smoke in the distance and gave that as the fire, when the real fire was miles away. it also found the sun and clouds as a fire. so, false positives everywhere. so today i basically tested and worked with existing solutions instead, like this one: https://github.com/AlimTleuliyev/wildfire-detection , plus other open source alternatives on kaggle. but yea, overall today i felt retrogressed, and i’m thinking of going back to CV. This article also helped a lot https://www.mdpi.com/2571-6255/7/4/140 .
Devlog #16: I probably should have done this earlier :( yea so while on vacation I decided to rework the weight and thrust ratios that the motors were producing with 11x7 props. I found out that my drone will not be able to fly SMOOTHLY. So I decided too look into why, one of the big reasons were that it was heavy, and two it wasn’t aerodynamic. So today I tried to kill two birds with one stone, (I also worked on my ML for a good portion of the time, but I feel this is more important). I ran digital wind tunnel tests and kept redesigning and testing until I landed on what I have now. I plan to make this out of carbon fiber which will be expensive, but ig that’s part of the process.
Devlog #17: I tested a lot tdy as well as designed new components I submitted my project, as is, to the Outpost fund, and I got some feedback. Mostly everything was good except for some issues with funding an NVDIA devkit :))), but the biggest issue was that I couldn’t buy a flight controller. In an devlog before, I mentioned and shows a picture of me designing a custom pcb, but I have not worked on that since. So today I fired up Kikad and designed layer 2 of my FC (easier, layer one has a lot of components that I need to import). I also spent a good chunk of today refining my 3d model, I used Air Shaper and SimScale and I aerodynamic tested all of the designs, I also asked claude for some ideas of how to make my .stls better. @vrunchil7 is da goat frfr he taught me how and what kikad is.
Devlog #18: A GREAT way to start working on your project again 😩 I’ve taken a break these past few days, realizing that a vacation exists for a reason! Today, however, I didn’t want to fall behind schedule. Since I also want grants to use a premium carbon fiber frame and all I need is to finish my PCB, I spent the day working in KiCad. Truth be told, the best way to learn is by doing—I thought the same about CAD, and I feel the same about PCB design. I made the executive decision to make a double-sided PCB rather than adding more layers, as it will be much simpler. Anyway, here are my final mockups.
Ships:
I made an autonomous drone. The most challenging part was the soldering. The soldering was quite hard for me and there were times where i burnt my hand...
|
1792875212.5828192
|
1793739212.5828192
|
|
3522
|
Inscryption Multiplayer Online by @MouthlessStoat Inscryption Multiplayer Online by @MouthlessStoat | Stardance...
|
MouthlessStoat
|
0
|
154.81
|
0
|
[]
|
[{"post_id": 57409, "ts": "202 [{"post_id": 57409, "ts": "2026-08-29T15:36:57Z", "hours": 9.0444, "text": "Devlog 14: Implemented a deck library feature to browse and edit all the deck. It was surprising hard to implement a way for deck from different format and ruleset to be converted to another ruleset. It almost look like a game, now only have to implement some small feature like variable attacks and missing sigils as well as custom sigils and card portraits."}, {"post_id": 55016, "ts": "2026-08-26T13:20:22Z", "hours": 18.4028, "text": "Devlog 13: Finishing and touching up the deck editor, now with actual filtering, saving decoration to distinguish different rarity. Along with this actually parse the side deck option and now they can be selected in the deck editor. Now working on a deck library function to display all the deck and allow them to be edit. Sigil progress is still going steadily"}, {"post_id": 47239, "ts": "2026-08-15T01:01:56Z", "hours": 10.8786, "text": "Devlog 12: Been spending the past few days implementing and fixing the card renderer, now everything should be final with no large major changes. All of this is for the first rudimentary version of the deck editor, None of the filtering or side deck works or even saving but I need to post a devlog and so this is it. After this deck editor tangent is done more sigil need to be implemented, luckily I do have a friend to help with implementing sigils."}, {"post_id": 44970, "ts": "2026-08-11T02:36:26Z", "hours": 7.2186, "text": "Devlog 11: Working on and perfecting active as well as stat buff sigil"}, {"post_id": 42038, "ts": "2026-08-06T16:23:29Z", "hours": 3.7253, "text": "Devlog 10: Finally something to show instead of just boring technical code. This is a new card renderer to get ready for the deck editor. Art are done by a friend of mine or ripped from vanilla."}, {"post_id": 40919, "ts": "2026-08-04T19:07:01Z", "hours": 7.09, "text": "Devlog 9: Implement rudimentary ruleset parsing so now custom card can be loaded externally instead of just hard coding it into the game. Still have much to do but this lay the foundation for the game."}, {"post_id": 37711, "ts": "2026-07-30T16:48:12Z", "hours": 8.6803, "text": "Devlog 8: Huge refactoring to clarify the shape of a bunch of type that have been just passed around as Dictionary until now. This should hopefully make further development easier as it make stuff more clear and concrete"}, {"post_id": 33276, "ts": "2026-07-23T02:05:40Z", "hours": 9.2731, "text": "Devlog 7: Another small batch of sigil. Various sigils that I can implement without large modification to the code base. Along with these implementation are small bug fixes here and there through out the codebase. Roughly 1/4 or 27 sigils out of the total 106 from vanilla base game have been implemented."}, {"post_id": 29969, "ts": "2026-07-17T05:50:52Z", "hours": 1.8678, "text": "Devlog 6: Spent way too long trying to solve lil bugs, this one have to do with a new AddCardAction specification. New instead of constructing and adding the card and expecting it to always be public, it now support private card, but need the user to make a new token if they want new card."}, {"post_id": 29888, "ts": "2026-07-17T01:36:21Z", "hours": 8.9164, "text": "Devlog 5: First small batch of sigil now that the stack system is mature, more to come over the next few devlog until most if not all sigils are implemented, then other features can be work upon."}, {"post_id": 28481, "ts": "2026-07-14T18:59:46Z", "hours": 33.1594, "text": "Devlog 4: Oops i went a long time without devlog, ourely because most of the work now are backend stuff that don’t really have anything to show for a devlog. Just boring design of the code base so that adding more feature in the future would be much much easier. Currently the action and stack system are being finalize, i am pretty confident this is the final revision with not much other changes. Sigil are still slowly being added with the increasing power of the stack system. No new major feature can be develop until the stack is perfect and capable. Cost and sigil that interact with them are finish, the custom cost system need to come later as I don’t want to spend even more time working on backend stuff and never releasing an alpha version."}, {"post_id": 9074, "ts": "2026-06-15T04:55:02Z", "hours": 14.1511, "text": "Devlog 3: Absolute countless night of head banging, finally implemented combat although a bit janky for now. But it work super well for Inscryption. . When the turn end, combat action is issues, which resolve into some amount of card attack action. There is a strike override for sigil like Bifurcated Strike or Trifurcated Strike, and a replacement ability hook now so stuff like air borne can be implemented. . Next devlog might be like a very very long time because there are so many sigil in base game Inscryption to implement but that need to be done. Ill check back in when most of the sigil category are implemented into the game and make sure they work well with each other. . After that are active sigil, proper fight handling, like the rest of the game (deck builder, ui polish, etc.). Then after some QA and Alpha testing it can go into public Beta as version 0.0.1 (We use pride versioning around these part and also cus pride month <3)"}, {"post_id": 6989, "ts": "2026-06-11T18:48:18Z", "hours": 7.3147, "text": "Devlog 2?: This is mainly a backend devlog as a bunch of stuff are tweak and slightly modify so the DX can be better. Action are now a new base clas that new action can inherit this streamline the process of making new action and resolver instead of moving between like 3 different file to make a new action you only need to look and modify 2. . A new total rework of the stack system to be more clean and easy to work with. The game now pause correctly and resolve them in sequence activating more sigil as they go along. Along with this new stack and a bunch of design document and deliberation for the combat system that should be implemented in the next devlog. Because it is all backend stuff there are nothing to show for this devlog </3"}, {"post_id": 4698, "ts": "2026-06-08T03:51:38Z", "hours": 1.8117, "text": "Multiplayer Working After literally hours of playing around with syncing and networking and trying to make sure the 2 client can talk to each other, finally made a working small demo of playing card and resolving the stack correctly. Instead of the playing fast and loose nature of Inscryption I opted instead to use a stack like Magic the Gathering to handle sigil resolution and ability trigger. This causes like a lot more issue than originally expected. I wanted both client to work independently when resolving sigil but they still need private information like hand and deck for card like Corpse Maggot and Pelt Lice. So now we have a very janky system where after every stack action the game sit there and wait for the other client to boardcast any private trigger they have so both client can continue the work. The system now is quite robust and can take alot of funky stack stuff. Next is working on the combat and programming in a bunch of sigils."}, {"post_id": 4627, "ts": "2026-06-08T00:30:06Z", "hours": 13.2789, "text": "Getting all the basic boilerplate down like handing a fight and resolving the stack and some cool lil UI"}]...
|
Title: Inscryption Multiplayer Online by @Mouthles Title: Inscryption Multiplayer Online by @MouthlessStoat | Stardance
Devlogs:
Getting all the basic boilerplate down like handing a fight and resolving the stack and some cool lil UI
Multiplayer Working After literally hours of playing around with syncing and networking and trying to make sure the 2 client can talk to each other, finally made a working small demo of playing card and resolving the stack correctly. Instead of the playing fast and loose nature of Inscryption I opted instead to use a stack like Magic the Gathering to handle sigil resolution and ability trigger. This causes like a lot more issue than originally expected. I wanted both client to work independently when resolving sigil but they still need private information like hand and deck for card like Corpse Maggot and Pelt Lice. So now we have a very janky system where after every stack action the game sit there and wait for the other client to boardcast any private trigger they have so both client can continue the work. The system now is quite robust and can take alot of funky stack stuff. Next is working on the combat and programming in a bunch of sigils.
Devlog 2?: This is mainly a backend devlog as a bunch of stuff are tweak and slightly modify so the DX can be better. Action are now a new base clas that new action can inherit this streamline the process of making new action and resolver instead of moving between like 3 different file to make a new action you only need to look and modify 2. . A new total rework of the stack system to be more clean and easy to work with. The game now pause correctly and resolve them in sequence activating more sigil as they go along. Along with this new stack and a bunch of design document and deliberation for the combat system that should be implemented in the next devlog. Because it is all backend stuff there are nothing to show for this devlog </3
Devlog 3: Absolute countless night of head banging, finally implemented combat although a bit janky for now. But it work super well for Inscryption. . When the turn end, combat action is issues, which resolve into some amount of card attack action. There is a strike override for sigil like Bifurcated Strike or Trifurcated Strike, and a replacement ability hook now so stuff like air borne can be implemented. . Next devlog might be like a very very long time because there are so many sigil in base game Inscryption to implement but that need to be done. Ill check back in when most of the sigil category are implemented into the game and make sure they work well with each other. . After that are active sigil, proper fight handling, like the rest of the game (deck builder, ui polish, etc.). Then after some QA and Alpha testing it can go into public Beta as version 0.0.1 (We use pride versioning around these part and also cus pride month <3)
Devlog 4: Oops i went a long time without devlog, ourely because most of the work now are backend stuff that don’t really have anything to show for a devlog. Just boring design of the code base so that adding more feature in the future would be much much easier. Currently the action and stack system are being finalize, i am pretty confident this is the final revision with not much other changes. Sigil are still slowly being added with the increasing power of the stack system. No new major feature can be develop until the stack is perfect and capable. Cost and sigil that interact with them are finish, the custom cost system need to come later as I don’t want to spend even more time working on backend stuff and never releasing an alpha version.
Devlog 5: First small batch of sigil now that the stack system is mature, more to come over the next few devlog until most if not all sigils are implemented, then other features can be work upon.
Devlog 6: Spent way too long trying to solve lil bugs, this one have to do with a new AddCardAction specification. New instead of constructing and adding the card and expecting it to always be public, it now support private card, but need the user to make a new token if they want new card.
Devlog 7: Another small batch of sigil. Various sigils that I can implement without large modification to the code base. Along with these implementation are small bug fixes here and there through out the codebase. Roughly 1/4 or 27 sigils out of the total 106 from vanilla base game have been implemented.
Devlog 8: Huge refactoring to clarify the shape of a bunch of type that have been just passed around as Dictionary until now. This should hopefully make further development easier as it make stuff more clear and concrete
Devlog 9: Implement rudimentary ruleset parsing so now custom card can be loaded externally instead of just hard coding it into the game. Still have much to do but this lay the foundation for the game.
Devlog 10: Finally something to show instead of just boring technical code. This is a new card renderer to get ready for the deck editor. Art are done by a friend of mine or ripped from vanilla.
Devlog 11: Working on and perfecting active as well as stat buff sigil
Devlog 12: Been spending the past few days implementing and fixing the card renderer, now everything should be final with no large major changes. All of this is for the first rudimentary version of the deck editor, None of the filtering or side deck works or even saving but I need to post a devlog and so this is it. After this deck editor tangent is done more sigil need to be implemented, luckily I do have a friend to help with implementing sigils.
Devlog 13: Finishing and touching up the deck editor, now with actual filtering, saving decoration to distinguish different rarity. Along with this actually parse the side deck option and now they can be selected in the deck editor. Now working on a deck library function to display all the deck and allow them to be edit. Sigil progress is still going steadily
Devlog 14: Implemented a deck library feature to browse and edit all the deck. It was surprising hard to implement a way for deck from different format and ruleset to be converted to another ruleset. It almost look like a game, now only have to implement some small feature like variable attacks and missing sigils as well as custom sigils and card portraits....
|
1792594495.2896154
|
1793199295.2896154
|
|
901
|
Kern by @AntKru | Stardance
|
AntKru
|
3
|
153.98
|
2739
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:46:53Z", "hours": 65.0, "multiplier": 19.56, "payout": 1269, "blessing": "neutral", "text": "I have released the next version of my own kernel! The biggest feature I added is multitasking. While it doesn’t look that special, it was actually very difficult to make my kernel switch between different tasks! Here are some notes on how to try the project: If you don’t want/can’t run it, you can look at the video in the readme. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller", "repo": "https://gitlab.com/AntKru/kern", "demo": "https://gitlab.com/AntKru/kern/-/releases/"}, {"ship_num": 2, "ts": "2026-07-24T06:30:43Z", "hours": 48.0, "multiplier": 19.83, "payout": 961, "blessing": "neutral", "text": "I added a CLI the kernel, which was possible, because I finally have a keyboard driver! It only took so long, because it was actually difficult to write it: I thought I have to program the PIC, but it was already disabled so I had to learn the more complicated APIC. There is a demo video in the README if you don’t want to run the kernel. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller", "repo": "https://gitlab.com/AntKru/kern", "demo": "https://gitlab.com/AntKru/kern/-/releases/"}, {"ship_num": 3, "ts": "2026-06-20T14:34:14Z", "hours": 30.0, "multiplier": 17.21, "payout": 509, "blessing": "neutral", "text": "I made an x86_64 kernel using the limine boot protocol. I don’t know what the most difficult thing was, as even most basic things are very complicated for me as a beginner in osdev. I still have to learn much and the kernel will be improved, but I thing it kind of works now. I have a video demo in the readme, if you don’t have qemu . When building, remember to clone the submodules ( git submodule init && git submodule update ). You need xorriso to build the ISO. Sorry for mixing meson and make , but in the README is a guide. Please use clang, gcc is very complicated.", "repo": "https://gitlab.com/AntKru/kern", "demo": "https://gitlab.com/AntKru/kern/-/releases/"}]...
|
[{"post_id": 79283, "ts": "202 [{"post_id": 79283, "ts": "2026-10-13T09:56:47Z", "hours": 4.6628, "text": "Memory management problems… It seems like there was a critical bug sleeping inside my memory manager. It appeared since I started using the PMM in my AHCI driver, but I think the problem is in the virtual memory manager. For this reason I am working currently on the memory manager instead of the AHCI driver. Roadmap As soon as I fix the MM, I will continue on the AHCI driver. It probably won’t be finished until the end of stardance."}, {"post_id": 76791, "ts": "2026-10-04T16:08:54Z", "hours": 2.6242, "text": "AHCI! (SATA) I am jumping a little bit fast form PCI to AHCI, but I think the PCI driver is as good as I need it right now, and if I learn that it isn’t, I will fix it. Anyway, I am starting to work on AHCI! This is really cool, as this allows me to communicate to storage devices! At the moment the kernel just lists connected devices, but that’s just the beginning! Roadmap The AHCI driver is in a very early stage, and it will take me a lot of time to finish, as AHCI is relatively complicated and the documentation isn’t written for beginners like me ;-)"}, {"post_id": 74920, "ts": "2026-09-28T16:27:51Z", "hours": 3.6928, "text": "PCI! I am starting to write a PCI driver, which opens a new world to me! As you can see, the kernel is already able to print some information on boot about connected PCI devices. I also added a function that can search for a specific PCI device by it’s class, which will help me to implement drivers for specific PCI devices. Roadmap The real reason I am implementing PCI is that I need it to find the AHCI controller. The AHCI controller can be used to access connected storage devices, which is my long-term goal."}, {"post_id": 71311, "ts": "2026-09-20T16:38:40Z", "hours": 1.3486, "text": "Release 0.3.0 I finished the release, including the new borders command! The visible bugs that I found are also fixed, please report them if you find some! Roadmap The kernel isn’t finished yet, I will continue to improve it and see how far I will get."}, {"post_id": 70750, "ts": "2026-09-19T18:15:14Z", "hours": 4.075, "text": "Final improvements before the next release Status bar I moved the status bar from the bottom to the top and removed the borders, in my opinion it looks better this way. Framebuffer borders I am already working on a new command which will make it possible to see the borders of the framebuffer in QEMU. This will be useful for debugging while keeping the UI simple. Bugs There are still some obvious bugs: My printf() implementation seems to break with invalid format strings and I have a bug in my memory manager which prevents me from merging the command showing the screen borders into main. Roadmap I will try to fix the bugs, but the features are now complete. I want to release the new version tomorrow."}, {"post_id": 68765, "ts": "2026-09-15T18:23:31Z", "hours": 7.8061, "text": "printf compatability I improved the printf() compatability, so that I can pad numbers with or 0 . This is very useful, for example I now can use it to display time and date properly. Roadmap I don’t know yet what’s the next thing to do, maybe I will ship soon."}, {"post_id": 63678, "ts": "2026-09-07T16:41:58Z", "hours": 4.1103, "text": "Status bar! I added a status bar which show the current time. It is very basic, but makes the OS look way more friendlier in my opinion. Sorry for the weird messages in the main window, I am currently debugging my printf implementation. Roadmap I still have a problem with printing dates: The year 2006 would be printed as 206 , because the RTC has seperate registers for year and century, so if century is 20 and year is 6 it prints 206."}, {"post_id": 58325, "ts": "2026-08-30T18:21:09Z", "hours": 2.6081, "text": "“Windows” I am making it possible to split the framebuffer into multiple views. This should make it more easy to have a more advanced UI than a CLI already inside the kernel. Hopefully there will be user processes at some point, but I want to have a nice looking OS before that. Roadmap I still have to fix some things (as visible on the screenshot). After that, I can try to make use of it and add a status bar or a separate command window."}, {"post_id": 55470, "ts": "2026-08-27T10:27:14Z", "hours": 4.5317, "text": "RTC The kernel can now read the current time from the Computer’s RTC! At the moment, you can’t select the time zone, so the time is probably in UTC, depending on how the computer is configured. Roadmap I am planning to improve the use experience, for example by using multiple “windows”, to maybe even have a status bar."}, {"post_id": 52423, "ts": "2026-08-22T15:29:50Z", "hours": 4.2389, "text": "GCC support I added GCC support, which should (hopefully) make debugging easier for me. I can’t show it really on the screenshot, trust me, it is compiled with gcc! Roadmap I have still bugs in my multitasking system. Currently I get a page fault when compiling with optimization > -O2 with clang, the next step is to test it with GCC."}, {"post_id": 47914, "ts": "2026-08-16T05:50:20Z", "hours": 2.6892, "text": "Mutexes I implemented a simple mutex (which isn’t perfect yet, but it works). As visible on the screenshot, I used it to make it impossible for the test tasks to print at the same time. One problem with it is that it currently runs hlt after releasing a mutex so that a different task has a chance to acquire it, which doesn’t seem like the best solution to me. Roadmap I am making the terminal position atomic, so that I don’t need mutexes for output, which I can not use in interrupt handlers"}, {"post_id": 46418, "ts": "2026-08-13T16:41:17Z", "hours": 5.8897, "text": "Multitasking! I fixed the last bug (that I could find) and multitasking works now! On the screenshot you can see two tasks trying to print the numbers 0-19 at the same time. The CLI even waits until the tasks are finished! Road map The output is still a little bit broken, so I want to implement output buffering and mutexes, so that multiple threads can’t print at the same time."}, {"post_id": 44770, "ts": "2026-08-10T19:26:17Z", "hours": 6.2656, "text": "Multitasking… I am still working on multitasking, but I am stuck currently. I am trying to modify the stack frame so that asm_switch_task is called after iretq , but it doesn’t work. As you can see on the screenshot, I get a page fault as soon as it tries to switch tasks (in the debugging process I had it switch 2-3 times before it crashes, which is not really better) Road map My highest priority is to get task switching to work consistently. After that, I will see what I can polish."}, {"post_id": 43900, "ts": "2026-08-09T10:50:40Z", "hours": 2.4128, "text": "SSE register state switching! The kernel will now switch the SSE register state lazily, but I still have two problems: The Part for the registers in the TCB must be 16 byte aligned, which it currently not guaranteed The interrupt handlers are not allowed to use SSE instructions, but I have no way of verifying this Road map I think it is time to write a version of malloc() which can guarantee a specified alignment. After that, I can try to actually switch tasks automatically with a simple scheduler! I will probably use the PIT interrupt to switch to the next task in a list."}, {"post_id": 42570, "ts": "2026-08-07T11:56:52Z", "hours": 4.5606, "text": "It probably doesn’t sound special, but it is as important as everything else: SSE support SSE is an extension of the CPU which has 16 128-bit registers, but is rarely used. This means, that saving all of these registers every time a task switch occurs would cost some performance. For this reason, the CPU has a bit that can be set to indicate that a task switch occurred. In most cases, nothing happens and the registers are kept in their original state. But if a task needs to use SSE instructions, the CPU generates an interrupt, which manually saves the SSE registers. This is what I am working on currently. Custom ISR wrapper All interrupt handlers use now my custom wrappers, which made possible that I can work on SSE support."}, {"post_id": 40940, "ts": "2026-08-04T19:52:16Z", "hours": 5.0347, "text": "Array optimization (Screenshot 1) I now actually optimized the dynamic array type, which means that it allocates memory in bigger chunks instead of every time an element is added / removed. In the process I added some debug logging, so typing is now very difficult if you don’t know how it works with log level LOG_DEBUG . Custom ISR wrapper (Screenshot 2) I finally decided to implement my own wrapper for ISRs instead of relying on __attribute__((interrupt)) . This should allow me to use floating point math with the FPU in the future. Also, I can now read more registers on interrupt (screenshot). Road map I am currently working on making all ISRs compatible with my wrapper. Then I will continue trying to get multitasking to work."}, {"post_id": 38897, "ts": "2026-08-01T14:03:43Z", "hours": 6.4275, "text": "Multitasking (Screenshot 1) I decided to try to implement multitasking! The kernel can now switch tasks, but only one time. This is the first step in direction of real multitasking, but I still have much to do. It is interesting to see, How I realize how bad my implementations I did earlier are, because I don’t fully understand them. But now I can improve them! Dynamic arrays (Screenshot 2) I made a quick implementation of dynamic arrays for the keyboard driver, but as I realized that I need them to store a list of tasks, I decided to implement one optimized implementation I can use everywhere. I have implemented a very simple version and use it in the keyboard driver, but it isn’t optimized yet. In fact, it’s even worse than the one I had earlier in the keyboard driver, because every modification now requires a reallocation. Road map I am going to optimize dynamic arrays, and then continue with multitasking."}, {"post_id": 36558, "ts": "2026-07-28T19:08:32Z", "hours": 2.8569, "text": "PIT I quickly wrote a simple PIT (Programmable Interval Timer) driver, so that I have a basic sleep function. It isn’t really useful at the moment and not thread safe, but as it was very simple I thought why not? APIC I realized that MADT I/O APIC overrides also override the flags of entries, so I am using these now unless it’s overridden by the user. Road map As I have now a simple keyboard driver, I want to work on something new. Some things I am considering: Multitasking Filesystems ELF loading PCI USB All of this topics are completely new to me, so I will pick the one that looks the most simple and probably fail anyway."}, {"post_id": 33535, "ts": "2026-07-23T15:58:35Z", "hours": 2.3419, "text": "I am shipping soon! Some little improvements in messages I improved some messages, so that the kernel looks more polished to new users. v0.2.0 I released a new version, which is what I am shipping soon (if nothing goes wrong). It includes an interactive CLI, which was made possible with the new keyboard driver. I improved the scrolling performance a lot, which I personally really enjoy! Finally, I fixed a bug when printing numbers, so the printed memory map now has (mostly) correct addresses."}, {"post_id": 32511, "ts": "2026-07-21T18:56:41Z", "hours": 3.1614, "text": "The kernel is now interactive! Demo CLI I added a demo CLI (you can see it on the screenshot) where you can exit properly, run tests or view the old demo! Keyboard driver I had to fix some bugs with the keyboard driver, but now I think it works okay enough that the CLI is stable (previously, it kept parts from the old buffer when reading it again) Road map I want to add more features to the CLI, such as setting the log level. As you can see on the screenshot, the debug output disturbs the CLI."}, {"post_id": 31826, "ts": "2026-07-20T14:47:46Z", "hours": 5.0328, "text": "I FINALLY get interrupts from the keyboard! PS/2 Keyboard driver The problem was, that I mistook the IRQ number for the interrupt vector when calling my own function! Now I can start expanding my keyboard driver. Currently, it already prints the pressed keys to the screen, as you can see on the screen shot. Performance improvements when scrolling After I finished the interrupt stuff, I can focus on improving the TTY in other areas, like the performance. I am using now memset() and memcpy() functions when scrolling the frame buffer, which itself is not an improvement: I optimized the two functions to use copy 8-byte blocks ad uint64_t instead of each byte individually, which made a significant difference. Scrolling with KVM acceleration is now almost instant on my PC, and without it is as fast as it was before with acceleration. Road map I want to improve the TTY with things like buffering, which should improve the performance even more. When I have a solid TTY, I can rework the demo and ship again."}, {"post_id": 30816, "ts": "2026-07-18T19:00:05Z", "hours": 6.3653, "text": "I am still far away from getting interrupts from the keyboard, but I am still learning much and making progress on other parts of the kernel! PMM I added support for mapping pages manually, which means that I can program now the APICs! While debugging this, I also improved my Page Fault handler, which you can see on the screenshot. APIC driver The APIC driver should now be able to configure IRQs on the I/O APIC to get delivered to the local APIC, but I can’t test it as I still don’t know why I can’t get interrupts from the keyboard :-( Road Map I am still working on getting interrupts from the keyboard, which is my main goal before the next ship. I currently suspect that my PS/2 driver is broken."}, {"post_id": 29069, "ts": "2026-07-15T18:32:01Z", "hours": 7.5669, "text": "I prefer this devlog format, so I will stick to it. I/O APIC As I explained earlier, I need to configure the APIC to get interrupts. I think I only need the I/O APIC and not the local APIC, if I understand the limine documentation correctly. But when trying to access it’s registers, I got a page fault. It seems like I need to manually map the registers to virtual memory, which brings me to… Physical Memory Manager I need to do what I already feared when starting to write the PMM, manually editing page tables. I am working on a function which will map pages (Including the I/O APIC registers) to virtual addresses. For this, I need to walk the complete paging structure: PML4 (from cr3) -> PDPT -> PD -> PT I can already parse it until I have the PT’s address, but when accessing the PT I get a page fault, as you can see on the screenshot. Road map I just wanted to post this update so that the next devlog is not too long. I will continue to work on the PMM, until I can access the I/O APIC’s registers."}, {"post_id": 24628, "ts": "2026-07-08T10:52:11Z", "hours": 8.3475, "text": "I did not post for some time, so this devlog will be relatively long. PS/2 driver (Screenshot 1) I wanted to get the PIC to work, but as I had no idea why it didn’t work I thought that the PS/2 Controller might not be in a functioning state. So, I wrote a PS/2 driver which initializes the Controller, and also detects connected devices! PIC -> APIC After that, I finally found out that limine already sets up the APIC, which means that the PIC is no longer functional. So I decided that my next big goal is to learn how ACPI and APIC work… ACPI (Screenshot 2) As you can see on the screenshots, I started working on an ACPI driver, which is already able to find tables like the MADT, which I need to find the APICs UEFI This does not have anything to do with the progress of my project, but I learned how to use UEFI in QEMU, so that I can debug my ACPI driver better. Road map I will have to learn now how APICs work, so that I can get interrupts from the keyboard. Then, I can improve the keyboard driver, which should make the kernel way more fun to use!"}, {"post_id": 20746, "ts": "2026-07-02T13:20:11Z", "hours": 6.0672, "text": "I have finished implementing the memory manager! free() will now call pmm_free() to free unused pages. At the moment it does not make any difference, but if I want to extend the PMM it will have saved me the work. Also, I split the demo from the main function so that it is more maintainable. Log messages with the log level DEBUG will now only appear in debug builds. This made the output much more readable, as you can see in the screenshots."}, {"post_id": 19208, "ts": "2026-06-30T14:00:38Z", "hours": 9.6128, "text": "I have added a simple memory manager to my kernel! It was only possible with the help from kmos , a project I found while voting. I didn’t know how to start writing a physical memory manager, but in that kernel I found that I have to use the limine HHDM request to have simple access to physical addresses. Then I could implement the rest completely myself. The last thing left to do until I’m satisfied with my memory manager, is to free pages in the PMM after using free()"}, {"post_id": 12539, "ts": "2026-06-20T14:12:50Z", "hours": 0.8414, "text": "Now I am actually shipping! I had a bug that occured only when compiling with optimization level 2 or higher (which I used in the release CI). As I am working now on a Debian machine, I made it also compile on Debian stable by not requiring a new objcopy version. On the screenshot you can see the bug."}, {"post_id": 11482, "ts": "2026-06-18T19:17:02Z", "hours": 4.0292, "text": "I will ship the kernel now for the first time! I added a libk (like a libc but for the kernel) and implemented some cool functions like printf(), which I could use for cool error messages with hex numbers like the one on the screenshot."}, {"post_id": 9395, "ts": "2026-06-15T18:55:28Z", "hours": 2.4939, "text": "I sadly don’t have much to say, because I did make almost no progress. I am trying to use the PIC to get interrupts from the keyboard, but it doesn’t work for some reason. Maybe I will try to use APIC instead, but it’s more complicated."}, {"post_id": 8627, "ts": "2026-06-14T10:44:21Z", "hours": 2.2619, "text": "I finally figured out how I can integrate the external library! Now I can skip instructions when an interrupt is executed and continue execution"}, {"post_id": 7621, "ts": "2026-06-12T19:00:11Z", "hours": 1.0647, "text": "I just wanted to implement an interrupt handler specific to divide error, but it turned out to be way more difficult than I thought! To continue execution after the interrupt, I have to manually increment the instruction pointer manually. But to know by which amount, I need to now the size of the whole instruction. To find it I wanted to use a library called Zydis, but I could not get it to compile, because clang generates calls to memset() and memcpy() . As I can not link with the standard library, I will have to find a solution tomorrow."}, {"post_id": 5837, "ts": "2026-06-09T19:37:29Z", "hours": 3.1153, "text": "I added a demo to show the features of my kernel. The kernel is almost ready for the first ship!"}, {"post_id": 4373, "ts": "2026-06-07T18:00:51Z", "hours": 3.2469, "text": "After giving up on the memory manager, I added logging and very basic interrupt handling. I will ship the project when I have a demo of all the features and published ISOs."}, {"post_id": 3530, "ts": "2026-06-06T14:47:32Z", "hours": 2.2575, "text": "As I have now a very basic way to interact with the kernel, I will try to move on to more complex topics. At the moment I try to understand how memory management exactly works (specifically, how to write a physical memory manager), but it’s difficult to find information about it. Until now, I have requested a memory map from limine and can display it in a table."}, {"post_id": 3364, "ts": "2026-06-06T07:57:08Z", "hours": 1.7286, "text": "I implemented enter key press detection before doing anything else, so that I can interact somehow with the kernel. I did it with IO Ports instead of interrupts for now (because I don’t know how to set up interrupts), which means it only works with PS/2 Keyboards. Luckily, qemu shows the keyboard as a PS/2 Keyboard."}, {"post_id": 2308, "ts": "2026-06-04T18:38:28Z", "hours": 2.5331, "text": "I have added a normal font which makes things way simpler. I also improved the general tty: scrolling, new lines and tabs work now!"}, {"post_id": 1458, "ts": "2026-06-03T14:42:11Z", "hours": 1.7617, "text": "I spend so much time to fix a stupid bug (taking the address of a pointer instead of the address stored in the pointer), but know I can display characters from my ugly psf2 font! At least I learned more about gdb."}, {"post_id": 957, "ts": "2026-06-02T18:43:29Z", "hours": 3.0825, "text": "I implemented a set_pixel function, so that I can set specific pixels on the framebuffer. The next step will probably be to display text, maybe with a font made with psfedit, my project for flavortown. I also published my code on GitLab, which means I will try to build ISOs with gitlab CI at some point."}, {"post_id": 294, "ts": "2026-06-01T15:23:58Z", "hours": 1.1658, "text": "I have started to work on my kernel! I just set up my project structure but it does not work as you can see on the screenshot. I will look at it tomorrow. I have already tried to write a kernel earlier this week, but it was an i686 kernel with multiboot 2. Also, I had to copy much code from the limine template, but I will go beyond that when the kernel runs. This means, that I have a weird mix of makefile and meson, as the example uses make but I prefer meson. As I do not want to set up long mode myself, my new kernel uses limine instead of multiboot. My current plan is to get it to run and then publish the source code. Later, I might try to remove make completely and only rely on meson for building the iso."}]...
|
Title: Kern by @AntKru | Stardance
Devlogs:
I hav Title: Kern by @AntKru | Stardance
Devlogs:
I have started to work on my kernel! I just set up my project structure but it does not work as you can see on the screenshot. I will look at it tomorrow. I have already tried to write a kernel earlier this week, but it was an i686 kernel with multiboot 2. Also, I had to copy much code from the limine template, but I will go beyond that when the kernel runs. This means, that I have a weird mix of makefile and meson, as the example uses make but I prefer meson. As I do not want to set up long mode myself, my new kernel uses limine instead of multiboot. My current plan is to get it to run and then publish the source code. Later, I might try to remove make completely and only rely on meson for building the iso.
I implemented a set_pixel function, so that I can set specific pixels on the framebuffer. The next step will probably be to display text, maybe with a font made with psfedit, my project for flavortown. I also published my code on GitLab, which means I will try to build ISOs with gitlab CI at some point.
I spend so much time to fix a stupid bug (taking the address of a pointer instead of the address stored in the pointer), but know I can display characters from my ugly psf2 font! At least I learned more about gdb.
I have added a normal font which makes things way simpler. I also improved the general tty: scrolling, new lines and tabs work now!
I implemented enter key press detection before doing anything else, so that I can interact somehow with the kernel. I did it with IO Ports instead of interrupts for now (because I don’t know how to set up interrupts), which means it only works with PS/2 Keyboards. Luckily, qemu shows the keyboard as a PS/2 Keyboard.
As I have now a very basic way to interact with the kernel, I will try to move on to more complex topics. At the moment I try to understand how memory management exactly works (specifically, how to write a physical memory manager), but it’s difficult to find information about it. Until now, I have requested a memory map from limine and can display it in a table.
After giving up on the memory manager, I added logging and very basic interrupt handling. I will ship the project when I have a demo of all the features and published ISOs.
I added a demo to show the features of my kernel. The kernel is almost ready for the first ship!
I just wanted to implement an interrupt handler specific to divide error, but it turned out to be way more difficult than I thought! To continue execution after the interrupt, I have to manually increment the instruction pointer manually. But to know by which amount, I need to now the size of the whole instruction. To find it I wanted to use a library called Zydis, but I could not get it to compile, because clang generates calls to memset() and memcpy() . As I can not link with the standard library, I will have to find a solution tomorrow.
I finally figured out how I can integrate the external library! Now I can skip instructions when an interrupt is executed and continue execution
I sadly don’t have much to say, because I did make almost no progress. I am trying to use the PIC to get interrupts from the keyboard, but it doesn’t work for some reason. Maybe I will try to use APIC instead, but it’s more complicated.
I will ship the kernel now for the first time! I added a libk (like a libc but for the kernel) and implemented some cool functions like printf(), which I could use for cool error messages with hex numbers like the one on the screenshot.
Now I am actually shipping! I had a bug that occured only when compiling with optimization level 2 or higher (which I used in the release CI). As I am working now on a Debian machine, I made it also compile on Debian stable by not requiring a new objcopy version. On the screenshot you can see the bug.
I have added a simple memory manager to my kernel! It was only possible with the help from kmos , a project I found while voting. I didn’t know how to start writing a physical memory manager, but in that kernel I found that I have to use the limine HHDM request to have simple access to physical addresses. Then I could implement the rest completely myself. The last thing left to do until I’m satisfied with my memory manager, is to free pages in the PMM after using free()
I have finished implementing the memory manager! free() will now call pmm_free() to free unused pages. At the moment it does not make any difference, but if I want to extend the PMM it will have saved me the work. Also, I split the demo from the main function so that it is more maintainable. Log messages with the log level DEBUG will now only appear in debug builds. This made the output much more readable, as you can see in the screenshots.
I did not post for some time, so this devlog will be relatively long. PS/2 driver (Screenshot 1) I wanted to get the PIC to work, but as I had no idea why it didn’t work I thought that the PS/2 Controller might not be in a functioning state. So, I wrote a PS/2 driver which initializes the Controller, and also detects connected devices! PIC -> APIC After that, I finally found out that limine already sets up the APIC, which means that the PIC is no longer functional. So I decided that my next big goal is to learn how ACPI and APIC work… ACPI (Screenshot 2) As you can see on the screenshots, I started working on an ACPI driver, which is already able to find tables like the MADT, which I need to find the APICs UEFI This does not have anything to do with the progress of my project, but I learned how to use UEFI in QEMU, so that I can debug my ACPI driver better. Road map I will have to learn now how APICs work, so that I can get interrupts from the keyboard. Then, I can improve the keyboard driver, which should make the kernel way more fun to use!
I prefer this devlog format, so I will stick to it. I/O APIC As I explained earlier, I need to configure the APIC to get interrupts. I think I only need the I/O APIC and not the local APIC, if I understand the limine documentation correctly. But when trying to access it’s registers, I got a page fault. It seems like I need to manually map the registers to virtual memory, which brings me to… Physical Memory Manager I need to do what I already feared when starting to write the PMM, manually editing page tables. I am working on a function which will map pages (Including the I/O APIC registers) to virtual addresses. For this, I need to walk the complete paging structure: PML4 (from cr3) -> PDPT -> PD -> PT I can already parse it until I have the PT’s address, but when accessing the PT I get a page fault, as you can see on the screenshot. Road map I just wanted to post this update so that the next devlog is not too long. I will continue to work on the PMM, until I can access the I/O APIC’s registers.
I am still far away from getting interrupts from the keyboard, but I am still learning much and making progress on other parts of the kernel! PMM I added support for mapping pages manually, which means that I can program now the APICs! While debugging this, I also improved my Page Fault handler, which you can see on the screenshot. APIC driver The APIC driver should now be able to configure IRQs on the I/O APIC to get delivered to the local APIC, but I can’t test it as I still don’t know why I can’t get interrupts from the keyboard :-( Road Map I am still working on getting interrupts from the keyboard, which is my main goal before the next ship. I currently suspect that my PS/2 driver is broken.
I FINALLY get interrupts from the keyboard! PS/2 Keyboard driver The problem was, that I mistook the IRQ number for the interrupt vector when calling my own function! Now I can start expanding my keyboard driver. Currently, it already prints the pressed keys to the screen, as you can see on the screen shot. Performance improvements when scrolling After I finished the interrupt stuff, I can focus on improving the TTY in other areas, like the performance. I am using now memset() and memcpy() functions when scrolling the frame buffer, which itself is not an improvement: I optimized the two functions to use copy 8-byte blocks ad uint64_t instead of each byte individually, which made a significant difference. Scrolling with KVM acceleration is now almost instant on my PC, and without it is as fast as it was before with acceleration. Road map I want to improve the TTY with things like buffering, which should improve the performance even more. When I have a solid TTY, I can rework the demo and ship again.
The kernel is now interactive! Demo CLI I added a demo CLI (you can see it on the screenshot) where you can exit properly, run tests or view the old demo! Keyboard driver I had to fix some bugs with the keyboard driver, but now I think it works okay enough that the CLI is stable (previously, it kept parts from the old buffer when reading it again) Road map I want to add more features to the CLI, such as setting the log level. As you can see on the screenshot, the debug output disturbs the CLI.
I am shipping soon! Some little improvements in messages I improved some messages, so that the kernel looks more polished to new users. v0.2.0 I released a new version, which is what I am shipping soon (if nothing goes wrong). It includes an interactive CLI, which was made possible with the new keyboard driver. I improved the scrolling performance a lot, which I personally really enjoy! Finally, I fixed a bug when printing numbers, so the printed memory map now has (mostly) correct addresses.
PIT I quickly wrote a simple PIT (Programmable Interval Timer) driver, so that I have a basic sleep function. It isn’t really useful at the moment and not thread safe, but as it was very simple I thought why not? APIC I realized that MADT I/O APIC overrides also override the flags of entries, so I am using these now unless it’s overridden by the user. Road map As I have now a simple keyboard driver, I want to work on something new. Some things I am considering: Multitasking Filesystems ELF loading PCI USB All of this topics are completely new to me, so I will pick the one that looks the most simple and probably fail anyway.
Multitasking (Screenshot 1) I decided to try to implement multitasking! The kernel can now switch tasks, but only one time. This is the first step in direction of real multitasking, but I still have much to do. It is interesting to see, How I realize how bad my implementations I did earlier are, because I don’t fully understand them. But now I can improve them! Dynamic arrays (Screenshot 2) I made a quick implementation of dynamic arrays for the keyboard driver, but as I realized that I need them to store a list of tasks, I decided to implement one optimized implementation I can use everywhere. I have implemented a very simple version and use it in the keyboard driver, but it isn’t optimized yet. In fact, it’s even worse than the one I had earlier in the keyboard driver, because every modification now requires a reallocation. Road map I am going to optimize dynamic arrays, and then continue with multitasking.
Array optimization (Screenshot 1) I now actually optimized the dynamic array type, which means that it allocates memory in bigger chunks instead of every time an element is added / removed. In the process I added some debug logging, so typing is now very difficult if you don’t know how it works with log level LOG_DEBUG . Custom ISR wrapper (Screenshot 2) I finally decided to implement my own wrapper for ISRs instead of relying on __attribute__((interrupt)) . This should allow me to use floating point math with the FPU in the future. Also, I can now read more registers on interrupt (screenshot). Road map I am currently working on making all ISRs compatible with my wrapper. Then I will continue trying to get multitasking to work.
It probably doesn’t sound special, but it is as important as everything else: SSE support SSE is an extension of the CPU which has 16 128-bit registers, but is rarely used. This means, that saving all of these registers every time a task switch occurs would cost some performance. For this reason, the CPU has a bit that can be set to indicate that a task switch occurred. In most cases, nothing happens and the registers are kept in their original state. But if a task needs to use SSE instructions, the CPU generates an interrupt, which manually saves the SSE registers. This is what I am working on currently. Custom ISR wrapper All interrupt handlers use now my custom wrappers, which made possible that I can work on SSE support.
SSE register state switching! The kernel will now switch the SSE register state lazily, but I still have two problems: The Part for the registers in the TCB must be 16 byte aligned, which it currently not guaranteed The interrupt handlers are not allowed to use SSE instructions, but I have no way of verifying this Road map I think it is time to write a version of malloc() which can guarantee a specified alignment. After that, I can try to actually switch tasks automatically with a simple scheduler! I will probably use the PIT interrupt to switch to the next task in a list.
Multitasking… I am still working on multitasking, but I am stuck currently. I am trying to modify the stack frame so that asm_switch_task is called after iretq , but it doesn’t work. As you can see on the screenshot, I get a page fault as soon as it tries to switch tasks (in the debugging process I had it switch 2-3 times before it crashes, which is not really better) Road map My highest priority is to get task switching to work consistently. After that, I will see what I can polish.
Multitasking! I fixed the last bug (that I could find) and multitasking works now! On the screenshot you can see two tasks trying to print the numbers 0-19 at the same time. The CLI even waits until the tasks are finished! Road map The output is still a little bit broken, so I want to implement output buffering and mutexes, so that multiple threads can’t print at the same time.
Mutexes I implemented a simple mutex (which isn’t perfect yet, but it works). As visible on the screenshot, I used it to make it impossible for the test tasks to print at the same time. One problem with it is that it currently runs hlt after releasing a mutex so that a different task has a chance to acquire it, which doesn’t seem like the best solution to me. Roadmap I am making the terminal position atomic, so that I don’t need mutexes for output, which I can not use in interrupt handlers
GCC support I added GCC support, which should (hopefully) make debugging easier for me. I can’t show it really on the screenshot, trust me, it is compiled with gcc! Roadmap I have still bugs in my multitasking system. Currently I get a page fault when compiling with optimization > -O2 with clang, the next step is to test it with GCC.
RTC The kernel can now read the current time from the Computer’s RTC! At the moment, you can’t select the time zone, so the time is probably in UTC, depending on how the computer is configured. Roadmap I am planning to improve the use experience, for example by using multiple “windows”, to maybe even have a status bar.
“Windows” I am making it possible to split the framebuffer into multiple views. This should make it more easy to have a more advanced UI than a CLI already inside the kernel. Hopefully there will be user processes at some point, but I want to have a nice looking OS before that. Roadmap I still have to fix some things (as visible on the screenshot). After that, I can try to make use of it and add a status bar or a separate command window.
Status bar! I added a status bar which show the current time. It is very basic, but makes the OS look way more friendlier in my opinion. Sorry for the weird messages in the main window, I am currently debugging my printf implementation. Roadmap I still have a problem with printing dates: The year 2006 would be printed as 206 , because the RTC has seperate registers for year and century, so if century is 20 and year is 6 it prints 206.
printf compatability I improved the printf() compatability, so that I can pad numbers with or 0 . This is very useful, for example I now can use it to display time and date properly. Roadmap I don’t know yet what’s the next thing to do, maybe I will ship soon.
Final improvements before the next release Status bar I moved the status bar from the bottom to the top and removed the borders, in my opinion it looks better this way. Framebuffer borders I am already working on a new command which will make it possible to see the borders of the framebuffer in QEMU. This will be useful for debugging while keeping the UI simple. Bugs There are still some obvious bugs: My printf() implementation seems to break with invalid format strings and I have a bug in my memory manager which prevents me from merging the command showing the screen borders into main. Roadmap I will try to fix the bugs, but the features are now complete. I want to release the new version tomorrow.
Release 0.3.0 I finished the release, including the new borders command! The visible bugs that I found are also fixed, please report them if you find some! Roadmap The kernel isn’t finished yet, I will continue to improve it and see how far I will get.
PCI! I am starting to write a PCI driver, which opens a new world to me! As you can see, the kernel is already able to print some information on boot about connected PCI devices. I also added a function that can search for a specific PCI device by it’s class, which will help me to implement drivers for specific PCI devices. Roadmap The real reason I am implementing PCI is that I need it to find the AHCI controller. The AHCI controller can be used to access connected storage devices, which is my long-term goal.
AHCI! (SATA) I am jumping a little bit fast form PCI to AHCI, but I think the PCI driver is as good as I need it right now, and if I learn that it isn’t, I will fix it. Anyway, I am starting to work on AHCI! This is really cool, as this allows me to communicate to storage devices! At the moment the kernel just lists connected devices, but that’s just the beginning! Roadmap The AHCI driver is in a very early stage, and it will take me a lot of time to finish, as AHCI is relatively complicated and the documentation isn’t written for beginners like me ;-)
Memory management problems… It seems like there was a critical bug sleeping inside my memory manager. It appeared since I started using the PMM in my AHCI driver, but I think the problem is in the virtual memory manager. For this reason I am working currently on the memory manager instead of the AHCI driver. Roadmap As soon as I fix the MM, I will continue on the AHCI driver. It probably won’t be finished until the end of stardance.
Ships:
I made an x86_64 kernel using the limine boot protocol. I don’t know what the most difficult thing was, as even most basic things are very complicated for me as a beginner in osdev. I still have to learn much and the kernel will be improved, but I thing it kind of works now. I have a video demo in the readme, if you don’t have qemu . When building, remember to clone the submodules ( git submodule init && git submodule update ). You need xorriso to build the ISO. Sorry for mixing meson and make , but in the README is a guide. Please use clang, gcc is very complicated.
I added a CLI the kernel, which was possible, because I finally have a keyboard driver! It only took so long, because it was actually difficult to write it: I thought I have to program the PIC, but it was already disabled so I had to learn the more complicated APIC. There is a demo video in the README if you don’t want to run the kernel. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller
I have released the next version of my own kernel! The biggest feature I added is multitasking. While it doesn’t look that special, it was actually very difficult to make my kernel switch between different tasks! Here are some notes on how to try the project: If you don’t want/can’t run it, you can look at the video in the readme. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller...
|
1792990588.7570596
|
1793076988.7570596
|
|
40567
|
Complex CSH Tracker by @CoolDuck | Stardance
|
CoolDuck
|
1
|
151.24
|
1894
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T16:35:25Z", "hours": 140.0, "multiplier": 14.51, "payout": 1894, "blessing": "neutral", "text": "Complex CSH Tracker My school runs on a very old tracking system for CSH (Community Service Hours) meaning it was hard for us students to see how much we have as well as see what happens to our CSH requests. I made this to solve this problem and decided to join stardance for the fun of it :O Please beware of the bugs Tester passwords are in the readme Unfortunely drive picker functionality doesn’t work cuz i didnt verify my google app :(", "repo": "https://github.com/coolduckmaster/ComplexCSHTracker", "demo": "https://complex-csh-tracker.vercel.app/"}]...
|
[{"post_id": 79501, "ts": "202 [{"post_id": 79501, "ts": "2026-10-14T10:18:26Z", "hours": 11.2411, "text": "They changed the deadline 💔💔 Fixed some bugs relating to CSH registering. Fixed loading screen bug. Fixed Welcome back appearing after clicking log out. Additionaly filter for Approvals. Export to PDF finally works. Split the Approval into different files."}, {"post_id": 75609, "ts": "2026-09-30T15:31:35Z", "hours": 11.1422, "text": "This is it vercel intergrated product ready to ship the time is currently 10:30 pm please let this ship go through :))))"}, {"post_id": 73643, "ts": "2026-09-25T15:56:06Z", "hours": 12.3236, "text": "And now, the end is near. Added first version of the history page with some filter edited backend intergration for said history small ui changes to Approval small ui changes to dashboard side bar. many other misc ui changes bug fixes (?)"}, {"post_id": 67461, "ts": "2026-09-13T15:57:54Z", "hours": 10.9419, "text": "GOOGLE DRIVE BACKEND INTERGRATION Title says it all Misc loading screens (so like it loads or smth) Bug fixes???? Some other random things (like placeholder images and stuff)."}, {"post_id": 60285, "ts": "2026-09-02T15:42:39Z", "hours": 10.4444, "text": "GOOGLE DRIVE INTERGRATION Yes google Oauth Yes upload section Yes multiple files (WITH FILE IMAGE) No teacher backend (yet) No personal infomation (i hope)"}, {"post_id": 52431, "ts": "2026-08-22T15:34:31Z", "hours": 13.3567, "text": "idk did smth? I did something i guess????? I dont rmb to much school work. btw the google frontend button is wip"}, {"post_id": 46093, "ts": "2026-08-13T01:50:16Z", "hours": 10.9692, "text": "10 hours in 2 days New teacher note tab for approval-deny New 404 page (easter egg hidden) Bugfixes (note: School has started, I do not have the free time to do manythings)"}, {"post_id": 44042, "ts": "2026-08-09T15:34:21Z", "hours": 5.4497, "text": "MongoServerError: E11000 duplicate key error collection: login.cshes index: userId_1 dup key: New functions have arrived! Approve and Deny have been fleshed out. Futhermore the description has a functioning backend to show it! Request pages has a new description box with a word limit! Dashboard has now show updates when your requests been approved or denied! Fixed backend bugs(?) Much more small UI changes!"}, {"post_id": 43358, "ts": "2026-08-08T15:49:56Z", "hours": 5.2531, "text": "[vite] Internal server error: Transform failed with 1 error: Added a new details screen for Approval page (missing approve-deny features). Frontend edits for pre-existing UI in “Approval” panel. Backend API edits for intergrating. Slept 4 hours."}, {"post_id": 42719, "ts": "2026-08-07T15:59:58Z", "hours": 7.2431, "text": "PENDING REQUEST! Pending request pages for all your pending request needs! (UI up to change). Authware updated to be more cool Intergrated Authware to the frontend (like, 60% intergrated) Burnt bugs (?) Much more!"}, {"post_id": 42022, "ts": "2026-08-06T15:51:51Z", "hours": 6.7397, "text": "REQUEST-FUNCTIONALITY The Request pages have gain functionality! All of the request now go to the “Pending Hours” and is automatically logged in the Backend Database! The Approval panel is still in the works however."}, {"post_id": 41375, "ts": "2026-08-05T15:30:06Z", "hours": 5.3767, "text": "Request Page in the work LACKS FUNCTIONALITY. Backend API fixes (?). Frontend Dashboard edits. Bugs? (Vouch doesn’t exist yet. still figuring out a image storage solution)"}, {"post_id": 40799, "ts": "2026-08-04T15:36:25Z", "hours": 7.1403, "text": "NAV MENU BUTTON! Frontend stuff for the “Request” pages Backend API for like request and stuff. Fixed MANY things(?)."}, {"post_id": 40167, "ts": "2026-08-03T15:55:16Z", "hours": 7.6592, "text": "7 and a half hours spend on doing what??? Bugs, loads, and loads, of bugs. Fixed code after spliting the dashboard side panel. Backend stuff. DASHBOARD LAYOUT (Spend a large amount of time styling)."}, {"post_id": 38979, "ts": "2026-08-01T16:26:58Z", "hours": 6.0889, "text": "OOGA BOOGA DASHBOARD IT TOOK ME 6 HOURS STRAIGHT TO GET THIS TO WORK, I HAD TO STEAL BORROW HACKATIME HTML CODE FOR THIS!"}, {"post_id": 38267, "ts": "2026-07-31T16:02:28Z", "hours": 5.05, "text": "What the hell is jsx?? Started work on the “Dashboard” screen. stole it from Hackatime dashboard Inspired by hack a time dashboard. Added a frontend router (?). Did some more stuff!"}, {"post_id": 37665, "ts": "2026-07-30T15:38:21Z", "hours": 4.1078, "text": "Log - 4: on boarding done (?), rename the project to “Complex CSH Tracker.”, started work on a dashboard. Beside from that, I might have to rework some of the log in UI with what I have in mind."}, {"post_id": 37072, "ts": "2026-07-29T15:34:59Z", "hours": 5.625, "text": "Added On boarding logic so users can pick their class and stuff. (this took longer then expected)"}, {"post_id": 36407, "ts": "2026-07-28T14:40:37Z", "hours": 3.25, "text": "ጮልጋቹ ነዐጮቹ ዪልክጋዐጮ “Login Page” የልፏቹ የረቹልነቹ ⶴቹረየ ጮቹ ጎ ፪ቹቹክ ልፕ ፕⶴጎነ ቻዐዪ ⶴዐ፱ዪነ"}, {"post_id": 35857, "ts": "2026-07-27T15:50:05Z", "hours": 1.5753, "text": "Started work on the full stack log in functionally of this tracker website (It’s no longer simple)."}]...
|
Title: Complex CSH Tracker by @CoolDuck | Stardanc Title: Complex CSH Tracker by @CoolDuck | Stardance
Devlogs:
Started work on the full stack log in functionally of this tracker website (It’s no longer simple).
ጮልጋቹ ነዐጮቹ ዪልክጋዐጮ “Login Page” የልፏቹ የረቹልነቹ ⶴቹረየ ጮቹ ጎ ፪ቹቹክ ልፕ ፕⶴጎነ ቻዐዪ ⶴዐ፱ዪነ
Added On boarding logic so users can pick their class and stuff. (this took longer then expected)
Log - 4: on boarding done (?), rename the project to “Complex CSH Tracker.”, started work on a dashboard. Beside from that, I might have to rework some of the log in UI with what I have in mind.
What the hell is jsx?? Started work on the “Dashboard” screen. stole it from Hackatime dashboard Inspired by hack a time dashboard. Added a frontend router (?). Did some more stuff!
OOGA BOOGA DASHBOARD IT TOOK ME 6 HOURS STRAIGHT TO GET THIS TO WORK, I HAD TO STEAL BORROW HACKATIME HTML CODE FOR THIS!
7 and a half hours spend on doing what??? Bugs, loads, and loads, of bugs. Fixed code after spliting the dashboard side panel. Backend stuff. DASHBOARD LAYOUT (Spend a large amount of time styling).
NAV MENU BUTTON! Frontend stuff for the “Request” pages Backend API for like request and stuff. Fixed MANY things(?).
Request Page in the work LACKS FUNCTIONALITY. Backend API fixes (?). Frontend Dashboard edits. Bugs? (Vouch doesn’t exist yet. still figuring out a image storage solution)
REQUEST-FUNCTIONALITY The Request pages have gain functionality! All of the request now go to the “Pending Hours” and is automatically logged in the Backend Database! The Approval panel is still in the works however.
PENDING REQUEST! Pending request pages for all your pending request needs! (UI up to change). Authware updated to be more cool Intergrated Authware to the frontend (like, 60% intergrated) Burnt bugs (?) Much more!
[vite] Internal server error: Transform failed with 1 error: Added a new details screen for Approval page (missing approve-deny features). Frontend edits for pre-existing UI in “Approval” panel. Backend API edits for intergrating. Slept 4 hours.
MongoServerError: E11000 duplicate key error collection: login.cshes index: userId_1 dup key: New functions have arrived! Approve and Deny have been fleshed out. Futhermore the description has a functioning backend to show it! Request pages has a new description box with a word limit! Dashboard has now show updates when your requests been approved or denied! Fixed backend bugs(?) Much more small UI changes!
10 hours in 2 days New teacher note tab for approval-deny New 404 page (easter egg hidden) Bugfixes (note: School has started, I do not have the free time to do manythings)
idk did smth? I did something i guess????? I dont rmb to much school work. btw the google frontend button is wip
GOOGLE DRIVE INTERGRATION Yes google Oauth Yes upload section Yes multiple files (WITH FILE IMAGE) No teacher backend (yet) No personal infomation (i hope)
GOOGLE DRIVE BACKEND INTERGRATION Title says it all Misc loading screens (so like it loads or smth) Bug fixes???? Some other random things (like placeholder images and stuff).
And now, the end is near. Added first version of the history page with some filter edited backend intergration for said history small ui changes to Approval small ui changes to dashboard side bar. many other misc ui changes bug fixes (?)
This is it vercel intergrated product ready to ship the time is currently 10:30 pm please let this ship go through :))))
They changed the deadline 💔💔 Fixed some bugs relating to CSH registering. Fixed loading screen bug. Fixed Welcome back appearing after clicking log out. Additionaly filter for Approvals. Export to PDF finally works. Split the Approval into different files.
Ships:
Complex CSH Tracker My school runs on a very old tracking system for CSH (Community Service Hours) meaning it was hard for us students to see how much we have as well as see what happens to our CSH requests. I made this to solve this problem and decided to join stardance for the fun of it :O Please beware of the bugs Tester passwords are in the readme Unfortunely drive picker functionality doesn’t work cuz i didnt verify my google app :(...
|
1792853543.167628
|
1792939943.167628
|
|
4967
|
slackzilla 🦖🦖 by @rylvion | Stardance
|
rylvion
|
0
|
151.14
|
0
|
[]
|
[{"post_id": 78787, "ts": "202 [{"post_id": 78787, "ts": "2026-10-11T16:34:14Z", "hours": 31.9517, "text": "devlog 11 - ADMIN EHANCEMENTS: errors views, log archiving & restoration, logs deletion controls, RAG IMPROVEMENTS AND MORE… date: 11/10/2026 time logged: 31hr 57m version: v0.9.6-beta this release focused on making Slackzilla easier to debug, manage and understand internally. a LOT of work went into the admin panel, route extraction and testing. 1. admin panel got some SERIOUS upgrades added 3 new admin pages for server events, errors and logs. also split admin.css into separate stylesheets because one giant stylesheet isn’t exactly a maintenance strategy. error monitoring added an error viewer with timestamps, stack traces and source files improved error messages to make them more user-friendly log management added a log archive viewer with backup timestamps, line counts and file sizes added backup restoration and switching added controls to delete specific lines, ranges or the last X lines added log rotation and telemetry reset controls added the /log-archives admin endpoint 7 new admin controls: delete-logs , delete-lines , delete-last , delete-line , rotate-logs , restore-log and reset-telemetry that’s a LOT more control over server logs than before. 2. endpoints & session security added 4 new endpoints : 3 admin endpoints: /errors , /errors/stream , /log-archives 1 public endpoint: /api/session /api/session now provides current session information, with csrfToken moved from /api/admin/summary to the new endpoint. also fixed the CSRF token not appearing in the document head. small bug, annoying consequences. removed the children=[] pattern from routes.js and its associated dependencies. 3. RAG / code parser improvements route extraction got a substantial upgrade. detects routes using exact path checks, prefix checks and array-based matching improved HTTP method inference for conditional routes, including GET and POST merges duplicate route entries and inferred methods expanded discovery beyond server/api/ , including /webhook and /admin/login improved /api/routes to return supported methods, match types, source files and line numbers the goal: give the RAG system more accurate route information instead of confidently retrieving incomplete or duplicated data. ᕦ(ò_óˇ)ᕤ 4. AI activity & markdown the AI activity view now displays elapsed time alongside tool summaries and responses, making it easier to follow what the system actually did. replaced the custom Markdown parser with marked AND dompurify for established parsing and HTML sanitisation. switched the configured model from openrouter/free to openai/gpt-6-luna , aiming for better performance and reliability. also deduplicated getReleaseInfo to avoid maintaining redundant version information. 5. testing added 3 npm scripts : test:code-parser for code parser tests test:rag for RAG tests test:all for the broader test suite and validation checks added automated code parser tests covering route extraction, HTTP method inference and deduplication. 6. docs updated README.md and project documentation to reflect the latest endpoints, admin controls, route extraction changes and RAG improvements. documentation staying in sync with the codebase. revolutionary concept, apparently. release summary v0.9.6-beta added: 4 endpoints 7 admin controls 3 admin pages 3 npm testing scripts improved error visibility, log management, session information and route extraction updated Markdown rendering, AI activity information and documentation the main focus was improving maintainability, debugging and the reliability of Slackzilla’s internal tooling. ( ͡° ͜ʖ ͡°) next devlog hint: a terminal is coming. think less clicking through admin pages, more interacting with Slackzilla directly through a terminal interface. details in the NEXT devlog. \(^o^)/"}, {"post_id": 71489, "ts": "2026-09-20T22:15:26Z", "hours": 27.4447, "text": "Devlog 10 - QOL DASHBOARD IMPROVEMENTS, RAG ENHANCEMENTS WITH TOOLS & CACING AND LOTS OF STUFF time logged: 27 hrs 30 mins date: 20/09/2026 version: v0.9.5-beta This devlog is COVERING A LOT of stuff that i did, but im not gonna drag this over like i did from all other devlogs so heres are the features: covering from v0.9.1-beta to v0.9.5-beta, see release-history.json for the full changelog Features added Added RAG TOOLS including getStatus - returns the status of the RAG getCommands - with enhanced filtering (filter by name, usage hint, id, category and fuzzy filter (makes it easier for RAG to find commands)) getReleaseInfo - returns the release info of the CURRENT version and (optionally) any other version (pass it by parameter) runCommand - runs a command by id getLogs - returns recent logs for the RAG to inspect (max 100, default 20) getMetrics - returns the metrics of the RAG (memory usage, cpu usage, etc) getRoutes - returns the routes of the APIs added 3 new scripts ( npm run ) which are rag - runs the RAG with or without the --ai flag to see context/answer cli rag:use-tool - runs a tool by name (with optional parameters) release - appends current release notes from package.json to release-history.json . Added new endpoints /api/telemetry - returns the telemetry history separately from the main status endpoint /api/command/:id - gets or executes a command by id /api/telemetry/stream - streams telemetry updates using SSE /api/admin/server-events - returns server events for the admin dashboard /api/ask - now uses SSE to stream the RAG’s activity ( yers now we can see the RAG in aciton ), context, tool usage, token usage and final response dashboard imporvements added a seperate admin server events page (wevent searching, filtering, prioritisation and stylying) added a command runner on the command page fixed recent activity not showing up on the dashboard Added visible AI activity to the AI page the RAG now emits activity events while processing a question AI page is cached on localStorage so you can go back and forth between pages without losing the AI page state Improved the RAG’s repository awareness added AST-based parsing using acorn and acorn-walk added persistent .rag/index.json added symbol search and dependency analysis added function, export, function call, environment variable and route extraction added richer code context and source metadata added automatic index rebuilding improved path-based dependency detection fixed the RAG detecting references created using path.join(rootDir, ...) add token budgeting and usage tracking. Changed how telemetry is handled telemetry history is no longer included in /api/status or any other endpoints CHANGED all admin endpoints so that none of them has the telemetryHistory anymore Added release history tracking added release-history.json /sz-release can now retrieve release information for different versions npm run release automatically appends the current release notes Tl;DR: RAG got a major upgrade with AST-powered repository indexing (acorn/acorn-walk), persistent indexing via .rag/index.json , symbol search, dependency analysis, function/export/call/env-var/route extraction, richer source metadata, automatic index rebuilding, 7 new RAG tools, 3 new CLI tools, SSE-powered streaming for /api/ask and telemetry, telemetry endpoints, admin server events, live AI activity tracing, token/context/tool usage visibility, AI session caching, release history tracking, telemetry separation from /api/status, admin API cleanup, and a large collection of bug fixes, repository-awareness improvements and major QOL improvements. . hopefully i will be devloging every version till i ship"}, {"post_id": 61072, "ts": "2026-09-03T19:44:37Z", "hours": 29.0225, "text": "Devlog 9: React Dashboard time logged: 29hr 1m date: 03/09/2026 The React dashboard is finally here! I completely migrated the old EJS dashboard with a new React app. THIS will be IS the biggest devlog yet, as it covers a lot of changes and new features. main features added is migration, codebase assistance, graphs, telemetary and a new api. Heres a summary of what i changed renamed src/ to bot/ - this is because its related to the bot and not the server and its not where all the main files are migrated the EJS dashboard into a React app overhauled the UI deleted the pages system and the workflow to build it added a new RAG modal that answers questions about the repo and shows related visual assets (also includes a new rag.js file that handles retrieval and generation of answers) The react dashboard has the following features: 10 pages (Home, Admin, Api, Commands, Docs, Home, Logs, AI, Sitemap, Status) 12 components 8 utilities js exports in the utils/ folder 404 page (with routing) & Error Boundary modal page public AI assistant page with repository-aware retrieval and related visual assets command API with stable IDs, command help, and captured command responses (so API can be called from the dashboard) public status, logs, metrics, command, and AI API endpoints admin feedback controls for filtering, viewing, replying, marking read/unread, and deleting (they dont work on windows only linux) CPU, memory, disk, and network telemetry with responsive graphs and hover data tooltips (so satisfying) Current React Architecture The active client source lives in server/client/src/ . Vite builds it into server/client/dist/ , which is served by server/server.js . React Router renders the page routes declared in server/client/src/components/utils/routes.js . The server still owns the HTTP status code: known browser routes receive the React shell with 200 , while unknown browser routes receive the same shell with 404 so the client can render the NotFound page without hiding the correct HTTP semantics. The old EJS dashboard and static page-generation flow are no longer the active dashboard path. The bot remains in bot/ , separate from the dashboard server, and the server uses explicit Node http handlers under server/api/ . RAG and Command APIs The new /ai page sends questions to POST /api/ask . server/lib/rag.js retrieves relevant repository text while excluding priv/ , .env files, dependencies, logs, and build output. It can identify related image assets such as the calculator flowchart without parsing binary image contents. If configured, the retrieved context is sent to the AI provider; otherwise the endpoint returns a local configuration message and source metadata. Commands are exposed through GET /api/commands , GET /api/commands/:id , and POST /api/commands/:id . The API adapter reuses the same command modules as Slack and captures their responses. The Commands page provides the interactive runner, while the AI page remains focused on repository questions. Explicit natural-language requests can still ask the RAG service to execute a recognised slash command and return its result. Limitations The migration exposed several boundaries that are now documented in docs/ : authentication and CSRF, the webhook protocol, API registration, setup, and RAG behaviour. Runtime persistence is still file-backed through server/database/store.js ; an external database remains a future adapter project rather than a required dependency. Linux systemd controls and deployment scripts are intended for the hosted environment. On Windows local development, the dashboard, APIs, telemetry, and React pages work, but system service actions and Bash deployment are not expected to succeed. The dashboard must be rebuilt and restarted after production client or server changes."}, {"post_id": 48936, "ts": "2026-08-17T14:33:48Z", "hours": 17.7958, "text": "Devlog 8 - server hosted dashboard finally happened time logged: 17hr 47min 45s date: 16/08/2026 The server hosted dashboard is finally here! It is hosted with the webhook, connected to the bot, and shows logs, status, and other information. architecture The Slackzilla server-hosted dashboard is the web control centre sitting alongside the webhook (runs on the same port). The server runs the dashboard, API routes, authentication/session handling, CSRF protection, logging, monitoring and administrative controls. The dashboard has been moving from the earlier static local/pages prototype (see devlog 7) towards an EJS-based server-rendered architecture, with shared layouts/partials and a global dashboard styling system. The server also handles the GitHub deployment webhook on port 9000 , while Nginx sits in front of the application. The dashboard is intended to expose things such as bot status, logs, statistics, monitoring, API documentation and admin controls rather than sshing into the server and running commands manually I’ve been separating the dashboard’s presentation layer, API layer and server logic. During development, I encountered and fixed several contract problems where route modules expected helpers such as context.sendError() and context.sendOk() that the runtime context did not provide. I also changed the authentication-aware API/SSE routes so unauthenticated requests return proper JSON/HTTP responses rather than accidentally redirecting an EventSource connection into an HTML login page. The dashboard has admin-only functionality, CSRF protection and server-side authentication, whilst the bot itself uses Slack’s Events/Slash Command mechanisms for incoming Slack activity. Slack’s Events API delivers subscribed events to the HTTP endpoint, while slash commands are sent to the configured app endpoint via HTTP POST. /api/admin routes are protected by an authenticated admin session and CSRF protection. Admin authentication uses a session cookie, which is only created after logging in through rylvion.hackclub.app/admin/login . The admin password is never stored in plaintext. It is stored as a PBKDF2-HMAC-SHA512 hash in the server environment, using a random salt and a high iteration count. The dashboard does not allow the password to be created or changed, so the server environment must be updated manually before restarting the service. CSRF tokens are generated server-side and sent to the authenticated client via a cookie. For POST requests, the client must return the token in the X-CSRF-Token header, preventing unauthorised or forged requests from triggering admin actions. /api/ (excluding /api/admin ) has no authentication Port 9000 is used for the webhook and the dashboard whilst the bot itself runs on socket mode. The api that currently has these endpoints base url: https://rylvion.hackclub.app/api/ GET /api/status - returns the bot status and other information GET /api/logs - returns the bot logs from slackzilla.log as JSON, including the file size in bytes POST /api/admin/control - allow the admin to control the accepts several actions such as start , stop , restart , redeploy , refresh , refresh-logs , refresh-status (self explanatory actions) with dangerous actions (such as redeploy , restart and stop ) contains a confirmation prompt to prevent accidental execution of the action. GET /api/admin/feedback - returns database feedback as JSON GET /api/admin/feedback/:id - returns the feedback with the given ID as JSON POST /api/admin/feedback/:id - allows the admin to control and accepts 3 actions such as delete , read , unread , respond . GET /api/admin/events - is a SSE (Server Sent Event) endpoint that allows the admin to receive real time events from the server such as logs, status, feedbacks and other information about the bot."}, {"post_id": 38519, "ts": "2026-07-31T22:58:19Z", "hours": 9.9792, "text": "Devlog 7 - Adding a Web Dashboard (locally) time logged: 9hr 58m date: 31/07/2026 ███████╗██╗ █████╗ ██████╗██╗ ██╗███████╗██╗██╗ ██╗ █████╗ ██╔════╝██║ ██╔══██╗██╔════╝██║ ██╔╝╚══███╔╝██║██║ ██║ ██╔══██╗ ███████╗██║ ███████║██║ █████╔╝ ███╔╝ ██║██║ ██║ ███████║ ╚════██║██║ ██╔══██║██║ ██╔═██╗ ███╔╝ ██║██║ ██║ ██╔══██║ ███████║███████╗██║ ██║╚██████╗██║ ██╗███████╗██║███████╗███████╗██║ ██║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot. the dashboard is designed to be responsive and works on both desktop and mobile devices. it has a clean and modern design that is easy to navigate. for Github Pages hosting, i used gh-pages branch which meant creating a seperate workflow ( pages.yml ) to build and deploy the dashboard to the dist/ folder. before that i needed a way to make it minified and optimised for production, so i used terser , clean-css and html-minifier-terser to minify the js, css and html files respectively, i do realise that this meant adding extra dependencies to the project (even though its not linked to the bot yet). The deployment website will be hosted on the bot’s server ( rylvion.hackclub.app ) and on the same port as the webhook server i also added new logging functionality that return smth like this the one below, this helps me track the usage of the commands and see how many times they have been used, when they were last used and by whom. this will be useful for the dashboard to show command usage statistics and manage command permissions. { \" commands \" : { \" sz-hash \" : { \" count \" : 3 , \" lastUsedAt \" : \" 2026-07-23T13:27:28.116Z \" , \" lastUser \" : \" rylvion \" , \" lastUserId \" : \" U0A84FA2NP2 \" } } } TL;DR: added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot and logging functionality that return command usage statistics and manage command permissions. introduced a new logging system that logs to both console and a file. added command usage tracking to record how often each command is used. enhanced server.js to serve dashboard, logs, and status pages. improved webhook handling and added signature verification. added a new metrics utility and feedback.js for tracking command usage statistics. next devlog will be about connecting the dashboard to the bot & server and making it functional, its gonna be a long one so stay tuned for that"}, {"post_id": 35837, "ts": "2026-07-27T15:06:51Z", "hours": 6.6219, "text": "Devlog 6 - command buffet time logged: 6hr 37m 19s date: 22/07/2026 okay since most of the major architectural refactors are done, i can finally focus on adding more commands to Slackzilla. this devlog is about the new commands that i added to the bot, which are mostly utility commands that can be used for various purposes. base64 encoding hashing - supports multiple algorithms, default: sha256 decoder - decodes every algorithm that hashing supports random ids (uuid) secure tokens random numbers unix date conversion text case conversion (camel, pascal, snake, kebab) character counter rock paper scissors magic 8ball (the only entertainment command added in this devlog) the trickier parts were the input parsers. hash has to decide whether the first word is an algorithm or part of the text, case needs to split words without mangling the content too much, and unix has to switch between timestamps and readable dates without getting confused by weird inputs. i also added guardrails for invalid ranges and missing text so the bot gives a useful reply instead of just silently failing. the fun commands were the easiest win. 8ball just picks from a response list, and rps does a quick match against the player choice and the bot choice to decide whether it was a win, lose, or tie. it is very low stakes code, which is honestly refreshing after the manifest workflow stuff from last time. all utilities commands all have a help command associated to it the current utilities commands include: /sz-base64 - encodes a string to base64 /sz-hash - generates a hash of a string, default: sha256 /sz-decode - decodes a base64 encoded string /sz-uuid - generates a random uuid /sz-token - generates a random secure token /sz-random - generates a random number in a given range /sz-unix - converts a unix timestamp to a human-readable date and vice versa /sz-case - converts a string to camelCase, PascalCase, snake_case, or kebab-case /sz-count - counts the number of characters in a string /sz-rps - plays rock paper scissors with the bot /sz-calc - evaluates mathematical expression so all of it has a 2nd argument for help, so for example /sz-hash help will show the usage and examples of the command. i also added on package.json , 2 new scripts \"validate-commands\" : \"ajv validate -s schemas/command.schema.json -d src/data/commands.json\" , \"cmd-stats\" : \"node scripts/stats.js\" one to validate the commands.json file against the command.schema.json file, and another to provide statistics about the number of commands in the commands.json file. this will help me keep track of how many commands are in the bot and also make sure that the commands.json file is valid before a pull request is merged. currently, the bot has 22 commands in total, and 11 of them are utility commands (10 of them got added into this devlog (excluding the /sz-8ball that also was added in this devlog, but is an entertainment command)). the other 11 commands are the ones that were already in the bot before this devlog. i need some feedback on what other commands i should add to the bot, so if you have any ideas, please let me know. (im running out of ideas * sighs * ) im also planning on adding a web dashboard to the bot, which will allow users to see the bot’s status, logs, and other information in a more user-friendly way. this will be a big change, so stay tuned for that in the next devlog TL;DR: added a bunch of new slash commands for Slackzilla, kept the implementations small and native where possible, and tightened up the input handling so the new tools fail a little more gracefully."}, {"post_id": 33001, "ts": "2026-07-22T15:09:05Z", "hours": 7.1047, "text": "Devlog 5 - manifest workflow time logged: 7hrs 6min 16 sec date: 21/07/2026 ok so i kinda lied in the last devlog. this ended up being another major architectural change to slackzilla. the slack manifest system was always the most brittle part of the pipeline and manually maintaining manifest.json was a guaranteed way to let things drift. today i finally automated the entire manifest workflow. the new setup makes commands.json and meta.js the single source of truth. i wrote a manifest generator that loads all metadata like descriptions colours oauth scopes bot info and merges it with the command definitions to build a complete slack manifest object. once assembled it writes manifest.json and syncs it during deployment. validation is baked directly into the generator. i wired AJV into both stages. every command is validated against command.schema.json and the final manifest is validated again against slack’s official schema. if anything fails the generator stops immediately with a clear error instead of producing a broken file. this caught several issues especially after i moved all schemas into a dedicated schemas/ directory to clean up the project structure. the github actions workflow also got a major overhaul. every push now generates the manifest validates commands and manifest rotates the slack configuration token updates github secrets syncs the manifest through the slack api and deploys the bot. changing a slash command in commands.json now updates both the bot and the slack app config automatically. no more manual edits to manifest.json or the slack app settings. the entire pipeline is now self maintaining and fully automated. token rotation was the biggest pain. slack configuration tokens only last twelve hours so storing them in github secrets was not enough. i created a fine grained github PAT with permission to modify repo secrets and wrote rotateManifestToken.js to handle the full refresh cycle. it rotates the manifest token receives a new refresh token and updates both secrets so the next deployment does not break. i spent way too long debugging an invalid_refresh_token error. note that slack’s copy button does not copy the existing refresh token it generates a new pair. every time i clicked it the previously saved token became invalid instantly. once i realised that i started updating github secrets immediately after copying the new pair so everything stayed in sync. after that the rotated token still was not being passed correctly between github actions steps. i switched to GITHUB_OUTPUT so the rotation step could hand the new token to the manifest sync step. then slack started returning not_authed which led to another rabbit hole. the manifest update endpoint requires the token in the correct auth header not the request body. once i fixed the request format the entire pipeline finally ran clean end to end. See figure 2 for github actions workflow TL;DR slackzilla now auto generates its slack manifest validates everything with AJV rotates configuration tokens syncs the manifest during deployment and updates the bot server with minimal manual work. after a lot of debugging around token rotation schema mismatches and github actions quirks the deployment pipeline is basically self maintaining except refreshing the github PAT every ninety days."}, {"post_id": 30675, "ts": "2026-07-18T13:24:53Z", "hours": 2.345, "text": "Devlog 4: calc and roll commands time logged: 2 hr 20 minutes date: 17/07/2026 today i spent some time reading the Java Shunting Yard Algorithm implementation on GeeksforGeeks . The example focuses entirely on converting an infix expression into postfix form. It scans the expression character by character, places operands directly into the output string, and uses a stack to manage operators based on precedence and associativity. Once the scan is complete, any remaining operators are appended to produce a postfix expression like 5238-52^^/+. The Java version supports operators including + , - , * , / , and ^ , and it handles parentheses, but it stops after producing the postfix representation. It does not evaluate the numerical result. after reading that, i wanted something more complete for Slackzilla. I used the same core idea of converting infix to postfix, but I extended it in several ways. My implementation tokenises the input instead of reading one character at a time, which allows it to support multi digit numbers and decimals. I added unary minus detection so expressions like -3 or 5*-2 behave correctly. One challenge was distinguishing unary minus from subtraction. The parser has to determine whether it starts with a number or subtracts two values depending on the previous token. I kept exponentiation with the correct right associativity. Once the postfix array is built, I added a second stage that evaluates the postfix expression using a number stack. This lets the function return the final computed value rather than just the postfix notation. The result is a more flexible and practical version of the algorithm that fits naturally into Slackzilla and can evaluate real expressions interactively. after finishing the calculator command, I also added another command to Slackzilla called /sz-roll . This command allows users to simulate dice rolls directly inside Slack. It supports normal dice notation like d6 , custom dice sizes like d20 , multiple dice such as 2d6 , and modifiers like 2d20+5 . I added parsing logic to split the dice expression into the amount of dice, number of sides, and any modifier before rolling each dice individually and calculating the final total. I also added a /sz-roll help and /sz-calc help command which explains how to use the command and shows examples of supported formats. also i spent A LOT of time making the flowchart to describe this more than the implementation itself. I think it will be useful for future reference and for anyone else who wants to understand how the algorithm works. i also added json schema validation for commands.json as talked in devlog 2 the commands.json is the source of truth, so i addded a validator.yml to validate the json schema of commands.json and make sure it is valid before a pull request is merged. This will help prevent errors and ensure that the commands are correctly defined. TL;DR: added a calculator using the Shunting Yard algorithm with postfix evaluation, plus a flexible dice rolling command. Also added help commands, a flowchart and automated JSON schema validation. also ill add way more devlogs from now on since most of my last devlogs were major architecture refactor, unless there is a major change, i will just add a small devlog to add a new command/small feature, fix a bug, improve an existing feature and add more documentation."}, {"post_id": 27894, "ts": "2026-07-13T20:15:52Z", "hours": 6.0267, "text": "Devlog 3 - github actions webhook request (13/07/2026) time logged: 6hr 01min i added a webhook dispatcher that automatically triggers a deployment whenever i commit to the main branch. Instead of manually pulling changes on the server and restarting the service myself, the GitHub Action now sends a signed webhook to my deployment server, which verifies it and runs the deploy script for me. i also added 2 more commands /sz-meme - this makes a meme /sz-echo [str] - this echoes the string you can see the flowchart below and see the full devlog 3 here (hyperlinked) TL;DR whenever i commit the server automatically receives it and slackzilla updates to the latest version"}, {"post_id": 21774, "ts": "2026-07-03T21:35:52Z", "hours": 11.0325, "text": "Devlog 2 - server setup & modular command system & more [03/07/2026] time logged: 10hr 59 min so since the last devlog, i’ve have worked on LOADS of things including behind the scene (this doesnt get tracked on hacaktime :( ), i dont even know if this will hit the char limit, but anyways, here are the logs EDIT: IT DID HIT THE CHAR LIMIT, turns out the original devlog was ~9.6k characters 💀 while the limit is only 4k, so this is the shortened version. the full one is still in priv/devlogs/devlog2.md if anyone wants the extended edition.z Commits logs e47c48ac0970b49015e920607a59657259122f2f - made the cur proj into more modular featuring dynamic command loading system w commands.json as the source of truth on this, i figured out that packing every single thing into one file is a bad idea, so i made a modular command system that loads commands dynamically from a commands.json file, this way, i can add new commands without having to touch the main bot.js file, and also, it makes it easier to manage commands since they are all in one place 03b07ffc6f44d0231f9073f637caee1f9437705a) - added more detailed server logging with time & user at the start of most console logs onto terminal [coloured output] this was way more of a pain than i thought it was gonna be. after countless rounds of testing i finally got it working how i wanted. the ansi colours kept either leaking into the rest of the terminal or resetting back to the default colour when i needed them to go back to the current log level. i was genuinely losing my mind because every “fix” just broke something else. after hours of messing around i ended up making a wrapper so instead of resetting after things like the username or command, it switches back to whatever the current log level colour is (info, success or error), then only resets once right at the end of the log. it took way longer than it should’ve and nearly made me give up, but it finally does exactly what i wanted and nothing leaks anymore.added src/utils/logger.js and switched almost every console.log over to it. it adds timestamps, users, commands and coloured log levels.and changed all the console logs in src/bot.js and src/cmds/ to use the new logger api b81c739cc06edba2895695e51dbbf88d8868f19f - overhauled readme well as the name implies its pretty self explanatory lol but i massively expanded the README with better documentation and setup instructions. Server setup find more info in the setup guide on Step 7 out of 8 in https://stardance.hackclub.com/missions/slack-bot/guide#step-7 i had to apply for a Nest server and get SSH access.yeah so basically my starting gear is a potato server (2GB RAM, 16GB storage) but that’s more than enough for this bot. i also got to mess around with linux for a bit ( yes i am a windows user ). honestly… i kinda liked it and i’m like 80% convinced i’ll switch one day (but too much of a hassle to switch rn, but maybe in the future). after installing everything, setting up the environment variables and creating a systemd service, i finally got the bot running 24/7.TL;DR: i got the bot running 24/7 in the server and it works perfectly fine, and i can now add new commands without having to touch the main bot.js file, and also, and added detailed server logging with time & user aight y’all i spent an ENTIRE HOUR writing this devlog and THEN i had to rewrite a shortened down version, y’all better rate me 9/9 for story telling, rylvion signing out 🫡 pls see my full devlog version"}, {"post_id": 1731, "ts": "2026-06-03T22:11:42Z", "hours": 1.815, "text": "slackzilla after countless testing of figuring out why my bot isnt working, i found out the reason… well sort of… it seems so that the bot doesnt read my messages nad only respond to app commands idk how to make it respond to my messages if it not a cmd but anyways here are the logs 7be9077de2a487f7be8a779123420295dc9bff7e - add MIT license 9ceb9c2fe638f91ab6b0a14326437c9a5f32f499 - add initial bot setup (just for testing!] 66eb775434c871f063fd57daf0bdfc7bd66501f1 - add launch.json, .env.example (like formats), README.md, add stuff to bot.js btw this isnt hosted (will host soon) or anything and to use it you have to use the cmd prefix (sc-) e.g., /sz-ping"}]...
|
Title: slackzilla 🦖🦖 by @rylvion | Stardance
Devl Title: slackzilla 🦖🦖 by @rylvion | Stardance
Devlogs:
slackzilla after countless testing of figuring out why my bot isnt working, i found out the reason… well sort of… it seems so that the bot doesnt read my messages nad only respond to app commands idk how to make it respond to my messages if it not a cmd but anyways here are the logs 7be9077de2a487f7be8a779123420295dc9bff7e - add MIT license 9ceb9c2fe638f91ab6b0a14326437c9a5f32f499 - add initial bot setup (just for testing!] 66eb775434c871f063fd57daf0bdfc7bd66501f1 - add launch.json, .env.example (like formats), README.md, add stuff to bot.js btw this isnt hosted (will host soon) or anything and to use it you have to use the cmd prefix (sc-) e.g., /sz-ping
Devlog 2 - server setup & modular command system & more [03/07/2026] time logged: 10hr 59 min so since the last devlog, i’ve have worked on LOADS of things including behind the scene (this doesnt get tracked on hacaktime :( ), i dont even know if this will hit the char limit, but anyways, here are the logs EDIT: IT DID HIT THE CHAR LIMIT, turns out the original devlog was ~9.6k characters 💀 while the limit is only 4k, so this is the shortened version. the full one is still in priv/devlogs/devlog2.md if anyone wants the extended edition.z Commits logs e47c48ac0970b49015e920607a59657259122f2f - made the cur proj into more modular featuring dynamic command loading system w commands.json as the source of truth on this, i figured out that packing every single thing into one file is a bad idea, so i made a modular command system that loads commands dynamically from a commands.json file, this way, i can add new commands without having to touch the main bot.js file, and also, it makes it easier to manage commands since they are all in one place 03b07ffc6f44d0231f9073f637caee1f9437705a) - added more detailed server logging with time & user at the start of most console logs onto terminal [coloured output] this was way more of a pain than i thought it was gonna be. after countless rounds of testing i finally got it working how i wanted. the ansi colours kept either leaking into the rest of the terminal or resetting back to the default colour when i needed them to go back to the current log level. i was genuinely losing my mind because every “fix” just broke something else. after hours of messing around i ended up making a wrapper so instead of resetting after things like the username or command, it switches back to whatever the current log level colour is (info, success or error), then only resets once right at the end of the log. it took way longer than it should’ve and nearly made me give up, but it finally does exactly what i wanted and nothing leaks anymore.added src/utils/logger.js and switched almost every console.log over to it. it adds timestamps, users, commands and coloured log levels.and changed all the console logs in src/bot.js and src/cmds/ to use the new logger api b81c739cc06edba2895695e51dbbf88d8868f19f - overhauled readme well as the name implies its pretty self explanatory lol but i massively expanded the README with better documentation and setup instructions. Server setup find more info in the setup guide on Step 7 out of 8 in https://stardance.hackclub.com/missions/slack-bot/guide#step-7 i had to apply for a Nest server and get SSH access.yeah so basically my starting gear is a potato server (2GB RAM, 16GB storage) but that’s more than enough for this bot. i also got to mess around with linux for a bit ( yes i am a windows user ). honestly… i kinda liked it and i’m like 80% convinced i’ll switch one day (but too much of a hassle to switch rn, but maybe in the future). after installing everything, setting up the environment variables and creating a systemd service, i finally got the bot running 24/7.TL;DR: i got the bot running 24/7 in the server and it works perfectly fine, and i can now add new commands without having to touch the main bot.js file, and also, and added detailed server logging with time & user aight y’all i spent an ENTIRE HOUR writing this devlog and THEN i had to rewrite a shortened down version, y’all better rate me 9/9 for story telling, rylvion signing out 🫡 pls see my full devlog version
Devlog 3 - github actions webhook request (13/07/2026) time logged: 6hr 01min i added a webhook dispatcher that automatically triggers a deployment whenever i commit to the main branch. Instead of manually pulling changes on the server and restarting the service myself, the GitHub Action now sends a signed webhook to my deployment server, which verifies it and runs the deploy script for me. i also added 2 more commands /sz-meme - this makes a meme /sz-echo [str] - this echoes the string you can see the flowchart below and see the full devlog 3 here (hyperlinked) TL;DR whenever i commit the server automatically receives it and slackzilla updates to the latest version
Devlog 4: calc and roll commands time logged: 2 hr 20 minutes date: 17/07/2026 today i spent some time reading the Java Shunting Yard Algorithm implementation on GeeksforGeeks . The example focuses entirely on converting an infix expression into postfix form. It scans the expression character by character, places operands directly into the output string, and uses a stack to manage operators based on precedence and associativity. Once the scan is complete, any remaining operators are appended to produce a postfix expression like 5238-52^^/+. The Java version supports operators including + , - , * , / , and ^ , and it handles parentheses, but it stops after producing the postfix representation. It does not evaluate the numerical result. after reading that, i wanted something more complete for Slackzilla. I used the same core idea of converting infix to postfix, but I extended it in several ways. My implementation tokenises the input instead of reading one character at a time, which allows it to support multi digit numbers and decimals. I added unary minus detection so expressions like -3 or 5*-2 behave correctly. One challenge was distinguishing unary minus from subtraction. The parser has to determine whether it starts with a number or subtracts two values depending on the previous token. I kept exponentiation with the correct right associativity. Once the postfix array is built, I added a second stage that evaluates the postfix expression using a number stack. This lets the function return the final computed value rather than just the postfix notation. The result is a more flexible and practical version of the algorithm that fits naturally into Slackzilla and can evaluate real expressions interactively. after finishing the calculator command, I also added another command to Slackzilla called /sz-roll . This command allows users to simulate dice rolls directly inside Slack. It supports normal dice notation like d6 , custom dice sizes like d20 , multiple dice such as 2d6 , and modifiers like 2d20+5 . I added parsing logic to split the dice expression into the amount of dice, number of sides, and any modifier before rolling each dice individually and calculating the final total. I also added a /sz-roll help and /sz-calc help command which explains how to use the command and shows examples of supported formats. also i spent A LOT of time making the flowchart to describe this more than the implementation itself. I think it will be useful for future reference and for anyone else who wants to understand how the algorithm works. i also added json schema validation for commands.json as talked in devlog 2 the commands.json is the source of truth, so i addded a validator.yml to validate the json schema of commands.json and make sure it is valid before a pull request is merged. This will help prevent errors and ensure that the commands are correctly defined. TL;DR: added a calculator using the Shunting Yard algorithm with postfix evaluation, plus a flexible dice rolling command. Also added help commands, a flowchart and automated JSON schema validation. also ill add way more devlogs from now on since most of my last devlogs were major architecture refactor, unless there is a major change, i will just add a small devlog to add a new command/small feature, fix a bug, improve an existing feature and add more documentation.
Devlog 5 - manifest workflow time logged: 7hrs 6min 16 sec date: 21/07/2026 ok so i kinda lied in the last devlog. this ended up being another major architectural change to slackzilla. the slack manifest system was always the most brittle part of the pipeline and manually maintaining manifest.json was a guaranteed way to let things drift. today i finally automated the entire manifest workflow. the new setup makes commands.json and meta.js the single source of truth. i wrote a manifest generator that loads all metadata like descriptions colours oauth scopes bot info and merges it with the command definitions to build a complete slack manifest object. once assembled it writes manifest.json and syncs it during deployment. validation is baked directly into the generator. i wired AJV into both stages. every command is validated against command.schema.json and the final manifest is validated again against slack’s official schema. if anything fails the generator stops immediately with a clear error instead of producing a broken file. this caught several issues especially after i moved all schemas into a dedicated schemas/ directory to clean up the project structure. the github actions workflow also got a major overhaul. every push now generates the manifest validates commands and manifest rotates the slack configuration token updates github secrets syncs the manifest through the slack api and deploys the bot. changing a slash command in commands.json now updates both the bot and the slack app config automatically. no more manual edits to manifest.json or the slack app settings. the entire pipeline is now self maintaining and fully automated. token rotation was the biggest pain. slack configuration tokens only last twelve hours so storing them in github secrets was not enough. i created a fine grained github PAT with permission to modify repo secrets and wrote rotateManifestToken.js to handle the full refresh cycle. it rotates the manifest token receives a new refresh token and updates both secrets so the next deployment does not break. i spent way too long debugging an invalid_refresh_token error. note that slack’s copy button does not copy the existing refresh token it generates a new pair. every time i clicked it the previously saved token became invalid instantly. once i realised that i started updating github secrets immediately after copying the new pair so everything stayed in sync. after that the rotated token still was not being passed correctly between github actions steps. i switched to GITHUB_OUTPUT so the rotation step could hand the new token to the manifest sync step. then slack started returning not_authed which led to another rabbit hole. the manifest update endpoint requires the token in the correct auth header not the request body. once i fixed the request format the entire pipeline finally ran clean end to end. See figure 2 for github actions workflow TL;DR slackzilla now auto generates its slack manifest validates everything with AJV rotates configuration tokens syncs the manifest during deployment and updates the bot server with minimal manual work. after a lot of debugging around token rotation schema mismatches and github actions quirks the deployment pipeline is basically self maintaining except refreshing the github PAT every ninety days.
Devlog 6 - command buffet time logged: 6hr 37m 19s date: 22/07/2026 okay since most of the major architectural refactors are done, i can finally focus on adding more commands to Slackzilla. this devlog is about the new commands that i added to the bot, which are mostly utility commands that can be used for various purposes. base64 encoding hashing - supports multiple algorithms, default: sha256 decoder - decodes every algorithm that hashing supports random ids (uuid) secure tokens random numbers unix date conversion text case conversion (camel, pascal, snake, kebab) character counter rock paper scissors magic 8ball (the only entertainment command added in this devlog) the trickier parts were the input parsers. hash has to decide whether the first word is an algorithm or part of the text, case needs to split words without mangling the content too much, and unix has to switch between timestamps and readable dates without getting confused by weird inputs. i also added guardrails for invalid ranges and missing text so the bot gives a useful reply instead of just silently failing. the fun commands were the easiest win. 8ball just picks from a response list, and rps does a quick match against the player choice and the bot choice to decide whether it was a win, lose, or tie. it is very low stakes code, which is honestly refreshing after the manifest workflow stuff from last time. all utilities commands all have a help command associated to it the current utilities commands include: /sz-base64 - encodes a string to base64 /sz-hash - generates a hash of a string, default: sha256 /sz-decode - decodes a base64 encoded string /sz-uuid - generates a random uuid /sz-token - generates a random secure token /sz-random - generates a random number in a given range /sz-unix - converts a unix timestamp to a human-readable date and vice versa /sz-case - converts a string to camelCase, PascalCase, snake_case, or kebab-case /sz-count - counts the number of characters in a string /sz-rps - plays rock paper scissors with the bot /sz-calc - evaluates mathematical expression so all of it has a 2nd argument for help, so for example /sz-hash help will show the usage and examples of the command. i also added on package.json , 2 new scripts "validate-commands" : "ajv validate -s schemas/command.schema.json -d src/data/commands.json" , "cmd-stats" : "node scripts/stats.js" one to validate the commands.json file against the command.schema.json file, and another to provide statistics about the number of commands in the commands.json file. this will help me keep track of how many commands are in the bot and also make sure that the commands.json file is valid before a pull request is merged. currently, the bot has 22 commands in total, and 11 of them are utility commands (10 of them got added into this devlog (excluding the /sz-8ball that also was added in this devlog, but is an entertainment command)). the other 11 commands are the ones that were already in the bot before this devlog. i need some feedback on what other commands i should add to the bot, so if you have any ideas, please let me know. (im running out of ideas * sighs * ) im also planning on adding a web dashboard to the bot, which will allow users to see the bot’s status, logs, and other information in a more user-friendly way. this will be a big change, so stay tuned for that in the next devlog TL;DR: added a bunch of new slash commands for Slackzilla, kept the implementations small and native where possible, and tightened up the input handling so the new tools fail a little more gracefully.
Devlog 7 - Adding a Web Dashboard (locally) time logged: 9hr 58m date: 31/07/2026 ███████╗██╗ █████╗ ██████╗██╗ ██╗███████╗██╗██╗ ██╗ █████╗ ██╔════╝██║ ██╔══██╗██╔════╝██║ ██╔╝╚══███╔╝██║██║ ██║ ██╔══██╗ ███████╗██║ ███████║██║ █████╔╝ ███╔╝ ██║██║ ██║ ███████║ ╚════██║██║ ██╔══██║██║ ██╔═██╗ ███╔╝ ██║██║ ██║ ██╔══██║ ███████║███████╗██║ ██║╚██████╗██║ ██╗███████╗██║███████╗███████╗██║ ██║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot. the dashboard is designed to be responsive and works on both desktop and mobile devices. it has a clean and modern design that is easy to navigate. for Github Pages hosting, i used gh-pages branch which meant creating a seperate workflow ( pages.yml ) to build and deploy the dashboard to the dist/ folder. before that i needed a way to make it minified and optimised for production, so i used terser , clean-css and html-minifier-terser to minify the js, css and html files respectively, i do realise that this meant adding extra dependencies to the project (even though its not linked to the bot yet). The deployment website will be hosted on the bot’s server ( rylvion.hackclub.app ) and on the same port as the webhook server i also added new logging functionality that return smth like this the one below, this helps me track the usage of the commands and see how many times they have been used, when they were last used and by whom. this will be useful for the dashboard to show command usage statistics and manage command permissions. { " commands " : { " sz-hash " : { " count " : 3 , " lastUsedAt " : " 2026-07-23T13:27:28.116Z " , " lastUser " : " rylvion " , " lastUserId " : " U0A84FA2NP2 " } } } TL;DR: added a local prototype view of the web dashboard for slackzilla, its hosted on Github Pages and is a static site that is not connected to the bot yet, it shows the design and layout of the dashboard and how it will look when its connected to the bot and logging functionality that return command usage statistics and manage command permissions. introduced a new logging system that logs to both console and a file. added command usage tracking to record how often each command is used. enhanced server.js to serve dashboard, logs, and status pages. improved webhook handling and added signature verification. added a new metrics utility and feedback.js for tracking command usage statistics. next devlog will be about connecting the dashboard to the bot & server and making it functional, its gonna be a long one so stay tuned for that
Devlog 8 - server hosted dashboard finally happened time logged: 17hr 47min 45s date: 16/08/2026 The server hosted dashboard is finally here! It is hosted with the webhook, connected to the bot, and shows logs, status, and other information. architecture The Slackzilla server-hosted dashboard is the web control centre sitting alongside the webhook (runs on the same port). The server runs the dashboard, API routes, authentication/session handling, CSRF protection, logging, monitoring and administrative controls. The dashboard has been moving from the earlier static local/pages prototype (see devlog 7) towards an EJS-based server-rendered architecture, with shared layouts/partials and a global dashboard styling system. The server also handles the GitHub deployment webhook on port 9000 , while Nginx sits in front of the application. The dashboard is intended to expose things such as bot status, logs, statistics, monitoring, API documentation and admin controls rather than sshing into the server and running commands manually I’ve been separating the dashboard’s presentation layer, API layer and server logic. During development, I encountered and fixed several contract problems where route modules expected helpers such as context.sendError() and context.sendOk() that the runtime context did not provide. I also changed the authentication-aware API/SSE routes so unauthenticated requests return proper JSON/HTTP responses rather than accidentally redirecting an EventSource connection into an HTML login page. The dashboard has admin-only functionality, CSRF protection and server-side authentication, whilst the bot itself uses Slack’s Events/Slash Command mechanisms for incoming Slack activity. Slack’s Events API delivers subscribed events to the HTTP endpoint, while slash commands are sent to the configured app endpoint via HTTP POST. /api/admin routes are protected by an authenticated admin session and CSRF protection. Admin authentication uses a session cookie, which is only created after logging in through rylvion.hackclub.app/admin/login . The admin password is never stored in plaintext. It is stored as a PBKDF2-HMAC-SHA512 hash in the server environment, using a random salt and a high iteration count. The dashboard does not allow the password to be created or changed, so the server environment must be updated manually before restarting the service. CSRF tokens are generated server-side and sent to the authenticated client via a cookie. For POST requests, the client must return the token in the X-CSRF-Token header, preventing unauthorised or forged requests from triggering admin actions. /api/ (excluding /api/admin ) has no authentication Port 9000 is used for the webhook and the dashboard whilst the bot itself runs on socket mode. The api that currently has these endpoints base url: https://rylvion.hackclub.app/api/ GET /api/status - returns the bot status and other information GET /api/logs - returns the bot logs from slackzilla.log as JSON, including the file size in bytes POST /api/admin/control - allow the admin to control the accepts several actions such as start , stop , restart , redeploy , refresh , refresh-logs , refresh-status (self explanatory actions) with dangerous actions (such as redeploy , restart and stop ) contains a confirmation prompt to prevent accidental execution of the action. GET /api/admin/feedback - returns database feedback as JSON GET /api/admin/feedback/:id - returns the feedback with the given ID as JSON POST /api/admin/feedback/:id - allows the admin to control and accepts 3 actions such as delete , read , unread , respond . GET /api/admin/events - is a SSE (Server Sent Event) endpoint that allows the admin to receive real time events from the server such as logs, status, feedbacks and other information about the bot.
Devlog 9: React Dashboard time logged: 29hr 1m date: 03/09/2026 The React dashboard is finally here! I completely migrated the old EJS dashboard with a new React app. THIS will be IS the biggest devlog yet, as it covers a lot of changes and new features. main features added is migration, codebase assistance, graphs, telemetary and a new api. Heres a summary of what i changed renamed src/ to bot/ - this is because its related to the bot and not the server and its not where all the main files are migrated the EJS dashboard into a React app overhauled the UI deleted the pages system and the workflow to build it added a new RAG modal that answers questions about the repo and shows related visual assets (also includes a new rag.js file that handles retrieval and generation of answers) The react dashboard has the following features: 10 pages (Home, Admin, Api, Commands, Docs, Home, Logs, AI, Sitemap, Status) 12 components 8 utilities js exports in the utils/ folder 404 page (with routing) & Error Boundary modal page public AI assistant page with repository-aware retrieval and related visual assets command API with stable IDs, command help, and captured command responses (so API can be called from the dashboard) public status, logs, metrics, command, and AI API endpoints admin feedback controls for filtering, viewing, replying, marking read/unread, and deleting (they dont work on windows only linux) CPU, memory, disk, and network telemetry with responsive graphs and hover data tooltips (so satisfying) Current React Architecture The active client source lives in server/client/src/ . Vite builds it into server/client/dist/ , which is served by server/server.js . React Router renders the page routes declared in server/client/src/components/utils/routes.js . The server still owns the HTTP status code: known browser routes receive the React shell with 200 , while unknown browser routes receive the same shell with 404 so the client can render the NotFound page without hiding the correct HTTP semantics. The old EJS dashboard and static page-generation flow are no longer the active dashboard path. The bot remains in bot/ , separate from the dashboard server, and the server uses explicit Node http handlers under server/api/ . RAG and Command APIs The new /ai page sends questions to POST /api/ask . server/lib/rag.js retrieves relevant repository text while excluding priv/ , .env files, dependencies, logs, and build output. It can identify related image assets such as the calculator flowchart without parsing binary image contents. If configured, the retrieved context is sent to the AI provider; otherwise the endpoint returns a local configuration message and source metadata. Commands are exposed through GET /api/commands , GET /api/commands/:id , and POST /api/commands/:id . The API adapter reuses the same command modules as Slack and captures their responses. The Commands page provides the interactive runner, while the AI page remains focused on repository questions. Explicit natural-language requests can still ask the RAG service to execute a recognised slash command and return its result. Limitations The migration exposed several boundaries that are now documented in docs/ : authentication and CSRF, the webhook protocol, API registration, setup, and RAG behaviour. Runtime persistence is still file-backed through server/database/store.js ; an external database remains a future adapter project rather than a required dependency. Linux systemd controls and deployment scripts are intended for the hosted environment. On Windows local development, the dashboard, APIs, telemetry, and React pages work, but system service actions and Bash deployment are not expected to succeed. The dashboard must be rebuilt and restarted after production client or server changes.
Devlog 10 - QOL DASHBOARD IMPROVEMENTS, RAG ENHANCEMENTS WITH TOOLS & CACING AND LOTS OF STUFF time logged: 27 hrs 30 mins date: 20/09/2026 version: v0.9.5-beta This devlog is COVERING A LOT of stuff that i did, but im not gonna drag this over like i did from all other devlogs so heres are the features: covering from v0.9.1-beta to v0.9.5-beta, see release-history.json for the full changelog Features added Added RAG TOOLS including getStatus - returns the status of the RAG getCommands - with enhanced filtering (filter by name, usage hint, id, category and fuzzy filter (makes it easier for RAG to find commands)) getReleaseInfo - returns the release info of the CURRENT version and (optionally) any other version (pass it by parameter) runCommand - runs a command by id getLogs - returns recent logs for the RAG to inspect (max 100, default 20) getMetrics - returns the metrics of the RAG (memory usage, cpu usage, etc) getRoutes - returns the routes of the APIs added 3 new scripts ( npm run ) which are rag - runs the RAG with or without the --ai flag to see context/answer cli rag:use-tool - runs a tool by name (with optional parameters) release - appends current release notes from package.json to release-history.json . Added new endpoints /api/telemetry - returns the telemetry history separately from the main status endpoint /api/command/:id - gets or executes a command by id /api/telemetry/stream - streams telemetry updates using SSE /api/admin/server-events - returns server events for the admin dashboard /api/ask - now uses SSE to stream the RAG’s activity ( yers now we can see the RAG in aciton ), context, tool usage, token usage and final response dashboard imporvements added a seperate admin server events page (wevent searching, filtering, prioritisation and stylying) added a command runner on the command page fixed recent activity not showing up on the dashboard Added visible AI activity to the AI page the RAG now emits activity events while processing a question AI page is cached on localStorage so you can go back and forth between pages without losing the AI page state Improved the RAG’s repository awareness added AST-based parsing using acorn and acorn-walk added persistent .rag/index.json added symbol search and dependency analysis added function, export, function call, environment variable and route extraction added richer code context and source metadata added automatic index rebuilding improved path-based dependency detection fixed the RAG detecting references created using path.join(rootDir, ...) add token budgeting and usage tracking. Changed how telemetry is handled telemetry history is no longer included in /api/status or any other endpoints CHANGED all admin endpoints so that none of them has the telemetryHistory anymore Added release history tracking added release-history.json /sz-release can now retrieve release information for different versions npm run release automatically appends the current release notes Tl;DR: RAG got a major upgrade with AST-powered repository indexing (acorn/acorn-walk), persistent indexing via .rag/index.json , symbol search, dependency analysis, function/export/call/env-var/route extraction, richer source metadata, automatic index rebuilding, 7 new RAG tools, 3 new CLI tools, SSE-powered streaming for /api/ask and telemetry, telemetry endpoints, admin server events, live AI activity tracing, token/context/tool usage visibility, AI session caching, release history tracking, telemetry separation from /api/status, admin API cleanup, and a large collection of bug fixes, repository-awareness improvements and major QOL improvements. . hopefully i will be devloging every version till i ship
devlog 11 - ADMIN EHANCEMENTS: errors views, log archiving & restoration, logs deletion controls, RAG IMPROVEMENTS AND MORE… date: 11/10/2026 time logged: 31hr 57m version: v0.9.6-beta this release focused on making Slackzilla easier to debug, manage and understand internally. a LOT of work went into the admin panel, route extraction and testing. 1. admin panel got some SERIOUS upgrades added 3 new admin pages for server events, errors and logs. also split admin.css into separate stylesheets because one giant stylesheet isn’t exactly a maintenance strategy. error monitoring added an error viewer with timestamps, stack traces and source files improved error messages to make them more user-friendly log management added a log archive viewer with backup timestamps, line counts and file sizes added backup restoration and switching added controls to delete specific lines, ranges or the last X lines added log rotation and telemetry reset controls added the /log-archives admin endpoint 7 new admin controls: delete-logs , delete-lines , delete-last , delete-line , rotate-logs , restore-log and reset-telemetry that’s a LOT more control over server logs than before. 2. endpoints & session security added 4 new endpoints : 3 admin endpoints: /errors , /errors/stream , /log-archives 1 public endpoint: /api/session /api/session now provides current session information, with csrfToken moved from /api/admin/summary to the new endpoint. also fixed the CSRF token not appearing in the document head. small bug, annoying consequences. removed the children=[] pattern from routes.js and its associated dependencies. 3. RAG / code parser improvements route extraction got a substantial upgrade. detects routes using exact path checks, prefix checks and array-based matching improved HTTP method inference for conditional routes, including GET and POST merges duplicate route entries and inferred methods expanded discovery beyond server/api/ , including /webhook and /admin/login improved /api/routes to return supported methods, match types, source files and line numbers the goal: give the RAG system more accurate route information instead of confidently retrieving incomplete or duplicated data. ᕦ(ò_óˇ)ᕤ 4. AI activity & markdown the AI activity view now displays elapsed time alongside tool summaries and responses, making it easier to follow what the system actually did. replaced the custom Markdown parser with marked AND dompurify for established parsing and HTML sanitisation. switched the configured model from openrouter/free to openai/gpt-6-luna , aiming for better performance and reliability. also deduplicated getReleaseInfo to avoid maintaining redundant version information. 5. testing added 3 npm scripts : test:code-parser for code parser tests test:rag for RAG tests test:all for the broader test suite and validation checks added automated code parser tests covering route extraction, HTTP method inference and deduplication. 6. docs updated README.md and project documentation to reflect the latest endpoints, admin controls, route extraction changes and RAG improvements. documentation staying in sync with the codebase. revolutionary concept, apparently. release summary v0.9.6-beta added: 4 endpoints 7 admin controls 3 admin pages 3 npm testing scripts improved error visibility, log management, session information and route extraction updated Markdown rendering, AI activity information and documentation the main focus was improving maintainability, debugging and the reliability of Slackzilla’s internal tooling. ( ͡° ͜ʖ ͡°) next devlog hint: a terminal is coming. think less clicking through admin pages, more interacting with Slackzilla directly through a terminal interface. details in the NEXT devlog. \(^o^)/...
|
1792752514.4039207
|
1793357314.4039207
|
|
7084
|
ALL of the board games I like or Invented by @Nezr ALL of the board games I like or Invented by @Nezruceuil | Stardance...
|
Nezruceuil
|
1
|
151.0
|
1265
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T19:52:05Z", "hours": 151.0, "multiplier": 8.44, "payout": 1265, "blessing": "neutral", "text": "I coded a Game in which you can play all of my favorite board games and the games that I invented. I deepened my Godot coding knowledge by recreating complicated games like: Chess, Reversi, Go, Tafl and Shōgi. I really enjoyed doing this project and now you can enjoy it too! hey, if you write **Stardance** in the background texture you can get this amazing background ↓. ✨", "repo": "https://github.com/Nezruceuil/my-board-games", "demo": "https://nezruceuil.itch.io/cool-board-games"}]...
|
[{"post_id": 75686, "ts": "202 [{"post_id": 75686, "ts": "2026-09-30T19:11:44Z", "hours": 1.1744, "text": "Fixed Bugs and added new secrets panels."}, {"post_id": 71414, "ts": "2026-09-20T19:42:26Z", "hours": 9.54, "text": "Fixed bugs, improved my game, added recommendation, added a way to order the games however you want, added art for amazons game fire and added a Chess panel."}, {"post_id": 61656, "ts": "2026-09-04T17:57:46Z", "hours": 5.3467, "text": "Improve my board game, fixed bugs, added a texture for the walls, added a play time estimation for every games, added Amazons and added Gomoku."}, {"post_id": 58882, "ts": "2026-08-31T13:38:25Z", "hours": 1.7225, "text": "Fixed more bugs (tafl and text in wrong place.) and improved Castle War and added some art to it."}, {"post_id": 58076, "ts": "2026-08-30T12:49:31Z", "hours": 10.0364, "text": "Fixed Bugs (tafl,drawback chess,ect…), Added a Spring panel, Added Amazons and Added Castle War (my own strategy game)."}, {"post_id": 48101, "ts": "2026-08-16T12:03:28Z", "hours": 9.0517, "text": "fixed Bugs, added 2 new chess variants and Added 15 unique drawbacks to drawback chess!"}, {"post_id": 46333, "ts": "2026-08-13T14:07:53Z", "hours": 9.0744, "text": "Fixed bugs, added a Hazelnut fight ai (not entirely done) and added more drawbacks to drawback chess."}, {"post_id": 43342, "ts": "2026-08-08T15:20:23Z", "hours": 8.5814, "text": "Added better panel for the main page (added a Summer panel a Winter panel that you can get by being on the game at the right season. and a star dance panel that you can get by typing “Stardance”. (I drew all of the panels myself.)) , added a Save and Load function, change all of the text font to be better and added a script to see the panel (control/option space)."}, {"post_id": 40696, "ts": "2026-08-04T11:49:37Z", "hours": 1.2158, "text": "fixed bugs, improved design and added a delete drawings and arrows function win delete. (a lot of arrows + delete button = no more arrows)"}, {"post_id": 39671, "ts": "2026-08-02T20:01:01Z", "hours": 4.1125, "text": "added an arrow drawing ability and fixed bugs."}, {"post_id": 38699, "ts": "2026-08-01T06:56:05Z", "hours": 1.4872, "text": "added an explanation for every games and fixed bugs with the lines of action game."}, {"post_id": 38178, "ts": "2026-07-31T13:20:17Z", "hours": 1.7389, "text": "fixed a bug with chess and added lines of action!"}, {"post_id": 37562, "ts": "2026-07-30T11:46:29Z", "hours": 3.5211, "text": "fixed bugs and added Go!"}, {"post_id": 37224, "ts": "2026-07-29T19:30:53Z", "hours": 1.4664, "text": "finished making talf games (added the king suffocation mechanic) !"}, {"post_id": 36562, "ts": "2026-07-28T19:20:19Z", "hours": 3.0928, "text": "started added talf game( ≈ 85% done) still need to add the king capture feature"}, {"post_id": 35321, "ts": "2026-07-26T17:18:12Z", "hours": 1.8692, "text": "fixed bugs and added more chess variants"}, {"post_id": 35080, "ts": "2026-07-26T08:26:26Z", "hours": 4.0767, "text": "Fixed bugs and added Reversi!"}, {"post_id": 34274, "ts": "2026-07-24T20:51:45Z", "hours": 2.0453, "text": "added bigger tic tac toe and fixed bugs."}, {"post_id": 33662, "ts": "2026-07-23T19:17:40Z", "hours": 2.0328, "text": "added 4 player Chess, fixed bugs and added a boat for Chaturaji."}, {"post_id": 33528, "ts": "2026-07-23T15:39:08Z", "hours": 2.0022, "text": "added an explanation for every game."}, {"post_id": 33148, "ts": "2026-07-22T19:53:27Z", "hours": 4.4092, "text": "fixed bugs and added Chaturaji"}, {"post_id": 31461, "ts": "2026-07-19T20:45:54Z", "hours": 4.3989, "text": "fixed a bug with duck chess and added Shōgi."}, {"post_id": 30822, "ts": "2026-07-18T19:09:14Z", "hours": 6.975, "text": "added every variants( Atomic,Duck Chess,Fog Of War,Giveaway,King Of The Hill,Capture Anything,Torpedo,No Castling,Ghost Board,Sideways ) and added Connect 4"}, {"post_id": 30297, "ts": "2026-07-17T19:08:42Z", "hours": 7.4939, "text": "Started adding an AI for Hazelnut Fight, fixed bugs with castling in the chess games, added a page to play classic chess variants, and a page where you can see all the chess variants coming in the next devlog. I also added an autofill that checks for similarity to fill in variant names (for example: aTuMyk -> Atomic .)"}, {"post_id": 27888, "ts": "2026-07-13T20:03:40Z", "hours": 0.7567, "text": "added color pickers to the options menu."}, {"post_id": 27847, "ts": "2026-07-13T18:47:36Z", "hours": 1.3992, "text": "added a classic version to pieces fit!"}, {"post_id": 24673, "ts": "2026-07-08T12:50:10Z", "hours": 4.3453, "text": "Added ‘Pieces Fit,’ a game where everyone is given the same randomly generated custom piece and must place as many copies of it as possible without any of them attacking each other."}, {"post_id": 24151, "ts": "2026-07-07T15:08:03Z", "hours": 3.4447, "text": "fixed bugs with some drawbacks and added 5 more uniques drawbacks"}, {"post_id": 22245, "ts": "2026-07-04T16:41:55Z", "hours": 2.2403, "text": "added a resign button 5 more unique drawback and fixed bugs"}, {"post_id": 22065, "ts": "2026-07-04T09:47:55Z", "hours": 3.5369, "text": "added Drawback Chess with 15 drawbacks!"}, {"post_id": 20990, "ts": "2026-07-02T18:48:12Z", "hours": 3.8056, "text": "added draw to the chess games and a options menu (that doesn’t do anything yet)"}, {"post_id": 19446, "ts": "2026-06-30T19:25:45Z", "hours": 0.8839, "text": "added normal chess"}, {"post_id": 19383, "ts": "2026-06-30T17:58:23Z", "hours": 0.91, "text": "added a drawing ability , added color to see the last movement of your enemy and it now turn 180° every turn."}, {"post_id": 19112, "ts": "2026-06-30T11:00:58Z", "hours": 2.1864, "text": "added game mode and additional rule for pizza chess (for example this one makes all pieces looks like pizza ( Kings opening vs King Indian defense ) and you can’t even tell what is what piece)"}, {"post_id": 19057, "ts": "2026-06-30T07:37:39Z", "hours": 8.1514, "text": "added pizza chess (my own version of chess where the left knight is replace by a pizza)"}, {"post_id": 8544, "ts": "2026-06-14T06:27:46Z", "hours": 3.6144, "text": "added a new game with gambling (not real money!)"}, {"post_id": 3536, "ts": "2026-06-06T14:59:28Z", "hours": 1.145, "text": "added a indicator for the player turn and fixed a bug with the golden hazelnut. Added visual to hazelnut fight page in the menu."}, {"post_id": 3391, "ts": "2026-06-06T09:11:28Z", "hours": 0.5789, "text": "Finished the game ! and Fixed some bugs"}, {"post_id": 3377, "ts": "2026-06-06T08:32:40Z", "hours": 0.45, "text": "polished and added texture for this game!"}, {"post_id": 3355, "ts": "2026-06-06T07:38:18Z", "hours": 1.9031, "text": "added a settings for my games that work and finished the gameplay of the game !"}, {"post_id": 3315, "ts": "2026-06-06T05:39:18Z", "hours": 1.3564, "text": "fixed hiding, look around and added a win condition and a win screen!"}, {"post_id": 2792, "ts": "2026-06-05T16:34:28Z", "hours": 1.0958, "text": "added a Hazelnut limit for the inventory, added the possibility of hiding you hazelnuts and added the number of turns"}, {"post_id": 2319, "ts": "2026-06-04T19:05:43Z", "hours": 0.7481, "text": "added movement, look around button with how many hazelnuts you found on your position!"}, {"post_id": 2258, "ts": "2026-06-04T17:29:03Z", "hours": 0.6908, "text": "added a next player button, player turn and player with controlled position!"}, {"post_id": 2137, "ts": "2026-06-04T13:52:30Z", "hours": 0.6044, "text": "added a tile map with random tile (forest, plain or lake) for one of the game"}, {"post_id": 2037, "ts": "2026-06-04T10:08:21Z", "hours": 0.5872, "text": "Added the main page with buttons and a scroll bar"}]...
|
Title: ALL of the board games I like or Invented b Title: ALL of the board games I like or Invented by @Nezruceuil | Stardance
Devlogs:
Added the main page with buttons and a scroll bar
added a tile map with random tile (forest, plain or lake) for one of the game
added a next player button, player turn and player with controlled position!
added movement, look around button with how many hazelnuts you found on your position!
added a Hazelnut limit for the inventory, added the possibility of hiding you hazelnuts and added the number of turns
fixed hiding, look around and added a win condition and a win screen!
added a settings for my games that work and finished the gameplay of the game !
polished and added texture for this game!
Finished the game ! and Fixed some bugs
added a indicator for the player turn and fixed a bug with the golden hazelnut. Added visual to hazelnut fight page in the menu.
added a new game with gambling (not real money!)
added pizza chess (my own version of chess where the left knight is replace by a pizza)
added game mode and additional rule for pizza chess (for example this one makes all pieces looks like pizza ( Kings opening vs King Indian defense ) and you can’t even tell what is what piece)
added a drawing ability , added color to see the last movement of your enemy and it now turn 180° every turn.
added normal chess
added draw to the chess games and a options menu (that doesn’t do anything yet)
added Drawback Chess with 15 drawbacks!
added a resign button 5 more unique drawback and fixed bugs
fixed bugs with some drawbacks and added 5 more uniques drawbacks
Added ‘Pieces Fit,’ a game where everyone is given the same randomly generated custom piece and must place as many copies of it as possible without any of them attacking each other.
added a classic version to pieces fit!
added color pickers to the options menu.
Started adding an AI for Hazelnut Fight, fixed bugs with castling in the chess games, added a page to play classic chess variants, and a page where you can see all the chess variants coming in the next devlog. I also added an autofill that checks for similarity to fill in variant names (for example: aTuMyk -> Atomic .)
added every variants( Atomic,Duck Chess,Fog Of War,Giveaway,King Of The Hill,Capture Anything,Torpedo,No Castling,Ghost Board,Sideways ) and added Connect 4
fixed a bug with duck chess and added Shōgi.
fixed bugs and added Chaturaji
added an explanation for every game.
added 4 player Chess, fixed bugs and added a boat for Chaturaji.
added bigger tic tac toe and fixed bugs.
Fixed bugs and added Reversi!
fixed bugs and added more chess variants
started added talf game( ≈ 85% done) still need to add the king capture feature
finished making talf games (added the king suffocation mechanic) !
fixed bugs and added Go!
fixed a bug with chess and added lines of action!
added an explanation for every games and fixed bugs with the lines of action game.
added an arrow drawing ability and fixed bugs.
fixed bugs, improved design and added a delete drawings and arrows function win delete. (a lot of arrows + delete button = no more arrows)
Added better panel for the main page (added a Summer panel a Winter panel that you can get by being on the game at the right season. and a star dance panel that you can get by typing “Stardance”. (I drew all of the panels myself.)) , added a Save and Load function, change all of the text font to be better and added a script to see the panel (control/option space).
Fixed bugs, added a Hazelnut fight ai (not entirely done) and added more drawbacks to drawback chess.
fixed Bugs, added 2 new chess variants and Added 15 unique drawbacks to drawback chess!
Fixed Bugs (tafl,drawback chess,ect…), Added a Spring panel, Added Amazons and Added Castle War (my own strategy game).
Fixed more bugs (tafl and text in wrong place.) and improved Castle War and added some art to it.
Improve my board game, fixed bugs, added a texture for the walls, added a play time estimation for every games, added Amazons and added Gomoku.
Fixed bugs, improved my game, added recommendation, added a way to order the games however you want, added art for amazons game fire and added a Chess panel.
Fixed Bugs and added new secrets panels.
Ships:
I coded a Game in which you can play all of my favorite board games and the games that I invented. I deepened my Godot coding knowledge by recreating complicated games like: Chess, Reversi, Go, Tafl and Shōgi. I really enjoyed doing this project and now you can enjoy it too! hey, if you write **Stardance** in the background texture you can get this amazing background ↓. ✨...
|
1792853378.4869957
|
1792939778.4869957
|
|
32533
|
Kobayashi OS by @Riko | Stardance
|
Riko
|
2
|
151.0
|
2155
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T13:18:06Z", "hours": 108.0, "multiplier": 19.95, "payout": 2155, "blessing": "neutral", "text": "What did you make? Kobayashi OS — a web OS themed around Miss Kobayashi’s Dragon Maid . I wanted to make one of the most feature-rich and polished web OS experiences possible, something that actually feels like you’re using a PC. And yeah, this is Kobayashi’s PC, so don’t be surprised if you find something interesting related to her. The main thing I focused on was making everything feel connected, just like a real OS. Apps don’t just exist separately — Camera connects to Gallery and Files, downloads go into Files, Kanvas can save things to Files, widgets remember where you put them, and Kobayashi-chan can actually interact with the system. Basically, it’s not just a collection of apps. It’s one big little OS. What was challenging? Interconnecting all the apps and keeping everything persistent was definitely a challenge. I wanted things to behave like an actual OS instead of just being separate demos. Making the Kobayashi-chan AI work was one of the toughest hurdles. Getting tool calling, memory, emotions, and system interaction to work together took a lot of trial and error. Designing and building the widget system was another tough one. Making widgets draggable, positionable, persistent, and actually useful took quite a bit of work. Honestly, getting all the small details and polish right took way more time than I expected. What am I proud of? First — Kobayashi-chan AI. This is probably my favorite part of the whole project. She has tool calling, memory, emotions, and can actually interact with the OS. I genuinely didn’t expect I would be able to make something like this. It’s basically a little Jarvis, but Kobayashi-chan. The piano. I spent way more time on this than I probably should have. Not building it — playing it. It’s such a stupidly fun little feature that I keep losing track of time playing on it. The overall polish. I’ve been working on this for so long that I’ve honestly lost count of all the little things I added. I designed the UI in Figma, made a lot of the icons myself, kept redesigning things, learned a ridiculous amount along the way, and kept adding small details until it finally started feeling like a real OS. I’m genuinely proud of how it turned out. There are a lot of things packed into this project, and I think the best way to understand the amount of work that went into it is to actually explore it yourself. What should you know before testing? The project: https://kobayashi.cawai.site/ Please explore the widgets. This is one of the parts I spent a lot of time on. Please try the piano. Seriously. On the first load, some images may take 1–2 seconds to appear. Give it a moment. Wallpaper customization, live wallpapers, and icon customization may also take a little time on the first load. There are a LOT of games: Thor, Spider-Man, Minecraft, etc. If you open one and see a black screen, don’t panic. Some of them just take a little while to load. Come on, we’re talking about Minecraft here. Give it some time. And obviously, click around. Open things. Break things. Try stuff. A lot of the fun is finding the little details hidden around the OS. That’s Kobayashi OS. I started with the idea of making a web OS, but somewhere along the way it turned into this huge little world with its own apps, games, music, memories, AI, and way too many tiny details. Hope you have fun exploring it.", "repo": "https://github.com/anshumitasahu/Kobayashi--OS", "demo": "https://kobayashi.cawai.site/"}, {"ship_num": 2, "ts": "2026-08-01T08:57:08Z", "hours": 43.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Kobayashi OS v1.0 is finally live! Kobayashi OS is a lightweight, anime-inspired Web Operating System built to bring a desktop-like experience to the browser. This first release focuses on a smooth window management system, allowing multiple instances of the same application, along with wallpaper, icon, and brightness customization. It uses React, TypeScript, Bun, Tailwind CSS, Zustand, and Local Storage to provide a persistent experience. The custom logo and launch banner were also designed specifically for this release. Some applications currently contain placeholder alerts and are still under development, with more features and apps planned for future updates. Highlights Anime-inspired light theme Interactive multi-window desktop Multiple instances of the same app Wallpaper, icon & brightness customization Zustand + Local Storage More apps and features coming soon", "repo": "https://github.com/anshumitasahu/Kobayashi--OS", "demo": "https://kobayashi.cawai.site/"}]...
|
[{"post_id": 62884, "ts": "202 [{"post_id": 62884, "ts": "2026-09-06T12:36:45Z", "hours": 1.8994, "text": "Polished the UI of the widgets, improved wallpaper customization, refined the app UX, resized the apps, added a bunch of new features, and made countless small tweaks across the OS. A lot has gone into this project, and I really hope it becomes the star project considering how much time I’ve poured into it. 🥹 Still more to come!"}, {"post_id": 62379, "ts": "2026-09-05T18:24:34Z", "hours": 1.5711, "text": "Kobayashi-chan is here! Chat, open apps, change settings. She remembers, reacts, and doesn’t mind a little flirting. :) Major changes!! A summary of everything I’ve done over the past 5 days. Lots of design work too—especially Figma stuff. StarDance doesn’t log my Figma hours though… too bad."}, {"post_id": 62033, "ts": "2026-09-05T07:58:56Z", "hours": 10.0164, "text": "Damnn!! Been a while haven’t posted anything bout my Work!!!!!! added a piano added a lots of Fun games improved the architecture and UI/UX improved the response of the Kobai added Terminal and Code editor.. added a proper and nice widget system changed the whole UI of my apps_ and more features are coming soon!!!!!"}, {"post_id": 58672, "ts": "2026-08-31T05:42:22Z", "hours": 9.2753, "text": "Added a lots of appppss!!! embeded few games, hackclub and typingtest.com … and Yeah added my own built apps (Json Lab , DevScope, and MoneyTrail)"}, {"post_id": 55183, "ts": "2026-08-26T18:06:02Z", "hours": 3.21, "text": "Another day on Kobayashi OS. Damn, I really turned the AI Assistant into what I actually wanted it to be. And yeah, now the Shorts app isn’t just some mere app with a icon sitting there — it actually has Shorts embedded hehe. And yeah… there’s a Kanvas app now too lol."}, {"post_id": 54549, "ts": "2026-08-25T16:00:46Z", "hours": 9.8811, "text": "Damn !! Been a while !! Yup was working on the assistant.. yeah which actually works!!! changed the architecture of ai chatbot and yeah its much better now !! and Yeah some more tweaks ongoing"}, {"post_id": 52981, "ts": "2026-08-23T11:05:21Z", "hours": 1.2497, "text": "Making the UI of music player nicer .."}, {"post_id": 52917, "ts": "2026-08-23T09:19:23Z", "hours": 3.9803, "text": "BIG ALERT IN KOBAYASHI OS I SUCCESSFULLY BUILT AN AI ASSISTANT FOR MY WEB OS! 🎉 It can actually understand commands and interact with the OS — opening apps, handling actions, and more.Another huge step for Kobayashi OS. I’m learning a LOT about AI while building this, and it’s honestly crazy seeing everything come together."}, {"post_id": 52189, "ts": "2026-08-22T08:54:28Z", "hours": 5.2606, "text": "Worked on the adding more apps.. with functionality and zero css hehe but yeah add it later currently working on a ai chat box on my project apps"}, {"post_id": 51173, "ts": "2026-08-20T17:52:30Z", "hours": 3.4503, "text": "Today was more focused on research and architecture than coding, but I still made some solid progress. I perfected the widgets, made the right-click menu fully functional, and built a basic music player that’s already working. I’ll be focusing on the CSS and visual polish for the music player tomorrow. Overall, another productive day on Kobayashi OS."}, {"post_id": 50444, "ts": "2026-08-19T16:37:20Z", "hours": 3.5219, "text": "Spent some more time working on the Widgets section 👀 Made the widgets draggable and closable only when the widgets menu the widgets top bar is being displayed.Also fixed up some CSS issues, added a right-click context menu, and added an Open option. So far, only one widget is actually openable; the rest will come later 😅 That’s enough UI work for today though — my shoulders and back are officially protesting. 💀 More to come!"}, {"post_id": 50174, "ts": "2026-08-19T09:00:29Z", "hours": 1.9064, "text": "Update Made a few solid improvements to the widget experience: Widget positions are now stored globally and persisted in local storage, so the app restores exactly where you left it after a refresh. Tweaked the visuals for a cleaner, more polished look. Added resizable widgets for a more flexible, customizable layout. Small changes, but they make the overall experience feel much smoother. More to come!"}, {"post_id": 49755, "ts": "2026-08-18T17:54:09Z", "hours": 3.4989, "text": "A little update on the Widgets section It’s already looking pretty cool , but I’m not quite done with it yet. There are still a few tweaks and some changes I want to make to how the widget system works under the hood. The goal is to make the whole experience feel cleaner, more flexible, and easier to build on as I keep adding more widgets. For now, though… I’m pretty happy with how it’s coming together. 🚀More tweaks incoming."}, {"post_id": 49478, "ts": "2026-08-18T10:44:19Z", "hours": 5.8236, "text": "Yahooooooo! Made some awesome progress! Added the Widgets feature Added a toggle function to open/close the Widgets list Added a Calendar widget Added a Clock widget Added toggle functionality for opening and closing widgets So happy to see it all coming together! 😄 🔥One step at a time, and the project is getting better and better! ✨ 💪"}, {"post_id": 48289, "ts": "2026-08-16T16:27:18Z", "hours": 3.5703, "text": "Camera Improvements Fixed a few bugs and made some nice improvements to the camera flow. Now, the last captured photo is shown directly in the camera. Tap it, and the gallery opens with the image displayed at full width and height. From there, you can swipe through the rest of your photos. Still have a few things I want to tweak in this flow, but the experience is already feeling much smoother. Next up: widgets !!"}, {"post_id": 47551, "ts": "2026-08-15T15:04:05Z", "hours": 7.6117, "text": "Been a while! Added a working camera + gallery and implemented IndexedDB for storing captured photos.Honestly, the camera logic and IndexedDB were the biggest challenges since I knew nothing about them before this. Learned from internet resources, experimented, broke things, fixed them… and finally cracked it."}, {"post_id": 44158, "ts": "2026-08-09T18:47:51Z", "hours": 3.5058, "text": "I worked on improving the app bar behavior in Kobayashi OS. I added the Menu app icon to the apps bar whenever it’s opened, and also implemented position shifting for existing apps so they adjust automatically when a new app appears. Small interaction improvements, but they make the desktop feel more dynamic and consistent."}, {"post_id": 43954, "ts": "2026-08-09T12:32:36Z", "hours": 4.1286, "text": "Gallery is successfully made! Glad it turned out well. The main challenge was the UI 🙄, but yeah, it now has Next/Previous and Back functionality. The selected image expands to the full width and height—just like we see in a proper gallery, without appearing in some corner or another section. Overall, pretty happy with how it turned out!"}, {"post_id": 43099, "ts": "2026-08-08T05:43:08Z", "hours": 7.2944, "text": "It’s been a while since my last update, but I’m happy to say Kobayashi OS is getting closer to the finish line! 🚀 Update: Added a toggle to open/close the Menu app Improved the Settings & overall UI Added app resizing App bar now hides when the screen is maximized Added a background for active page in settings Changed the About us Section More apps and features coming soon!🔥"}, {"post_id": 41836, "ts": "2026-08-06T09:25:46Z", "hours": 1.5522, "text": "Worked on the menu app UI. It’s not fully functional yet, but I’ve added some basic functionality. I think it’s looking pretty good so far. This isn’t the final version, but the overall design will probably stay pretty close to this."}, {"post_id": 41800, "ts": "2026-08-06T07:15:41Z", "hours": 4.815, "text": "Worked on the icon styling and UI, and implemented the app menu with close functionality. What ended up taking most of my time was a tiny bug—I was referencing a value as a string in one place while providing it as an object in another. It took me hours to spot the mismatch. Funny how the smallest errors can consume the most time."}, {"post_id": 40844, "ts": "2026-08-04T17:03:57Z", "hours": 3.7994, "text": "I’ve been working on the app’s UI in the maximized state. Initially, the main challenges were around the overall workflow and approach. After experimenting with a few different directions, everything clicked and I landed on this design. Next, I’ll be refining the icon styles further."}, {"post_id": 40140, "ts": "2026-08-03T15:22:36Z", "hours": 4.1178, "text": "I updated the minimize/maximize buttons so restored windows remember their previous position via the global store. Minimized apps now show a dot indicator at the bottom instead of the top. I also fixed a topbar bug where its z-index and absolute positioning caused maximized windows to get stuck underneath. My main hurdle right now is UI scaling: the window container maximizes fine, but the internal components don’t resize with it. I’m weighing a few fixes to see which approach works best."}, {"post_id": 39349, "ts": "2026-08-02T08:39:42Z", "hours": 0.9731, "text": "Just fixed the README"}, {"post_id": 38957, "ts": "2026-08-01T16:01:53Z", "hours": 2.0964, "text": "Implemented minimize and restore with functionality and the maximize feat will be implemented in the 2nd version.."}, {"post_id": 38729, "ts": "2026-08-01T08:51:37Z", "hours": 1.1942, "text": "Fixed the README and got it ready for the first official launch. The main issue was that the images and screenshots weren’t displaying correctly. Since it was a GitHub README, every small change required a commit and push just to verify whether the images loaded properly, which made the process slower than expected. Despite that, the final README turned out well and is now ready for launch."}, {"post_id": 38361, "ts": "2026-07-31T18:19:40Z", "hours": 3.6125, "text": "Added a notes app and added loading and welcome page .. Creating the logo was a bit hard :< More feats and apps are coming!!"}, {"post_id": 38107, "ts": "2026-07-31T10:07:15Z", "hours": 3.5414, "text": "Worked on the icons bar and added a new feature to the Settings app — you can now switch icon styles. Also saved wallpaper, brightness, and icon styles to localStorage . Biggest challenges were digging through a massive icon file, organising them, and getting the UI right. At one point the icons just wouldn’t change… turns out I forgot to call the function. 😅 Moving on to more features and apps."}, {"post_id": 37465, "ts": "2026-07-30T07:17:09Z", "hours": 1.4686, "text": "Updated the app icons — they look so much better now. The old ones felt a bit off. Funny disaster though: right after the change, nothing would open. Threw in some console.log()s … and the system crashed. Turns out the old icon was still being called in the main code, which made every window try to open. 😂"}, {"post_id": 37085, "ts": "2026-07-29T15:46:45Z", "hours": 2.3036, "text": "Very small visible change this time. Added functionality to the settings sidebar . Yeah thinking bout the architecture!! I did added different colors to my app background then removed it due to change in the architecture. Working on something which looks like a small change 🥲 but needs a solid time and architecture 🫠 😮💨."}, {"post_id": 36496, "ts": "2026-07-28T17:20:36Z", "hours": 2.3367, "text": "Nothing!! Just refactored the UI of the Settings app. Added a side bar with the search bar. The main headache was the Architecture !! Damn!! My head hurts !! Still moving on. I will update the full functionality of settings app next time !! (That’s my goal) . But yeah will add the other features later as the OS grows."}, {"post_id": 36275, "ts": "2026-07-28T08:28:19Z", "hours": 1.7669, "text": "Just dropped a fresh update for my web OS, Kobayashi OS ! It can now fully customize the desktop’s wallpaper with solid colors and gradients , all powered by a global store so everything stays smooth and in sync. And Yo!! not gonna lie, building this took me on a absolute emotional roller coaster. I hit bug after bug, spent ages searching for answers, only to discover the culprits were… simple typos and missed JavaScript punctuation!! Classic! But hey, every bug fixed is a lesson learned. I’m on a roll , so expect more updates super soon! Next up on the build list: making the Settings app feel like a real-deal OS and dropping some brand-new apps."}, {"post_id": 35678, "ts": "2026-07-27T08:43:11Z", "hours": 2.6417, "text": "I recently refactored our z-index management from local storage to a global system. Naturally, it brought a wave of visual bugs along with it—fix one, and four more pop up!After a solid debugging session with console.log(), everything is stable and working as expected. Next up: building out the Settings app to make it fully functional."}, {"post_id": 34138, "ts": "2026-07-24T17:18:12Z", "hours": 1.5758, "text": "Cleaned up the codebase, fixed a minor bug, and finally built a manual wallpaper changer. Decided to use global state for it and… wow. It actually clicked. I was stuck for a minute overthinking how the workflow should look, but once I just started typing, it made total sense. State management isn’t nearly as painful as I used to think. Naturally, it didn’t work on the first try—the wallpaper wasn’t updating at all. Turns out I forgot a set of parentheses and had a stupid typo. Classic. Fixed that, and now it’s smooth sailing."}, {"post_id": 33969, "ts": "2026-07-24T10:18:51Z", "hours": 2.7989, "text": "I started moving my app state from local state to a global store using Zustand. Right now, the open/close state of applications is managed globally, and next I’ll move the window dragging logic there as well. The dragging system already works locally, so this is mostly a refactor to make the OS easier to scale.I also added a Settings app, although it doesn’t do anything yet. I decided to focus on getting the core OS functionality solid before adding more features and applications. Once that’s done, I’ll add things like manually changeable wallpapers and expand the Settings app. As someone who’s still new to state management, I had no idea how to use a global store when I started. So before writing code, I spent time learning Zustand, understanding how global state works, and planning the architecture instead of jumping straight into implementation.There were plenty of moments where I got stuck. I had a few headaches trying to wrap my head around the concepts, but I kept going until it finally clicked. No big visual changes, but I think I crossed a small milestone—one that’s going to make everything I build next much cleaner and easier to manage."}, {"post_id": 31816, "ts": "2026-07-20T14:35:36Z", "hours": 1.2033, "text": "Fixed a sneaky LocalStorage bug today! 🛠️ I initially put JSON.stringify directly inside useState , which completely crashed the app and prevented it from opening. Rewrote the logic by moving JSON.stringify into a useEffect hook with tasks as a dependency. That got it working, but refreshing the page triggered a new bug: local storage was getting overwritten with an empty array. I logged the data flow at every stage and caught the issue: useEffect was running on initial mount before state was restored. Added a simple length check (tasks.length > 0) before stringifying, and everything works perfectly now! Always check your mount cycles! 🚀"}, {"post_id": 31692, "ts": "2026-07-20T09:40:11Z", "hours": 6.9306, "text": "It’s been a while since my last update, so here is what I’ve been building and refining lately: UI Refactoring: Invested a significant amount of time redesigning and polishing the UI (still a work in progress, but looking much better!). Window Management: Added support for opening, minimizing, and closing windows. Calculator App: Cleaned up the codebase and added new functionality. Task Tracking: Added a strike-through feature for completed items in To-Dos App. Next up: Implementing localStorage so task completions and window states persist across sessions."}, {"post_id": 27792, "ts": "2026-07-13T17:37:49Z", "hours": 1.6667, "text": "Focus was the window manager. Completed Implemented dynamic z-index so the active window is always brought to the front. Added window minimization.Implemented restore functionality from the Apps Bar. Preserved window state while minimized instead of closing the application. Challenge: Initially, minimizing a window removed it from the UI, but there was no way to bring it back because clicking the app icon simply ignored already opened apps. Solution: Instead of treating minimized windows as closed, I introduced a minimized state for each window. The Apps Bar now checks whether an app is already open, minimized, or closed, and performs the appropriate action—open, restore, or bring it to the front. This keeps the component mounted and preserves its state while hidden. The desktop now supports opening, closing, dragging, minimizing, restoring, and proper window stacking. With these core interactions in place, the next milestone is maximize/restore, followed by window resizing and a global state refactor with Zustand."}, {"post_id": 27668, "ts": "2026-07-13T13:16:12Z", "hours": 2.5236, "text": "Continued building the window management system for Kobayashi OS. Implemented draggable application windows from scratch using React mouse events (mousedown, mousemove, mouseup) with proper drag offsets for smooth movement. Refactored the layout to introduce a dedicated desktop area, keeping windows constrained within the workspace instead of the entire page. Spent most of the session debugging positioning logic, DOM measurements, and boundary constraints. The draggable window system is now functional and forms the foundation for upcoming features like minimize, maximize, focus (z-index), and Zustand-powered window state management."}, {"post_id": 27273, "ts": "2026-07-12T18:23:14Z", "hours": 1.3567, "text": "Continued refining the Kobayashi OS interface.Finalized the built-in app icons and continued shaping the application dock and overall desktop structure to make the OS feel more like a complete desktop environment.Built the first built-in application—a basic calculator—with support for standard arithmetic operations. This marks the beginning of adding functional utilities to the OS.The focus remains on establishing a solid foundation before expanding into more advanced applications and features."}, {"post_id": 27129, "ts": "2026-07-12T12:31:10Z", "hours": 1.3028, "text": "Continued working on the Kobayashi OS layout. The overall design is still evolving, and I’m experimenting with different arrangements before settling on a final structure. I added icons for the built-in applications and started shaping how the interface should feel. No application logic yet—right now the focus is on finding the right layout before building the functionality."}, {"post_id": 27073, "ts": "2026-07-12T09:23:01Z", "hours": 1.6333, "text": "DevDock is no longer just a collection of developer tools—it’s being redesigned into Kobayashi OS , a browser-based operating system built for developers . This update focuses on restructuring the application’s architecture, replacing the original layout with an OS-inspired interface, and laying the groundwork for applications, tools, and a desktop-like workflow. The goal is to create a cohesive environment where developer utilities feel like native applications rather than separate web pages.The transition is still in progress, but the foundation for Kobayashi OS is now replacing the original DevDock vision."}, {"post_id": 25205, "ts": "2026-07-09T09:44:08Z", "hours": 3.5269, "text": "DevLog 1 — DevDock After wrapping up DevScope, I wanted to build something that solves a problem. Introducing DevDock — a workspace that brings essential developer tools together in one place, reducing context switching and making common development tasks faster and more convenient.I’ve already finished the initial landing page. It took far more CSS work than I’m used to, but I’m happy with where it stands for now. Of course, nothing is ever truly finished—I’ll keep refining it if future feedback or better ideas come up.This is only the beginning. The real work starts now as I begin building the tools that will make DevDock genuinely useful."}]...
|
Title: Kobayashi OS by @Riko | Stardance
Devlogs: Title: Kobayashi OS by @Riko | Stardance
Devlogs:
DevLog 1 — DevDock After wrapping up DevScope, I wanted to build something that solves a problem. Introducing DevDock — a workspace that brings essential developer tools together in one place, reducing context switching and making common development tasks faster and more convenient.I’ve already finished the initial landing page. It took far more CSS work than I’m used to, but I’m happy with where it stands for now. Of course, nothing is ever truly finished—I’ll keep refining it if future feedback or better ideas come up.This is only the beginning. The real work starts now as I begin building the tools that will make DevDock genuinely useful.
DevDock is no longer just a collection of developer tools—it’s being redesigned into Kobayashi OS , a browser-based operating system built for developers . This update focuses on restructuring the application’s architecture, replacing the original layout with an OS-inspired interface, and laying the groundwork for applications, tools, and a desktop-like workflow. The goal is to create a cohesive environment where developer utilities feel like native applications rather than separate web pages.The transition is still in progress, but the foundation for Kobayashi OS is now replacing the original DevDock vision.
Continued working on the Kobayashi OS layout. The overall design is still evolving, and I’m experimenting with different arrangements before settling on a final structure. I added icons for the built-in applications and started shaping how the interface should feel. No application logic yet—right now the focus is on finding the right layout before building the functionality.
Continued refining the Kobayashi OS interface.Finalized the built-in app icons and continued shaping the application dock and overall desktop structure to make the OS feel more like a complete desktop environment.Built the first built-in application—a basic calculator—with support for standard arithmetic operations. This marks the beginning of adding functional utilities to the OS.The focus remains on establishing a solid foundation before expanding into more advanced applications and features.
Continued building the window management system for Kobayashi OS. Implemented draggable application windows from scratch using React mouse events (mousedown, mousemove, mouseup) with proper drag offsets for smooth movement. Refactored the layout to introduce a dedicated desktop area, keeping windows constrained within the workspace instead of the entire page. Spent most of the session debugging positioning logic, DOM measurements, and boundary constraints. The draggable window system is now functional and forms the foundation for upcoming features like minimize, maximize, focus (z-index), and Zustand-powered window state management.
Focus was the window manager. Completed Implemented dynamic z-index so the active window is always brought to the front. Added window minimization.Implemented restore functionality from the Apps Bar. Preserved window state while minimized instead of closing the application. Challenge: Initially, minimizing a window removed it from the UI, but there was no way to bring it back because clicking the app icon simply ignored already opened apps. Solution: Instead of treating minimized windows as closed, I introduced a minimized state for each window. The Apps Bar now checks whether an app is already open, minimized, or closed, and performs the appropriate action—open, restore, or bring it to the front. This keeps the component mounted and preserves its state while hidden. The desktop now supports opening, closing, dragging, minimizing, restoring, and proper window stacking. With these core interactions in place, the next milestone is maximize/restore, followed by window resizing and a global state refactor with Zustand.
It’s been a while since my last update, so here is what I’ve been building and refining lately: UI Refactoring: Invested a significant amount of time redesigning and polishing the UI (still a work in progress, but looking much better!). Window Management: Added support for opening, minimizing, and closing windows. Calculator App: Cleaned up the codebase and added new functionality. Task Tracking: Added a strike-through feature for completed items in To-Dos App. Next up: Implementing localStorage so task completions and window states persist across sessions.
Fixed a sneaky LocalStorage bug today! 🛠️ I initially put JSON.stringify directly inside useState , which completely crashed the app and prevented it from opening. Rewrote the logic by moving JSON.stringify into a useEffect hook with tasks as a dependency. That got it working, but refreshing the page triggered a new bug: local storage was getting overwritten with an empty array. I logged the data flow at every stage and caught the issue: useEffect was running on initial mount before state was restored. Added a simple length check (tasks.length > 0) before stringifying, and everything works perfectly now! Always check your mount cycles! 🚀
I started moving my app state from local state to a global store using Zustand. Right now, the open/close state of applications is managed globally, and next I’ll move the window dragging logic there as well. The dragging system already works locally, so this is mostly a refactor to make the OS easier to scale.I also added a Settings app, although it doesn’t do anything yet. I decided to focus on getting the core OS functionality solid before adding more features and applications. Once that’s done, I’ll add things like manually changeable wallpapers and expand the Settings app. As someone who’s still new to state management, I had no idea how to use a global store when I started. So before writing code, I spent time learning Zustand, understanding how global state works, and planning the architecture instead of jumping straight into implementation.There were plenty of moments where I got stuck. I had a few headaches trying to wrap my head around the concepts, but I kept going until it finally clicked. No big visual changes, but I think I crossed a small milestone—one that’s going to make everything I build next much cleaner and easier to manage.
Cleaned up the codebase, fixed a minor bug, and finally built a manual wallpaper changer. Decided to use global state for it and… wow. It actually clicked. I was stuck for a minute overthinking how the workflow should look, but once I just started typing, it made total sense. State management isn’t nearly as painful as I used to think. Naturally, it didn’t work on the first try—the wallpaper wasn’t updating at all. Turns out I forgot a set of parentheses and had a stupid typo. Classic. Fixed that, and now it’s smooth sailing.
I recently refactored our z-index management from local storage to a global system. Naturally, it brought a wave of visual bugs along with it—fix one, and four more pop up!After a solid debugging session with console.log(), everything is stable and working as expected. Next up: building out the Settings app to make it fully functional.
Just dropped a fresh update for my web OS, Kobayashi OS ! It can now fully customize the desktop’s wallpaper with solid colors and gradients , all powered by a global store so everything stays smooth and in sync. And Yo!! not gonna lie, building this took me on a absolute emotional roller coaster. I hit bug after bug, spent ages searching for answers, only to discover the culprits were… simple typos and missed JavaScript punctuation!! Classic! But hey, every bug fixed is a lesson learned. I’m on a roll , so expect more updates super soon! Next up on the build list: making the Settings app feel like a real-deal OS and dropping some brand-new apps.
Nothing!! Just refactored the UI of the Settings app. Added a side bar with the search bar. The main headache was the Architecture !! Damn!! My head hurts !! Still moving on. I will update the full functionality of settings app next time !! (That’s my goal) . But yeah will add the other features later as the OS grows.
Very small visible change this time. Added functionality to the settings sidebar . Yeah thinking bout the architecture!! I did added different colors to my app background then removed it due to change in the architecture. Working on something which looks like a small change 🥲 but needs a solid time and architecture 🫠 😮💨.
Updated the app icons — they look so much better now. The old ones felt a bit off. Funny disaster though: right after the change, nothing would open. Threw in some console.log()s … and the system crashed. Turns out the old icon was still being called in the main code, which made every window try to open. 😂
Worked on the icons bar and added a new feature to the Settings app — you can now switch icon styles. Also saved wallpaper, brightness, and icon styles to localStorage . Biggest challenges were digging through a massive icon file, organising them, and getting the UI right. At one point the icons just wouldn’t change… turns out I forgot to call the function. 😅 Moving on to more features and apps.
Added a notes app and added loading and welcome page .. Creating the logo was a bit hard :< More feats and apps are coming!!
Fixed the README and got it ready for the first official launch. The main issue was that the images and screenshots weren’t displaying correctly. Since it was a GitHub README, every small change required a commit and push just to verify whether the images loaded properly, which made the process slower than expected. Despite that, the final README turned out well and is now ready for launch.
Implemented minimize and restore with functionality and the maximize feat will be implemented in the 2nd version..
Just fixed the README
I updated the minimize/maximize buttons so restored windows remember their previous position via the global store. Minimized apps now show a dot indicator at the bottom instead of the top. I also fixed a topbar bug where its z-index and absolute positioning caused maximized windows to get stuck underneath. My main hurdle right now is UI scaling: the window container maximizes fine, but the internal components don’t resize with it. I’m weighing a few fixes to see which approach works best.
I’ve been working on the app’s UI in the maximized state. Initially, the main challenges were around the overall workflow and approach. After experimenting with a few different directions, everything clicked and I landed on this design. Next, I’ll be refining the icon styles further.
Worked on the icon styling and UI, and implemented the app menu with close functionality. What ended up taking most of my time was a tiny bug—I was referencing a value as a string in one place while providing it as an object in another. It took me hours to spot the mismatch. Funny how the smallest errors can consume the most time.
Worked on the menu app UI. It’s not fully functional yet, but I’ve added some basic functionality. I think it’s looking pretty good so far. This isn’t the final version, but the overall design will probably stay pretty close to this.
It’s been a while since my last update, but I’m happy to say Kobayashi OS is getting closer to the finish line! 🚀 Update: Added a toggle to open/close the Menu app Improved the Settings & overall UI Added app resizing App bar now hides when the screen is maximized Added a background for active page in settings Changed the About us Section More apps and features coming soon!🔥
Gallery is successfully made! Glad it turned out well. The main challenge was the UI 🙄, but yeah, it now has Next/Previous and Back functionality. The selected image expands to the full width and height—just like we see in a proper gallery, without appearing in some corner or another section. Overall, pretty happy with how it turned out!
I worked on improving the app bar behavior in Kobayashi OS. I added the Menu app icon to the apps bar whenever it’s opened, and also implemented position shifting for existing apps so they adjust automatically when a new app appears. Small interaction improvements, but they make the desktop feel more dynamic and consistent.
Been a while! Added a working camera + gallery and implemented IndexedDB for storing captured photos.Honestly, the camera logic and IndexedDB were the biggest challenges since I knew nothing about them before this. Learned from internet resources, experimented, broke things, fixed them… and finally cracked it.
Camera Improvements Fixed a few bugs and made some nice improvements to the camera flow. Now, the last captured photo is shown directly in the camera. Tap it, and the gallery opens with the image displayed at full width and height. From there, you can swipe through the rest of your photos. Still have a few things I want to tweak in this flow, but the experience is already feeling much smoother. Next up: widgets !!
Yahooooooo! Made some awesome progress! Added the Widgets feature Added a toggle function to open/close the Widgets list Added a Calendar widget Added a Clock widget Added toggle functionality for opening and closing widgets So happy to see it all coming together! 😄 🔥One step at a time, and the project is getting better and better! ✨ 💪
A little update on the Widgets section It’s already looking pretty cool , but I’m not quite done with it yet. There are still a few tweaks and some changes I want to make to how the widget system works under the hood. The goal is to make the whole experience feel cleaner, more flexible, and easier to build on as I keep adding more widgets. For now, though… I’m pretty happy with how it’s coming together. 🚀More tweaks incoming.
Update Made a few solid improvements to the widget experience: Widget positions are now stored globally and persisted in local storage, so the app restores exactly where you left it after a refresh. Tweaked the visuals for a cleaner, more polished look. Added resizable widgets for a more flexible, customizable layout. Small changes, but they make the overall experience feel much smoother. More to come!
Spent some more time working on the Widgets section 👀 Made the widgets draggable and closable only when the widgets menu the widgets top bar is being displayed.Also fixed up some CSS issues, added a right-click context menu, and added an Open option. So far, only one widget is actually openable; the rest will come later 😅 That’s enough UI work for today though — my shoulders and back are officially protesting. 💀 More to come!
Today was more focused on research and architecture than coding, but I still made some solid progress. I perfected the widgets, made the right-click menu fully functional, and built a basic music player that’s already working. I’ll be focusing on the CSS and visual polish for the music player tomorrow. Overall, another productive day on Kobayashi OS.
Worked on the adding more apps.. with functionality and zero css hehe but yeah add it later currently working on a ai chat box on my project apps
BIG ALERT IN KOBAYASHI OS I SUCCESSFULLY BUILT AN AI ASSISTANT FOR MY WEB OS! 🎉 It can actually understand commands and interact with the OS — opening apps, handling actions, and more.Another huge step for Kobayashi OS. I’m learning a LOT about AI while building this, and it’s honestly crazy seeing everything come together.
Making the UI of music player nicer ..
Damn !! Been a while !! Yup was working on the assistant.. yeah which actually works!!! changed the architecture of ai chatbot and yeah its much better now !! and Yeah some more tweaks ongoing
Another day on Kobayashi OS. Damn, I really turned the AI Assistant into what I actually wanted it to be. And yeah, now the Shorts app isn’t just some mere app with a icon sitting there — it actually has Shorts embedded hehe. And yeah… there’s a Kanvas app now too lol.
Added a lots of appppss!!! embeded few games, hackclub and typingtest.com … and Yeah added my own built apps (Json Lab , DevScope, and MoneyTrail)
Damnn!! Been a while haven’t posted anything bout my Work!!!!!! added a piano added a lots of Fun games improved the architecture and UI/UX improved the response of the Kobai added Terminal and Code editor.. added a proper and nice widget system changed the whole UI of my apps_ and more features are coming soon!!!!!
Kobayashi-chan is here! Chat, open apps, change settings. She remembers, reacts, and doesn’t mind a little flirting. :) Major changes!! A summary of everything I’ve done over the past 5 days. Lots of design work too—especially Figma stuff. StarDance doesn’t log my Figma hours though… too bad.
Polished the UI of the widgets, improved wallpaper customization, refined the app UX, resized the apps, added a bunch of new features, and made countless small tweaks across the OS. A lot has gone into this project, and I really hope it becomes the star project considering how much time I’ve poured into it. 🥹 Still more to come!
Ships:
Kobayashi OS v1.0 is finally live! Kobayashi OS is a lightweight, anime-inspired Web Operating System built to bring a desktop-like experience to the browser. This first release focuses on a smooth window management system, allowing multiple instances of the same application, along with wallpaper, icon, and brightness customization. It uses React, TypeScript, Bun, Tailwind CSS, Zustand, and Local Storage to provide a persistent experience. The custom logo and launch banner were also designed specifically for this release. Some applications currently contain placeholder alerts and are still under development, with more features and apps planned for future updates. Highlights Anime-inspired light theme Interactive multi-window desktop Multiple instances of the same app Wallpaper, icon & brightness customization Zustand + Local Storage More apps and features coming soon
What did you make? Kobayashi OS — a web OS themed around Miss Kobayashi’s Dragon Maid . I wanted to make one of the most feature-rich and polished web OS experiences possible, something that actually feels like you’re using a PC. And yeah, this is Kobayashi’s PC, so don’t be surprised if you find something interesting related to her. The main thing I focused on was making everything feel connected, just like a real OS. Apps don’t just exist separately — Camera connects to Gallery and Files, downloads go into Files, Kanvas can save things to Files, widgets remember where you put them, and Kobayashi-chan can actually interact with the system. Basically, it’s not just a collection of apps. It’s one big little OS. What was challenging? Interconnecting all the apps and keeping everything persistent was definitely a challenge. I wanted things to behave like an actual OS instead of just being separate demos. Making the Kobayashi-chan AI work was one of the toughest hurdles. Getting tool calling, memory, emotions, and system interaction to work together took a lot of trial and error. Designing and building the widget system was another tough one. Making widgets draggable, positionable, persistent, and actually useful took quite a bit of work. Honestly, getting all the small details and polish right took way more time than I expected. What am I proud of? First — Kobayashi-chan AI. This is probably my favorite part of the whole project. She has tool calling, memory, emotions, and can actually interact with the OS. I genuinely didn’t expect I would be able to make something like this. It’s basically a little Jarvis, but Kobayashi-chan. The piano. I spent way more time on this than I probably should have. Not building it — playing it. It’s such a stupidly fun little feature that I keep losing track of time playing on it. The overall polish. I’ve been working on this for so long that I’ve honestly lost count of all the little things I added. I designed the UI in Figma, made a lot of the icons myself, kept redesigning things, learned a ridiculous amount along the way, and kept adding small details until it finally started feeling like a real OS. I’m genuinely proud of how it turned out. There are a lot of things packed into this project, and I think the best way to understand the amount of work that went into it is to actually explore it yourself. What should you know before testing? The project: https://kobayashi.cawai.site/ Please explore the widgets. This is one of the parts I spent a lot of time on. Please try the piano. Seriously. On the first load, some images may take 1–2 seconds to appear. Give it a moment. Wallpaper customization, live wallpapers, and icon customization may also take a little time on the first load. There are a LOT of games: Thor, Spider-Man, Minecraft, etc. If you open one and see a black screen, don’t panic. Some of them just take a little while to load. Come on, we’re talking about Minecraft here. Give it some time. And obviously, click around. Open things. Break things. Try stuff. A lot of the fun is finding the little details hidden around the OS. That’s Kobayashi OS. I started with the idea of making a web OS, but somewhere along the way it turned into this huge little world with its own apps, games, music, memories, AI, and way too many tiny details. Hope you have fun exploring it....
|
1792878436.301216
|
1793742436.301216
|
|
30453
|
slate by @swedishsplidney | Stardance
|
swedishsplidney
|
0
|
150.35
|
0
|
[]
|
[{"post_id": 73395, "ts": "202 [{"post_id": 73395, "ts": "2026-09-25T01:57:08Z", "hours": 8.295, "text": "shadows this one is really cool, i feel like it really takes it from looking like its from 1995 to like… 2015 maybe? it doesnt look that good but i think its a massive improvement! right now, its a 4096x4096 shadowmap with an extent of 24 units, a random noise filter to reduce pixelation, and 3x3 pcf to make it look somewhat smooth it is currently orthographic light projection only, but I think i’ll work on getting perspective lighting soon :) shadows did reqire implementing a whole new imageview, descriptor set, render pass, all that, but i’m getting used to it atp lol serialization is also completely broken right now, so I do need to fix that…"}, {"post_id": 67098, "ts": "2026-09-13T04:51:35Z", "hours": 7.6267, "text": "texture loading!!! absolute yipee moment this took like a lot of thinking to figure out how to implement for reasons that i think are obvious, but some of them are: how tf do you load an image what does the loaded image data mean how do you map the texture to the model’s uv coords how does normal mapping work how does the shader know where on the image its reading and a lot more that i prolly forgot lol this whole thing basically meant a whole shader overhaul again (even though i alr did that last devlog but its whatever loll) you can now map albedo (color), normal (height/offset), orm (occlusion, roughness, metallic), and emmision (glowiness) emission only kind of works rn lol, but i will get to it soon also, you currently have to manually set filepaths to the textures you want in the .json sidecar for that model, i need to add filepicker stuff to the inspector but i will get to it ok the textures in the video below were manually baked, packed, etc at 4096*4096 in blender i think another feature i should work on soon is procedural material generating, because texture mapping will always have a resolution limit (even 4k textures look kinda bad when mapped to larger models) i also want to change how reflections work a little bit, or maybe add anti-aliasing because right now the reflections look deep fried (as you will see in the video below)"}, {"post_id": 65721, "ts": "2026-09-11T02:04:30Z", "hours": 7.1881, "text": "shader overhaul so i noticed that the pbr shader lowkey looked kinda ugly and my microfacet solver was buns af so i js spent a while fixing it up and basically ended up going down a rabbit hole of tonemapping and completely rewrote the whole thing i switched from some random generic tonemapping to khronos standard neutral pbr mapping, which i think looks wayyyyyy better, the colors actually feel accurate now i also spent a little while setting up the shader to support texture colors when i get that all working it is wayyy better now, especially metallic things i also started setting up for texture imports but right now its only albedo and it does NOT work in the slightest lmao i think i will hopefully have texture importing and mapping done by next devlog, but uhhhhh…. no promises"}, {"post_id": 63897, "ts": "2026-09-07T22:41:08Z", "hours": 8.7083, "text": "physics aaaaaaaaaaaaaaaaa it works concerningly well and it actually makes me really happy to see it working i legit jumped for joy when i first saw stuff dropping due to gravity the actual underlying physics engine is jolt physics, but all the init and handling and all that is custom from me its all linked to the inspector and allat, so you can tweak values real time, such as body type, bounciness, friction, and mass its now a physics playground instead of just a glorified obj viewer scaling is very broken as far as colliders go, ill probably fix that soon you can start and stop the physics sim with f5"}, {"post_id": 62615, "ts": "2026-09-06T02:39:32Z", "hours": 5.9828, "text": "working scene serialization (saving) if you hit ctrl + s (or hit the gui button) then it creates a .slate file, containing all the data of every object in the scene this .slate file is human readable (and editable), written in a format very similar to toml heres an example .slate file: [ scene ] name = \"SlateScene\" version = \"1.0\" [[ entity ]] index = 0 name = \"\" mesh_path = \"models/test_obj.obj\" position = [ -0.310723 , 0.927019 , 1.47743 ] rotation = [ 0 , -0 , 0 ] scale = [ 1.9916 , 2.28848 , 3.38984 ] [ entity . material ] albedo = [ 0.183333 , 1 , 0 , 1 ] roughness = 0.5 metallic = 1 ior = 1.5 transmission = 0 [[ entity ]] index = 1 name = \"\" mesh_path = \"models/emerald_monkey.obj\" position = [ 1.29034 , 0 , -5.64025e-08 ] rotation = [ 8.61461 , 6.18611 , 2.71029 ] scale = [ 3.07852 , 3.38535 , 3.86504 ] [ entity . material ] albedo = [ 0.050432 , 0.800023 , 0.302281 , 1 ] roughness = 0 metallic = 0 ior = 2.418 transmission = 1 next, ill probably start working on physics"}, {"post_id": 61285, "ts": "2026-09-04T04:09:23Z", "hours": 8.2292, "text": "scene serialization okay so this is akward but it doesnt actually work yet, but in my defense serialization is really confusing to me since i generally don’t do a whole lot with file writing and loading, especially in a custom formatted and extensioned .slate file it basically just takes a bunch of data by looping through scene objects and records them, then it also has to do that backwards, then i also have to implement a command and gui system to trigger the logic and i also want the .slate to be easily readable, so i need to format the text in a way that makes sense (i’m taking inspiration from TOML) hopefully its done next devlog, but no promises lol"}, {"post_id": 59368, "ts": "2026-09-01T04:03:06Z", "hours": 8.3792, "text": "color picking! i noticed that setting color in the inspector with 3 rgb values was really annoying, so i made a whole new ui class ( ui_color_picker.hpp/cpp ), that can hook into any other ui it supports: S/B box + hue bar RGB input CMYK input (mildly broken) hex input (very broken) it actually works pretty well, there is some bug where an object can never be fully white but i think thats a command issue not color picker or inspector next, it might be time to work on physics"}, {"post_id": 58306, "ts": "2026-08-30T17:59:13Z", "hours": 8.5094, "text": "bugfixes and writing docs i spent a good 4 hours just going through some code, finding anything that might be wrong and fixing them. surprisingly, i didnt find that much, which means that i’m better at coding than i thought i found a few places where i just forgot to add something to a cleanup function, which could have led to a small memory leak over time, but nothing major some bugs i fixed: the background of any dropdown menu was rendering behind the viewport selecting stuff in the hierarchy wouldnt sync with the inspector properly i forgot to add screenPointToRay to my cleanup function some other things that i forgot i also added a few std::couts in some spots that needed them i also decided to start writing some docs because my brain was fried i basically just dug through my ~3000 lines of vulkan init and rendering code, and took notes throughout and tried explaining my confusing mental processes in a .md file this kinda made me realize that i do not have enough annotation in my code but thats a problem for future me :)"}, {"post_id": 56986, "ts": "2026-08-29T01:24:41Z", "hours": 8.5281, "text": "hierarchy panel and scrolling the hierarchy panel itself was actually not that hard, the hard part was coming up with a reliable system that can detect and list every object currently loaded in the scene without turning your pc into an explosive the other hard part was modifying the dockspace layout to be able to handle multiple different panels, because previously, it was just one window per dockspace panel, but now it can be as many as you want also, the scrolling system is new, it is its own class ui_scrollable_container , and it is basically doing what the dockspace used to do, but it also lets you scroll. so now, the dockspace just loads a scrollable container, and the scrollable container does all the arrangement and sizing logic. the hierarchy works exactly as you would expect it to, it lists current scene objects and then you can select them from it eventually, ill prolly add support for parenting, which should be pretty easy its kinda crazy to see my custom persistent ui system slowly turn into something useful as i add more features to it so far ive just been adding features when i need them, i havent just thought of features i might need and added all of them"}, {"post_id": 55367, "ts": "2026-08-27T04:34:36Z", "hours": 8.7392, "text": "inspector updates and dropdowns the inspector now has IOR and transmission values that you can change, ui updates, and dropdowns this took literally like 45 epochs because i was running into a materialgpu indexing issue where the inspector boxes would update the wrong values and my peanut brain didnt even think to check if i set the indices correctly dropdowns also took a good 3-4 hours, but it wasnt too bad, mostly just figuring out the correct logic in total, the dropdown class (ui_dropdown.cpp/hpp) is at 169 lines, and the inspector class (ui_inspector_panel.cpp/hpp) is at 470 lines next, i think ill either work on ui rounding or a file hierarchy viewer"}, {"post_id": 52171, "ts": "2026-08-22T08:13:19Z", "hours": 8.115, "text": "ui inspector the inspector is by no means done, but its a start! right now its just supposed to be purely functional, but i plan on making it look better in the future the input boxes are their own ui class, meaning i can have those input boxes everywhere making the ui system from scratch is very fun, but it at times i do regret not using qml or im gui, but overall, i dont regret making it from scratch too much the main issues with it right now is that the sensitivity values in the input boxes feel wrong, i think the position needs less sensitivity and the rotation needs more also, the color ones are a bit broken, theres a little bit of discrepancy between what the ui shows and what the actual .json material sidecar has written, so i’ll have to figure out how to fix that i think at some point, i want to add support for dropdowns, so each row can be expanded into larger input boxes if needed, or so the entire transform or material section can be collapsed i also need to add input boxes for IOR and transmission, i jus forgot to do that lol, should be pretty easy tho"}, {"post_id": 49355, "ts": "2026-08-18T04:12:43Z", "hours": 5.6403, "text": "rotation gizmo, multi-object support you can now switch between the translation gizmo, and the rotation gizmo, and click between objects to change what one has the gizmo active the gizmo also stays locked to the selected meshes’ local axes, i might add switching between local and global axis orientation at some point, but for right now local only is good enough all of the gizmo mesh is generated from code, not as an obj, making it very efficient and fast and robust, but making the logic that generates vertices in the right position was very annoying lol next, ill probably work on an inspector panel where you can edit an object’s location, rotation, scale, material data, etc or maybe saving the scene to file but now you can move and rotate any amount of objects to your heart’s content"}, {"post_id": 47420, "ts": "2026-08-15T10:46:06Z", "hours": 9.2511, "text": "translation gizmo this was like miserable to make lol it took me sooooooo long to get translation working, basically i had this samurai battle with a scaling issue for the longest time, i accidentally told my code that the viewport was smaller than it actually was and it just took forever to find that out this issue caused a really annoying issue where the actual location of the rendered gizmo was different than the clickable area there was also this other issue where the gizmo would move twice the speed of the mesh it was translating, but it was just a flaw with the mesh class, the gizmo was basically constantly recieving its own center as well as the meshes’ center which made it translate double but it works now, i think it works pretty well its all based off of the modular command system, so anything can call translatemeshcommand and it translate meshes next is prolly working on rotate and scale and stuff, all the other gizmos that we need the gizmos also meant a new .vert and .frag pair, and a whole new vulkan render pipeline lol"}, {"post_id": 43684, "ts": "2026-08-09T02:47:19Z", "hours": 9.0197, "text": "grid generation this took forever, and was much harder than i expected basically, i needed to create a whole new rendering pipeline and a whole new glsl shader pair, as well as coming up with logic so the triangle-focused renderer can actually render some super thin infinite lines the grid does generate dynamically around the camera view, so it is endless i think it does look pretty good tho next, ill prolly work on adding some move and rotation and maybe even scale tools"}, {"post_id": 37279, "ts": "2026-07-29T21:25:56Z", "hours": 9.8689, "text": "mesh importing and refraction ima start off by saying that this isn’t true refraction, since that requires path tracing, which is really computationally intensive instead, i went with screen space refraction offset approximation , which is a good, efficient refraction approximator that i still think looks pretty cool material data for refraction the value that determines the transparency of an object is called transmission , and the value for refraction is index of refraction (or IOR) the current filesystem for materials that i have is .mtl files, because thats the standard filetype for exporting materials with objs from programs like blender. however, .mtl is a filesystem from the 1990s that was originally created for phong systems, meaning it doesnt really contain transmission values so, i created a json sidecar system, that generates a better, more robust, human readable material file for every model. so now, when you import an obj/mtl pair: it checks for a json sidecar file if there is one already, just load from that and finish! if there isn’t one already, now read the .mtl, extract as much info as you can from that, and write it to a new json file multi pass rendering in order to correctly render transparent meshes, you need at least 2 render passes (render the opaque ones first, then the transparent ones) also, for the refraction to work, it needs an image of everything behind it, so in between the opaque and transparent pass, it quickly copies everything on the screen to an offscreen framebuffer how the refraction works 1. get the view vector (v): this one’s simple, just evaluate the view direction from the fragment position to the camera position also, adjust the normal (n) if rendering backface 2. refraction vector (snell’s law): the refraction vector is actually easy too, glsl has a built in refract intrinsic so you just drive that with a clamped ior value 3. deviation mapping: to determine how much to bend the background scene texture, just calculate the deviation vector between the refracted ray and the view ray: vec3 rayDeviation = refractDir - (- V ); vec2 distortion = ( push . viewProjMatrix * vec4 ( rayDeviation , 0.0 )). xy * 0.05 * transmission ; 4. uv sampling + composite blending offset the screen coordinates, but in order to prevent the edges from exploding, it needs to be clamped also, sample the background buffer to blend lighting and make a fresnel rim other stuff i did: i also made a full custom persistent ui system (this took a while), and a command system, because hardcoding the ui to do stuff is bad so instead of the ui code directly running logic, clicking a button just sends a command to the command system this meant creating another render pass, meaning i’m up to 3 render passes per frame now the only command so far is file.import_mesh , which is also hooked into the ui (you can see in the video below)"}, {"post_id": 35648, "ts": "2026-07-27T07:01:43Z", "hours": 7.2731, "text": "pbr materials pbr math reflectance: this is the main equation that a cook-torrance pbr system, all the other equations lead back to this one at some point 𝐿𝑜(𝑝,𝜔𝑜) =𝐿𝑒(𝑝,𝜔𝑜) +∫Ω𝑓𝑟(𝑝,𝜔𝑖,𝜔𝑜)𝐿𝑖(𝑝,𝜔𝑖)(𝐧⋅𝜔𝑖)𝑑𝜔𝑖 this equation essentially just determines what light does after hitting a surface with specific parameters we approximate the integral with two different light interactions: diffuse (𝑘𝐷): any light that penetrates the surface, scatters internally, and re-emerges specular (𝑘𝑆): light that reflects directly off the micro-surface in the code itself, the total outgoing radiance ($L_o$) is calculated with: vec3 Lo = ( kD * albedo / PI + specular ) * radiance * NdotL ; cook-torrance brdf: the specular component is calculated using the cook-torrance microfacet brdf: ## 𝑓cook-torrance =𝐷⋅𝐺⋅𝐹 / 4(𝐍⋅𝐕)(𝐍⋅𝐋) where 𝐷, 𝐺, and 𝐹 represent: normal distribution (𝐷): the NDF statistical distribution calculates how many microfacets are aligned with the halfway vector ($𝐇=𝐕+𝐋 / abs(𝐕+𝐋)) 𝐷GGX(𝐍,𝐇,𝛼) = 𝛼^2 / 𝜋((𝐍⋅𝐇)2(𝛼2−1)+1)2 ```glsl float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH * NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / max(denom, 0.000001); } ``` geometry (𝐺): smiths schlick-ggx microfacets can cast shadows and obscure light from the camera too, so the geometry function calculates the self shading factor using smiths method: 𝐺(𝐍,𝐕,𝐋,𝑘) =𝐺1(𝐍,𝐕,𝑘) ⋅𝐺1(𝐍,𝐋,𝑘) where 𝑘 maps roughness for direct lighting using 𝑘 = (roughness+1)^2 / 8: ```glsl float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r * r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; } ``` fresnel equation (𝐹): fresnel-schlick approximation the fresnel factor calculates the percentage of light reflected versus absorbed based on the viewing angle (𝜃): 𝐹(𝜃,𝐹0) =𝐹0 +(1−𝐹0)(1−cos𝜃)^5 nonmetals reflect around 4% of light (𝐹0 =0.04), while metals (conductors) use their tinted base albedo color as 𝐹0: ```glsl vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); } // lower, inside main(): vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); ``` other stuff: a surface cant reflect more light than it recieves, so a simple equation is used to make sure this doesnt happen: ## 𝐤𝐃 =(1−𝐤𝐒) ⋅(1−metallic) right now, all the material data is pulled from a .mtl file i also added bindless ssbo storage so it doesnt explode when you have a lot of models next, i might keep working on the custom persistent ui system"}, {"post_id": 32732, "ts": "2026-07-22T02:20:30Z", "hours": 8.3064, "text": "custom obj file loading all of the obj loading is done using tinyobjloader , which is a popular header file that im using to get the raw vertex coords of any .obj file however, all tinyobj does is pass the raw vertex data to my code (technically it can do some basic triangulation, but thats not its main purpose so its not perfect) this means that any model with n-gons (complex polygons) will not work and will look super weird technically you can tell blender to explicitly triangulate a file when you export it, but i think that it should be able to take any obj that you can throw at it without needing external setup so i also added a popular header file called earcut , which at a basic level, just cuts any complex polygons into 3-vertex triangles (which my index pass and renderer accepts). this now means that it can load any custom obj file i want to add auto color loading (from the obj data) or texture loading next, or maybe work on the ui or add ambient occlusion"}, {"post_id": 25108, "ts": "2026-07-09T03:12:17Z", "hours": 6.5614, "text": "entered the 3rd dimension wasd movement made a whole separate Camera class (look at me keepin things organized ) this means that now the vulkan_renderer class has model, projection, view, and transform matrices: the model matrix tracks the transformations the view matrix essentially tracks where the camera is the projection matrix sets a perspective frustum in order to make things actually have perspective and not just be flat the lerping is also based on deltaTime, which means smooth movement no matter ur fps the mouse tracking is locked via SDL_SetWindowRelativeMouseMode , and can be unlocked with the escape key vertices and index buffers right now, the vertices are being set manually in my code… however, importing obj (and maybe gltf and stl) files is next on the feature list, i’m planning on using tinyobj all the geometry is indexed, which basically means that instead of wasting a ton of memory repeating data for 36 raw vertices, you can just define the 8 corner vertices, then use an index buffer pass to tell the gpu how to connect those 8 vertices into 12 triangles window resizing this was easy, basically just had to tell it to make new image views and framebuffers based on the current aspect ratio (w/h) when the size of the window changes so now, its a spinning cube in a resizeable window that you can move around with wasd"}, {"post_id": 22507, "ts": "2026-07-05T00:42:28Z", "hours": 6.1236, "text": "the window opens (!!) so, why did it take me 6 hours to get a window to open? it kinda just comes down to the fact that vulkan is vulkan on other apis such as opengl, the graphics driver just does stuff for you. you can say sumn like “open a window and make it pink” and it just does the memory, thread syncing, and goofy platform stuff for you vulkan on the other hand, wants none of that. if you dont specifically ask for something, it wont happen. this does make it significantly harder (and much easier to create a gpu-ending vram overflow) to code with, but it does have the benifit of being much more powerful, having no overhead, and 100% control. its not gonna do anything that you dont tell it to so what do you have to do to open a beautiful grey window with vulkan? os bridge (sdl3): instead of writing a whole abstraction for wayland/x11, win32 and metal, you just have to tell sdl3 that you’re making a vulkan window, and it does some magic stuff vulkan instance ( VkInstance ): this is how you get into the vulkan sdk. you kinda just have to tell vulkan everything it needs to know and ask sdl what extensions you need window surface ( VkSurfaceKHR ): vulkan is kinda dumb and doesnt know what a window actually is, so this is where sdl tells vulkan where it can actually write pixels pick a physical device: scan the current hardware, loop through every available device, and then just pick the best one (eventually ill probably add a way to select a custom one) logical device ( VkDevice ): the physical device is the actual doohickey in your computer that runs stuff, the logical device is the software’s interface to it. swapchain ( VkSwapchainKHR ): vulkan can’t actually write images directly to the screen (and that would look bad anyway), so you make a swapchain. my code does double buffering (basically vsync), which means that the screen displays image a, while the gpu is rendering image b. render pass and framebuffers: basically just telling vulkan what to do (in this case, clear the screen, then draw the color). the framebuffer just binds the swapchain image views to the render pass synchronization and command subsystem: believe it or not, your gpu’s clock speed is usually around (or more than) half of your cpu’s clock speed, so you have to make sure that your code waits for the gpu is ready before running the next c++ line. if you don’t, your gpu ram and cache will overflow. overall, this took a total of 764 lines of code just to get a grey window the nice part is that the progress that i’ll make is exponential, since the very beginning stuff takes the longest i also made a logo (the current project page banner)"}]...
|
Title: slate by @swedishsplidney | Stardance
Devl Title: slate by @swedishsplidney | Stardance
Devlogs:
the window opens (!!) so, why did it take me 6 hours to get a window to open? it kinda just comes down to the fact that vulkan is vulkan on other apis such as opengl, the graphics driver just does stuff for you. you can say sumn like “open a window and make it pink” and it just does the memory, thread syncing, and goofy platform stuff for you vulkan on the other hand, wants none of that. if you dont specifically ask for something, it wont happen. this does make it significantly harder (and much easier to create a gpu-ending vram overflow) to code with, but it does have the benifit of being much more powerful, having no overhead, and 100% control. its not gonna do anything that you dont tell it to so what do you have to do to open a beautiful grey window with vulkan? os bridge (sdl3): instead of writing a whole abstraction for wayland/x11, win32 and metal, you just have to tell sdl3 that you’re making a vulkan window, and it does some magic stuff vulkan instance ( VkInstance ): this is how you get into the vulkan sdk. you kinda just have to tell vulkan everything it needs to know and ask sdl what extensions you need window surface ( VkSurfaceKHR ): vulkan is kinda dumb and doesnt know what a window actually is, so this is where sdl tells vulkan where it can actually write pixels pick a physical device: scan the current hardware, loop through every available device, and then just pick the best one (eventually ill probably add a way to select a custom one) logical device ( VkDevice ): the physical device is the actual doohickey in your computer that runs stuff, the logical device is the software’s interface to it. swapchain ( VkSwapchainKHR ): vulkan can’t actually write images directly to the screen (and that would look bad anyway), so you make a swapchain. my code does double buffering (basically vsync), which means that the screen displays image a, while the gpu is rendering image b. render pass and framebuffers: basically just telling vulkan what to do (in this case, clear the screen, then draw the color). the framebuffer just binds the swapchain image views to the render pass synchronization and command subsystem: believe it or not, your gpu’s clock speed is usually around (or more than) half of your cpu’s clock speed, so you have to make sure that your code waits for the gpu is ready before running the next c++ line. if you don’t, your gpu ram and cache will overflow. overall, this took a total of 764 lines of code just to get a grey window the nice part is that the progress that i’ll make is exponential, since the very beginning stuff takes the longest i also made a logo (the current project page banner)
entered the 3rd dimension wasd movement made a whole separate Camera class (look at me keepin things organized ) this means that now the vulkan_renderer class has model, projection, view, and transform matrices: the model matrix tracks the transformations the view matrix essentially tracks where the camera is the projection matrix sets a perspective frustum in order to make things actually have perspective and not just be flat the lerping is also based on deltaTime, which means smooth movement no matter ur fps the mouse tracking is locked via SDL_SetWindowRelativeMouseMode , and can be unlocked with the escape key vertices and index buffers right now, the vertices are being set manually in my code… however, importing obj (and maybe gltf and stl) files is next on the feature list, i’m planning on using tinyobj all the geometry is indexed, which basically means that instead of wasting a ton of memory repeating data for 36 raw vertices, you can just define the 8 corner vertices, then use an index buffer pass to tell the gpu how to connect those 8 vertices into 12 triangles window resizing this was easy, basically just had to tell it to make new image views and framebuffers based on the current aspect ratio (w/h) when the size of the window changes so now, its a spinning cube in a resizeable window that you can move around with wasd
custom obj file loading all of the obj loading is done using tinyobjloader , which is a popular header file that im using to get the raw vertex coords of any .obj file however, all tinyobj does is pass the raw vertex data to my code (technically it can do some basic triangulation, but thats not its main purpose so its not perfect) this means that any model with n-gons (complex polygons) will not work and will look super weird technically you can tell blender to explicitly triangulate a file when you export it, but i think that it should be able to take any obj that you can throw at it without needing external setup so i also added a popular header file called earcut , which at a basic level, just cuts any complex polygons into 3-vertex triangles (which my index pass and renderer accepts). this now means that it can load any custom obj file i want to add auto color loading (from the obj data) or texture loading next, or maybe work on the ui or add ambient occlusion
pbr materials pbr math reflectance: this is the main equation that a cook-torrance pbr system, all the other equations lead back to this one at some point 𝐿𝑜(𝑝,𝜔𝑜) =𝐿𝑒(𝑝,𝜔𝑜) +∫Ω𝑓𝑟(𝑝,𝜔𝑖,𝜔𝑜)𝐿𝑖(𝑝,𝜔𝑖)(𝐧⋅𝜔𝑖)𝑑𝜔𝑖 this equation essentially just determines what light does after hitting a surface with specific parameters we approximate the integral with two different light interactions: diffuse (𝑘𝐷): any light that penetrates the surface, scatters internally, and re-emerges specular (𝑘𝑆): light that reflects directly off the micro-surface in the code itself, the total outgoing radiance ($L_o$) is calculated with: vec3 Lo = ( kD * albedo / PI + specular ) * radiance * NdotL ; cook-torrance brdf: the specular component is calculated using the cook-torrance microfacet brdf: ## 𝑓cook-torrance =𝐷⋅𝐺⋅𝐹 / 4(𝐍⋅𝐕)(𝐍⋅𝐋) where 𝐷, 𝐺, and 𝐹 represent: normal distribution (𝐷): the NDF statistical distribution calculates how many microfacets are aligned with the halfway vector ($𝐇=𝐕+𝐋 / abs(𝐕+𝐋)) 𝐷GGX(𝐍,𝐇,𝛼) = 𝛼^2 / 𝜋((𝐍⋅𝐇)2(𝛼2−1)+1)2 ```glsl float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH * NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / max(denom, 0.000001); } ``` geometry (𝐺): smiths schlick-ggx microfacets can cast shadows and obscure light from the camera too, so the geometry function calculates the self shading factor using smiths method: 𝐺(𝐍,𝐕,𝐋,𝑘) =𝐺1(𝐍,𝐕,𝑘) ⋅𝐺1(𝐍,𝐋,𝑘) where 𝑘 maps roughness for direct lighting using 𝑘 = (roughness+1)^2 / 8: ```glsl float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r * r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; } ``` fresnel equation (𝐹): fresnel-schlick approximation the fresnel factor calculates the percentage of light reflected versus absorbed based on the viewing angle (𝜃): 𝐹(𝜃,𝐹0) =𝐹0 +(1−𝐹0)(1−cos𝜃)^5 nonmetals reflect around 4% of light (𝐹0 =0.04), while metals (conductors) use their tinted base albedo color as 𝐹0: ```glsl vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0); } // lower, inside main(): vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); ``` other stuff: a surface cant reflect more light than it recieves, so a simple equation is used to make sure this doesnt happen: ## 𝐤𝐃 =(1−𝐤𝐒) ⋅(1−metallic) right now, all the material data is pulled from a .mtl file i also added bindless ssbo storage so it doesnt explode when you have a lot of models next, i might keep working on the custom persistent ui system
mesh importing and refraction ima start off by saying that this isn’t true refraction, since that requires path tracing, which is really computationally intensive instead, i went with screen space refraction offset approximation , which is a good, efficient refraction approximator that i still think looks pretty cool material data for refraction the value that determines the transparency of an object is called transmission , and the value for refraction is index of refraction (or IOR) the current filesystem for materials that i have is .mtl files, because thats the standard filetype for exporting materials with objs from programs like blender. however, .mtl is a filesystem from the 1990s that was originally created for phong systems, meaning it doesnt really contain transmission values so, i created a json sidecar system, that generates a better, more robust, human readable material file for every model. so now, when you import an obj/mtl pair: it checks for a json sidecar file if there is one already, just load from that and finish! if there isn’t one already, now read the .mtl, extract as much info as you can from that, and write it to a new json file multi pass rendering in order to correctly render transparent meshes, you need at least 2 render passes (render the opaque ones first, then the transparent ones) also, for the refraction to work, it needs an image of everything behind it, so in between the opaque and transparent pass, it quickly copies everything on the screen to an offscreen framebuffer how the refraction works 1. get the view vector (v): this one’s simple, just evaluate the view direction from the fragment position to the camera position also, adjust the normal (n) if rendering backface 2. refraction vector (snell’s law): the refraction vector is actually easy too, glsl has a built in refract intrinsic so you just drive that with a clamped ior value 3. deviation mapping: to determine how much to bend the background scene texture, just calculate the deviation vector between the refracted ray and the view ray: vec3 rayDeviation = refractDir - (- V ); vec2 distortion = ( push . viewProjMatrix * vec4 ( rayDeviation , 0.0 )). xy * 0.05 * transmission ; 4. uv sampling + composite blending offset the screen coordinates, but in order to prevent the edges from exploding, it needs to be clamped also, sample the background buffer to blend lighting and make a fresnel rim other stuff i did: i also made a full custom persistent ui system (this took a while), and a command system, because hardcoding the ui to do stuff is bad so instead of the ui code directly running logic, clicking a button just sends a command to the command system this meant creating another render pass, meaning i’m up to 3 render passes per frame now the only command so far is file.import_mesh , which is also hooked into the ui (you can see in the video below)
grid generation this took forever, and was much harder than i expected basically, i needed to create a whole new rendering pipeline and a whole new glsl shader pair, as well as coming up with logic so the triangle-focused renderer can actually render some super thin infinite lines the grid does generate dynamically around the camera view, so it is endless i think it does look pretty good tho next, ill prolly work on adding some move and rotation and maybe even scale tools
translation gizmo this was like miserable to make lol it took me sooooooo long to get translation working, basically i had this samurai battle with a scaling issue for the longest time, i accidentally told my code that the viewport was smaller than it actually was and it just took forever to find that out this issue caused a really annoying issue where the actual location of the rendered gizmo was different than the clickable area there was also this other issue where the gizmo would move twice the speed of the mesh it was translating, but it was just a flaw with the mesh class, the gizmo was basically constantly recieving its own center as well as the meshes’ center which made it translate double but it works now, i think it works pretty well its all based off of the modular command system, so anything can call translatemeshcommand and it translate meshes next is prolly working on rotate and scale and stuff, all the other gizmos that we need the gizmos also meant a new .vert and .frag pair, and a whole new vulkan render pipeline lol
rotation gizmo, multi-object support you can now switch between the translation gizmo, and the rotation gizmo, and click between objects to change what one has the gizmo active the gizmo also stays locked to the selected meshes’ local axes, i might add switching between local and global axis orientation at some point, but for right now local only is good enough all of the gizmo mesh is generated from code, not as an obj, making it very efficient and fast and robust, but making the logic that generates vertices in the right position was very annoying lol next, ill probably work on an inspector panel where you can edit an object’s location, rotation, scale, material data, etc or maybe saving the scene to file but now you can move and rotate any amount of objects to your heart’s content
ui inspector the inspector is by no means done, but its a start! right now its just supposed to be purely functional, but i plan on making it look better in the future the input boxes are their own ui class, meaning i can have those input boxes everywhere making the ui system from scratch is very fun, but it at times i do regret not using qml or im gui, but overall, i dont regret making it from scratch too much the main issues with it right now is that the sensitivity values in the input boxes feel wrong, i think the position needs less sensitivity and the rotation needs more also, the color ones are a bit broken, theres a little bit of discrepancy between what the ui shows and what the actual .json material sidecar has written, so i’ll have to figure out how to fix that i think at some point, i want to add support for dropdowns, so each row can be expanded into larger input boxes if needed, or so the entire transform or material section can be collapsed i also need to add input boxes for IOR and transmission, i jus forgot to do that lol, should be pretty easy tho
inspector updates and dropdowns the inspector now has IOR and transmission values that you can change, ui updates, and dropdowns this took literally like 45 epochs because i was running into a materialgpu indexing issue where the inspector boxes would update the wrong values and my peanut brain didnt even think to check if i set the indices correctly dropdowns also took a good 3-4 hours, but it wasnt too bad, mostly just figuring out the correct logic in total, the dropdown class (ui_dropdown.cpp/hpp) is at 169 lines, and the inspector class (ui_inspector_panel.cpp/hpp) is at 470 lines next, i think ill either work on ui rounding or a file hierarchy viewer
hierarchy panel and scrolling the hierarchy panel itself was actually not that hard, the hard part was coming up with a reliable system that can detect and list every object currently loaded in the scene without turning your pc into an explosive the other hard part was modifying the dockspace layout to be able to handle multiple different panels, because previously, it was just one window per dockspace panel, but now it can be as many as you want also, the scrolling system is new, it is its own class ui_scrollable_container , and it is basically doing what the dockspace used to do, but it also lets you scroll. so now, the dockspace just loads a scrollable container, and the scrollable container does all the arrangement and sizing logic. the hierarchy works exactly as you would expect it to, it lists current scene objects and then you can select them from it eventually, ill prolly add support for parenting, which should be pretty easy its kinda crazy to see my custom persistent ui system slowly turn into something useful as i add more features to it so far ive just been adding features when i need them, i havent just thought of features i might need and added all of them
bugfixes and writing docs i spent a good 4 hours just going through some code, finding anything that might be wrong and fixing them. surprisingly, i didnt find that much, which means that i’m better at coding than i thought i found a few places where i just forgot to add something to a cleanup function, which could have led to a small memory leak over time, but nothing major some bugs i fixed: the background of any dropdown menu was rendering behind the viewport selecting stuff in the hierarchy wouldnt sync with the inspector properly i forgot to add screenPointToRay to my cleanup function some other things that i forgot i also added a few std::couts in some spots that needed them i also decided to start writing some docs because my brain was fried i basically just dug through my ~3000 lines of vulkan init and rendering code, and took notes throughout and tried explaining my confusing mental processes in a .md file this kinda made me realize that i do not have enough annotation in my code but thats a problem for future me :)
color picking! i noticed that setting color in the inspector with 3 rgb values was really annoying, so i made a whole new ui class ( ui_color_picker.hpp/cpp ), that can hook into any other ui it supports: S/B box + hue bar RGB input CMYK input (mildly broken) hex input (very broken) it actually works pretty well, there is some bug where an object can never be fully white but i think thats a command issue not color picker or inspector next, it might be time to work on physics
scene serialization okay so this is akward but it doesnt actually work yet, but in my defense serialization is really confusing to me since i generally don’t do a whole lot with file writing and loading, especially in a custom formatted and extensioned .slate file it basically just takes a bunch of data by looping through scene objects and records them, then it also has to do that backwards, then i also have to implement a command and gui system to trigger the logic and i also want the .slate to be easily readable, so i need to format the text in a way that makes sense (i’m taking inspiration from TOML) hopefully its done next devlog, but no promises lol
working scene serialization (saving) if you hit ctrl + s (or hit the gui button) then it creates a .slate file, containing all the data of every object in the scene this .slate file is human readable (and editable), written in a format very similar to toml heres an example .slate file: [ scene ] name = "SlateScene" version = "1.0" [[ entity ]] index = 0 name = "" mesh_path = "models/test_obj.obj" position = [ -0.310723 , 0.927019 , 1.47743 ] rotation = [ 0 , -0 , 0 ] scale = [ 1.9916 , 2.28848 , 3.38984 ] [ entity . material ] albedo = [ 0.183333 , 1 , 0 , 1 ] roughness = 0.5 metallic = 1 ior = 1.5 transmission = 0 [[ entity ]] index = 1 name = "" mesh_path = "models/emerald_monkey.obj" position = [ 1.29034 , 0 , -5.64025e-08 ] rotation = [ 8.61461 , 6.18611 , 2.71029 ] scale = [ 3.07852 , 3.38535 , 3.86504 ] [ entity . material ] albedo = [ 0.050432 , 0.800023 , 0.302281 , 1 ] roughness = 0 metallic = 0 ior = 2.418 transmission = 1 next, ill probably start working on physics
physics aaaaaaaaaaaaaaaaa it works concerningly well and it actually makes me really happy to see it working i legit jumped for joy when i first saw stuff dropping due to gravity the actual underlying physics engine is jolt physics, but all the init and handling and all that is custom from me its all linked to the inspector and allat, so you can tweak values real time, such as body type, bounciness, friction, and mass its now a physics playground instead of just a glorified obj viewer scaling is very broken as far as colliders go, ill probably fix that soon you can start and stop the physics sim with f5
shader overhaul so i noticed that the pbr shader lowkey looked kinda ugly and my microfacet solver was buns af so i js spent a while fixing it up and basically ended up going down a rabbit hole of tonemapping and completely rewrote the whole thing i switched from some random generic tonemapping to khronos standard neutral pbr mapping, which i think looks wayyyyyy better, the colors actually feel accurate now i also spent a little while setting up the shader to support texture colors when i get that all working it is wayyy better now, especially metallic things i also started setting up for texture imports but right now its only albedo and it does NOT work in the slightest lmao i think i will hopefully have texture importing and mapping done by next devlog, but uhhhhh…. no promises
texture loading!!! absolute yipee moment this took like a lot of thinking to figure out how to implement for reasons that i think are obvious, but some of them are: how tf do you load an image what does the loaded image data mean how do you map the texture to the model’s uv coords how does normal mapping work how does the shader know where on the image its reading and a lot more that i prolly forgot lol this whole thing basically meant a whole shader overhaul again (even though i alr did that last devlog but its whatever loll) you can now map albedo (color), normal (height/offset), orm (occlusion, roughness, metallic), and emmision (glowiness) emission only kind of works rn lol, but i will get to it soon also, you currently have to manually set filepaths to the textures you want in the .json sidecar for that model, i need to add filepicker stuff to the inspector but i will get to it ok the textures in the video below were manually baked, packed, etc at 4096*4096 in blender i think another feature i should work on soon is procedural material generating, because texture mapping will always have a resolution limit (even 4k textures look kinda bad when mapped to larger models) i also want to change how reflections work a little bit, or maybe add anti-aliasing because right now the reflections look deep fried (as you will see in the video below)
shadows this one is really cool, i feel like it really takes it from looking like its from 1995 to like… 2015 maybe? it doesnt look that good but i think its a massive improvement! right now, its a 4096x4096 shadowmap with an extent of 24 units, a random noise filter to reduce pixelation, and 3x3 pcf to make it look somewhat smooth it is currently orthographic light projection only, but I think i’ll work on getting perspective lighting soon :) shadows did reqire implementing a whole new imageview, descriptor set, render pass, all that, but i’m getting used to it atp lol serialization is also completely broken right now, so I do need to fix that…...
|
1792774523.8995285
|
1793379323.8995285
|
|
44119
|
Riggurly by @infinite_silly | Stardance
|
infinite_silly
|
0
|
150.23
|
0
|
[]
|
[{"post_id": 80938, "ts": "202 [{"post_id": 80938, "ts": "2026-10-19T09:22:13Z", "hours": 8.6244, "text": "Scooby-Doo Hello friends! I just got an email from Stardance saying I have 8+ unlogged hours, so let’s dive in? I Wish That I Could [Fail] I haven’t exactly done much of aything since my last devlog. I’ve written two unit tests, I guess, which do partially (mostly) address the situation with ensuring that ROM state isn’t changed by a bad save, such as with an RTC or loading in a bad save. I covered the case for two MBCs (MBC1 and MBC3) that the number of banks for the save is mismatched with what ROM was loaded (eg. 4 banks on a 1 bank ROM or MBC2 style ram on an MBC3 rom, though I will cover this case in the future). As for where the time came from, it may be that I stared at my TODO list too hard, as I have my TODOs for Riggurly in one emacs split and my TODOs for school in the other, but I have my school.org in a completely different location in my FS, in my org directory ~/org instead of my my Riggurly directory ~/projects/riggurly, but I have no clue. I didn’t even edit either file for more than a total of 5 minutes!!! Anyway, that’s all for now folks! Make sure to keep listening to Jamie Paige and drop @ElffawIThink a follow! Also, the novel is a stupid ad I saw on Royal Road whiul ereading 1% lifesteal"}, {"post_id": 79844, "ts": "2026-10-15T16:31:09Z", "hours": 3.4033, "text": "Failing Tests Hello everybody! We’re back with another devlog! Let’s dive right in so I can got to bed! All Tests Pass A good bit of test writing has happened since the last devlog. The ROM suite has gone from a measly 3 tests to a much nicer 16, though still incomplete. I wrote more tests to test combinations of roms and save sizes that are meant to work, as well as a bunch of those that also test RTC functionality for MBC3. I ended up putting ROM construction into a helper, as well as making a helper for most of the save round trip tests, probably saving a few hundred lines of code. Next tests are probably going to be broken saves, saves that don’t match, etc. etc. to see that ROMs are preserved and such. Algospeak Going back to the RTC, I remade the function that adds a number of seconds to the internal RTC. What I was doing before was calling a function that ticked by ticks with an amount of ticks equal to 1 second FOR EACH SECOND. That’s often hundreds of thousands or millions of function calls, with O(n) time complexity. I was pretty easily able to swap it for an O(1) modulus thingy. Switchie-Shwoo Going back to ROM preservation, I recently realised that it was loading in new timestamp data before checking save validity, which could end up being problematic. I just swapped the order of those two and the problem was solved, though, as I said before, this needs to be test-enforced. That’s it for now folks! See y’all next time!"}, {"post_id": 78970, "ts": "2026-10-12T06:56:19Z", "hours": 2.3525, "text": "sleep(); sleep(); sleep(); allTestsPass() Hello everyone! Let’s dive in so I can get back to work before I go to bed! Testing, Testing, 1, 2, 3 For the last couple hours, I’ve been writing unit tests for the ROM module. I’ve been going on and off with unit tests for a while. Before, I wanted to write unit test for cpu instructions before realising Blarrg made test ROMs for that. Because of that, test ROMs are the primary mode of testing out Riggurly, especially since test ROM developers know much more about specifics, like the halt bug, than I do. However, trest ROMs don’t test things like saving and loading, which is something I CAN write tests for in a reasonable amount of time. A lot of the work I’ve done was just making one helper function and figuring out what I wanted to be covered by it and what I want the tests to do. I might also refactor some repeated stuff into another helper for more efficient code after I finish writing the save round trip unit tests. That’s it for now friends, and don’t forget to listen to Flavor Foley’s new album, Mirror Modulation, which dropped today? on all music streaming platforms"}, {"post_id": 78511, "ts": "2026-10-11T01:38:07Z", "hours": 2.9031, "text": "Little Bonuses Hello Everyone! I have to go walk the dogs, so let’s dive right in! Building Codes Since I want a few more hours to try to see if I can get a Framework 13 and Celeste, I decided it would be good to add all the nicities I did for my last CLI, leading-zero-util (I know, terribly named), namely, man file and completion generation. On lzu, I used a hidden flag for completions and had a build.rs for the man page. However, I found it best to merge all of them into one hidden flag for ease of use. At first I tried a build.rs, but it kinda made dependencies annoying and made either my or lib users’ lives worse. That’s it for now folks! Next I’ll be working on unit tests for ROM stuff."}, {"post_id": 77765, "ts": "2026-10-08T06:16:50Z", "hours": 5.5431, "text": "Much TODO About Nothing Hello everyone! We are finally back after a devlog hiatus due to me having to write essays to apply for my school’s software team! Let’s dive in so I can work on my history homework! Read It and Weep Last time, I talked about, in one title line by accident, how writing documentation and documenting my software’s flaws really exposed what was wrong with it. This update is all about fixing those flaws (mostly) A Multitude of Screams One of the biggest issues with my emulator was the audio. Not in the backend, but the frontend. Due to laziness, I didn’t bother adding mono audio support, which ended up being a 5-minute fix. There was also another glaring issue with the audio: Once it crashed, it wouldn’t rebuild the stream. If you unplugged your headphones, thinking the audio would continue on your other speakers, it would just turn it off and modulate speed with std:🧵 :sleep() . It took me a while to write all the rebuilding code in such a way to maximise user QoL for all users. When did I download you?! Since Riggurly is both a CLI AND a library, it has dependencies that are used only in the CLI that are still a part of the package as a whole. Library users still have to download and compile these dependencies, which can be a hassle and a waste of time. I’ve been meaning to put CLI-only dependencies behind a feature so library users can easily prevent themselves from downloading and compiling a bunch of heavy extra dependencies. This also taught me how to use features, which was good. You’re a Waste of the Air You Breathe! One thing that’s been bugging me for a while is efficiency. My array for the fallback memory bus array in the memory bus struct has always been 0x10000 bytes long (1 mebibyte, how much ram a GB has (kind of)). How reading and writing has worked is that there are match statements you go through to see if you access that array or you access the rom or if you access the vram or something else. The problem is that over 3/4 of that array’s length is useless and shadowed by ROM/CRAM/VRAM. I was wasting 768 kb of heap-memory. I ended up dropping the first 3/4 and just having a smaller array. Unfortunately, some space is still wasted, but it’s not much compared to before. I showed @ElffawIThink and they though it was funny. Also, one of the ROM types comes with 512 HALF-BYTES(nibbles) of RAM, which I had been representing with a [u8,512] with the upper nibbles of EVERY BYTE going unused. I shrank this down to a [u8,256] and use both nibbles for a fish in the sea . Take Me Home Before, I had to put a disclaimer in my README that you couldn’t use ~ as your home directory in your default ROM path in your config.toml because different users have different home directories and I have to use the dirs crate to find that out at runtime. This was a surprisingly long fix, though it was quite simple. Just a few lines of code to strip the ~ and replace it with the already found home directory. That’s all for tonight comrades! Make sure to listen to Jamie Paige, especially Clover! That song is now the first song in my playlist with vocal (sequentially, obviously my playlist has other songs with vocals), overtaking Lemon Boy by Cavetown, it’s just that good. It has also shown itself to be a better daily anthem than Villain by Teniwoha and Schifty Five, the YouTube classic."}, {"post_id": 76331, "ts": "2026-10-03T07:10:40Z", "hours": 2.3758, "text": "Lover Tell Me if You CanHello everyone! Let’s dive in so I can work on improving the user experience!## ManThis devlog is all about README. I have actually never used Markdown before, only org, Emacs’s outliner/md format, because it is more intuitive and Emacs gives you more toys. My style guide is in org, my todo lists are in org; the only things that aren’t are the AGENTS.md I stole from Ghostty and the README.md. I ended up using a combination of the Stardance and Phantom README guides to help me figure out what to put in it and how to do syntax. Working on the README put an emphasis on some flaws in my code:- config path ~ not expanding- my glaring lack of a homebrew tap- mono audio still being unsupported- feature gating on binary-only depsThat’s it for now folks!"}, {"post_id": 75838, "ts": "2026-10-01T09:37:11Z", "hours": 3.2122, "text": "Erroneous Hello everyone! I have a history in-class-writing in 6 hours, so let’s dive right in! Error 404 Once I started adding support for loading ROMs and saves, failure points became possible. I hadn’t previously written errors before, so I just wrote strings and propagated them through with Result< T, Box> and the ? operator, with no regard to API users that may want to recover from a failure. I’ve been putting this off for so long, and was even considering doing this after shipping, but since I have so much time on my hands and the only other big TODOs left are the README.md and the Homebrew tap, I decided, why not? This has been a very interesting process over all, and it even gave me the impetus to do some proper gating on load_rom. Different MBCs only support some cram sizes, but because I wasn’t gating on load, these would fail at runtime with a mismatch. Read All About It Next up is the README. I previously had a mediocre, small, incomplete README in a file formet I forgot crates.io doesn’t have a renderer for, so I figured it would be best to start from scratch in Markdown instead of trying to port it over from Org. I also chnaged the name to Riggurly since that rolls off the tongue more. That’s it for this morning! I also found the bathroom in ENA: Dream BBQ, which was cool. I still need to go inside. Also, make sure to listen to Jamie Paige, as she always boosts my productivity!"}, {"post_id": 75451, "ts": "2026-09-30T04:14:29Z", "hours": 4.1544, "text": "Vendetta Hello everyone! Let’s dive right in so I can work on my math homework so I don’t fail my calc test next week! TUIzers I COMPLETED THE TUIIIIII!!! I added a text entry box for people to manually enter the names of their new saves. I also stylised the highlighting a bit more, and , even though its not in the video, now, the color changes to green when you’re selecting a save. This was a really fun learning experience. I originally wanted to make a TUI because one of the raters on my last project, leading zero util , complained about having to use a simple CLI and told me it wasn’t that good because of the lack of TUI, so this has been kind of a personal vendetta against that person to improve my software and user experience. The Other Interface This project isn’t just a CLI utility. The entire time I’ve been building this, I’ve wanted to enable others to make a frontend for it, whether it be on the web or a gui or some port of it in something. I’ve maintained a careful separation between lib and bin, with the exception that they are the same crate. For library users, dealing with my errors would be impossible since many of them are just strings and they are all just Box. Before throwing this on crates.io, I want to make error enums and stuff so people can do error matching. Tap Tap After completing error enums and stuff, I’m going to throw it on crates.io and make a github release so I can make a Homebrew tap. The last time I made a homebrew tap, I gave the project it’s own separate tap repo, but this time I’ll keep all my taps in a new tap repo on my GitHub instead of Codeberg for users. That’s it for now! I’m excited to make error enums so I can have that skill under my belt as well! Also, I’ve reached the point where shipping would probably let me get a framework 12, which is very exciting for me."}, {"post_id": 74790, "ts": "2026-09-28T08:03:25Z", "hours": 3.5664, "text": "Pick Me Hello everyone! Let’s dive in so I can go feed my gecko and sleep! Seleccionar For the past few hours, I’ve been working on the file picker for selecting a rom and a save file. A lot of it is just learning about how to use Ratatui. Originally, I was going to have the selecting happen all at once, by one function, but I switched it to two calls so that load_rom() and has_battery() can be called to check whether the save menu should even come up. Write-In Candidate The thing is, since with a new save, the file has to be constructed by the emulator and it doesn’t exist. Right now, I’m writing a little text input field to be triggered if the save menu gets close with Esc. This will be pretty short, and won’t require a large change to existing code. After that, I’ll wire it in and test. Next Steps Homebrew Cask Separating frontend from backend crate by crate, so lib users don’t have to deal with frontend only imports."}, {"post_id": 73502, "ts": "2026-09-25T07:49:51Z", "hours": 2.4244, "text": "Ratatouille Hello everyone, we’re back with another devlog! Let’s dive right in so I can hit bed so I can go rafting the day after tomorrow! Compliance Chips I’ve finally finished dealing with compliance! I’m surprised by how many extranneous parentheses I had! I knew I had a lot, but I didn’t know it was this much! I’m so happy that is over so I can get to real work! Tui T. Sutherland The last big feature I wanted to add before shipping was a TUI for selecting ROMs and saves. To do this, I need to use the ratatui crate, which fortunately run off the same crossterm my project already does. So far, all I’ve done is learn about it and write the fn for getting the directories/files with the appropriate endings and sorting them for display use. I’ll see y’all in a couple days!"}, {"post_id": 73040, "ts": "2026-09-24T08:03:54Z", "hours": 1.5953, "text": "Comply-cations Hello everyone!! We’re back with another devlog today. Let’s dive right in so I can start the next step! Parensal Issues As I said in my last devlog, while working on compliance for joypad.rs, I realised that I needed to delete extra parentheses around operators with obvious precedence. After working on that file, I continued down the buffers open in Neovim, also correcting that issue in addition to the others. Because I only caught it midway through, I have to complete a second pass of compliance editing. Fortunately, I have mini.surround installed, so deleting parentheses is really easy. That’s all that really happened. Make sure to listen to the daily dose of Jamie Paige and Vane Lily’s new song!"}, {"post_id": 72583, "ts": "2026-09-23T08:54:29Z", "hours": 1.9347, "text": "You Will Be Terminated Hello everyone! We’re back with another devlog! Let’s dive right in since it is 02:00 over here! Lookin’ So Fab I have contined with my quest to implement my BEAUTIFUL and living style guide. Here’s what I did, since this work is mostly just repetitive and long. gpu.rs and memory_bs.rs publicity compliance. Before today, 4/6 of Gpu’s fields were pub(crate) something they had no business being, so I refactored so everything uses methods. Took a chunk of time but it was very worth it. registers.rs This one was pretty stupid. It had two main issues, publicity and masks. The lackluster and incomplete guide I was following had me write registers.rs with a ton of bitmasks it didn’t need it in a way that was ugly and sad, so I dropped the masks. All of Registers’ field and subfields are pub(crate), which I determined is optimal because it would be a major and massive chang to Cpu, and the registers are purely for the Cpu to use, and are part of the Cpu. rom.rs rom.rs was pretty chill, only a few things here and there. joypad.rs Despite this one taking a matter of minutes, this one is going to cause my so much work. All of its publicity was correct, as well as bit selecting formatting. Turns out I’ve been forgetting to remove parentheses around my files! Simply ridiculous! ANyway, that’s all for now, since I need to go touch bed. So y’all later, and keep listening to Jamie Paige!"}, {"post_id": 72213, "ts": "2026-09-22T13:50:31Z", "hours": 2.2914, "text": "If You Do Not Comply Hello everyone! We’re back with another devlog! I need to go to school soon, so let’s dive right in! Numerics, Literally Since I made the style guide, it was time to start implementing it. So far, I’ve gone through emulator.rs, memory_bus.rs, apu.rs, and cpu.rs. emulator.rs This one just needed doccomment formatting. memory-bus.rs This one needed a few numeric literal changes. I also directly accesses the stat field of gpu, which is unnacceptable, but since I’m doing gpu.rs next, I left it for the time being. apu.rs Despite being the file in which I came up with a chunk of my numeric literal style while writing, it felt like every literal was wrong. cpu.rs This was the second easiest file, despite it being the longest by a wide margin. There was some repetitive numeric literal issues in the methods, but that was it. I also tried to split it into multiple files for length since it is double the size of any other file, but I lowkey failed. Next up is gpu.rs compliance. I’ll see y’all next time!"}, {"post_id": 71902, "ts": "2026-09-21T18:55:47Z", "hours": 4.1017, "text": "Dripmogging Hello developer theme users! It’s been a couple days since my last devlog, since I couldn’t make one last night since my dad thought I had school today, so let’s dive in so I can work on compliance and becoming a peer tutor for math for my school! Bitmasks: origins One of the biggest parts of this project is working with bytes and getting data from bytes. To do this, you have to shift the bits you want to the end and then mask them like (byte >> shift) & bitmask . I feel like I’ve gone through dozens of different styles for bitmask and shift numeric literals, which is where the whole style guide idea came from. Personal Stylist For the past 4 hours, I’ve been perfecting a style guide for my codebase. It’s a beautiful org doc with that sweet sweet table of contents with rules on everything from numeric literals to tests to error enums. There’s not to much to say except the next step is going over all 5000+ lines of code to enforce compliance. I’d like that written up A quick note on org. Many online code hosting services like GitHub and Codeberg support org rendering. Rather unfortunately, crates.io only supports a README.md, and not a README.org, which gives me a big sad, especially since I’ll haveto rewrite my README in markdown (ew), which does not give me the luxury of an automatically generated table of contents. That’s it for now folks, see y’all tonight!"}, {"post_id": 70463, "ts": "2026-09-19T07:33:42Z", "hours": 5.4736, "text": "Scream it Loud and Scream it Proud Hello everyone! We are back with the once again DAILY devlog!!! Let’s dive right in! IT LIIIIIVES!!! This morning, as soon as I came up, I sat my @ down to trouble shoot my audio processing on 4 hours of sleep . Despite adding the manual sleep time reduction, I was still experiencing some crackling, so I found a bug in the channels, solving which didn’t solve anything, but switching timing to be based off of audio when available worked like a charm, giving better and more accuracte speeds and crisp audio, so I was able to show off my COMPLETED EMULATOR CORE to some of my friends (as well as my backpack with Ferris on it). IT DIIIIIES!!! After adding the audio, I had to make sure that it wouldn’t cause the emulator to break, so I added a timeout that shuts off audio if it’s broken for more than 500 ms YES CAAAAAAP Because of how I was translating from u16 audio to f32, I was getting popping, so I implemented a software capacitor to slowly dampen sounds closer to EQUILIBRIUM SWITCH IT UUUUP After audio had all it needed, it was time to work on something I had long anticipated, a lib.rs for people o build their own frontends on top of my emulator. I also added an Emulator wrapper struct around Cpu so that it would be easier to manage pub methods and such without the ~1550 other lines in cpu.rs making things hard. There’s a reason this project isn’t just one big file of 5000 SLoC. I also added some documentation, and I found the best use of Claude Code is checking for spelling errors (it’s like I’m illiterate!) Speaking of SLoC, I cracked 5000 today! This is about 3.5x larger than my last two projects combined! I’ll see y’all next time, and don’t forget to listen to beabadoobee’s new album Pylon and Jamie Paige!"}, {"post_id": 70001, "ts": "2026-09-18T07:59:49Z", "hours": 5.9544, "text": "BLAAALAKKLJHSLJHDKHJALKJHLKGSFG Hello everyone! It seems that the devlogs have become oppositely bidaily — just this once, don’t you worry — than my last two devlogs. Let’s dive right in since we have so much to cover. audio output master race After I finished chan 4, it was time to implement master apu registers and channel mixing and panning. Most of the registers were pretty simple, except the one with the master APU power on/power off, as to implement it I had to gate every write on whether it was on, except the wave RAM. I also did that during my PE class (while exercising, of course), which contributed to the difficulty. Fortunately, I write my code in Neovim, so it really sped things up, including 1-handed editing. With that, the backend was nearly done, and I had reached the point at which I would no longer need Pan Docs or anything of the like, just straight Rust sailing. Thread the Needle In order to get the audio timed correctly, I had to hook up tick_channels() to a channel on which it sends a tuple of u16s (left and right amplitudes) to some receiver. This lets the audio be decoupled from whatever frontend one has. Your Pal, CPAL cpal is a a Rust crate for audio and stuff. Here’s the audio stuff because I can’t think straight it’s so late & I have an integration by parts quiz tomorrow and I don’t want to fail something light b/c I didn’t sleep. fn get_audio_stream ( cpu : & mut Cpu ) -> Result < Option < Stream > , Box < dyn std :: error : : Error >> { if true && let Some ( device ) = cpal :: default_host () .default_output_device () { let supported_stream_config = device .default_output_config () ? ; let stream_config = supported_stream_config .config (); let sample_format = supported_stream_config .sample_format (); let ( sender , receiver ) = std :: sync :: mpsc :: sync_channel :: < ( u16 , u16 ) > ( 5000 ); let error_callback = | _err : cpal :: Error | {}; cpu .set_audio_sample_rate ( stream_config .sample_rate ); cpu .set_audio_sample_sender ( sender ); let stream = match sample_format { cpal :: SampleFormat :: F32 => { let data_callback = make_data_callback :: < f32 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: I16 => { let data_callback = make_data_callback :: < i16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: U16 => { let data_callback = make_data_callback :: < u16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } _ => Err ( \"Audio output sample format not supported! Try disabling audio in your config with 'audio = false'\" , ) ? , }; return Ok ( stream ); } Ok ( None ) } // makedatacallback not shown due to char limits Position,Velocity, Acceleration, Jerk, Snap, Crackle, and Pop After that, I tested it, but there was some terrible audio crackling. Turns out it was due to oversleeping when trying to time things correctly, though before finding this out, I ended up slightly optimising draw_frame().The artifacts seem to be mostly gone and I will leave this to tomorrow silly. nearly @ 5000 sloc"}, {"post_id": 69022, "ts": "2026-09-16T07:14:24Z", "hours": 1.4908, "text": "Madra Channels Here we are; we’re back again, making this a bidaily devlog?! Let’s dive into the last 1½ hours of development so I can touch bed. Me-Chan Navigator After finishing channel 4, it was time to tackle the most complicated (maybe, but 4 is pretty funky), or at least the weirdest. I thought channel 3 varied it’s pitch based on the info in the wave ram, BUT NOOO, it varies the waveform instead. It let’s the gameboy make more varied sounds rather than just variations of beeps, like saw waves and stuff. Lots of its machinery is reused from the other channels, and it also doesn’t have envelope because you can vary the volume yourself. That’s it for this devlog! See y’all tomorrow as I probably will finish audio tomorrow! I don’t think there is an applicable image for this, so have some xkcds"}, {"post_id": 68979, "ts": "2026-09-16T04:46:04Z", "hours": 3.0544, "text": "4Chan Hello everyone! Welcome back to the Daily Devlog, where we go over the new developments in RustyGameGirl!! Let’s get started with today’s broadcast! White Noise, Brown Noise, Black Noise, Grey Noise, What’s the Difference? After finishing the two pulse channels, 1 and 2, it was time to start a new one. I went with channel 4 since it is the closest to 1 and 2 in terms of structure and simplicity. Channel 4 is a randomised noise channel thingy, for stuff, like gunfire maybe? Here’s the summary from Pan Docs: This channel is used to output white noise, which is done by randomly switching the amplitude between two levels fairly fast. The frequency can be adjusted in order to make the noise appear “harder” (lower frequency) or “softer” (higher frequency). The random function that switches the output level can also be manipulated. Certain settings can cause the wave to be more regular, sounding closer to a pulse than noise. A lot of channel 4’s machinery is the same as 1 and 2’s, like envelope and length, which brings us to our next section. Adaptive Water Body Until today, I have never written a trait in Rust. I’ve used them, of course, especially Default and Drop, but also the num-traits crate from when I was making my fast-factor crate, but I’ve never written one before. I figured now was as good a time as any, especially since all four channels share many similar methods, like the nrxy reads and writes, output (to u8 only), clock_length, tick_period, etc., so I added the three following traits: trait Channel { fn output ( & self ) -> u8 ; fn tick_period ( & mut self , ticks : u32 ); fn clock_length ( & mut self ); fn nrx1_read ( & self ) -> u8 ; fn nrx2_read ( & self ) -> u8 ; fn nrx3_read ( & self ) -> u8 ; fn nrx4_read ( & self ) -> u8 ; fn nrx1_write ( & mut self , byte : u8 ); fn nrx2_write ( & mut self , byte : u8 ); fn nrx3_write ( & mut self , byte : u8 ); fn nrx4_write ( & mut self , byte : u8 ); } trait ChannelWithEnvelope { fn clock_envelope ( & mut self ); } trait ChannelSpecificFeature { fn nrx0_read ( & self ) -> u8 ; fn nrx0_write ( & mut self , byte : u8 ); } Having all the separate impl blocks forced and ordered the same makes the code far more readable, and it’s not like this will slow the code, and it sped up the creation of channel 4 and will likely speed up channel 3’s creation. Notes Rather unfortunately, since I was coding piecemeal today and I was to lazy (probably b/c of the gudetama shirt I’m wearing), I didn’t start listening to music until ater I was done coding, while I was working on homework (English I think? It was the only real homework I had today since I did most of the rest in class), but a Polyphia song just popped up in my shuffle (Reverie), and I locked in so much harder. Also, once I started working on the APU, I cracked 4000 SLoC!!! That’s more than my last two projects doubled and combined. It’s also likely the majority of code I’ve written in the 7 years I’ve been programming. I am currently at 4509 SLoC, which is over triple my last two projects combined! See y’all tomorrow, if not later tonight!"}, {"post_id": 68505, "ts": "2026-09-15T07:22:17Z", "hours": 2.2572, "text": "Sweep It Under the Rug Hello humans! We’re back with the DAILY DEVLOG!!!!! I need to go to bed and feed my geck, so let’s dive right in! No Sweeping for You! Today, I finished up last night’s work of finishing channel 2. All that was left was adding an output to u8 fn that’s just sitting there as dead code rn and wiring it up to read_byte(). relatively uneventful, except for when I forgot how bitwise operations work. WeeeWoooWeeeWooo After channel 2, the obvious next step was channel 1. Channel 1 is just channel 2 with an extra feature: sweep. Sweep is kinda funky. I thought it changes envelope, but it actually changes pitch. It does some weird funky shenanigans to change the pitch and also on note trigger. A lot of building channel 1 was just making echo fns for proper layering of structs. Pan docs was once again confusing. Notes A side note on documentation. While working, I decided to read the forword of pan docs, and lo and behold, its built for game developers, but there’s also a Complete GB Technical Reference which was supposedly built for emulator builders. I decided to check it out and see if it would be more useful than pan docs. BUT GUESS WHAT?? It had EVRYTHING EXCEPT AUDIO in there!! The word “audio” was used exactly once!! Apu wasn’t even mentioned!!! SO I have to continue with pan docs, which does have decentish detail for audio. Music I ended up listening to a lot of Chappell Roan, Cavetown, CITY LIMITS, and MAFUMAFU this session. Y’all should listen to the PEAK music of Sorry Ghost as well. See y’all next time!"}, {"post_id": 67901, "ts": "2026-09-14T06:27:32Z", "hours": 3.3375, "text": "Apu, like from The Simpsons ? Hello beautiful humans! We’re back, and I’ve finally stopped procrastinating on the APU! Let’s dive right in! CPU, GPU, TPU, NPU, LPU, DPU, and now APU?! I’ve been very scared of dealing with the APU, since it’s seemed like the hairiest thing to deal with, and it’s also the last part of the emulator core. The APU has four channels and mixing and fading and stuff I will get into. 2 Chan The first channel I started with was channel 2, since it is the simplest (1 has an extra feature, but otherwise, they’re the same) There are four things one needs to understand for these channels: Period Duty Length Envelope Duty is the waveform of the audio, like what percentage of the square wave is at level 1 vs level 0. This changes the timbre of the sound. Length is the amount of time the note plays for. It’s harder for devs to have to manually turn off the notes on their own b/c of timing. Envelope is the fade in/fade out of the sound Also, on channel 1, there is sweep, which changes envelope I think? I don’t know b/c Pan Docs is confusing for this (built for game developers it feels) Aaaanyways, that’s it from me for now, as I have a history in-class writing test thing tomorrow and I’ve already hit my 2½ hour goal for the day. Also, I was listening to Constant Companions and I realised I probably never listened to the album hard enough b/c “Clouddrop” is a lot more depressing than I remember, and I got ts on vinyl soo that’s something I will be embarrassed to tell my friends. Also, y’all should listen to Constant Companions to increase her listeners so that one day, Jamie can have her Paige again."}, {"post_id": 67127, "ts": "2026-09-13T05:58:53Z", "hours": 0.7461, "text": "Blink Twice Hello everyone! This is going to be a shorter devlog, so let’s dive right in! NOOOOOOOOOOOooooooooo When I set up the keypress handling a bit back, I wanted to use the default Retroarch keybinds so that anyone who had ever used Retroarch could use RGG without difficulty. The one discrepancy was that you only had to click escape one singular time to quit the emulator. I am no stranger to mistaken clicks, and today I realised this could be an issue for anyone who shares some of my clumsy tendencies. I figured it iwould be good to better copy Retroarch’s binds by making it so that you had to click Esc twice in quick succession to quit. A nice and easy change tha’s completion will probably force me to actually stop procrastinating audio/APU. Anyyywayyy, y’all should listen to CityLimits , DeltaFey , and Black Polish . I feel all of their music is great for programming. We’ll see if I can post another devlog today. ¡Adiós!"}, {"post_id": 66415, "ts": "2026-09-12T07:26:24Z", "hours": 0.7267, "text": "Frontman Hello everyone! This will probably, maybe, be the shortest amount of time for a devlog, so let’s hop to it! I’ll never let you go Last night, I implemented the backend funtionality and started on frontend functionality, a ’lil bit. Over the past 30 odd minutes, I finished up the saver struct. I wanted to have Saver be have a custom drop impl, but that would require it to carry an immutable reference to the CPU through the running of the emulator, which would break ownership rules due to having to make a mutable reference to the CPU to step it. What I did was I isolated the loop into a function and saved the return value to a variable, which gets propogated after the emulator attempts to save. The video is of me loading in a save into Pokémon Red! Comment which theme you want me to show off next!"}, {"post_id": 65817, "ts": "2026-09-11T06:36:19Z", "hours": 2.92, "text": "SAAAAAAAVVVEEE MEEEEEEE Hello everyone, we’re back with our daily devlog, this time before midnight! Let’s dive in! I’ll never forget you After finishing the MBCs, it was time to work on saving the game state. I had to save the data in binary form. Originally, I was going to use bincode, but I switched to postcard since bincode has been deprecated. I managed to get the plumbing working, so now I just have to implement the saving in main.rs. I had to keep this short since I need to go to bed. See y’all!"}, {"post_id": 65238, "ts": "2026-09-10T07:13:40Z", "hours": 1.3814, "text": "Rap It Up Hello friends! We’re back with the Daily Devlog! This one’s a quickie because the docs were (mostly) clear and I was listening to Rob Apollo while working. Let’s dive right in so I can run a mile on 5.5 hours of sleep rather than only 5! The Final Boss of MBCs When I started to do MBCs, the scope of this project was to do no MBC, MBC1, MBC2, MBC3, and maybe MBC5. I have been completing them largely in sequence: MBC1 MBC2 No MBC MBC3 (yesterday) This leaves only MBC5, today’s feature. I thought MBC5 was going to be difficult, but it was probably the easiest MBC besides no MBC, which isn’t even an MBC! MBC5 is basically a simpler and bigger version of MBC1, with two exceptions: Rumble: Apparently, cartridges can shake it down because some MBC5 variants have a rumble motor controlled by bit 3 of the CRAM selector. If there is rumble, that bit is dead. Chunks Every other MBC I’ve implemented followed this general rule: the ROM is exposed of 0x8000 bytes. Those bytes are split into four sections, each of 0x2000 bytes. Depending on which register you wrote to, it would be a different MBC command/"}, {"post_id": 64657, "ts": "2026-09-09T07:16:11Z", "hours": 2.3947, "text": "Third Time’s the Charm Hello everyone! I would have devlogged sooner, but I’ve spent most of the last time between this devlog and the last on a single feature, and the rest on YouTube. Let’s dive right in! Clock Iiiiit! After adding MBC2 and No MBC, the natural next step was MBC3. MBC3 is a lot like MBC1. It uses mostly the same register, many of which are direct copies or basically the same. There are only two key differences: MBC3 supports more RAM and has an RTC (real time clock). The more RAM wasn’t much to deal with, but the RTC kinda was. I messed up a good deal of the ticking on the irst pass of writing it, and I kept forgetting how if let worked, which did end up slowing me down. Anyway, it’s well past midnight and I need to smash my face in my pillow. My one regret is that I didn’t listen to enough Jamie Paige while devving."}, {"post_id": 64608, "ts": "2026-09-09T03:53:21Z", "hours": 3.1956, "text": "Clip It Hello comrades! We’re back with yet another devlog! Let’s dive in so I can get back to programming! Memory Control (Not 1984 Style) A bit ago, I mentioned that since cartridges were physical pieces of hardware, they could have logic chips of their own controlling their own RAM, so I would have to emulate those on top of the functionality of the actual GameBoy’s hardware. The next MBC (memory bank controller) to emulate was MBC2. MBC2 is weird. It has ROM banks as standard, but it also has 512 half-bytes of RAM built straight into the MBC chip for some reason. Those were a little weird to emulate, but altogether straightforward. I also had duplicated RAM indexing logic for both reading and writing to the cartridge RAM, which I marked todo in my code, so I had an excuse to do a quick refactor. After handling the weird little freak that is MBC2 was implementing No MBC. You may be asking, V, what’s there to emulate if there is nothing to emulate? And to that I say, it is once again weird and silly, just how we like it. Even if a game has no MBC, it can still have some RAM; it’s just always on and has no logic for accessing it. It ended up with me having to deal with a lil extra changes to handle some things I was not anticipating. Looks Like You’re Trying to Kill a Stick Figure A while ago, I watched a prime video (who was also the source of the idea for this project) about the Power of 10. I’ve since thought these rules are pretty neat and can serve to make code better (with possibly the exception of rule 7). I decided that I wanted to follow rule 10 for my code, so I foolishly set all lints to max pedantic, thinking I would have some lints, but I ENDED UP HAVING HUNDREDS OF MOSTLY USELESS LINTS, many of which ended up being me using as for casting causing less readable behaviour. Some of them were useful, such as me allocating MASSIVE arrays on the stack, even if they were boxed. Turns out Box::new([0; 0x20000]) creates the array on the stack first before memcopying to the heap in unoptimised builds, which is completely unnacceptable. Also, may of my other arrays were just straight up massive and unboxed, like the framebuffer or bus memory flat array. Anyways, after spending the bulk of this devlog’s time dealing with that, I gave up knowing the rest of the lints were harmless and pointless and clogging up important lints. In other news, despite listening to Jamie Paige for many hours this weekend, I still ended up needing my fren to tell me about it’s new song with Vane Lily and Yuma . I also showed them to Developer theme and it brought them some joy. I’m also very happy I got the thermometer question right, especially since I have an infrared thermometer on my desk and I had to find the correct emissivity setting to use on milk yesterday since my dad was making yoghurt. Anyway, I’ll end this before Grammarly shows me any more lints for this devlog."}, {"post_id": 63424, "ts": "2026-09-07T08:10:14Z", "hours": 5.5439, "text": "Can It Tetris? I say hello to you again, my near and dear viewers, as I begin this devlog with a frustratingly long amount of time logged. Let’s dive in so I can put the last few days behind me. DMing the Memory Last time I menioned that there was a feature I needed to add that allowed the cpu to write a byte to a register in memory to trigger a transfer of data from the address specified by the written byte to the OAM (object attribute memory — sprites and stuff; this transfer is the DMA OAM tranfer) because that was the main way stuff was written to oam b/c otherwise it would be too slow. Originally, I wrote a doubly recursive function kinda thing b/c it called read_byte() when it itself was called indirectly by read_byte() and it also called itself, but I scrapped it due to unguarenteed tail recursion and the slowness of repeatedly matching the section of memory being written to/read from, so I just used copy_within(). This also somehow fixed my input issues, so idk. Double Bug Whammy This is the part of the last few days that has been a slog and a horror. After adding the DMA OAM transfer, I tried running Tetris, and it worked…until I got into gameplay. The sprite showing the selected player amount on the start screen was working and it would respond to user input. However, when it hit actual gameplay, it wouldn’t render the tetromino sprites until they were baked into the background as part of setting in place. To try and diagnose the problem, I ran blarrg’s big cpu_instrs.gb test ROM, and it stopped rendering frames in the middle of the 3rd test, the standalone ROM for which had been working without a flaw. Testing in mGBA through RetroArch (I don’t have mGBA installed standalone on this device), I found that the test takes a second to run, but doesn’t cause the whole emulator to hang. Also, since new frames weren’t being completed, it wouldn’t poll for input since it only polls on a frame completion, which meant I had to close the terminal session to quit the emulator. I spent hours running tests just to find that it was getting hit by a STOP instruction it couldn’t escape. I checked Pan Docs and found there had been some unimplemented STOP behaviours. After implementing those and it still not working, I set STOP to only stop for a single cycle, which let the test ROM pass all the tests with no timing issues. After that, within 2 minutes, I was able to find an incorrect == (should have been !=) in my sprite attributes bit 7 sprite priority control, allowing Tetris to finally work!!! Next up is: MBC2 MBC3 MBC5 Saving Audio TUI rather than bare CLI a lib.rs so others can write a frontend on top of Rusty Game Girl A style guide and making my code compliant (hard to do while writing and over a codebase who’s size is at least 4.5x bigger than anything else I’ve ever worked with) Unit tests also here’s a video of me selling at Tetris b/c I wasn’t listening to Jamie Paige while playing"}, {"post_id": 61315, "ts": "2026-09-04T05:11:57Z", "hours": 2.0253, "text": "RAM or ROM Hello everyone! I’ve finally logged a normal amount of time again! Let’s dive right in! MBC Say One! I managed to bang out my first supported MBC (memory bank controller), a lot of it done while walking on the treadmill this morning. I had already implemented the ROM bank switching by this morning, so next I had to implement switching RAM banks, which has some pretty funky indexing. Grace Hopper Naturally, what does one do when they have a hopefully working MBC system, you try a rom!. I only found out tetris doesn’t use an mbc after removing my basic mbc substitute stuff that enabled me to run simple roms. Speaking of Tetris, the screenshots are me attempting to run tetris iwth different themes (the themes work, tetris doesn’t which we’ll get to). The themes in order Wisteria GBGRreen Jungle Developer (Don’t worry, there’s more themes, and you can always submit an issue or PR with a new theme) Let’s get back to BUGSSSS!! When I tried to run tetris, it wasn’t accepting input and the arrow showing which options are selected was unpresent. These issues are the next things to resolve. I found that there was a critical error in the read methods on my button data stuct Here is the commit with the changes in case you are curious. I found out that there is a spot in memory you can write to to load a sprite from some address into OAM. This is the next thing I will be implementing before I try finding the next issue with input so I can at least see some pretty sprites. Anyway, see y’all tomorrow after I hopefully get tetris working!"}, {"post_id": 60661, "ts": "2026-09-03T05:07:00Z", "hours": 3.2858, "text": "You can switch the banks, switch banks, swi- swi- swi- swi- swi- — until you’re full of life Hello everyone! I changed the name of my project directory, so I wasn’t seeing my hackatime or had the ability to write a devlog until I realised the problem, so let’s just dive right in! Bank It The next thing to deal with was bank switching and better behaviour for handling roms. Cartridges are physical objects, and thus can have extra RAM and storage for the gameboy. These are controlled by MBCs (memory bank controllers). The most common ones are MBC1, MBC2, MBC3, and MBC5. For this project, for now, I am only emulating 1, 2, and 3. In the future, I will probably add more controllers once the full architecture is done for at least these three so I have an idea of hwo the skeletons should look. The first step of bank switching was having the rom portion of the memory be read-only and writes to it do certain mbc actions, like enable ram or switch banks or switch ram. I am currently implementing the switching of banks. I need to get back to MBC1-specific flags and writes. See y’all next time!"}, {"post_id": 59742, "ts": "2026-09-01T17:50:39Z", "hours": 7.8103, "text": "Human Error Hello everyone! I got too much in the flow and in the RAGE, which is why I logged nearly 8 hours since the last devlog! Let’s get in the weeds! Loading Bay I added ROM loading!!!!! I can actually load a test ROM in now!!! Naturally, I immediately loaded one in, and that brings us to our first issue. Speed? Issues When I was loading in a test ROM, the text of the name of the test would peek from the bottom of the screen, then jump up and not show passed. I probably spent 2 HOURS on trying to fix this. I thought it was a speed issue, and I ended up making a ton of optimisations and added alternate screen switching. BUT GUESS WHAT??? I zoomed out my terminal window, and there it was: Passed. I would share a screenshot, but I am currently working on changes to load_rom() that break the emulator currently (bank switching). Don’t Stop I mentioned a while ago that I had to emulate a bug in the hardware that caused the next instruction to occur twice if HALT is called when there is an interrupt pending and IME (interrupt master enable) is off. My implementation caused it to infinitely stall instead. So I fixed that bit, but the HALT bug test rom still wasn’t running the tests, so I found that LY couldn’t be read from memory, so fixing that fixed the thing, allowing the tests to run and FAIL. So I had to run a disassembler on the HALT bug test to find the exact mechanics of the HALT bug, then write it. Even though the values for the result were correct, it still wouldn’t pass. This was because of an oversight on my part when I was writing the interrupt handling. The IF byte (0xff0f, pending interrupts, whether or not they’re enabled) in hardware always has its highest 3 bits as 1, and I didn’t think it was necesary to implement this when I was writing interrupt handling, so I ignored it. And finally, fixing that, the HALT bug worked. The screenshots are: Gambatte failing the test. mGBA passing. RustBoy (May change to GameGirl/RustGirl for uniqueness and searchability) passing. See y’all next time!"}, {"post_id": 58276, "ts": "2026-08-30T17:25:28Z", "hours": 4.9708, "text": "You’ve Been Selected for a “Random” Screening Hello Everyone! We are back! I don’t know how it’s already been over 4½ hours! Let’s dive straight into the progress! They Know How to Push Each Other’s Buttons After making constructors for the structs and refactoring the button data struct, I added a loop to handle all waiting button presses and set the data in the button data struct. Not particularly complicated, though it was fun to test something that actually did something. Staaaaahhp Instructions take a set amount of time, so it is necessary to have a pause, since even a TI-84 (buy the CG-50 or HP Prime G2 instead; don’t get the CG-100, it lacks plugin support, which is why I recommend the CG-50 at all) is faster. Since systems can’t pause for a single tick, it pauses frame-by-frame instead. How to Exit Neovim I didn’t take the time to add a break condition, so I added a check to see if the escape key had been pressed, and if it had, it quit the application. Show Me the Money The biggest development was the render loop. Now, there is actually a visual to see and play with. Paint a Pretty Picture I also felt it would be boring if there was only one colour theme, so I added an enum along with PixelValue => Colour matching so that you can pick a theme! Speaking of picking… Staring at a Config File Since the user has to be able to pick a theme, I felt it would be good to have config.toml support for ease of use."}, {"post_id": 57137, "ts": "2026-08-29T07:35:57Z", "hours": 5.585, "text": "Building Buttons Hi everyone!! It seems that time has slipped away from me yet again, so let’s dive straight into your scheduled content! Pushy Pushy Buttons After dealing with sprites (oh! the horror! the suffering! the despair!), it was time to deal with a new kind of beast: the joypad. Implementing joypad functionality meant it was time to make a frontend (ew) instead of just building subsystems and cobbling them together later. This meant it was time to learn stuff about the crossterm crate and make some constructor functions. The screenshot is my current struct for storing the button push data. It used to be 8 bools, but that was 7 bytes too many, so it’s just a u8 wrapper now. Cross-multiply Those Terms! Crossterm is a crate for dealing with terminal keyboard interrupt and such. The first and only thing I’ve done so far was make a wrapper with a custom destructor for Keyboard enhancement flags. struct TerminalGuard { enhancement_pushed : bool , } impl TerminalGuard { fn new () -> std :: io :: Result < Self > { enable_raw_mode () ? ; let enhancement_pushed = supports_keyboard_enhancement () .unwrap_or ( false ); if enhancement_pushed { execute! ( stdout (), PushKeyboardEnhancementFlags ( KeyboardEnhancementFlags :: REPORT_EVENT_TYPES ) ) ? ; } Ok ( Self { enhancement_pushed }) } } impl Drop for TerminalGuard { fn drop ( & mut self ) { if self .enhancement_pushed { let _ = execute! ( stdout (), PopKeyboardEnhancementFlags ); } let _ = disable_raw_mode (); } } Computah, Make me a New Computah Since it was time to write a main() fn, it meant I also had to write constructor functions for CPU and all it’s subsidiaries, since I’ve not bothered to do it before. That’s it folks! See y’all next time!"}, {"post_id": 53353, "ts": "2026-08-23T21:11:57Z", "hours": 2.6878, "text": "Crack Open a Sprite Hello everyone! This dvelopment took longer than expected, so let’s just dive right in! County Rogues, Bring me lOAM After I finished the window layer, it was time to deal with sprites. Where each sprite is on the screen, which tiles to use, and sprite-specific render attributes are stored in a section of memory called OAM. 40 sprites’ data can be stored in OAM, each 4 bytes: the x position, y position, which tile(s) to use, and the attributes of that sprite (height, when to render, etc.) Unlike the background and window, sprites have a lot more moving parts. Here’s my code for rendering the sprites to the buffer. fn render_sprites ( & mut self ) { let lcdc = self .read_byte ( 0xff40 ); if lcdc >> 1 & 0x1 == 0 { return ; } let mut indexes = ( 0 .. 40 ) .collect :: < Vec < u16 >> (); indexes .sort_unstable_by_key (| n | ( self .read_byte ( 0xfe01 + n * 4 ) as i16 - 8 , * n )); let indexes : Vec <& u16 > = indexes .iter () .rev () .collect (); let height = if lcdc >> 2 & 0x1 == 0 { 8 } else { 16 }; for n in indexes { let entry = 0xfe00 + n * 4 ; let sprite_y = self .read_byte ( entry ) as i16 - 16 ; let sprite_x = self .read_byte ( entry + 0x1 ) as i16 - 8 ; let tile_index = self .read_byte ( entry + 0x2 ); let attributes = self .read_byte ( entry + 0x3 ); let palette = if ( attributes >> 4 ) & 0x1 == 0 { 0xff48 } else { 0xff49 }; for row in sprite_y .clamp ( 0 , 144 ) as u8 .. ( sprite_y + height ) .clamp ( 0 , 144 ) as u8 { for column in sprite_x .clamp ( 0 , 160 ) as u8 .. ( sprite_x + 8 ) .clamp ( 0 , 160 ) as u8 { if ( attributes >> 7 ) & 0x1 == 1 && self .bit_7_check ( row , column ) { continue ; } let row_in_sprite = if ( attributes >> 6 ) & 0x1 == 0 { ( row as i16 - sprite_y ) as usize } else { height as usize - ( row as i16 - sprite_y ) as usize - 1 }; let column_in_sprite = if ( attributes >> 5 ) & 0x1 == 0 { ( column as i16 - sprite_x ) as usize } else { 7 - ( column as i16 - sprite_x ) as usize }; let which_tile = if row_in_sprite < 8 { ( 0 , 0 ) } else { ( 1 , 8 ) }; let pixel = self .index_to_tile_unsigned ( tile_index + which_tile .0 ) [ row_in_sprite - which_tile .1 ][ column_in_sprite ]; if pixel == TilePixelValue :: Zero { continue ; } let value = self .palette_lookup ( pixel , palette ); self .gpu .set_pixel ( row , column , value ); } } } } fn bit_7_check ( & self , row : u8 , column : u8 ) -> bool { if self .window_active_for_pixel ( column , row ) { if self .window_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } return true ; } if self .background_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } true } This also excludes any boilerplate for window and background that I had to reuse. The most annoying part was dealing with ordering indexes efficiently, because the x value of the sprite is used as the method for sprite precedence over layers. I didn’t realise that sort_unstable_by_key dealt with like tuples and you could use that for precedence and tiebreaking. Anyway, that’s all folks! see y’all next time!"}, {"post_id": 51464, "ts": "2026-08-21T05:58:56Z", "hours": 1.9039, "text": "Ogres are like Onions Hello everyone! This time, I’ve fortunately logged a normal amount of time. Let’s dive in! Close the Window! After the background rendering was complete, it was time to work on the next layer: the window. The window is exactly as it sounds — the layer between sprites and the background that can have ui and stuff. The window starts at a position dictated by wx and wy (0xff4b and 0xff4a in memory), and those two dictate the top-left corner of the window layer (though wx - 7 is the actual top-left x coord). If a game wants to have a window layer that ends, it will switch off the window layer BETWEEN scanlines, which my current implementation cannot do because I render the whole frame at VBlank (after all scanlines) for simplicity, and it’s not strictly necessary. The code implementation of the window layer was relatively similar to background: fn window_active_for_pixel ( & self , screen_x : u8 , screen_y : u8 ) -> bool { if ( self .read_byte ( 0xff40 ) >> 5 ) & 0x1 == 0 { return false ; } let wy = self .read_byte ( 0xff4a ); let wx = self .read_byte ( 0xff4b ); if screen_y >= wy && screen_x >= wx .saturating_sub ( 7 ) { return true ; } false } fn window_pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let window_y = screen_y - self .read_byte ( 0xff4a ); let window_x = screen_x + 7 - self .read_byte ( 0xff4b ); let window_tile_map_index = ( window_y / 8 ) as u16 * 32 + ( window_x / 8 ) as u16 ; let window_tile_map_base = if ( self .read_byte ( 0xff40 ) >> 6 ) & 0x1 == 0 { 0x9800 } else { 0x9c00 }; let tile = & self .index_to_tile ( self .read_byte ( window_tile_map_base + window_tile_map_index )); tile [( window_y % 8 ) as usize ][( window_x % 8 ) as usize ] } The next step is the final layer: Sprites! Sprites will be more involved and unique compared to background and window. I still can’t believe the Sharp SM83 did all this for developers. See y’all next time!"}, {"post_id": 50574, "ts": "2026-08-19T19:34:48Z", "hours": 4.8942, "text": "No More GPU Crisis Hello everyone! It seems that, yet again, time has slipped away from me! Let’s dive back in! STATistics When the chip swaps rendering modes, depending on whether the STAT register enables that specific interrupt, it will trigger a STAT interrupt (priority level 2). I had to set up a loop to shift modes so that each mode can easily be fully handled (see screenshot). This was just a matter of finding out how long each mode and line lasted, relatively simple. Render Engines After this, I had to start adding rendering features. There are three components to the rendering: Background Window Sprites The first, and easiest part, was the background. Which tiles compose the background is dictated by a series of bytes after either 0x9800 or 0x9c00, which have references to tiles in memory. Pretty simple. fn render_to_buffer ( & mut self ) { for row in 0 .. 144 { for column in 0 .. 160 { self .gpu .set_pixel ( row , column , self .bgp_palette_lookup ( self .pixel_value ( column , row )), ); } } } fn pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let map_y = self .read_byte ( 0xff42 ) .wrapping_add ( screen_y ); let map_x = self .read_byte ( 0xff43 ) .wrapping_add ( screen_x ); let tile_map_index = ( map_y / 8 ) as u16 * 32 + ( map_x / 8 ) as u16 ; let tile_map_base = if ( self .read_byte ( 0xff40 ) >> 3 ) & 0x1 != 0 { 0x9c00 } else { 0x9800 }; let tile : & Tile = & self .index_to_tile ( self .read_byte ( tile_map_base + tile_map_index )); tile [( map_y % 8 ) as usize ][( map_x % 8 ) as usize ] } fn index_to_tile ( & self , index : u8 ) -> Tile { let unsigned = ( self .read_byte ( 0xff40 ) >> 4 ) & 0x1 != 0 ; if unsigned { return self .gpu.tile_set [ index as usize ]; } let signed_index = ( 256 + ( index as i8 as i16 )) as usize ; self .gpu.tile_set [ signed_index ] } fn bgp_palette_lookup ( & self , value : TilePixelValue ) -> PixelValue { let index = value as u8 ; match ( self .read_byte ( 0xff47 ) >> ( index * 2 )) & 0b11 { 0 => PixelValue :: White , 1 => PixelValue :: LightGray , 2 => PixelValue :: DarkGray , 3 => PixelValue :: Black , _ => panic! ( \"Unknown shade\" ), } } The next step is the window, then the sprites. Sprites will be hard due to their varied size. See y’all next time!"}, {"post_id": 48739, "ts": "2026-08-17T08:32:42Z", "hours": 2.0075, "text": "Div(isions of time) Hello everyone! This time, I actually remembered to make a devlog! Let’s dive in! Div(vy up Labour) Remember how I added the number of ticks each instruction took as a return value from the execute() fn? Well, it actually got put to use now! There is an internal 16-bit timer in the Sharp SM83, the upper 8 bits of which are exposed at memory address 0xff04. Programming this was pretty easy once I realised I could have read_byte() and write_byte() directly access the counter (Originally, I was going to have an update_div thingy probably and have the bte in memory and the accumulator be separate rather than this simpler approach). pub fn read_byte ( & self , address : u16 ) -> u8 { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .read_vram ( address - VRAM_BEGIN ), 0xff04 => ( self .div_accumulator >> 8 ) as u8 , _ => self .memory [ address ], } } pub fn write_byte ( & mut self , address : u16 , byte : u8 ) { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .write_vram ( address - VRAM_BEGIN , byte ), // Any write to div resets it and its accumulator 0xff04 => self .div_accumulator = 0 , _ => self .memory [ address ] = byte , }; } Now, last time, I set up interrupts, so with div set up, it was time to set up timer interrupts. TIMA Time What actually triggers timer interrupts, rather than div, is a separate timer called TIMA (0xff05 in memory). TIMA has settings set in TAC (0xff07 in memory). Bits 0 and 1 of TAC dictate which bit of the DIV accumulator (let’s call it divacc) to watch to see when TIMA should be incremented. Bit 2 dictates whether TIMA should be incremented at all. TIMA gets incremented whenever the indicated bit of divacc falls from 1 → 0. This can sometimes be as few as every 16 ticks, and since instructions can take up to 24 ticks, this can cause the bit to go from 1 → 0 → 1, which means that you can’t just check the new divacc against the old one to see whether the bit fell, though I tried this as a temporary solution. This is what I had to do instead (see screenshot). I wish it could be prettier, but what can you do? Anyways, y’all, see you next time!"}, {"post_id": 47323, "ts": "2026-08-15T06:28:37Z", "hours": 2.7594, "text": "Interrupting Cow Hello everyone! This took a lot longer than I expected due to a large amount of me getting confused by how interrupts work. Let’s dive in! Halt! After dealing with tick returns, the next step was dealing with interrupts. There are two bytes in memory that concern interrupts. One is IE (0xffff), which tells which interrupts to listen for, and the other is IF (0xff0f), which tells which interrupts are currently pending. Dealing with these was easy enough, but there was another thing that needed addressing: The Halt Bug The halt bug is a known bug that, should Halt be ran when there are interrupts pending and the IME (interrupt master enable I think) is off, it doesn’t halt and the next instruction runs twice. I was both confused by how this behaved and how it was triggered, which caused issues with my code that had to be addressed. I wasn’t able to deal with anything besides interrupt handling , so that’s all for now!"}, {"post_id": 46748, "ts": "2026-08-14T07:06:18Z", "hours": 3.7389, "text": "Ticking Time Bomb Hello everyone! It seems that, yet again, I have forgotten to make a devlog for a few hours, so let’s dive in! Fortunately, not much has happened. 16 GB of VRAM As I said in my last devlog, it was time to get started on graphical stuff. I set up a GPU struct with a separate VRAM, and set up the memory to write to that VRAM instead of the regular bus when it’s supposed to. This was also the last part of the docs I’ve been following, so I’ve been on my own since this point. It’s a little pesky that my best resources on how the GB works are now Claude Code and a random opcode table, but what can you do? Tick-Tock Goes the Clock Different operations in the GB’s processor take different numbers of clock cycles to do, so I had to add this as a second return value to execute to add slowing in the future. This was the majority of the hours I logged, staring at the opcode table and trying to figure out the patterns in the timings. Anyway, see y’all next time! These are some silly things that will probably land for at least some of you."}, {"post_id": 46058, "ts": "2026-08-13T00:13:53Z", "hours": 1.3156, "text": "Where are my keys? Hello everyone! We are back with a little news, so let’s dive right in! Hashmap, was not, in fact, the solution The mapping from opcode to instruction enum (fn from_byte()) is finally done. Not much to say except that it was a very tedious process. While working, I realised I hadn’t implemented ADD SP, i8 (addassign a signed integer to the stack pointer) yet, so I quickly added that. Unfortunately, that’s all folks! Next, I’m going to start dealing with graphics."}, {"post_id": 45921, "ts": "2026-08-12T18:07:20Z", "hours": 1.9139, "text": "Miscellany Hello everyone! Let’s keep this quick because I have much tedium to get through. What the Hecc is JR?! I finished most of instructions, so I needed to figure out which ones I forgot. I was looking at the opcode table and I realised I had no idea what JR or DAA did, so I had to figure out what they did. JR is just a relative jump rather than an absolute one, and DAA does some number formatting after an arithmetic op for better display. Let’s Table this Discussion Since the instructions that I can implement right now (very nearly all of them, except for stop and interrupts, etc.), it’s been time to update the Instruction::from_byte() fn with all the new instructions. I’m still doing this, and it is purely looking at the opcode table, entering something, looking at the opcode table again, looking at what I wrote, and repeating this over and over and over again. I’m not even done with this! Anyway, enjoy a hashmap meme that doesn’t apply to me b/c I am using a match"}, {"post_id": 45633, "ts": "2026-08-12T08:00:46Z", "hours": 1.6425, "text": "Pushpops Hello everyone! This time, I actually logged a normal amount of time! Let’s dive in! Loading Shipments I finally finished up the LD instruction! once I got through the weird targets, everything was smooth sailing. Stack Overflow Once LD was done, it was time to implement the stack. If you don’t know what (a/the) stack is, reference the wikipedia screenshot. For the GB, the two methods are PUSH and POP, and the stack actually goes down in memory from the end of the memory bus rather than from the beginning. Dear Functional Bros When I finished implementing the stack, which I though was going to be a lot harder, it was time to add functions to it. This was pretty simple: a CALL instr. that jumps to a point and puts the place where it left off on the stack and a RET instr. that goes to the last location on the stack."}, {"post_id": 45566, "ts": "2026-08-12T04:30:55Z", "hours": 3.2408, "text": "Loading Jump Time Hello everyone! I lost track of time, and it appears I have once more logged too many hours with no devlog, yet no excuses I have. Let’s get right to it! HL and D8 A lot of Instructions that I had already made have an HL target, in which they use the value in the joint register HL as an address in memory, and perform the operation on that byte. Up until this point, all HL targets were todos, but, since I had created the memory bus, I was able to quickly wire up those targets. A lot of those same instructions could also take the next byte in memory as the input (D8) so I wired those up too (though before HL). I actually wasn’t sure whether HL targets used a different memory bus than the one used for operations. JP Morgan The next instruction to deal with was JP (jump). Based on different conditions (the state of the zero flag or carry flag, or always) it would or wouldn’t jump to the address encoded over the next two bytes. Probably one of the easier instructions I’ve made. Loading… After JP was load. LD just copies data from one place to another. There are so many variations that I can’t talk about all of them, and there my code is too long for this devlog, so: Byte: Load a byte from point a to point b Word: just like the Byte type except with 16-bit valuesAFromIndirect: load the A register with the contents from a value from a memory location whose address is stored in some locationIndirectFromA: load a memory location whose address is stored in some location with the contents of the A registerAFromByteAddress: Just like AFromIndirect except the memory address is some address in the very last byte of memory.ByteAddressFromA: Just like IndirectFromA except the memory address is some address in the very last byte of memory. This is the opcode table I’ve been using"}, {"post_id": 45409, "ts": "2026-08-11T20:46:14Z", "hours": 4.115, "text": "Timeliness Rather unfortunately, a lot of work has been done since the last devlog due to yesterday’s hackatime outage. Let’s get started! House of Memories As I mentioned in the last devlog, the next step was to create a program counter (pc, marks where in the program we are) and the memory bus (with all the instructions we have been emulating for the GB to run, and others) Bite the Code The instructions are not stored as plain text of enums, they are stored as bytes , one byte for each combination of instruction and target. I thus have to map each bytecode to each instruction that I have added so far. Not English Class! Anything but English! There are much more than 256 different bytecodes; there are actually nearly 512. To accomplish this and still have memory be 1 byte, there is a bytecode prefix , 0xcb, which tells the chip that the real instruction is the next one, and to look it up on a different table. PCMR To go through each instruction, I added a step function: fn step ( & mut self ) { let ( instruction_byte , prefixed ) = { let temp_byte = self .bus .read_byte ( self .pc ); if temp_byte == 0xcb { ( self .bus .read_byte ( self .pc + 1 ), true ) } else { ( temp_byte , false ) } }; let next_pc = if let Some ( instruction ) = Instruction :: from_byte ( instruction_byte , prefixed ) { self .execute ( instruction ) } else { panic! ( \"Unknown instruction found for: 0x{:x}\" , instruction_byte ); }; self .pc = next_pc ; } As you can see, execute returns the next pc value, something it didn’t do before. So, I had to go and make all the match arms blocks that do their associated action and also return self.pc.wrapping_add(1) for non-0xcb functions and self.pc.wrapping_add(2) for 0xcb functions, since no function that modifies the pc has been added yet. Next is added yet more instructions! See y’all next time!"}, {"post_id": 44287, "ts": "2026-08-09T22:52:31Z", "hours": 2.3447, "text": "Registering New Data Hello Everyone! You know what they say: mo’ code mo’ devlogs. To the right, to the right, to the right, the right, the right I finished up all the instructions that act on register data!!! Specifically, these ones: ADD - Add the value of the target register to the A register. ADDHL (add to HL) - just like ADD except that the target is added to the HL register ADC (add with carry) - just like ADD except that the value of the carry flag is also added to the number SUB (subtract) - subtract the value stored in a specific register with the value in the A register SBC (subtract with carry) - just like ADD except that the value of the carry flag is also subtracted from the number AND (logical and) - do a bitwise and on the value in a specific register and the value in the A register OR (logical or) - do a bitwise or on the value in a specific register and the value in the A register XOR (logical xor) - do a bitwise xor on the value in a specific register and the value in the A register CP (compare) - just like SUB except the result of the subtraction is not stored back into A INC (increment) - increment the value in a specific register by 1 DEC (decrement) - decrement the value in a specific register by 1 CCF (complement carry flag) - toggle the value of the carry flag SCF (set carry flag) - set the carry flag to true RRA (rotate right A register) - bit rotate A register right through the carry flag RLA (rotate left A register) - bit rotate A register left through the carry flag RRCA (rotate right A register) - bit rotate A register right (not through the carry flag) RLCA (rotate left A register) - bit rotate A register left (not through the carry flag) CPL (complement) - toggle every bit of the A registerBIT (bit test) - test to see if a specific bit of a specific register is set RES (bit reset) - set a specific bit of a specific register to 0 SET (bit set) - set a specific bit of a specific register to 1 SRL (shift right logical) - bit shift a specific register right by 1 RR (rotate right) - bit rotate a specific register right by 1 through the carry flag RL (rotate left) - bit rotate a specific register left by 1 through the carry flag RRC (rorate right) - bit rotate a specific register right by 1 (not through the carry flag) RLC (rorate left) - bit rotate a specific register left by 1 (not through the carry flag) SRA (shift right arithmetic) - arithmetic shift a specific register right by 1 SLA (shift left arithmetic) - arithmetic shift a specific register left by 1 SWAP (swap nibbles) - switch upper and lower nibble of a specific register Some of the bitwise ops for rotation were a little difficult, but I was able to troubleshoot. Next is the game ROM, the program counter, prefix instructions, and jump instructions!"}, {"post_id": 43849, "ts": "2026-08-09T08:49:27Z", "hours": 1.5925, "text": "Untargeted Improvements Hello everyone! New day, new devlog! I added some new instructions! CCF — Clear Carry Flag SCF — Set Carry Flag RRA — Rotate Right A RLA — Rotate Left A RRCA — Rotate Right Circular A RLCA — Rotate Left Circular A CPL — Complement Bits of A Register Figuring out some of the bitwise logic for the rotation command, especially RLA (and because I was working in the car) was kind of difficult. fn rra ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = value & 0x1 == 1 ; self .registers.f.half_carry = false ; ( value >> 1 ) | ( carry << 7 ) } fn rla ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = ( value >> 7 ) & 0x1 == 1 ; // Originally I was doing the bit isolation before the bitshift, // and I forgot about the bitshift initially, // so I was just doing a bit isolation and then clippy complained b/c it would never be true. self .registers.f.half_carry = false ; ( value << 1 ) | carry } Next are BIT, RES, and SET, and then more instructions! The image is a question I saw on Protobowl a few months back."}, {"post_id": 43618, "ts": "2026-08-09T00:03:21Z", "hours": 2.3414, "text": "Target Practise Hello everyone! We’re back with another devlog! Instructor I managed to finish up all the instructions (minus the HL sections of those because that uses the value in the combined HL register as a pointer to memory, which I did not yet add) that were already in the enum (screenshot from last devlog). I also just added the INC and DEC instructions, which increment or decrement the value in the target register or byte in memory pointed to by HL. It was a bit of a hassle to figure out how I should do the target enums, since there is an 8 and 16 bit version of each INC and DEC, each with different targets. INC8 can target the byte of memory pointed to by HL, whereas INC16 can point to HL itself and the other 3 16 bit registers. See y’all next time!"}, {"post_id": 43150, "ts": "2026-08-08T08:10:23Z", "hours": 1.7228, "text": "We’ve Brought Some New Additions After finishing up the LZU and its associated rating, it’s time to get back to work on this project! There are no Antarctic Pyramids Ever since I heard about the wonderful site that is Codeberg, I’ve wanted to swap to there, but the thing stopping me was this challenge, because I thought it only worked with GitHub, but when I was rating projects, I found that one of them was on Codeberg. Because of that, I swapped over this repo to Codeberg, which it made very easy, and continued on my coding journey. Yesop Like I said in my last devlog, I have to implement the instructions for the CPU in code! I managed to create most of the implementations for AddHL and Adc, only stopped by the fact that I still need to emulate memory. The next step is to finish Sub and the rest of the ops in this enum, then the rest of the instructions! See y’all next time!"}, {"post_id": 42269, "ts": "2026-08-06T21:57:24Z", "hours": 1.3686, "text": "Register Additions Welcome to my first devlog! I am building a GameBoy emulator in Rust!! Didn’t Register The first step was emulating the registers. The GB has 8 8-bit registers, and sometimes they are combined 2-together to form 16-bit registers. 1 of the registers, register f, is the flag register. It’s upper four bits are different flags for things like carry and half carry. Didn’t Compute Next, I had to start making the cpu struct. It has to be capable of executing commands, like ADD, so there is a command enum with different commands, though it only has ADD right now, and I still need to figure out all the possible ADD targets."}]...
|
Title: Riggurly by @infinite_silly | Stardance
De Title: Riggurly by @infinite_silly | Stardance
Devlogs:
Register Additions Welcome to my first devlog! I am building a GameBoy emulator in Rust!! Didn’t Register The first step was emulating the registers. The GB has 8 8-bit registers, and sometimes they are combined 2-together to form 16-bit registers. 1 of the registers, register f, is the flag register. It’s upper four bits are different flags for things like carry and half carry. Didn’t Compute Next, I had to start making the cpu struct. It has to be capable of executing commands, like ADD, so there is a command enum with different commands, though it only has ADD right now, and I still need to figure out all the possible ADD targets.
We’ve Brought Some New Additions After finishing up the LZU and its associated rating, it’s time to get back to work on this project! There are no Antarctic Pyramids Ever since I heard about the wonderful site that is Codeberg, I’ve wanted to swap to there, but the thing stopping me was this challenge, because I thought it only worked with GitHub, but when I was rating projects, I found that one of them was on Codeberg. Because of that, I swapped over this repo to Codeberg, which it made very easy, and continued on my coding journey. Yesop Like I said in my last devlog, I have to implement the instructions for the CPU in code! I managed to create most of the implementations for AddHL and Adc, only stopped by the fact that I still need to emulate memory. The next step is to finish Sub and the rest of the ops in this enum, then the rest of the instructions! See y’all next time!
Target Practise Hello everyone! We’re back with another devlog! Instructor I managed to finish up all the instructions (minus the HL sections of those because that uses the value in the combined HL register as a pointer to memory, which I did not yet add) that were already in the enum (screenshot from last devlog). I also just added the INC and DEC instructions, which increment or decrement the value in the target register or byte in memory pointed to by HL. It was a bit of a hassle to figure out how I should do the target enums, since there is an 8 and 16 bit version of each INC and DEC, each with different targets. INC8 can target the byte of memory pointed to by HL, whereas INC16 can point to HL itself and the other 3 16 bit registers. See y’all next time!
Untargeted Improvements Hello everyone! New day, new devlog! I added some new instructions! CCF — Clear Carry Flag SCF — Set Carry Flag RRA — Rotate Right A RLA — Rotate Left A RRCA — Rotate Right Circular A RLCA — Rotate Left Circular A CPL — Complement Bits of A Register Figuring out some of the bitwise logic for the rotation command, especially RLA (and because I was working in the car) was kind of difficult. fn rra ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = value & 0x1 == 1 ; self .registers.f.half_carry = false ; ( value >> 1 ) | ( carry << 7 ) } fn rla ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = ( value >> 7 ) & 0x1 == 1 ; // Originally I was doing the bit isolation before the bitshift, // and I forgot about the bitshift initially, // so I was just doing a bit isolation and then clippy complained b/c it would never be true. self .registers.f.half_carry = false ; ( value << 1 ) | carry } Next are BIT, RES, and SET, and then more instructions! The image is a question I saw on Protobowl a few months back.
Registering New Data Hello Everyone! You know what they say: mo’ code mo’ devlogs. To the right, to the right, to the right, the right, the right I finished up all the instructions that act on register data!!! Specifically, these ones: ADD - Add the value of the target register to the A register. ADDHL (add to HL) - just like ADD except that the target is added to the HL register ADC (add with carry) - just like ADD except that the value of the carry flag is also added to the number SUB (subtract) - subtract the value stored in a specific register with the value in the A register SBC (subtract with carry) - just like ADD except that the value of the carry flag is also subtracted from the number AND (logical and) - do a bitwise and on the value in a specific register and the value in the A register OR (logical or) - do a bitwise or on the value in a specific register and the value in the A register XOR (logical xor) - do a bitwise xor on the value in a specific register and the value in the A register CP (compare) - just like SUB except the result of the subtraction is not stored back into A INC (increment) - increment the value in a specific register by 1 DEC (decrement) - decrement the value in a specific register by 1 CCF (complement carry flag) - toggle the value of the carry flag SCF (set carry flag) - set the carry flag to true RRA (rotate right A register) - bit rotate A register right through the carry flag RLA (rotate left A register) - bit rotate A register left through the carry flag RRCA (rotate right A register) - bit rotate A register right (not through the carry flag) RLCA (rotate left A register) - bit rotate A register left (not through the carry flag) CPL (complement) - toggle every bit of the A registerBIT (bit test) - test to see if a specific bit of a specific register is set RES (bit reset) - set a specific bit of a specific register to 0 SET (bit set) - set a specific bit of a specific register to 1 SRL (shift right logical) - bit shift a specific register right by 1 RR (rotate right) - bit rotate a specific register right by 1 through the carry flag RL (rotate left) - bit rotate a specific register left by 1 through the carry flag RRC (rorate right) - bit rotate a specific register right by 1 (not through the carry flag) RLC (rorate left) - bit rotate a specific register left by 1 (not through the carry flag) SRA (shift right arithmetic) - arithmetic shift a specific register right by 1 SLA (shift left arithmetic) - arithmetic shift a specific register left by 1 SWAP (swap nibbles) - switch upper and lower nibble of a specific register Some of the bitwise ops for rotation were a little difficult, but I was able to troubleshoot. Next is the game ROM, the program counter, prefix instructions, and jump instructions!
Timeliness Rather unfortunately, a lot of work has been done since the last devlog due to yesterday’s hackatime outage. Let’s get started! House of Memories As I mentioned in the last devlog, the next step was to create a program counter (pc, marks where in the program we are) and the memory bus (with all the instructions we have been emulating for the GB to run, and others) Bite the Code The instructions are not stored as plain text of enums, they are stored as bytes , one byte for each combination of instruction and target. I thus have to map each bytecode to each instruction that I have added so far. Not English Class! Anything but English! There are much more than 256 different bytecodes; there are actually nearly 512. To accomplish this and still have memory be 1 byte, there is a bytecode prefix , 0xcb, which tells the chip that the real instruction is the next one, and to look it up on a different table. PCMR To go through each instruction, I added a step function: fn step ( & mut self ) { let ( instruction_byte , prefixed ) = { let temp_byte = self .bus .read_byte ( self .pc ); if temp_byte == 0xcb { ( self .bus .read_byte ( self .pc + 1 ), true ) } else { ( temp_byte , false ) } }; let next_pc = if let Some ( instruction ) = Instruction :: from_byte ( instruction_byte , prefixed ) { self .execute ( instruction ) } else { panic! ( "Unknown instruction found for: 0x{:x}" , instruction_byte ); }; self .pc = next_pc ; } As you can see, execute returns the next pc value, something it didn’t do before. So, I had to go and make all the match arms blocks that do their associated action and also return self.pc.wrapping_add(1) for non-0xcb functions and self.pc.wrapping_add(2) for 0xcb functions, since no function that modifies the pc has been added yet. Next is added yet more instructions! See y’all next time!
Loading Jump Time Hello everyone! I lost track of time, and it appears I have once more logged too many hours with no devlog, yet no excuses I have. Let’s get right to it! HL and D8 A lot of Instructions that I had already made have an HL target, in which they use the value in the joint register HL as an address in memory, and perform the operation on that byte. Up until this point, all HL targets were todos, but, since I had created the memory bus, I was able to quickly wire up those targets. A lot of those same instructions could also take the next byte in memory as the input (D8) so I wired those up too (though before HL). I actually wasn’t sure whether HL targets used a different memory bus than the one used for operations. JP Morgan The next instruction to deal with was JP (jump). Based on different conditions (the state of the zero flag or carry flag, or always) it would or wouldn’t jump to the address encoded over the next two bytes. Probably one of the easier instructions I’ve made. Loading… After JP was load. LD just copies data from one place to another. There are so many variations that I can’t talk about all of them, and there my code is too long for this devlog, so: Byte: Load a byte from point a to point b Word: just like the Byte type except with 16-bit valuesAFromIndirect: load the A register with the contents from a value from a memory location whose address is stored in some locationIndirectFromA: load a memory location whose address is stored in some location with the contents of the A registerAFromByteAddress: Just like AFromIndirect except the memory address is some address in the very last byte of memory.ByteAddressFromA: Just like IndirectFromA except the memory address is some address in the very last byte of memory. This is the opcode table I’ve been using
Pushpops Hello everyone! This time, I actually logged a normal amount of time! Let’s dive in! Loading Shipments I finally finished up the LD instruction! once I got through the weird targets, everything was smooth sailing. Stack Overflow Once LD was done, it was time to implement the stack. If you don’t know what (a/the) stack is, reference the wikipedia screenshot. For the GB, the two methods are PUSH and POP, and the stack actually goes down in memory from the end of the memory bus rather than from the beginning. Dear Functional Bros When I finished implementing the stack, which I though was going to be a lot harder, it was time to add functions to it. This was pretty simple: a CALL instr. that jumps to a point and puts the place where it left off on the stack and a RET instr. that goes to the last location on the stack.
Miscellany Hello everyone! Let’s keep this quick because I have much tedium to get through. What the Hecc is JR?! I finished most of instructions, so I needed to figure out which ones I forgot. I was looking at the opcode table and I realised I had no idea what JR or DAA did, so I had to figure out what they did. JR is just a relative jump rather than an absolute one, and DAA does some number formatting after an arithmetic op for better display. Let’s Table this Discussion Since the instructions that I can implement right now (very nearly all of them, except for stop and interrupts, etc.), it’s been time to update the Instruction::from_byte() fn with all the new instructions. I’m still doing this, and it is purely looking at the opcode table, entering something, looking at the opcode table again, looking at what I wrote, and repeating this over and over and over again. I’m not even done with this! Anyway, enjoy a hashmap meme that doesn’t apply to me b/c I am using a match
Where are my keys? Hello everyone! We are back with a little news, so let’s dive right in! Hashmap, was not, in fact, the solution The mapping from opcode to instruction enum (fn from_byte()) is finally done. Not much to say except that it was a very tedious process. While working, I realised I hadn’t implemented ADD SP, i8 (addassign a signed integer to the stack pointer) yet, so I quickly added that. Unfortunately, that’s all folks! Next, I’m going to start dealing with graphics.
Ticking Time Bomb Hello everyone! It seems that, yet again, I have forgotten to make a devlog for a few hours, so let’s dive in! Fortunately, not much has happened. 16 GB of VRAM As I said in my last devlog, it was time to get started on graphical stuff. I set up a GPU struct with a separate VRAM, and set up the memory to write to that VRAM instead of the regular bus when it’s supposed to. This was also the last part of the docs I’ve been following, so I’ve been on my own since this point. It’s a little pesky that my best resources on how the GB works are now Claude Code and a random opcode table, but what can you do? Tick-Tock Goes the Clock Different operations in the GB’s processor take different numbers of clock cycles to do, so I had to add this as a second return value to execute to add slowing in the future. This was the majority of the hours I logged, staring at the opcode table and trying to figure out the patterns in the timings. Anyway, see y’all next time! These are some silly things that will probably land for at least some of you.
Interrupting Cow Hello everyone! This took a lot longer than I expected due to a large amount of me getting confused by how interrupts work. Let’s dive in! Halt! After dealing with tick returns, the next step was dealing with interrupts. There are two bytes in memory that concern interrupts. One is IE (0xffff), which tells which interrupts to listen for, and the other is IF (0xff0f), which tells which interrupts are currently pending. Dealing with these was easy enough, but there was another thing that needed addressing: The Halt Bug The halt bug is a known bug that, should Halt be ran when there are interrupts pending and the IME (interrupt master enable I think) is off, it doesn’t halt and the next instruction runs twice. I was both confused by how this behaved and how it was triggered, which caused issues with my code that had to be addressed. I wasn’t able to deal with anything besides interrupt handling , so that’s all for now!
Div(isions of time) Hello everyone! This time, I actually remembered to make a devlog! Let’s dive in! Div(vy up Labour) Remember how I added the number of ticks each instruction took as a return value from the execute() fn? Well, it actually got put to use now! There is an internal 16-bit timer in the Sharp SM83, the upper 8 bits of which are exposed at memory address 0xff04. Programming this was pretty easy once I realised I could have read_byte() and write_byte() directly access the counter (Originally, I was going to have an update_div thingy probably and have the bte in memory and the accumulator be separate rather than this simpler approach). pub fn read_byte ( & self , address : u16 ) -> u8 { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .read_vram ( address - VRAM_BEGIN ), 0xff04 => ( self .div_accumulator >> 8 ) as u8 , _ => self .memory [ address ], } } pub fn write_byte ( & mut self , address : u16 , byte : u8 ) { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .write_vram ( address - VRAM_BEGIN , byte ), // Any write to div resets it and its accumulator 0xff04 => self .div_accumulator = 0 , _ => self .memory [ address ] = byte , }; } Now, last time, I set up interrupts, so with div set up, it was time to set up timer interrupts. TIMA Time What actually triggers timer interrupts, rather than div, is a separate timer called TIMA (0xff05 in memory). TIMA has settings set in TAC (0xff07 in memory). Bits 0 and 1 of TAC dictate which bit of the DIV accumulator (let’s call it divacc) to watch to see when TIMA should be incremented. Bit 2 dictates whether TIMA should be incremented at all. TIMA gets incremented whenever the indicated bit of divacc falls from 1 → 0. This can sometimes be as few as every 16 ticks, and since instructions can take up to 24 ticks, this can cause the bit to go from 1 → 0 → 1, which means that you can’t just check the new divacc against the old one to see whether the bit fell, though I tried this as a temporary solution. This is what I had to do instead (see screenshot). I wish it could be prettier, but what can you do? Anyways, y’all, see you next time!
No More GPU Crisis Hello everyone! It seems that, yet again, time has slipped away from me! Let’s dive back in! STATistics When the chip swaps rendering modes, depending on whether the STAT register enables that specific interrupt, it will trigger a STAT interrupt (priority level 2). I had to set up a loop to shift modes so that each mode can easily be fully handled (see screenshot). This was just a matter of finding out how long each mode and line lasted, relatively simple. Render Engines After this, I had to start adding rendering features. There are three components to the rendering: Background Window Sprites The first, and easiest part, was the background. Which tiles compose the background is dictated by a series of bytes after either 0x9800 or 0x9c00, which have references to tiles in memory. Pretty simple. fn render_to_buffer ( & mut self ) { for row in 0 .. 144 { for column in 0 .. 160 { self .gpu .set_pixel ( row , column , self .bgp_palette_lookup ( self .pixel_value ( column , row )), ); } } } fn pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let map_y = self .read_byte ( 0xff42 ) .wrapping_add ( screen_y ); let map_x = self .read_byte ( 0xff43 ) .wrapping_add ( screen_x ); let tile_map_index = ( map_y / 8 ) as u16 * 32 + ( map_x / 8 ) as u16 ; let tile_map_base = if ( self .read_byte ( 0xff40 ) >> 3 ) & 0x1 != 0 { 0x9c00 } else { 0x9800 }; let tile : & Tile = & self .index_to_tile ( self .read_byte ( tile_map_base + tile_map_index )); tile [( map_y % 8 ) as usize ][( map_x % 8 ) as usize ] } fn index_to_tile ( & self , index : u8 ) -> Tile { let unsigned = ( self .read_byte ( 0xff40 ) >> 4 ) & 0x1 != 0 ; if unsigned { return self .gpu.tile_set [ index as usize ]; } let signed_index = ( 256 + ( index as i8 as i16 )) as usize ; self .gpu.tile_set [ signed_index ] } fn bgp_palette_lookup ( & self , value : TilePixelValue ) -> PixelValue { let index = value as u8 ; match ( self .read_byte ( 0xff47 ) >> ( index * 2 )) & 0b11 { 0 => PixelValue :: White , 1 => PixelValue :: LightGray , 2 => PixelValue :: DarkGray , 3 => PixelValue :: Black , _ => panic! ( "Unknown shade" ), } } The next step is the window, then the sprites. Sprites will be hard due to their varied size. See y’all next time!
Ogres are like Onions Hello everyone! This time, I’ve fortunately logged a normal amount of time. Let’s dive in! Close the Window! After the background rendering was complete, it was time to work on the next layer: the window. The window is exactly as it sounds — the layer between sprites and the background that can have ui and stuff. The window starts at a position dictated by wx and wy (0xff4b and 0xff4a in memory), and those two dictate the top-left corner of the window layer (though wx - 7 is the actual top-left x coord). If a game wants to have a window layer that ends, it will switch off the window layer BETWEEN scanlines, which my current implementation cannot do because I render the whole frame at VBlank (after all scanlines) for simplicity, and it’s not strictly necessary. The code implementation of the window layer was relatively similar to background: fn window_active_for_pixel ( & self , screen_x : u8 , screen_y : u8 ) -> bool { if ( self .read_byte ( 0xff40 ) >> 5 ) & 0x1 == 0 { return false ; } let wy = self .read_byte ( 0xff4a ); let wx = self .read_byte ( 0xff4b ); if screen_y >= wy && screen_x >= wx .saturating_sub ( 7 ) { return true ; } false } fn window_pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let window_y = screen_y - self .read_byte ( 0xff4a ); let window_x = screen_x + 7 - self .read_byte ( 0xff4b ); let window_tile_map_index = ( window_y / 8 ) as u16 * 32 + ( window_x / 8 ) as u16 ; let window_tile_map_base = if ( self .read_byte ( 0xff40 ) >> 6 ) & 0x1 == 0 { 0x9800 } else { 0x9c00 }; let tile = & self .index_to_tile ( self .read_byte ( window_tile_map_base + window_tile_map_index )); tile [( window_y % 8 ) as usize ][( window_x % 8 ) as usize ] } The next step is the final layer: Sprites! Sprites will be more involved and unique compared to background and window. I still can’t believe the Sharp SM83 did all this for developers. See y’all next time!
Crack Open a Sprite Hello everyone! This dvelopment took longer than expected, so let’s just dive right in! County Rogues, Bring me lOAM After I finished the window layer, it was time to deal with sprites. Where each sprite is on the screen, which tiles to use, and sprite-specific render attributes are stored in a section of memory called OAM. 40 sprites’ data can be stored in OAM, each 4 bytes: the x position, y position, which tile(s) to use, and the attributes of that sprite (height, when to render, etc.) Unlike the background and window, sprites have a lot more moving parts. Here’s my code for rendering the sprites to the buffer. fn render_sprites ( & mut self ) { let lcdc = self .read_byte ( 0xff40 ); if lcdc >> 1 & 0x1 == 0 { return ; } let mut indexes = ( 0 .. 40 ) .collect :: < Vec < u16 >> (); indexes .sort_unstable_by_key (| n | ( self .read_byte ( 0xfe01 + n * 4 ) as i16 - 8 , * n )); let indexes : Vec <& u16 > = indexes .iter () .rev () .collect (); let height = if lcdc >> 2 & 0x1 == 0 { 8 } else { 16 }; for n in indexes { let entry = 0xfe00 + n * 4 ; let sprite_y = self .read_byte ( entry ) as i16 - 16 ; let sprite_x = self .read_byte ( entry + 0x1 ) as i16 - 8 ; let tile_index = self .read_byte ( entry + 0x2 ); let attributes = self .read_byte ( entry + 0x3 ); let palette = if ( attributes >> 4 ) & 0x1 == 0 { 0xff48 } else { 0xff49 }; for row in sprite_y .clamp ( 0 , 144 ) as u8 .. ( sprite_y + height ) .clamp ( 0 , 144 ) as u8 { for column in sprite_x .clamp ( 0 , 160 ) as u8 .. ( sprite_x + 8 ) .clamp ( 0 , 160 ) as u8 { if ( attributes >> 7 ) & 0x1 == 1 && self .bit_7_check ( row , column ) { continue ; } let row_in_sprite = if ( attributes >> 6 ) & 0x1 == 0 { ( row as i16 - sprite_y ) as usize } else { height as usize - ( row as i16 - sprite_y ) as usize - 1 }; let column_in_sprite = if ( attributes >> 5 ) & 0x1 == 0 { ( column as i16 - sprite_x ) as usize } else { 7 - ( column as i16 - sprite_x ) as usize }; let which_tile = if row_in_sprite < 8 { ( 0 , 0 ) } else { ( 1 , 8 ) }; let pixel = self .index_to_tile_unsigned ( tile_index + which_tile .0 ) [ row_in_sprite - which_tile .1 ][ column_in_sprite ]; if pixel == TilePixelValue :: Zero { continue ; } let value = self .palette_lookup ( pixel , palette ); self .gpu .set_pixel ( row , column , value ); } } } } fn bit_7_check ( & self , row : u8 , column : u8 ) -> bool { if self .window_active_for_pixel ( column , row ) { if self .window_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } return true ; } if self .background_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } true } This also excludes any boilerplate for window and background that I had to reuse. The most annoying part was dealing with ordering indexes efficiently, because the x value of the sprite is used as the method for sprite precedence over layers. I didn’t realise that sort_unstable_by_key dealt with like tuples and you could use that for precedence and tiebreaking. Anyway, that’s all folks! see y’all next time!
Building Buttons Hi everyone!! It seems that time has slipped away from me yet again, so let’s dive straight into your scheduled content! Pushy Pushy Buttons After dealing with sprites (oh! the horror! the suffering! the despair!), it was time to deal with a new kind of beast: the joypad. Implementing joypad functionality meant it was time to make a frontend (ew) instead of just building subsystems and cobbling them together later. This meant it was time to learn stuff about the crossterm crate and make some constructor functions. The screenshot is my current struct for storing the button push data. It used to be 8 bools, but that was 7 bytes too many, so it’s just a u8 wrapper now. Cross-multiply Those Terms! Crossterm is a crate for dealing with terminal keyboard interrupt and such. The first and only thing I’ve done so far was make a wrapper with a custom destructor for Keyboard enhancement flags. struct TerminalGuard { enhancement_pushed : bool , } impl TerminalGuard { fn new () -> std :: io :: Result < Self > { enable_raw_mode () ? ; let enhancement_pushed = supports_keyboard_enhancement () .unwrap_or ( false ); if enhancement_pushed { execute! ( stdout (), PushKeyboardEnhancementFlags ( KeyboardEnhancementFlags :: REPORT_EVENT_TYPES ) ) ? ; } Ok ( Self { enhancement_pushed }) } } impl Drop for TerminalGuard { fn drop ( & mut self ) { if self .enhancement_pushed { let _ = execute! ( stdout (), PopKeyboardEnhancementFlags ); } let _ = disable_raw_mode (); } } Computah, Make me a New Computah Since it was time to write a main() fn, it meant I also had to write constructor functions for CPU and all it’s subsidiaries, since I’ve not bothered to do it before. That’s it folks! See y’all next time!
You’ve Been Selected for a “Random” Screening Hello Everyone! We are back! I don’t know how it’s already been over 4½ hours! Let’s dive straight into the progress! They Know How to Push Each Other’s Buttons After making constructors for the structs and refactoring the button data struct, I added a loop to handle all waiting button presses and set the data in the button data struct. Not particularly complicated, though it was fun to test something that actually did something. Staaaaahhp Instructions take a set amount of time, so it is necessary to have a pause, since even a TI-84 (buy the CG-50 or HP Prime G2 instead; don’t get the CG-100, it lacks plugin support, which is why I recommend the CG-50 at all) is faster. Since systems can’t pause for a single tick, it pauses frame-by-frame instead. How to Exit Neovim I didn’t take the time to add a break condition, so I added a check to see if the escape key had been pressed, and if it had, it quit the application. Show Me the Money The biggest development was the render loop. Now, there is actually a visual to see and play with. Paint a Pretty Picture I also felt it would be boring if there was only one colour theme, so I added an enum along with PixelValue => Colour matching so that you can pick a theme! Speaking of picking… Staring at a Config File Since the user has to be able to pick a theme, I felt it would be good to have config.toml support for ease of use.
Human Error Hello everyone! I got too much in the flow and in the RAGE, which is why I logged nearly 8 hours since the last devlog! Let’s get in the weeds! Loading Bay I added ROM loading!!!!! I can actually load a test ROM in now!!! Naturally, I immediately loaded one in, and that brings us to our first issue. Speed? Issues When I was loading in a test ROM, the text of the name of the test would peek from the bottom of the screen, then jump up and not show passed. I probably spent 2 HOURS on trying to fix this. I thought it was a speed issue, and I ended up making a ton of optimisations and added alternate screen switching. BUT GUESS WHAT??? I zoomed out my terminal window, and there it was: Passed. I would share a screenshot, but I am currently working on changes to load_rom() that break the emulator currently (bank switching). Don’t Stop I mentioned a while ago that I had to emulate a bug in the hardware that caused the next instruction to occur twice if HALT is called when there is an interrupt pending and IME (interrupt master enable) is off. My implementation caused it to infinitely stall instead. So I fixed that bit, but the HALT bug test rom still wasn’t running the tests, so I found that LY couldn’t be read from memory, so fixing that fixed the thing, allowing the tests to run and FAIL. So I had to run a disassembler on the HALT bug test to find the exact mechanics of the HALT bug, then write it. Even though the values for the result were correct, it still wouldn’t pass. This was because of an oversight on my part when I was writing the interrupt handling. The IF byte (0xff0f, pending interrupts, whether or not they’re enabled) in hardware always has its highest 3 bits as 1, and I didn’t think it was necesary to implement this when I was writing interrupt handling, so I ignored it. And finally, fixing that, the HALT bug worked. The screenshots are: Gambatte failing the test. mGBA passing. RustBoy (May change to GameGirl/RustGirl for uniqueness and searchability) passing. See y’all next time!
You can switch the banks, switch banks, swi- swi- swi- swi- swi- — until you’re full of life Hello everyone! I changed the name of my project directory, so I wasn’t seeing my hackatime or had the ability to write a devlog until I realised the problem, so let’s just dive right in! Bank It The next thing to deal with was bank switching and better behaviour for handling roms. Cartridges are physical objects, and thus can have extra RAM and storage for the gameboy. These are controlled by MBCs (memory bank controllers). The most common ones are MBC1, MBC2, MBC3, and MBC5. For this project, for now, I am only emulating 1, 2, and 3. In the future, I will probably add more controllers once the full architecture is done for at least these three so I have an idea of hwo the skeletons should look. The first step of bank switching was having the rom portion of the memory be read-only and writes to it do certain mbc actions, like enable ram or switch banks or switch ram. I am currently implementing the switching of banks. I need to get back to MBC1-specific flags and writes. See y’all next time!
RAM or ROM Hello everyone! I’ve finally logged a normal amount of time again! Let’s dive right in! MBC Say One! I managed to bang out my first supported MBC (memory bank controller), a lot of it done while walking on the treadmill this morning. I had already implemented the ROM bank switching by this morning, so next I had to implement switching RAM banks, which has some pretty funky indexing. Grace Hopper Naturally, what does one do when they have a hopefully working MBC system, you try a rom!. I only found out tetris doesn’t use an mbc after removing my basic mbc substitute stuff that enabled me to run simple roms. Speaking of Tetris, the screenshots are me attempting to run tetris iwth different themes (the themes work, tetris doesn’t which we’ll get to). The themes in order Wisteria GBGRreen Jungle Developer (Don’t worry, there’s more themes, and you can always submit an issue or PR with a new theme) Let’s get back to BUGSSSS!! When I tried to run tetris, it wasn’t accepting input and the arrow showing which options are selected was unpresent. These issues are the next things to resolve. I found that there was a critical error in the read methods on my button data stuct Here is the commit with the changes in case you are curious. I found out that there is a spot in memory you can write to to load a sprite from some address into OAM. This is the next thing I will be implementing before I try finding the next issue with input so I can at least see some pretty sprites. Anyway, see y’all tomorrow after I hopefully get tetris working!
Can It Tetris? I say hello to you again, my near and dear viewers, as I begin this devlog with a frustratingly long amount of time logged. Let’s dive in so I can put the last few days behind me. DMing the Memory Last time I menioned that there was a feature I needed to add that allowed the cpu to write a byte to a register in memory to trigger a transfer of data from the address specified by the written byte to the OAM (object attribute memory — sprites and stuff; this transfer is the DMA OAM tranfer) because that was the main way stuff was written to oam b/c otherwise it would be too slow. Originally, I wrote a doubly recursive function kinda thing b/c it called read_byte() when it itself was called indirectly by read_byte() and it also called itself, but I scrapped it due to unguarenteed tail recursion and the slowness of repeatedly matching the section of memory being written to/read from, so I just used copy_within(). This also somehow fixed my input issues, so idk. Double Bug Whammy This is the part of the last few days that has been a slog and a horror. After adding the DMA OAM transfer, I tried running Tetris, and it worked…until I got into gameplay. The sprite showing the selected player amount on the start screen was working and it would respond to user input. However, when it hit actual gameplay, it wouldn’t render the tetromino sprites until they were baked into the background as part of setting in place. To try and diagnose the problem, I ran blarrg’s big cpu_instrs.gb test ROM, and it stopped rendering frames in the middle of the 3rd test, the standalone ROM for which had been working without a flaw. Testing in mGBA through RetroArch (I don’t have mGBA installed standalone on this device), I found that the test takes a second to run, but doesn’t cause the whole emulator to hang. Also, since new frames weren’t being completed, it wouldn’t poll for input since it only polls on a frame completion, which meant I had to close the terminal session to quit the emulator. I spent hours running tests just to find that it was getting hit by a STOP instruction it couldn’t escape. I checked Pan Docs and found there had been some unimplemented STOP behaviours. After implementing those and it still not working, I set STOP to only stop for a single cycle, which let the test ROM pass all the tests with no timing issues. After that, within 2 minutes, I was able to find an incorrect == (should have been !=) in my sprite attributes bit 7 sprite priority control, allowing Tetris to finally work!!! Next up is: MBC2 MBC3 MBC5 Saving Audio TUI rather than bare CLI a lib.rs so others can write a frontend on top of Rusty Game Girl A style guide and making my code compliant (hard to do while writing and over a codebase who’s size is at least 4.5x bigger than anything else I’ve ever worked with) Unit tests also here’s a video of me selling at Tetris b/c I wasn’t listening to Jamie Paige while playing
Clip It Hello comrades! We’re back with yet another devlog! Let’s dive in so I can get back to programming! Memory Control (Not 1984 Style) A bit ago, I mentioned that since cartridges were physical pieces of hardware, they could have logic chips of their own controlling their own RAM, so I would have to emulate those on top of the functionality of the actual GameBoy’s hardware. The next MBC (memory bank controller) to emulate was MBC2. MBC2 is weird. It has ROM banks as standard, but it also has 512 half-bytes of RAM built straight into the MBC chip for some reason. Those were a little weird to emulate, but altogether straightforward. I also had duplicated RAM indexing logic for both reading and writing to the cartridge RAM, which I marked todo in my code, so I had an excuse to do a quick refactor. After handling the weird little freak that is MBC2 was implementing No MBC. You may be asking, V, what’s there to emulate if there is nothing to emulate? And to that I say, it is once again weird and silly, just how we like it. Even if a game has no MBC, it can still have some RAM; it’s just always on and has no logic for accessing it. It ended up with me having to deal with a lil extra changes to handle some things I was not anticipating. Looks Like You’re Trying to Kill a Stick Figure A while ago, I watched a prime video (who was also the source of the idea for this project) about the Power of 10. I’ve since thought these rules are pretty neat and can serve to make code better (with possibly the exception of rule 7). I decided that I wanted to follow rule 10 for my code, so I foolishly set all lints to max pedantic, thinking I would have some lints, but I ENDED UP HAVING HUNDREDS OF MOSTLY USELESS LINTS, many of which ended up being me using as for casting causing less readable behaviour. Some of them were useful, such as me allocating MASSIVE arrays on the stack, even if they were boxed. Turns out Box::new([0; 0x20000]) creates the array on the stack first before memcopying to the heap in unoptimised builds, which is completely unnacceptable. Also, may of my other arrays were just straight up massive and unboxed, like the framebuffer or bus memory flat array. Anyways, after spending the bulk of this devlog’s time dealing with that, I gave up knowing the rest of the lints were harmless and pointless and clogging up important lints. In other news, despite listening to Jamie Paige for many hours this weekend, I still ended up needing my fren to tell me about it’s new song with Vane Lily and Yuma . I also showed them to Developer theme and it brought them some joy. I’m also very happy I got the thermometer question right, especially since I have an infrared thermometer on my desk and I had to find the correct emissivity setting to use on milk yesterday since my dad was making yoghurt. Anyway, I’ll end this before Grammarly shows me any more lints for this devlog.
Third Time’s the Charm Hello everyone! I would have devlogged sooner, but I’ve spent most of the last time between this devlog and the last on a single feature, and the rest on YouTube. Let’s dive right in! Clock Iiiiit! After adding MBC2 and No MBC, the natural next step was MBC3. MBC3 is a lot like MBC1. It uses mostly the same register, many of which are direct copies or basically the same. There are only two key differences: MBC3 supports more RAM and has an RTC (real time clock). The more RAM wasn’t much to deal with, but the RTC kinda was. I messed up a good deal of the ticking on the irst pass of writing it, and I kept forgetting how if let worked, which did end up slowing me down. Anyway, it’s well past midnight and I need to smash my face in my pillow. My one regret is that I didn’t listen to enough Jamie Paige while devving.
Rap It Up Hello friends! We’re back with the Daily Devlog! This one’s a quickie because the docs were (mostly) clear and I was listening to Rob Apollo while working. Let’s dive right in so I can run a mile on 5.5 hours of sleep rather than only 5! The Final Boss of MBCs When I started to do MBCs, the scope of this project was to do no MBC, MBC1, MBC2, MBC3, and maybe MBC5. I have been completing them largely in sequence: MBC1 MBC2 No MBC MBC3 (yesterday) This leaves only MBC5, today’s feature. I thought MBC5 was going to be difficult, but it was probably the easiest MBC besides no MBC, which isn’t even an MBC! MBC5 is basically a simpler and bigger version of MBC1, with two exceptions: Rumble: Apparently, cartridges can shake it down because some MBC5 variants have a rumble motor controlled by bit 3 of the CRAM selector. If there is rumble, that bit is dead. Chunks Every other MBC I’ve implemented followed this general rule: the ROM is exposed of 0x8000 bytes. Those bytes are split into four sections, each of 0x2000 bytes. Depending on which register you wrote to, it would be a different MBC command/
SAAAAAAAVVVEEE MEEEEEEE Hello everyone, we’re back with our daily devlog, this time before midnight! Let’s dive in! I’ll never forget you After finishing the MBCs, it was time to work on saving the game state. I had to save the data in binary form. Originally, I was going to use bincode, but I switched to postcard since bincode has been deprecated. I managed to get the plumbing working, so now I just have to implement the saving in main.rs. I had to keep this short since I need to go to bed. See y’all!
Frontman Hello everyone! This will probably, maybe, be the shortest amount of time for a devlog, so let’s hop to it! I’ll never let you go Last night, I implemented the backend funtionality and started on frontend functionality, a ’lil bit. Over the past 30 odd minutes, I finished up the saver struct. I wanted to have Saver be have a custom drop impl, but that would require it to carry an immutable reference to the CPU through the running of the emulator, which would break ownership rules due to having to make a mutable reference to the CPU to step it. What I did was I isolated the loop into a function and saved the return value to a variable, which gets propogated after the emulator attempts to save. The video is of me loading in a save into Pokémon Red! Comment which theme you want me to show off next!
Blink Twice Hello everyone! This is going to be a shorter devlog, so let’s dive right in! NOOOOOOOOOOOooooooooo When I set up the keypress handling a bit back, I wanted to use the default Retroarch keybinds so that anyone who had ever used Retroarch could use RGG without difficulty. The one discrepancy was that you only had to click escape one singular time to quit the emulator. I am no stranger to mistaken clicks, and today I realised this could be an issue for anyone who shares some of my clumsy tendencies. I figured it iwould be good to better copy Retroarch’s binds by making it so that you had to click Esc twice in quick succession to quit. A nice and easy change tha’s completion will probably force me to actually stop procrastinating audio/APU. Anyyywayyy, y’all should listen to CityLimits , DeltaFey , and Black Polish . I feel all of their music is great for programming. We’ll see if I can post another devlog today. ¡Adiós!
Apu, like from The Simpsons ? Hello beautiful humans! We’re back, and I’ve finally stopped procrastinating on the APU! Let’s dive right in! CPU, GPU, TPU, NPU, LPU, DPU, and now APU?! I’ve been very scared of dealing with the APU, since it’s seemed like the hairiest thing to deal with, and it’s also the last part of the emulator core. The APU has four channels and mixing and fading and stuff I will get into. 2 Chan The first channel I started with was channel 2, since it is the simplest (1 has an extra feature, but otherwise, they’re the same) There are four things one needs to understand for these channels: Period Duty Length Envelope Duty is the waveform of the audio, like what percentage of the square wave is at level 1 vs level 0. This changes the timbre of the sound. Length is the amount of time the note plays for. It’s harder for devs to have to manually turn off the notes on their own b/c of timing. Envelope is the fade in/fade out of the sound Also, on channel 1, there is sweep, which changes envelope I think? I don’t know b/c Pan Docs is confusing for this (built for game developers it feels) Aaaanyways, that’s it from me for now, as I have a history in-class writing test thing tomorrow and I’ve already hit my 2½ hour goal for the day. Also, I was listening to Constant Companions and I realised I probably never listened to the album hard enough b/c “Clouddrop” is a lot more depressing than I remember, and I got ts on vinyl soo that’s something I will be embarrassed to tell my friends. Also, y’all should listen to Constant Companions to increase her listeners so that one day, Jamie can have her Paige again.
Sweep It Under the Rug Hello humans! We’re back with the DAILY DEVLOG!!!!! I need to go to bed and feed my geck, so let’s dive right in! No Sweeping for You! Today, I finished up last night’s work of finishing channel 2. All that was left was adding an output to u8 fn that’s just sitting there as dead code rn and wiring it up to read_byte(). relatively uneventful, except for when I forgot how bitwise operations work. WeeeWoooWeeeWooo After channel 2, the obvious next step was channel 1. Channel 1 is just channel 2 with an extra feature: sweep. Sweep is kinda funky. I thought it changes envelope, but it actually changes pitch. It does some weird funky shenanigans to change the pitch and also on note trigger. A lot of building channel 1 was just making echo fns for proper layering of structs. Pan docs was once again confusing. Notes A side note on documentation. While working, I decided to read the forword of pan docs, and lo and behold, its built for game developers, but there’s also a Complete GB Technical Reference which was supposedly built for emulator builders. I decided to check it out and see if it would be more useful than pan docs. BUT GUESS WHAT?? It had EVRYTHING EXCEPT AUDIO in there!! The word “audio” was used exactly once!! Apu wasn’t even mentioned!!! SO I have to continue with pan docs, which does have decentish detail for audio. Music I ended up listening to a lot of Chappell Roan, Cavetown, CITY LIMITS, and MAFUMAFU this session. Y’all should listen to the PEAK music of Sorry Ghost as well. See y’all next time!
4Chan Hello everyone! Welcome back to the Daily Devlog, where we go over the new developments in RustyGameGirl!! Let’s get started with today’s broadcast! White Noise, Brown Noise, Black Noise, Grey Noise, What’s the Difference? After finishing the two pulse channels, 1 and 2, it was time to start a new one. I went with channel 4 since it is the closest to 1 and 2 in terms of structure and simplicity. Channel 4 is a randomised noise channel thingy, for stuff, like gunfire maybe? Here’s the summary from Pan Docs: This channel is used to output white noise, which is done by randomly switching the amplitude between two levels fairly fast. The frequency can be adjusted in order to make the noise appear “harder” (lower frequency) or “softer” (higher frequency). The random function that switches the output level can also be manipulated. Certain settings can cause the wave to be more regular, sounding closer to a pulse than noise. A lot of channel 4’s machinery is the same as 1 and 2’s, like envelope and length, which brings us to our next section. Adaptive Water Body Until today, I have never written a trait in Rust. I’ve used them, of course, especially Default and Drop, but also the num-traits crate from when I was making my fast-factor crate, but I’ve never written one before. I figured now was as good a time as any, especially since all four channels share many similar methods, like the nrxy reads and writes, output (to u8 only), clock_length, tick_period, etc., so I added the three following traits: trait Channel { fn output ( & self ) -> u8 ; fn tick_period ( & mut self , ticks : u32 ); fn clock_length ( & mut self ); fn nrx1_read ( & self ) -> u8 ; fn nrx2_read ( & self ) -> u8 ; fn nrx3_read ( & self ) -> u8 ; fn nrx4_read ( & self ) -> u8 ; fn nrx1_write ( & mut self , byte : u8 ); fn nrx2_write ( & mut self , byte : u8 ); fn nrx3_write ( & mut self , byte : u8 ); fn nrx4_write ( & mut self , byte : u8 ); } trait ChannelWithEnvelope { fn clock_envelope ( & mut self ); } trait ChannelSpecificFeature { fn nrx0_read ( & self ) -> u8 ; fn nrx0_write ( & mut self , byte : u8 ); } Having all the separate impl blocks forced and ordered the same makes the code far more readable, and it’s not like this will slow the code, and it sped up the creation of channel 4 and will likely speed up channel 3’s creation. Notes Rather unfortunately, since I was coding piecemeal today and I was to lazy (probably b/c of the gudetama shirt I’m wearing), I didn’t start listening to music until ater I was done coding, while I was working on homework (English I think? It was the only real homework I had today since I did most of the rest in class), but a Polyphia song just popped up in my shuffle (Reverie), and I locked in so much harder. Also, once I started working on the APU, I cracked 4000 SLoC!!! That’s more than my last two projects doubled and combined. It’s also likely the majority of code I’ve written in the 7 years I’ve been programming. I am currently at 4509 SLoC, which is over triple my last two projects combined! See y’all tomorrow, if not later tonight!
Madra Channels Here we are; we’re back again, making this a bidaily devlog?! Let’s dive into the last 1½ hours of development so I can touch bed. Me-Chan Navigator After finishing channel 4, it was time to tackle the most complicated (maybe, but 4 is pretty funky), or at least the weirdest. I thought channel 3 varied it’s pitch based on the info in the wave ram, BUT NOOO, it varies the waveform instead. It let’s the gameboy make more varied sounds rather than just variations of beeps, like saw waves and stuff. Lots of its machinery is reused from the other channels, and it also doesn’t have envelope because you can vary the volume yourself. That’s it for this devlog! See y’all tomorrow as I probably will finish audio tomorrow! I don’t think there is an applicable image for this, so have some xkcds
BLAAALAKKLJHSLJHDKHJALKJHLKGSFG Hello everyone! It seems that the devlogs have become oppositely bidaily — just this once, don’t you worry — than my last two devlogs. Let’s dive right in since we have so much to cover. audio output master race After I finished chan 4, it was time to implement master apu registers and channel mixing and panning. Most of the registers were pretty simple, except the one with the master APU power on/power off, as to implement it I had to gate every write on whether it was on, except the wave RAM. I also did that during my PE class (while exercising, of course), which contributed to the difficulty. Fortunately, I write my code in Neovim, so it really sped things up, including 1-handed editing. With that, the backend was nearly done, and I had reached the point at which I would no longer need Pan Docs or anything of the like, just straight Rust sailing. Thread the Needle In order to get the audio timed correctly, I had to hook up tick_channels() to a channel on which it sends a tuple of u16s (left and right amplitudes) to some receiver. This lets the audio be decoupled from whatever frontend one has. Your Pal, CPAL cpal is a a Rust crate for audio and stuff. Here’s the audio stuff because I can’t think straight it’s so late & I have an integration by parts quiz tomorrow and I don’t want to fail something light b/c I didn’t sleep. fn get_audio_stream ( cpu : & mut Cpu ) -> Result < Option < Stream > , Box < dyn std :: error : : Error >> { if true && let Some ( device ) = cpal :: default_host () .default_output_device () { let supported_stream_config = device .default_output_config () ? ; let stream_config = supported_stream_config .config (); let sample_format = supported_stream_config .sample_format (); let ( sender , receiver ) = std :: sync :: mpsc :: sync_channel :: < ( u16 , u16 ) > ( 5000 ); let error_callback = | _err : cpal :: Error | {}; cpu .set_audio_sample_rate ( stream_config .sample_rate ); cpu .set_audio_sample_sender ( sender ); let stream = match sample_format { cpal :: SampleFormat :: F32 => { let data_callback = make_data_callback :: < f32 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: I16 => { let data_callback = make_data_callback :: < i16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: U16 => { let data_callback = make_data_callback :: < u16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } _ => Err ( "Audio output sample format not supported! Try disabling audio in your config with 'audio = false'" , ) ? , }; return Ok ( stream ); } Ok ( None ) } // makedatacallback not shown due to char limits Position,Velocity, Acceleration, Jerk, Snap, Crackle, and Pop After that, I tested it, but there was some terrible audio crackling. Turns out it was due to oversleeping when trying to time things correctly, though before finding this out, I ended up slightly optimising draw_frame().The artifacts seem to be mostly gone and I will leave this to tomorrow silly. nearly @ 5000 sloc
Scream it Loud and Scream it Proud Hello everyone! We are back with the once again DAILY devlog!!! Let’s dive right in! IT LIIIIIVES!!! This morning, as soon as I came up, I sat my @ down to trouble shoot my audio processing on 4 hours of sleep . Despite adding the manual sleep time reduction, I was still experiencing some crackling, so I found a bug in the channels, solving which didn’t solve anything, but switching timing to be based off of audio when available worked like a charm, giving better and more accuracte speeds and crisp audio, so I was able to show off my COMPLETED EMULATOR CORE to some of my friends (as well as my backpack with Ferris on it). IT DIIIIIES!!! After adding the audio, I had to make sure that it wouldn’t cause the emulator to break, so I added a timeout that shuts off audio if it’s broken for more than 500 ms YES CAAAAAAP Because of how I was translating from u16 audio to f32, I was getting popping, so I implemented a software capacitor to slowly dampen sounds closer to EQUILIBRIUM SWITCH IT UUUUP After audio had all it needed, it was time to work on something I had long anticipated, a lib.rs for people o build their own frontends on top of my emulator. I also added an Emulator wrapper struct around Cpu so that it would be easier to manage pub methods and such without the ~1550 other lines in cpu.rs making things hard. There’s a reason this project isn’t just one big file of 5000 SLoC. I also added some documentation, and I found the best use of Claude Code is checking for spelling errors (it’s like I’m illiterate!) Speaking of SLoC, I cracked 5000 today! This is about 3.5x larger than my last two projects combined! I’ll see y’all next time, and don’t forget to listen to beabadoobee’s new album Pylon and Jamie Paige!
Dripmogging Hello developer theme users! It’s been a couple days since my last devlog, since I couldn’t make one last night since my dad thought I had school today, so let’s dive in so I can work on compliance and becoming a peer tutor for math for my school! Bitmasks: origins One of the biggest parts of this project is working with bytes and getting data from bytes. To do this, you have to shift the bits you want to the end and then mask them like (byte >> shift) & bitmask . I feel like I’ve gone through dozens of different styles for bitmask and shift numeric literals, which is where the whole style guide idea came from. Personal Stylist For the past 4 hours, I’ve been perfecting a style guide for my codebase. It’s a beautiful org doc with that sweet sweet table of contents with rules on everything from numeric literals to tests to error enums. There’s not to much to say except the next step is going over all 5000+ lines of code to enforce compliance. I’d like that written up A quick note on org. Many online code hosting services like GitHub and Codeberg support org rendering. Rather unfortunately, crates.io only supports a README.md, and not a README.org, which gives me a big sad, especially since I’ll haveto rewrite my README in markdown (ew), which does not give me the luxury of an automatically generated table of contents. That’s it for now folks, see y’all tonight!
If You Do Not Comply Hello everyone! We’re back with another devlog! I need to go to school soon, so let’s dive right in! Numerics, Literally Since I made the style guide, it was time to start implementing it. So far, I’ve gone through emulator.rs, memory_bus.rs, apu.rs, and cpu.rs. emulator.rs This one just needed doccomment formatting. memory-bus.rs This one needed a few numeric literal changes. I also directly accesses the stat field of gpu, which is unnacceptable, but since I’m doing gpu.rs next, I left it for the time being. apu.rs Despite being the file in which I came up with a chunk of my numeric literal style while writing, it felt like every literal was wrong. cpu.rs This was the second easiest file, despite it being the longest by a wide margin. There was some repetitive numeric literal issues in the methods, but that was it. I also tried to split it into multiple files for length since it is double the size of any other file, but I lowkey failed. Next up is gpu.rs compliance. I’ll see y’all next time!
You Will Be Terminated Hello everyone! We’re back with another devlog! Let’s dive right in since it is 02:00 over here! Lookin’ So Fab I have contined with my quest to implement my BEAUTIFUL and living style guide. Here’s what I did, since this work is mostly just repetitive and long. gpu.rs and memory_bs.rs publicity compliance. Before today, 4/6 of Gpu’s fields were pub(crate) something they had no business being, so I refactored so everything uses methods. Took a chunk of time but it was very worth it. registers.rs This one was pretty stupid. It had two main issues, publicity and masks. The lackluster and incomplete guide I was following had me write registers.rs with a ton of bitmasks it didn’t need it in a way that was ugly and sad, so I dropped the masks. All of Registers’ field and subfields are pub(crate), which I determined is optimal because it would be a major and massive chang to Cpu, and the registers are purely for the Cpu to use, and are part of the Cpu. rom.rs rom.rs was pretty chill, only a few things here and there. joypad.rs Despite this one taking a matter of minutes, this one is going to cause my so much work. All of its publicity was correct, as well as bit selecting formatting. Turns out I’ve been forgetting to remove parentheses around my files! Simply ridiculous! ANyway, that’s all for now, since I need to go touch bed. So y’all later, and keep listening to Jamie Paige!
Comply-cations Hello everyone!! We’re back with another devlog today. Let’s dive right in so I can start the next step! Parensal Issues As I said in my last devlog, while working on compliance for joypad.rs, I realised that I needed to delete extra parentheses around operators with obvious precedence. After working on that file, I continued down the buffers open in Neovim, also correcting that issue in addition to the others. Because I only caught it midway through, I have to complete a second pass of compliance editing. Fortunately, I have mini.surround installed, so deleting parentheses is really easy. That’s all that really happened. Make sure to listen to the daily dose of Jamie Paige and Vane Lily’s new song!
Ratatouille Hello everyone, we’re back with another devlog! Let’s dive right in so I can hit bed so I can go rafting the day after tomorrow! Compliance Chips I’ve finally finished dealing with compliance! I’m surprised by how many extranneous parentheses I had! I knew I had a lot, but I didn’t know it was this much! I’m so happy that is over so I can get to real work! Tui T. Sutherland The last big feature I wanted to add before shipping was a TUI for selecting ROMs and saves. To do this, I need to use the ratatui crate, which fortunately run off the same crossterm my project already does. So far, all I’ve done is learn about it and write the fn for getting the directories/files with the appropriate endings and sorting them for display use. I’ll see y’all in a couple days!
Pick Me Hello everyone! Let’s dive in so I can go feed my gecko and sleep! Seleccionar For the past few hours, I’ve been working on the file picker for selecting a rom and a save file. A lot of it is just learning about how to use Ratatui. Originally, I was going to have the selecting happen all at once, by one function, but I switched it to two calls so that load_rom() and has_battery() can be called to check whether the save menu should even come up. Write-In Candidate The thing is, since with a new save, the file has to be constructed by the emulator and it doesn’t exist. Right now, I’m writing a little text input field to be triggered if the save menu gets close with Esc. This will be pretty short, and won’t require a large change to existing code. After that, I’ll wire it in and test. Next Steps Homebrew Cask Separating frontend from backend crate by crate, so lib users don’t have to deal with frontend only imports.
Vendetta Hello everyone! Let’s dive right in so I can work on my math homework so I don’t fail my calc test next week! TUIzers I COMPLETED THE TUIIIIII!!! I added a text entry box for people to manually enter the names of their new saves. I also stylised the highlighting a bit more, and , even though its not in the video, now, the color changes to green when you’re selecting a save. This was a really fun learning experience. I originally wanted to make a TUI because one of the raters on my last project, leading zero util , complained about having to use a simple CLI and told me it wasn’t that good because of the lack of TUI, so this has been kind of a personal vendetta against that person to improve my software and user experience. The Other Interface This project isn’t just a CLI utility. The entire time I’ve been building this, I’ve wanted to enable others to make a frontend for it, whether it be on the web or a gui or some port of it in something. I’ve maintained a careful separation between lib and bin, with the exception that they are the same crate. For library users, dealing with my errors would be impossible since many of them are just strings and they are all just Box. Before throwing this on crates.io, I want to make error enums and stuff so people can do error matching. Tap Tap After completing error enums and stuff, I’m going to throw it on crates.io and make a github release so I can make a Homebrew tap. The last time I made a homebrew tap, I gave the project it’s own separate tap repo, but this time I’ll keep all my taps in a new tap repo on my GitHub instead of Codeberg for users. That’s it for now! I’m excited to make error enums so I can have that skill under my belt as well! Also, I’ve reached the point where shipping would probably let me get a framework 12, which is very exciting for me.
Erroneous Hello everyone! I have a history in-class-writing in 6 hours, so let’s dive right in! Error 404 Once I started adding support for loading ROMs and saves, failure points became possible. I hadn’t previously written errors before, so I just wrote strings and propagated them through with Result< T, Box> and the ? operator, with no regard to API users that may want to recover from a failure. I’ve been putting this off for so long, and was even considering doing this after shipping, but since I have so much time on my hands and the only other big TODOs left are the README.md and the Homebrew tap, I decided, why not? This has been a very interesting process over all, and it even gave me the impetus to do some proper gating on load_rom. Different MBCs only support some cram sizes, but because I wasn’t gating on load, these would fail at runtime with a mismatch. Read All About It Next up is the README. I previously had a mediocre, small, incomplete README in a file formet I forgot crates.io doesn’t have a renderer for, so I figured it would be best to start from scratch in Markdown instead of trying to port it over from Org. I also chnaged the name to Riggurly since that rolls off the tongue more. That’s it for this morning! I also found the bathroom in ENA: Dream BBQ, which was cool. I still need to go inside. Also, make sure to listen to Jamie Paige, as she always boosts my productivity!
Lover Tell Me if You CanHello everyone! Let’s dive in so I can work on improving the user experience!## ManThis devlog is all about README. I have actually never used Markdown before, only org, Emacs’s outliner/md format, because it is more intuitive and Emacs gives you more toys. My style guide is in org, my todo lists are in org; the only things that aren’t are the AGENTS.md I stole from Ghostty and the README.md. I ended up using a combination of the Stardance and Phantom README guides to help me figure out what to put in it and how to do syntax. Working on the README put an emphasis on some flaws in my code:- config path ~ not expanding- my glaring lack of a homebrew tap- mono audio still being unsupported- feature gating on binary-only depsThat’s it for now folks!
Much TODO About Nothing Hello everyone! We are finally back after a devlog hiatus due to me having to write essays to apply for my school’s software team! Let’s dive in so I can work on my history homework! Read It and Weep Last time, I talked about, in one title line by accident, how writing documentation and documenting my software’s flaws really exposed what was wrong with it. This update is all about fixing those flaws (mostly) A Multitude of Screams One of the biggest issues with my emulator was the audio. Not in the backend, but the frontend. Due to laziness, I didn’t bother adding mono audio support, which ended up being a 5-minute fix. There was also another glaring issue with the audio: Once it crashed, it wouldn’t rebuild the stream. If you unplugged your headphones, thinking the audio would continue on your other speakers, it would just turn it off and modulate speed with std:🧵 :sleep() . It took me a while to write all the rebuilding code in such a way to maximise user QoL for all users. When did I download you?! Since Riggurly is both a CLI AND a library, it has dependencies that are used only in the CLI that are still a part of the package as a whole. Library users still have to download and compile these dependencies, which can be a hassle and a waste of time. I’ve been meaning to put CLI-only dependencies behind a feature so library users can easily prevent themselves from downloading and compiling a bunch of heavy extra dependencies. This also taught me how to use features, which was good. You’re a Waste of the Air You Breathe! One thing that’s been bugging me for a while is efficiency. My array for the fallback memory bus array in the memory bus struct has always been 0x10000 bytes long (1 mebibyte, how much ram a GB has (kind of)). How reading and writing has worked is that there are match statements you go through to see if you access that array or you access the rom or if you access the vram or something else. The problem is that over 3/4 of that array’s length is useless and shadowed by ROM/CRAM/VRAM. I was wasting 768 kb of heap-memory. I ended up dropping the first 3/4 and just having a smaller array. Unfortunately, some space is still wasted, but it’s not much compared to before. I showed @ElffawIThink and they though it was funny. Also, one of the ROM types comes with 512 HALF-BYTES(nibbles) of RAM, which I had been representing with a [u8,512] with the upper nibbles of EVERY BYTE going unused. I shrank this down to a [u8,256] and use both nibbles for a fish in the sea . Take Me Home Before, I had to put a disclaimer in my README that you couldn’t use ~ as your home directory in your default ROM path in your config.toml because different users have different home directories and I have to use the dirs crate to find that out at runtime. This was a surprisingly long fix, though it was quite simple. Just a few lines of code to strip the ~ and replace it with the already found home directory. That’s all for tonight comrades! Make sure to listen to Jamie Paige, especially Clover! That song is now the first song in my playlist with vocal (sequentially, obviously my playlist has other songs with vocals), overtaking Lemon Boy by Cavetown, it’s just that good. It has also shown itself to be a better daily anthem than Villain by Teniwoha and Schifty Five, the YouTube classic.
Little Bonuses Hello Everyone! I have to go walk the dogs, so let’s dive right in! Building Codes Since I want a few more hours to try to see if I can get a Framework 13 and Celeste, I decided it would be good to add all the nicities I did for my last CLI, leading-zero-util (I know, terribly named), namely, man file and completion generation. On lzu, I used a hidden flag for completions and had a build.rs for the man page. However, I found it best to merge all of them into one hidden flag for ease of use. At first I tried a build.rs, but it kinda made dependencies annoying and made either my or lib users’ lives worse. That’s it for now folks! Next I’ll be working on unit tests for ROM stuff.
sleep(); sleep(); sleep(); allTestsPass() Hello everyone! Let’s dive in so I can get back to work before I go to bed! Testing, Testing, 1, 2, 3 For the last couple hours, I’ve been writing unit tests for the ROM module. I’ve been going on and off with unit tests for a while. Before, I wanted to write unit test for cpu instructions before realising Blarrg made test ROMs for that. Because of that, test ROMs are the primary mode of testing out Riggurly, especially since test ROM developers know much more about specifics, like the halt bug, than I do. However, trest ROMs don’t test things like saving and loading, which is something I CAN write tests for in a reasonable amount of time. A lot of the work I’ve done was just making one helper function and figuring out what I wanted to be covered by it and what I want the tests to do. I might also refactor some repeated stuff into another helper for more efficient code after I finish writing the save round trip unit tests. That’s it for now friends, and don’t forget to listen to Flavor Foley’s new album, Mirror Modulation, which dropped today? on all music streaming platforms
Failing Tests Hello everybody! We’re back with another devlog! Let’s dive right in so I can got to bed! All Tests Pass A good bit of test writing has happened since the last devlog. The ROM suite has gone from a measly 3 tests to a much nicer 16, though still incomplete. I wrote more tests to test combinations of roms and save sizes that are meant to work, as well as a bunch of those that also test RTC functionality for MBC3. I ended up putting ROM construction into a helper, as well as making a helper for most of the save round trip tests, probably saving a few hundred lines of code. Next tests are probably going to be broken saves, saves that don’t match, etc. etc. to see that ROMs are preserved and such. Algospeak Going back to the RTC, I remade the function that adds a number of seconds to the internal RTC. What I was doing before was calling a function that ticked by ticks with an amount of ticks equal to 1 second FOR EACH SECOND. That’s often hundreds of thousands or millions of function calls, with O(n) time complexity. I was pretty easily able to swap it for an O(1) modulus thingy. Switchie-Shwoo Going back to ROM preservation, I recently realised that it was loading in new timestamp data before checking save validity, which could end up being problematic. I just swapped the order of those two and the problem was solved, though, as I said before, this needs to be test-enforced. That’s it for now folks! See y’all next time!
Scooby-Doo Hello friends! I just got an email from Stardance saying I have 8+ unlogged hours, so let’s dive in? I Wish That I Could [Fail] I haven’t exactly done much of aything since my last devlog. I’ve written two unit tests, I guess, which do partially (mostly) address the situation with ensuring that ROM state isn’t changed by a bad save, such as with an RTC or loading in a bad save. I covered the case for two MBCs (MBC1 and MBC3) that the number of banks for the save is mismatched with what ROM was loaded (eg. 4 banks on a 1 bank ROM or MBC2 style ram on an MBC3 rom, though I will cover this case in the future). As for where the time came from, it may be that I stared at my TODO list too hard, as I have my TODOs for Riggurly in one emacs split and my TODOs for school in the other, but I have my school.org in a completely different location in my FS, in my org directory ~/org instead of my my Riggurly directory ~/projects/riggurly, but I have no clue. I didn’t even edit either file for more than a total of 5 minutes!!! Anyway, that’s all for now folks! Make sure to keep listening to Jamie Paige and drop @ElffawIThink a follow! Also, the novel is a stupid ad I saw on Royal Road whiul ereading 1% lifesteal...
|
1792572850.1101463
|
1793177650.1101463
|