|
7702
|
Spark (Build!) by @henry1155 | Stardance
|
henry1155
|
2
|
124.0
|
389
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T02:24:20Z", "hours": 2.0, "multiplier": 5.0, "payout": 11, "blessing": "neutral", "text": "hey! re-ship with an edited video! (and the bonus updatelog!)(NOTE: EPILEPSY WARNING! (it is an edit after all)) ( https://www.youtube.com/watch?v=ktODngPF7UI ) (i have fond memories of this, it was the saturday before the week of outpost and i stayed up to 6 AM edited, after a full day of getting footage and stuff (and dealing with goofy kdenlive crashes)) i also somehow did 10hrs+ that day so that was pretty insane! anyways, thanks for reviewing :D", "repo": "https://github.com/HenryLi-0/spark", "demo": ""}, {"ship_num": 2, "ts": "2026-07-24T05:33:19Z", "hours": 122.0, "multiplier": 5.0, "payout": 378, "blessing": "neutral", "text": "Well, after 120+ hours of building across some 18 days, and another hundred hours of CAD previously, it’s a good time to present Spark, this time irl! Anyways, after last summer, I fell into a sort of hole of demotivation where I didn’t really see what I was “working towards” in terms of school and just waiting six months for the FRC build season to start. In order to try to get my creativity and to prove to myself I wasn’t washed, I decided to throw myself into the deep end and to create a 3D printer. That said, 9 months later and way too many demotivation breaks, I locked in after exams and fully assembled and programmed and tested the build in 18 days! It features a coreXY gantry system, along with a passive tool changing setup with latches and the friction of the top docking piece. This kept the overall motor count to be 5 (2 for xy, 2 for z, 1 for tool). The tool changing setup and printing is nowhere near perfect (after all, this thing’s mostly made of PLA and was programmed in a week), but it’s definitely able to be tuned and better perfected with more programming time! In the end, Spark did achieve its goal of sparking some figurative sparks for me to continue building! After this, it was shipped off and exhibited at Open Sauce in California as part of Outpost where I’ve met amazing people and learned more about 3D printers and how to design them better!", "repo": "https://github.com/HenryLi-0/spark", "demo": ""}]...
|
[{"post_id": 70376, "ts": "202 [{"post_id": 70376, "ts": "2026-09-19T02:12:33Z", "hours": 2.1469, "text": "7/28/2026 - 81st Update! Note: I wrote this back on 7/28/2026 but never published it here! (What? The return of Spark?) Well, not exactly, this is more of a thing for the latest announcement in #stardance-bulletin ! Here’s the edited video from a while back! It’s kinda for vertical/short form content, also, BIG EPILEPSY WARNING!!! While you’re here, you should definitely check out fermion , the “spark v2” in a way! It has a very different architecture (that’s surprisingly hard to cad), so check that out! Anyways, here’s the log without further ado… There’s really not that much to say. On July 26th, Spark was repackaged into a box and put into storage, almost a week after returning to New York City. It’s still in an operational state, with few wires disconnected, only with the WiFi credentials incorrect. For a logged 9 months and 2 weeks, a total of 287 days, with 80 progress updates in that time, Spark’s been on my mind for a long while, no doubt about that. Across the more than 64k words, 240+ hours, from the definitely overscoped original concept to the rush to finish it before Blueprint ended, Spark has existed between two whole YSWS programs, one used for design and one used for build. I have to say, with more than three quarters of a year, a lot has changed, both outside, in my actual life, and with Spark, as the idea changed through every log, slowly and carefully. There were highs and lows, and really, really, low lows, from feeling lost at the end of day 9 of build, to the excitment of the first motor turning during day 11. But now, it’s all neatly packed in the garage, waiting to be used another day. Spark isn’t gone, it still physically exists. It may not be resting on a giant wooden board I use for soldering next to my bed, but it still exists next to me through all the hard CAD and build days. It’s strange, this sudden change. For the last week, I haven’t really done much besides plan. And that’s probably a good thing, given all the planning Spark took. I haven’t really done much build, I haven’t really felt anything. Post convention depressions, I have to say, is hitting pretty hard. After such insane fun and wonder for a week, it’s suddenly back to a cool, rainy day, here in New York City. Sleeping through the afternoon, after sleeping not enough hours in the morning. As the rain starts pouring from the sky again, I’ve been wondering what the meaning of joy is. Alas, it might just be time. Adapting to such changes is obviously difficult, and the road of projects is too. But that doesn’t mean roadstops aren’t along the way. As I wrap up this update log, I want to leave a quick quote, one of my favorites. It probably sounds like a dumb platitude to say “it’s not the destination, it’s the journey”, but truth is, we’re made up of journeys. You’re never going to be who you’re supposed to be unless you take that road. … There is room in there for surprise, for deviations, for re-evaluations. I wouldn’t dare deprive you of that adventure. You only get one , after all. I know, you’re tired; resting is part of the journey too. But not giving up… Winter, in Housepets! (Rick Griffin, Dec 25, 2020) That said, what’s next? Well, first we’re gonna take a stepping stone. What’s next is still in concept form, but the unique constraints might require a custom PCB, which is where river comes in. First, it’s gonna be a quick project, just a custom PCB music player, just to jog the electrical skills. But after a quick skip over a stream, what’s truly next? What’s the successor to Spark? What’s next to rival its top 1 status? Fermion. See ya around."}, {"post_id": 33890, "ts": "2026-07-24T05:24:31Z", "hours": 1.5761, "text": "7/23/2026 - 80th Update! well. so im back from open sauce! actually, flight entered back to NYC on the morning of 7/21/2026, but the last two days have really just trying to get back in motion lol (turns out having crazy fun and instantly returning to “normal life” is somewhat rough) anyways, it’s 9:18 PM, here’s a recap! i dont think timelapsing all the work there would be reasonable (i estimate probably around 8 hours of work?), but yeah, mostly just config tuning and working on irl stuff, the base plate sort of didnt like the flight (but it’s really alright? basically the screws kinda ripped through the tape a bit) after the return flight, one of the LM2596’s input wires fell out, took a bit to get it in (haha get it screwdriver bit), anyways, still got a lot to do, i think for now im gonna just finish the update log on the stardance site, then update all the graphics over here, and yeah, prepare for something new??? (i have some ideas…) anyways, i think im gonna prep the stardance project to ship, idk if i can? ok, 11:00 PM, updated the front image, gonna work on updating some stuff ok, 11:06 PM (almost typed AM, that would be funny), added the open sauce image to the readme, brb! back at 12:42 AM, yeah, i think it’s a good time to ship? mfw fixing the position so the aspect ratio for the banner and the project banner (the different pages) are so so hard to get correct anyways, yeah, gonna copy this stuff over and we should be good to go? well, 1:22 AM, for now, good night!"}, {"post_id": 33812, "ts": "2026-07-24T01:35:42Z", "hours": 11.3686, "text": "7/11/2026 - 78th Update! in theory, the last one? in reality, probably not. anyways, it’s 3:22 PM, today’s reveal/edit day! of course, i got a bit of table clean up to do and recording, but i also wanted to play around with the settings a little more to get a somewhat better print? (and maybe test another print since this ones a little small) anyways, parent meeting at 5 PM today, gonna be attending on the side while probably editing? im planning on doing two more test prints before then test 1: turned layer speeds from 90mm/s to 70mm/s increase flow ratio from 1.15 to 1.21 decrease skirt loops from 7 to 5 ok, 3:43 PM, sliced and uploaded, heaters all heated, ready to go! gonna use the bathroom, seems to be printing well though! back at 3:55 PM, it printed well and ended well! gonna modify the ending gcode to cool down, analyzing results now! kinda wanna replace the middle tape strip since i kinda messed up and removed a ripped a bit of it while scrapping the skirts off (whoops), gonna go for one more print, im pretty satisfied, this ones gonna be a bigger test print (not a benchy yet though), im thinking calibration cube? test 2: increase flow rate from 1.21 to 1.30 decreae rotation distance from 6.4 to 6.0 increase deretraction speed from 6mm/s to 6.5mm/s decrease jerk for x (5mm/s to 4.5mm/s) y (5mm/s to 4.5mm/s) z (0.2mm/s to 0.175mm/s) x (0.3mm/s to 0.25mm/s) gonna use this makerworld one for this! intrested to see how this one goes! it’s more of a z axis and consistency ending test should have just enough filament? expecting like 2-3cm left on the top after this? might not have enough on the top but that should be fine? hopefully? i mean, if i see the filaments about to run out id rather end the test? idk footage time yeah its kinda… erm. it kinda failed to print beyond the base layer, seems to just struggle with grabbing filament on its side, let me get a straw real quick, nvm, just used a piece of filament taped down for it, i think its just a filament grabbing issue (probably fighting against the curl?), so yeah, this should straighten that out a bit? test 3 (aka, 2 again), decided not to change anything, here we go! gonna focus on footage for this one so that might have been the… worst prints ive seen, but sure ok, just added the filament from the spool, should be ready for a bigger test? test 4: changed max volumetric speed from 5mm^3/s to 3mm^3/s turned flow ratio from 1.3 down to 1.22 rotation distance reverted from 6.0 back to 6.4 oh yeah heres the image of the cube yeah, gonna go for a 50% benchy erm 50 minute print uhh, well, 5:50 PM, now or never, i guess imma setup for a reveal scene ok, created a nice set for filming, gonna be doing mostly footage stuff while this prints, not really any timelapse? i guess i could? ok, hopefully printing and footage done by 7PM, then probably editing or dinner sometime around there (yes, todays the end day i think, at least my goal) ok, quite some time later, gonna speedrun dinner, its 7:31 PM though i was away for a bit before then welcome back, 9:11 PM, did a bit of footage getting earlier, here goes a print so. half way through. turns out our cold end/heatsink or whatever kinda doesnt cool it well enough. essentially, yeah. it just started curling up halfway in. yeah. however, it did successfuly print half of it! test 5: turned layer speeds from 70mm/s to 80mm/s changed max volumetric speed from 4mm^3/s to 3mm^3/s (seems like i forgot to do it whoops) most devious gcode modifications and slicer shenanigans later devious part 2 well, it’s 6:02 AM now, after lots of editing, submitted the forms, time to head off to bed! and yeah, good night!"}, {"post_id": 26773, "ts": "2026-07-11T19:21:48Z", "hours": 7.0922, "text": "7/10/2026 - 77th Update! wow, 77 updates, so it’s now 10:00 PM, idk what happened to this afternoon (basically just vanished, went to some job in the morning, slept when i got home, ate lunch at 4 PM, slept again, ate dinner at 8 PM, then showered and now it’s somehow 10:00 PM) im thinking media is gonna have to be moved to tomorrow, my only goal today is to find diamonds get the printing to work reliably here’s a couple ideas i brainstormed last night increase the extruder heating temperature should make it way easier for the gearing to push as well double check gearing probably not this now that i think about it, but check docs double check rotation distance again, probably correct add extra pressure in the config similar to the first idea as in trying to actually push more filament slow things down even more very sad but self explanatory if we overextrude, that’s ok, we just need to find the tuning sweet spot where it is actually decent, but of course, the more important goal is to actually get some reasonable stream of filament flowing out (constantly extruding is not optimal but it’s whatever) ok, upped the printing temperature by 10C, also decreased a lot of speeds, 10:33 PM, hopefully ready to test? ok, prepping the stuff, gotta clean the nozzle too, ok 10:40 PM, ready to go! well that didnt print anything ok, so shoving filament down the throat extrudes, pushing filament from far above works well (it does slam left and right but still functions fine), the velocity isnt correct AT ALL (might just be from the compression/friction), hmm ive been suggested to look into the heatbreak and stuff, so gonna take a look at that, idk a bit of a break later, the gearing is sus, trying to move it with the top off and only the heatsink attached, seems off it’s been two hours and ive been playing with so so so many configurations (probably at least thirty?), moving spacers, adding rubber bands, readjusting, measuring, and i think ive come to a point where it’s “ok”. it goes out ok (3 rotations of the motor connection results in: ~1.8cm pushing fast, ~1.7cm pushing slow, idk for expected), but it’s basically incapable of going back up for some reason. it also produces a good amount of force out, but, as mentioned before, barely any up (skips a bunch) ok, played around a bit more, idk, retraction worked for a second randomly, idk, installed it back on, ready to test again 3:36 AM, did a couple of cursed things in the config, specifically making it extrude 4x as much, along with making the deretraction speed higher in the slicer, that said, here we go! ey it printed something! its still really fuzzy so i guess we still got more work to do (that was v1.4), ok v1.5 uploaded, let’s see! 4:12 AM, here we go oh yeah also added fancy ending gcode lol hmm, it’s more complete, but stll missing stuff, ok, 4:27 AM, the birds are probably coming out soon, v1.6 going! well that didnt end well huh seems like the issue was just that the filament wasnt fully loaded, whoops ok, v1.7 uploaded with some print skirts on the outside to help with the missing start extruding, flow rate also increased, let’s see, it’s 4:54 AM, so last print of the day! uh oh it seems to be underextruding now, ok, 5:09 AM, here’s v1.8 ow was in the middle of cleaning the print bed and a piece of the skirt just went straight under my fingernail ouch well, with the sun rising, here’s the end of today! imo v1.5/v1.6 is my favorite, but it’s getting there in terms of smaller details, so i think tomorrow one or two more test prints and then a benchy would be a smart move? idk, the benchy’s just for the reveal video (yes i will try to fit in media here!) well, 5:33 AM, that’s it for me tonight (tomorrow morning?), and yeah, good night!"}, {"post_id": 25756, "ts": "2026-07-10T06:22:05Z", "hours": 4.8033, "text": "7/9/2026 - 76th Update! yo and welcome back! it’s 8:57 PM at night, don’t have much time to waste now, today’s hopefully printing day? (with the actual printer of course) saw online last night from like a video from 6 years ago that using blue painters tape is a good idea (why does my s key consistently fall out now aaaaa), well look what i got here (figuratively), it’s a roll of scotch blue 2090 tape! ok, watched a couple of enlightening videos, so, i think we’re just gonna use some blue tape, seems pretty much good enough for our purpose, not sure if i really want to get orca slicer just now, i think i just want the printer to at least extrude something at this point in time? center is roughly (50.00, 77.50, ~) right now, ok, wrote a little something to center the stuff so (0, 0, 0) should hopefully be the center? yeah, close enough! ok, it’s probably a good time to apply the tape ok, tape applied, cleaned the nozzle, planning on doing the paper thing right after, then we need to print like something flat real quick (if it works, since we still need to do the config stuff for the extruder) quick 20 minute break to let it cool down later, it’s 11:07 PM, time for the paper stuff! so it doesnt really do a good job at staying level, but i do have a solution in mind, aka, having weights on both the sides to keep it flat. yeah. or a rubber band thing stretching the entire length. anyways, configs inputted! so at this point, the thing we need to focus on is getting the extruder config up and running! ok, set up the slicer with the stuff, gear ratio is start (14) to mid (28->14) to final (28->12), where it ends ok, gonna do a test “print”! it’s in quotes since it’s actually not gonna have any filament, just gonna make sure the motion works/makes sense ok, 12:31 AM, let’s run it! ok, temperature below min or something (as in the gcode stuff) 12:40 AM and still figuring stuff out, hold on a second… ok, it’s running! at least, the stuffs moving, not sure if it’s printing well? idk, gonna watch it go! it’s going! that looks… fairly realistic? idk why the heatbed’s at 60.7C right now ok, 12:54 AM, filament loaded on the top in a semi precarious matter, things are ready! 12:57 AM, here we go! timelapse running on my phone, let’s see it! heat bed termperature good, extruder temperature rising, oh turns out i have to have the tab active for it to update the graph visually, whoops well, reached the temperature, let’s see something? oh it just stopped itself because axis werent homed, ok, test 2! 1:03 AM, z axis is lifting, here we go! hmm so the extruder didnt really try… anything. like it wasnt running the whole time (unless it’s just a really small amount that the gearing cant handle?) ok the issue might just be i didnt push the filament in enough, since i just gave it multiple aggresive tugs and a whole bunch just came out of the nozzle, 1:14 AM, here we go again! (i do not want to know what the weird vapors or gasses it just released (yes i saw it, which isnt a very good thing)) also, wow, the heating controls are tuned really nicely! ok, 1:17 AM, z axis going up again so wasnt extruding anything, had to push on it to move, and that resulted in an obvious pile of sad sad so i feel like this is a bit of a gearing thing, since small amount arent really wanting to come out at least it got the rough shape correct? hmm i want to try it out without me pushing on the filament, expecting nothing to happen but who knows yeah i think its just really under extruding, probably because of slip inside? 1:43 AM, trying again, yep, nothing good, it’s now 2:00 AM, gonna go to sleep at this point yeah. idk. the one on the left is forced filament, the middle had a bit of push at the beginning, the last one was mostly by itself. yeah, idk what to do at this point. it’s 2:03 AM, idk what to do, and yeah, we’re kinda behind schedule. anyways, good night!"}, {"post_id": 25175, "ts": "2026-07-09T06:59:41Z", "hours": 4.6269, "text": "7/8/2026 - 75th Update! mfw when the stardance bot tells me that only 10 hours per devlog counts now that’s just rude well, welcome back! 5:01 PM today and starting things off in a bad mood. guess we gotta waste our precious time by cleaning stuff up anyways, 15 minutes later and some serious condensing (each day is like 5 sentences max), back to work! got some unfinished business to do while we work on today’s stuff! so a series of event have occured and now it’s 10:13 PM. oops. for a second i got scared something was wrong but turns out the connecting wire to the inlet thing was just a bit disconnected, trying to access the web interface right now… oh it’s because im on downstairs wifi. oh. gonna be following this for calibration! not exactly sure why there’s so many connection issues today. ok, while that’s connecting, gonna print the latch parts so my s key finally fell off. oh. that’s not good (yes im touching the little button under it) ok, w repair, cleaned it up, the key still does the weird tilt thing, but it stays in there, so that’s good so uh it fell out again. not good. ssssssssssssssssssssssssssssssssssssssssssssssssss oh i guess im gonna keep that, i just need to be more mindful of where i press it i guess, problem is currently that the mcu keeps disconnecting whenever i change the extruder temperature, which is kinda weird hmm mightve been an electrical thing? so i just spent an hour trying to come up a solution for the extruder, none of them are reliable or possible (rubber band placement just gets in the way). so yeah. whys it working now i guess the solution is grinding the gears down? whys the “rushed for display” extruder the only working one now, wow ok, latches made, no rubber bands since that just doesnt work (both the track and the thing), idk, later issue, right now i guess we’re gonna tune z stuff or gonna just try to make it as flat as possible? i think for now let’s just assume perfect flatness for time, let’s replace the heater section of 1 with the one of 3 and just basically use tool 3 instead for time (since the gearing apparently works???) (please stay that way) i guess making it as flat as possible is the best idea for now ok so it’s now 2:32 AM, the docking bay and the latches are added (ngl, they are bending because of a fillet), gonna ignore the fact that it’s slightly broken (nothing tape can’t fix), it does work, takes a bit of force though (as always) 7/7/2026: DONE - print, assemble, and add latches 7/8/2026 DONE - heating tuning DONE GOOD - z bed tuning GOOD - either assume perfect flatness or work on bed mesh/calibration g code should be able to run easily (simple commands of course) look into how to print stuff PRINTING WORKING BY EOD it’s 2:50 AM, tested it out, IT EXTRUDES! YAY! (like i let go of the filament after pushing it to the cooling area and then it extruded!!! by itself with its own gearing!!!) the clicking noises are a bit questionable but sure, ill take it! also did the z paper thingy! missed opportunity to call it cerberus, i might just add that somewhere… anyways, here’s the extruded stuff picture! woo! i mean, what a way to end the day! ok, it’s 2:56 AM, that’s about it for tonight, gonna copy paste this into the website for today’s log and yeah, good night!"}, {"post_id": 24973, "ts": "2026-07-08T21:15:36Z", "hours": 37.5192, "text": "I’ve just been told 75% of my time spent on this log doesn’t count (apparently), so instead of dedicating probably an extra two hours of unlogged time to write a clean version, yall gonna get my thoughts DAILY, straight from the source, raw updatelog content. just kidding, there’s now a world limit so im just gonna speedrun this (since no one reads this and i read my own raw thoughts) 7/2/2026 Mostly electronics work, on 7/1/2026 night, realized that I can actually gently pry off the jst connector shells, removed a good amount of them. Wrote a devlog, worked on tuning the extruder filament tgrabbing gears. After dinner, printed some stuffs, then started adding the corexy belting path. Spent a long time, didn’t really feel very motivated at 3:42 AM and ended the day almost finishing assembling the belts and with not working extruders. 7/3/2026 Woke up early, last night wasn’t a fun night, increased the gear scale, finally actually put the corexy belt together. The filament gears now grab, though it does skip when too much filament is put in. After fixing the shaft collar and adding it back, reassembled the test tool and it attaches! The corexy does have quite a bit of friction, but the tool is assembled! However, waiting on terminal stuffs. Rest of the day is starting the electronics stuff. 7/4/2026 Motors not moving? Removed wires from housing and fix phases, motors now moving! Wondered why one motor was faster, then they both became slow. Fans wired, heaters wired, more testing, heaters can heat up! 7/5/2026 Bad sleep schedule strikes again, some soldering and added the limit switches, more stuff sent to print. A bit of config editing later and the corexy moves properly now! With the correct x and y axis! Filament doesnt really grab very well, idk.More intense filament testing, extruder can reach 230C! 7/6/2026 Really late start, more tool printing, more tool assembly, all tools and extruders are assembled now! 7/7/2026 Schedule and todo list made, support bracket set to print, top shaft supports made a printed, belts tensioned again. Some fixing later, two part inlet case CAD done and sent to print and attached, second tool head also wired up. There’s your week of updatelogs compressed into a format because theres a character limit. From now on, all devlogs will be the updatelogs and not be as extra refined, since I don’t get time counted for writing these, and it’s really a pain and insult to just say that more than a whole 24 hour day worth of actual work doesn’t count because someone added a time limit per log out of nowhere."}, {"post_id": 21018, "ts": "2026-07-02T19:40:26Z", "hours": 22.1556, "text": "it’s been four days oops More Assembly and Electronics! 6/28/2026 Ok, it’s z axis day! Gonna try to keep these recaps short since I’ve mostly been writing giant blobs of text with little images recently, since moving photos from my phone to the laptop and into the update log is a bit annoying, but yeah, z axis and motor mounts were started today! 6/29/2026 Realizing that time was really running out, along with the fact that NYC is attempting to reach high temperatures out of nowhere, a schedule was made and coreXY pulley stands were sent to print! First things first though, the z axis lift base thing was added , and some electronics stuff was started! It’s a little different from the wiring diagram, along with the fact we’re using a raspberry pi 4b, and a couple other stuff. Also, the docking bay got redesigned! 6/30/2026 Anyways, coreXY stuff printed and the layer is assembled! The gantry has a bit of wobble (and the bearings aren’t a tight fit), but nothing some hot glue can’t help with! (Well, maybe the wobble). Anyways, mainsail flashed on the raspberry pi 4 and figured out the weird issues! Also, reminder to switch the jumper thing for input form the side to the usb power.. so, the t rods hit the gantry too, along with the fact that the build plate doesn’t exist. Decently productive day, 5 days left. 7/1/2026 go go go New month, and leectronics work continues! Sacrificed the aliexpress USB power cable, split the wires, and attached it to the LM2596, looks good! Also learned how to crimp today, so that’s pretty cool. There’s also a picture of the thermistor of the heater bed in the mainsail graph somewhere down there! Unfortuantely, I don’t have free JST connectors on ahdn, so we’re gonna be doing sketchy stuff with a dupont connector in there (the pitches are a bit different, yes, i know it’s crazy sketchy, shhhhh) Anyways, after setting tool stuff to print, went downstairs and (thanks to my dad) got the t screws cut and a 15x15 build plate out of some aluminum (it’s like 1.3-1.6mm thick?). We did have to make it out of sheet aluminum that was laying around, but it came out alright, the holes are just a little misaligned but that’s a bit on me. Anyways, realized the tool stuff printed was super cursed, had to work on redesigning a lot of parts, specifically the sahft collar, the gearing (no more bearings should be needed, all the stuff should be using filament as deadaxles). Anyways, we have to fix this cad stuff (half way done), then hopefully belt the corexy and do electronics while it prints tomorrow (aka, today)? Well, that’s it for now, gotta go fast (sonic reference?), only four days left…"}, {"post_id": 17873, "ts": "2026-06-28T20:10:07Z", "hours": 14.5661, "text": "What do you mean 14hrs+ passed? Anyways, here’s a quick recap! Frame Assembly and Even More Printing! 6/25/2026 On a kinda windy day in NYC, printing continues! But hold up, what’s this? Yes, it’s also extrusions cutting day! While printing the stands for the bottom of the printer (after printing a whole bunch of gussets the previous day) after optimizing the print settings, I did some quick reviewing of the extrusion and rod cut lengths and then realized that I miscounted the middle frame y extrusions, it should’ve been three instead of two. So there wasn’t enough length for this extra extrusion (the tmm extrusion). Yeah. Anyways, not shortening the print area by 6cm to get the length, so calculated the linear rod cut lengths and headed downstairs. Huge thanks to my dad for cutting all these extrusions and rods! Now that I think about it, I did work with a blade saw up down thing before (idk what its called, a cold saw but its not cold and goes to higher rpms), but not with a handheld grinder before (i think that’s what it’s called?). Anyways, I learned that the little aluminum chips (that you can’t eat unfortunately) is actually the material, since you lose material every time you cut! This means that some extrusions are a little shorter, but the gussets helped work fine with this! Anyways, after seeing real sparks from the rods getting cut and theneating dinner, finished printing the stands and then realized the bmm extrusion doesn’t have any support. Yeah. Anyways, counted the number of extrusions and ended that day starting a little bit of assembly! 6/26/2026 Frame assembly day! Not much to say other than it involved roughly 5 hours of manual screwing with a screwdriver (using a drill did not really end that well, yes, I tried, probably a skill issue though). Anyways, printed a good amount of tool base stuff at the same time (the tool base print fell on my foot off a table (ouch)), and did a lot of frame assembly! In fact, used 203 T-nuts and 128 screws! Mostly just a lot of tedious work, but hey, the main frame’s done! 6/27/2026 Oh that’s yesterday! Anyways, first part of the day was just me at the doctor’s office, so couldn’t get much done, but I did set an x slider block to print, and it came out pretty well! Also, all three extruders got assembled! And the starts of the tool base! Nothing else much though, unfortunately! Well, that’s it for now, not writing today’s (6/28/2026) since that’s still happening right now, see ya after corexy assembly! (hopefully???)"}, {"post_id": 15511, "ts": "2026-06-25T06:29:33Z", "hours": 11.0467, "text": "Well, it’s been another hot second, ya miss me? Jokes aside, here’s the recap of the last three days! 6/21/2026 haha funny number day Anyways, back to CAD fixing! After a quick little script writing for counting words in all the updatelogs (there’s around enough for a small novel, not including anything on the Blueprint site which is actually fully rewritten by the way, so that’s pretty cool!). Oh that’s a big list todo… again, check out the GitHub repo for more details! Anyways, today’s latch day, since, well you kinda need to finalize the latch design before fixing the docking bay… One spring print later, turns out the original idea wasn’t the best. Apart from being really weird to test (both prints weren’t really willing to stretch, and were really easily stretched beyond its maximum), so new design time! This time with rubber bands instead of springs! Oh yeah, we changed the idea, it’s no longer a top down spring locking thing, it’s more sideways, essentially this idea. ( Here’s the original plan, however the space restrictions really didn’t work out…) 6/22/2026 Since the latch design got ready to test… what do you mean it’s not ready… well, yeah, turns out there were quite a good number of oversights in the original version, so two more hours of fixing the structure later, it’s printed! It looked pretty promising, but has its own set of issues. For instance, the slider doesn’t lock since the rails kinda don’t keep it in, the guide does work (which is really good!, but gets a bit caught in a couple areas. The latch also uses filament for the smaller parts and pivot bits, which is a bit annoying but it alright… though, the rubberbands do need to be pretty strong for this to work. Also, a couple of small adjustments and keeping the pivot upwards so it doesn’t enter the latch the wrong way (it doesn’t work through the bottom path), and needs a bit more alignment stuff, but it’s pretty promising for a prototype! 6/24/2026 What happened to yesterday? Well, kinda got tired after an exam and just kinda didn’t do anything for the rest of the day. Anyways, it’s currently 2:19 AM (not counting this for the time by the way!), so this is technically today’s summary! Basically, we’re behind schedule, so we should probably start printing stuff that’s pretty much finalized (gussets, etc.) and isn’t gonna change anytime soon, just so we can CAD at the same time to speed things up (spoiler, not much CAD work was done today…). However, 22 corner gussets and 4 three way gussets were printed today! 4.95 hours of printing later (including a couple of failed prints), roughly 131.3g of filament was used (not including failed prints)! That’s some scary fast usage… Also, opened a fresh roll of white filament! Gotta say, I don’t really like the resulting surface finish of the Inland filament (got it last year at Micro Center and never opened it), but it’s probably something with print settings and what not. I mean, I can also print it out in vibrant pink? (that’s the only unopened one I have from bambulab…) I’d probably just use Polymaker or Bambu filament from now on, the prices are all relatively the same at $20/spool. (If anyone has any cool discounts or cheaper but reliable places, I’m all ears!) Anyways, yeah, quite a lot of writing, wow… anyways, that’s it for now! I think I’m just gonna continue doing logs every couple of days since sometimes I don’t feel like it, but I’ll try to keep up the consistency! Catch y’all in a bit!"}, {"post_id": 12953, "ts": "2026-06-21T06:14:36Z", "hours": 7.57, "text": "Well, it’s been a hot second, Spark progress resumes! (This site editor kinda has text way too big for my liking, gonna write this in notepad first…) Anyways, Blueprint rules still apply here, most of my thinking and extensive writing is going to be located inside the repository itself (under updatelogs), while here serves as a mroe general overview of what’s going on. So, what’s going on? There’s already 3 days worth of stuff done, so let’s go through them! 6/12/2026 Basically a brief recap of some test prints here and there! More importantly, I just drafted up a pretty decently sized todo list of stuff we need to fix in the CAD, before we can start multitasking printing and doing other stuff. Tested prints include the bearing stacks, frame gussets, and tool plates! This basically gave information that some dimensions were a bit off (bearings were 4mm tall, not 3mm, frame gussets could be a bit thicker, tool plate had some sus screw locations (material too thin in some places))! It also suggested other changes to make. 6/19/2026 Giant schedule! Again, see the whole thing over there, basically a really rushed schedule on when stuff needs to get done, the goal is to finish in a bit more than two weeks. After that, a whole bunch of CAD fixes! From the stuff mentioned before to some fixes with screw lengths being somewhat impossible for the top of the tool to fixing the filament not having anywhere to go, to starting work on fixing the docking bay! Overall a really productive day! 6/20/2026 Oh, that’s today… anyways, not as productive, currently trying to implement an actually working spring latch system for it to actual work (the other version just doesn’t work). However, it’s a bit hard to think about, and the space isn’t exactly optimal (it’s kinda tightly packed…). Didn’t finish it, gonna continue with it tomorrow and take some time to think about any possible oversights or anything! And that’s it for now! Decently large first log (not as big as the ones in updatelogs lol), but I’ll try to see if I can do this daily for the site, but no promises! Ok, see ya hopefully tomorrow!"}]...
|
Title: Spark (Build!) by @henry1155 | Stardance
D Title: Spark (Build!) by @henry1155 | Stardance
Devlogs:
Well, it’s been a hot second, Spark progress resumes! (This site editor kinda has text way too big for my liking, gonna write this in notepad first…) Anyways, Blueprint rules still apply here, most of my thinking and extensive writing is going to be located inside the repository itself (under updatelogs), while here serves as a mroe general overview of what’s going on. So, what’s going on? There’s already 3 days worth of stuff done, so let’s go through them! 6/12/2026 Basically a brief recap of some test prints here and there! More importantly, I just drafted up a pretty decently sized todo list of stuff we need to fix in the CAD, before we can start multitasking printing and doing other stuff. Tested prints include the bearing stacks, frame gussets, and tool plates! This basically gave information that some dimensions were a bit off (bearings were 4mm tall, not 3mm, frame gussets could be a bit thicker, tool plate had some sus screw locations (material too thin in some places))! It also suggested other changes to make. 6/19/2026 Giant schedule! Again, see the whole thing over there, basically a really rushed schedule on when stuff needs to get done, the goal is to finish in a bit more than two weeks. After that, a whole bunch of CAD fixes! From the stuff mentioned before to some fixes with screw lengths being somewhat impossible for the top of the tool to fixing the filament not having anywhere to go, to starting work on fixing the docking bay! Overall a really productive day! 6/20/2026 Oh, that’s today… anyways, not as productive, currently trying to implement an actually working spring latch system for it to actual work (the other version just doesn’t work). However, it’s a bit hard to think about, and the space isn’t exactly optimal (it’s kinda tightly packed…). Didn’t finish it, gonna continue with it tomorrow and take some time to think about any possible oversights or anything! And that’s it for now! Decently large first log (not as big as the ones in updatelogs lol), but I’ll try to see if I can do this daily for the site, but no promises! Ok, see ya hopefully tomorrow!
Well, it’s been another hot second, ya miss me? Jokes aside, here’s the recap of the last three days! 6/21/2026 haha funny number day Anyways, back to CAD fixing! After a quick little script writing for counting words in all the updatelogs (there’s around enough for a small novel, not including anything on the Blueprint site which is actually fully rewritten by the way, so that’s pretty cool!). Oh that’s a big list todo… again, check out the GitHub repo for more details! Anyways, today’s latch day, since, well you kinda need to finalize the latch design before fixing the docking bay… One spring print later, turns out the original idea wasn’t the best. Apart from being really weird to test (both prints weren’t really willing to stretch, and were really easily stretched beyond its maximum), so new design time! This time with rubber bands instead of springs! Oh yeah, we changed the idea, it’s no longer a top down spring locking thing, it’s more sideways, essentially this idea. ( Here’s the original plan, however the space restrictions really didn’t work out…) 6/22/2026 Since the latch design got ready to test… what do you mean it’s not ready… well, yeah, turns out there were quite a good number of oversights in the original version, so two more hours of fixing the structure later, it’s printed! It looked pretty promising, but has its own set of issues. For instance, the slider doesn’t lock since the rails kinda don’t keep it in, the guide does work (which is really good!, but gets a bit caught in a couple areas. The latch also uses filament for the smaller parts and pivot bits, which is a bit annoying but it alright… though, the rubberbands do need to be pretty strong for this to work. Also, a couple of small adjustments and keeping the pivot upwards so it doesn’t enter the latch the wrong way (it doesn’t work through the bottom path), and needs a bit more alignment stuff, but it’s pretty promising for a prototype! 6/24/2026 What happened to yesterday? Well, kinda got tired after an exam and just kinda didn’t do anything for the rest of the day. Anyways, it’s currently 2:19 AM (not counting this for the time by the way!), so this is technically today’s summary! Basically, we’re behind schedule, so we should probably start printing stuff that’s pretty much finalized (gussets, etc.) and isn’t gonna change anytime soon, just so we can CAD at the same time to speed things up (spoiler, not much CAD work was done today…). However, 22 corner gussets and 4 three way gussets were printed today! 4.95 hours of printing later (including a couple of failed prints), roughly 131.3g of filament was used (not including failed prints)! That’s some scary fast usage… Also, opened a fresh roll of white filament! Gotta say, I don’t really like the resulting surface finish of the Inland filament (got it last year at Micro Center and never opened it), but it’s probably something with print settings and what not. I mean, I can also print it out in vibrant pink? (that’s the only unopened one I have from bambulab…) I’d probably just use Polymaker or Bambu filament from now on, the prices are all relatively the same at $20/spool. (If anyone has any cool discounts or cheaper but reliable places, I’m all ears!) Anyways, yeah, quite a lot of writing, wow… anyways, that’s it for now! I think I’m just gonna continue doing logs every couple of days since sometimes I don’t feel like it, but I’ll try to keep up the consistency! Catch y’all in a bit!
What do you mean 14hrs+ passed? Anyways, here’s a quick recap! Frame Assembly and Even More Printing! 6/25/2026 On a kinda windy day in NYC, printing continues! But hold up, what’s this? Yes, it’s also extrusions cutting day! While printing the stands for the bottom of the printer (after printing a whole bunch of gussets the previous day) after optimizing the print settings, I did some quick reviewing of the extrusion and rod cut lengths and then realized that I miscounted the middle frame y extrusions, it should’ve been three instead of two. So there wasn’t enough length for this extra extrusion (the tmm extrusion). Yeah. Anyways, not shortening the print area by 6cm to get the length, so calculated the linear rod cut lengths and headed downstairs. Huge thanks to my dad for cutting all these extrusions and rods! Now that I think about it, I did work with a blade saw up down thing before (idk what its called, a cold saw but its not cold and goes to higher rpms), but not with a handheld grinder before (i think that’s what it’s called?). Anyways, I learned that the little aluminum chips (that you can’t eat unfortunately) is actually the material, since you lose material every time you cut! This means that some extrusions are a little shorter, but the gussets helped work fine with this! Anyways, after seeing real sparks from the rods getting cut and theneating dinner, finished printing the stands and then realized the bmm extrusion doesn’t have any support. Yeah. Anyways, counted the number of extrusions and ended that day starting a little bit of assembly! 6/26/2026 Frame assembly day! Not much to say other than it involved roughly 5 hours of manual screwing with a screwdriver (using a drill did not really end that well, yes, I tried, probably a skill issue though). Anyways, printed a good amount of tool base stuff at the same time (the tool base print fell on my foot off a table (ouch)), and did a lot of frame assembly! In fact, used 203 T-nuts and 128 screws! Mostly just a lot of tedious work, but hey, the main frame’s done! 6/27/2026 Oh that’s yesterday! Anyways, first part of the day was just me at the doctor’s office, so couldn’t get much done, but I did set an x slider block to print, and it came out pretty well! Also, all three extruders got assembled! And the starts of the tool base! Nothing else much though, unfortunately! Well, that’s it for now, not writing today’s (6/28/2026) since that’s still happening right now, see ya after corexy assembly! (hopefully???)
it’s been four days oops More Assembly and Electronics! 6/28/2026 Ok, it’s z axis day! Gonna try to keep these recaps short since I’ve mostly been writing giant blobs of text with little images recently, since moving photos from my phone to the laptop and into the update log is a bit annoying, but yeah, z axis and motor mounts were started today! 6/29/2026 Realizing that time was really running out, along with the fact that NYC is attempting to reach high temperatures out of nowhere, a schedule was made and coreXY pulley stands were sent to print! First things first though, the z axis lift base thing was added , and some electronics stuff was started! It’s a little different from the wiring diagram, along with the fact we’re using a raspberry pi 4b, and a couple other stuff. Also, the docking bay got redesigned! 6/30/2026 Anyways, coreXY stuff printed and the layer is assembled! The gantry has a bit of wobble (and the bearings aren’t a tight fit), but nothing some hot glue can’t help with! (Well, maybe the wobble). Anyways, mainsail flashed on the raspberry pi 4 and figured out the weird issues! Also, reminder to switch the jumper thing for input form the side to the usb power.. so, the t rods hit the gantry too, along with the fact that the build plate doesn’t exist. Decently productive day, 5 days left. 7/1/2026 go go go New month, and leectronics work continues! Sacrificed the aliexpress USB power cable, split the wires, and attached it to the LM2596, looks good! Also learned how to crimp today, so that’s pretty cool. There’s also a picture of the thermistor of the heater bed in the mainsail graph somewhere down there! Unfortuantely, I don’t have free JST connectors on ahdn, so we’re gonna be doing sketchy stuff with a dupont connector in there (the pitches are a bit different, yes, i know it’s crazy sketchy, shhhhh) Anyways, after setting tool stuff to print, went downstairs and (thanks to my dad) got the t screws cut and a 15x15 build plate out of some aluminum (it’s like 1.3-1.6mm thick?). We did have to make it out of sheet aluminum that was laying around, but it came out alright, the holes are just a little misaligned but that’s a bit on me. Anyways, realized the tool stuff printed was super cursed, had to work on redesigning a lot of parts, specifically the sahft collar, the gearing (no more bearings should be needed, all the stuff should be using filament as deadaxles). Anyways, we have to fix this cad stuff (half way done), then hopefully belt the corexy and do electronics while it prints tomorrow (aka, today)? Well, that’s it for now, gotta go fast (sonic reference?), only four days left…
I’ve just been told 75% of my time spent on this log doesn’t count (apparently), so instead of dedicating probably an extra two hours of unlogged time to write a clean version, yall gonna get my thoughts DAILY, straight from the source, raw updatelog content. just kidding, there’s now a world limit so im just gonna speedrun this (since no one reads this and i read my own raw thoughts) 7/2/2026 Mostly electronics work, on 7/1/2026 night, realized that I can actually gently pry off the jst connector shells, removed a good amount of them. Wrote a devlog, worked on tuning the extruder filament tgrabbing gears. After dinner, printed some stuffs, then started adding the corexy belting path. Spent a long time, didn’t really feel very motivated at 3:42 AM and ended the day almost finishing assembling the belts and with not working extruders. 7/3/2026 Woke up early, last night wasn’t a fun night, increased the gear scale, finally actually put the corexy belt together. The filament gears now grab, though it does skip when too much filament is put in. After fixing the shaft collar and adding it back, reassembled the test tool and it attaches! The corexy does have quite a bit of friction, but the tool is assembled! However, waiting on terminal stuffs. Rest of the day is starting the electronics stuff. 7/4/2026 Motors not moving? Removed wires from housing and fix phases, motors now moving! Wondered why one motor was faster, then they both became slow. Fans wired, heaters wired, more testing, heaters can heat up! 7/5/2026 Bad sleep schedule strikes again, some soldering and added the limit switches, more stuff sent to print. A bit of config editing later and the corexy moves properly now! With the correct x and y axis! Filament doesnt really grab very well, idk.More intense filament testing, extruder can reach 230C! 7/6/2026 Really late start, more tool printing, more tool assembly, all tools and extruders are assembled now! 7/7/2026 Schedule and todo list made, support bracket set to print, top shaft supports made a printed, belts tensioned again. Some fixing later, two part inlet case CAD done and sent to print and attached, second tool head also wired up. There’s your week of updatelogs compressed into a format because theres a character limit. From now on, all devlogs will be the updatelogs and not be as extra refined, since I don’t get time counted for writing these, and it’s really a pain and insult to just say that more than a whole 24 hour day worth of actual work doesn’t count because someone added a time limit per log out of nowhere.
7/8/2026 - 75th Update! mfw when the stardance bot tells me that only 10 hours per devlog counts now that’s just rude well, welcome back! 5:01 PM today and starting things off in a bad mood. guess we gotta waste our precious time by cleaning stuff up anyways, 15 minutes later and some serious condensing (each day is like 5 sentences max), back to work! got some unfinished business to do while we work on today’s stuff! so a series of event have occured and now it’s 10:13 PM. oops. for a second i got scared something was wrong but turns out the connecting wire to the inlet thing was just a bit disconnected, trying to access the web interface right now… oh it’s because im on downstairs wifi. oh. gonna be following this for calibration! not exactly sure why there’s so many connection issues today. ok, while that’s connecting, gonna print the latch parts so my s key finally fell off. oh. that’s not good (yes im touching the little button under it) ok, w repair, cleaned it up, the key still does the weird tilt thing, but it stays in there, so that’s good so uh it fell out again. not good. ssssssssssssssssssssssssssssssssssssssssssssssssss oh i guess im gonna keep that, i just need to be more mindful of where i press it i guess, problem is currently that the mcu keeps disconnecting whenever i change the extruder temperature, which is kinda weird hmm mightve been an electrical thing? so i just spent an hour trying to come up a solution for the extruder, none of them are reliable or possible (rubber band placement just gets in the way). so yeah. whys it working now i guess the solution is grinding the gears down? whys the “rushed for display” extruder the only working one now, wow ok, latches made, no rubber bands since that just doesnt work (both the track and the thing), idk, later issue, right now i guess we’re gonna tune z stuff or gonna just try to make it as flat as possible? i think for now let’s just assume perfect flatness for time, let’s replace the heater section of 1 with the one of 3 and just basically use tool 3 instead for time (since the gearing apparently works???) (please stay that way) i guess making it as flat as possible is the best idea for now ok so it’s now 2:32 AM, the docking bay and the latches are added (ngl, they are bending because of a fillet), gonna ignore the fact that it’s slightly broken (nothing tape can’t fix), it does work, takes a bit of force though (as always) 7/7/2026: DONE - print, assemble, and add latches 7/8/2026 DONE - heating tuning DONE GOOD - z bed tuning GOOD - either assume perfect flatness or work on bed mesh/calibration g code should be able to run easily (simple commands of course) look into how to print stuff PRINTING WORKING BY EOD it’s 2:50 AM, tested it out, IT EXTRUDES! YAY! (like i let go of the filament after pushing it to the cooling area and then it extruded!!! by itself with its own gearing!!!) the clicking noises are a bit questionable but sure, ill take it! also did the z paper thingy! missed opportunity to call it cerberus, i might just add that somewhere… anyways, here’s the extruded stuff picture! woo! i mean, what a way to end the day! ok, it’s 2:56 AM, that’s about it for tonight, gonna copy paste this into the website for today’s log and yeah, good night!
7/9/2026 - 76th Update! yo and welcome back! it’s 8:57 PM at night, don’t have much time to waste now, today’s hopefully printing day? (with the actual printer of course) saw online last night from like a video from 6 years ago that using blue painters tape is a good idea (why does my s key consistently fall out now aaaaa), well look what i got here (figuratively), it’s a roll of scotch blue 2090 tape! ok, watched a couple of enlightening videos, so, i think we’re just gonna use some blue tape, seems pretty much good enough for our purpose, not sure if i really want to get orca slicer just now, i think i just want the printer to at least extrude something at this point in time? center is roughly (50.00, 77.50, ~) right now, ok, wrote a little something to center the stuff so (0, 0, 0) should hopefully be the center? yeah, close enough! ok, it’s probably a good time to apply the tape ok, tape applied, cleaned the nozzle, planning on doing the paper thing right after, then we need to print like something flat real quick (if it works, since we still need to do the config stuff for the extruder) quick 20 minute break to let it cool down later, it’s 11:07 PM, time for the paper stuff! so it doesnt really do a good job at staying level, but i do have a solution in mind, aka, having weights on both the sides to keep it flat. yeah. or a rubber band thing stretching the entire length. anyways, configs inputted! so at this point, the thing we need to focus on is getting the extruder config up and running! ok, set up the slicer with the stuff, gear ratio is start (14) to mid (28->14) to final (28->12), where it ends ok, gonna do a test “print”! it’s in quotes since it’s actually not gonna have any filament, just gonna make sure the motion works/makes sense ok, 12:31 AM, let’s run it! ok, temperature below min or something (as in the gcode stuff) 12:40 AM and still figuring stuff out, hold on a second… ok, it’s running! at least, the stuffs moving, not sure if it’s printing well? idk, gonna watch it go! it’s going! that looks… fairly realistic? idk why the heatbed’s at 60.7C right now ok, 12:54 AM, filament loaded on the top in a semi precarious matter, things are ready! 12:57 AM, here we go! timelapse running on my phone, let’s see it! heat bed termperature good, extruder temperature rising, oh turns out i have to have the tab active for it to update the graph visually, whoops well, reached the temperature, let’s see something? oh it just stopped itself because axis werent homed, ok, test 2! 1:03 AM, z axis is lifting, here we go! hmm so the extruder didnt really try… anything. like it wasnt running the whole time (unless it’s just a really small amount that the gearing cant handle?) ok the issue might just be i didnt push the filament in enough, since i just gave it multiple aggresive tugs and a whole bunch just came out of the nozzle, 1:14 AM, here we go again! (i do not want to know what the weird vapors or gasses it just released (yes i saw it, which isnt a very good thing)) also, wow, the heating controls are tuned really nicely! ok, 1:17 AM, z axis going up again so wasnt extruding anything, had to push on it to move, and that resulted in an obvious pile of sad sad so i feel like this is a bit of a gearing thing, since small amount arent really wanting to come out at least it got the rough shape correct? hmm i want to try it out without me pushing on the filament, expecting nothing to happen but who knows yeah i think its just really under extruding, probably because of slip inside? 1:43 AM, trying again, yep, nothing good, it’s now 2:00 AM, gonna go to sleep at this point yeah. idk. the one on the left is forced filament, the middle had a bit of push at the beginning, the last one was mostly by itself. yeah, idk what to do at this point. it’s 2:03 AM, idk what to do, and yeah, we’re kinda behind schedule. anyways, good night!
7/10/2026 - 77th Update! wow, 77 updates, so it’s now 10:00 PM, idk what happened to this afternoon (basically just vanished, went to some job in the morning, slept when i got home, ate lunch at 4 PM, slept again, ate dinner at 8 PM, then showered and now it’s somehow 10:00 PM) im thinking media is gonna have to be moved to tomorrow, my only goal today is to find diamonds get the printing to work reliably here’s a couple ideas i brainstormed last night increase the extruder heating temperature should make it way easier for the gearing to push as well double check gearing probably not this now that i think about it, but check docs double check rotation distance again, probably correct add extra pressure in the config similar to the first idea as in trying to actually push more filament slow things down even more very sad but self explanatory if we overextrude, that’s ok, we just need to find the tuning sweet spot where it is actually decent, but of course, the more important goal is to actually get some reasonable stream of filament flowing out (constantly extruding is not optimal but it’s whatever) ok, upped the printing temperature by 10C, also decreased a lot of speeds, 10:33 PM, hopefully ready to test? ok, prepping the stuff, gotta clean the nozzle too, ok 10:40 PM, ready to go! well that didnt print anything ok, so shoving filament down the throat extrudes, pushing filament from far above works well (it does slam left and right but still functions fine), the velocity isnt correct AT ALL (might just be from the compression/friction), hmm ive been suggested to look into the heatbreak and stuff, so gonna take a look at that, idk a bit of a break later, the gearing is sus, trying to move it with the top off and only the heatsink attached, seems off it’s been two hours and ive been playing with so so so many configurations (probably at least thirty?), moving spacers, adding rubber bands, readjusting, measuring, and i think ive come to a point where it’s “ok”. it goes out ok (3 rotations of the motor connection results in: ~1.8cm pushing fast, ~1.7cm pushing slow, idk for expected), but it’s basically incapable of going back up for some reason. it also produces a good amount of force out, but, as mentioned before, barely any up (skips a bunch) ok, played around a bit more, idk, retraction worked for a second randomly, idk, installed it back on, ready to test again 3:36 AM, did a couple of cursed things in the config, specifically making it extrude 4x as much, along with making the deretraction speed higher in the slicer, that said, here we go! ey it printed something! its still really fuzzy so i guess we still got more work to do (that was v1.4), ok v1.5 uploaded, let’s see! 4:12 AM, here we go oh yeah also added fancy ending gcode lol hmm, it’s more complete, but stll missing stuff, ok, 4:27 AM, the birds are probably coming out soon, v1.6 going! well that didnt end well huh seems like the issue was just that the filament wasnt fully loaded, whoops ok, v1.7 uploaded with some print skirts on the outside to help with the missing start extruding, flow rate also increased, let’s see, it’s 4:54 AM, so last print of the day! uh oh it seems to be underextruding now, ok, 5:09 AM, here’s v1.8 ow was in the middle of cleaning the print bed and a piece of the skirt just went straight under my fingernail ouch well, with the sun rising, here’s the end of today! imo v1.5/v1.6 is my favorite, but it’s getting there in terms of smaller details, so i think tomorrow one or two more test prints and then a benchy would be a smart move? idk, the benchy’s just for the reveal video (yes i will try to fit in media here!) well, 5:33 AM, that’s it for me tonight (tomorrow morning?), and yeah, good night!
7/11/2026 - 78th Update! in theory, the last one? in reality, probably not. anyways, it’s 3:22 PM, today’s reveal/edit day! of course, i got a bit of table clean up to do and recording, but i also wanted to play around with the settings a little more to get a somewhat better print? (and maybe test another print since this ones a little small) anyways, parent meeting at 5 PM today, gonna be attending on the side while probably editing? im planning on doing two more test prints before then test 1: turned layer speeds from 90mm/s to 70mm/s increase flow ratio from 1.15 to 1.21 decrease skirt loops from 7 to 5 ok, 3:43 PM, sliced and uploaded, heaters all heated, ready to go! gonna use the bathroom, seems to be printing well though! back at 3:55 PM, it printed well and ended well! gonna modify the ending gcode to cool down, analyzing results now! kinda wanna replace the middle tape strip since i kinda messed up and removed a ripped a bit of it while scrapping the skirts off (whoops), gonna go for one more print, im pretty satisfied, this ones gonna be a bigger test print (not a benchy yet though), im thinking calibration cube? test 2: increase flow rate from 1.21 to 1.30 decreae rotation distance from 6.4 to 6.0 increase deretraction speed from 6mm/s to 6.5mm/s decrease jerk for x (5mm/s to 4.5mm/s) y (5mm/s to 4.5mm/s) z (0.2mm/s to 0.175mm/s) x (0.3mm/s to 0.25mm/s) gonna use this makerworld one for this! intrested to see how this one goes! it’s more of a z axis and consistency ending test should have just enough filament? expecting like 2-3cm left on the top after this? might not have enough on the top but that should be fine? hopefully? i mean, if i see the filaments about to run out id rather end the test? idk footage time yeah its kinda… erm. it kinda failed to print beyond the base layer, seems to just struggle with grabbing filament on its side, let me get a straw real quick, nvm, just used a piece of filament taped down for it, i think its just a filament grabbing issue (probably fighting against the curl?), so yeah, this should straighten that out a bit? test 3 (aka, 2 again), decided not to change anything, here we go! gonna focus on footage for this one so that might have been the… worst prints ive seen, but sure ok, just added the filament from the spool, should be ready for a bigger test? test 4: changed max volumetric speed from 5mm^3/s to 3mm^3/s turned flow ratio from 1.3 down to 1.22 rotation distance reverted from 6.0 back to 6.4 oh yeah heres the image of the cube yeah, gonna go for a 50% benchy erm 50 minute print uhh, well, 5:50 PM, now or never, i guess imma setup for a reveal scene ok, created a nice set for filming, gonna be doing mostly footage stuff while this prints, not really any timelapse? i guess i could? ok, hopefully printing and footage done by 7PM, then probably editing or dinner sometime around there (yes, todays the end day i think, at least my goal) ok, quite some time later, gonna speedrun dinner, its 7:31 PM though i was away for a bit before then welcome back, 9:11 PM, did a bit of footage getting earlier, here goes a print so. half way through. turns out our cold end/heatsink or whatever kinda doesnt cool it well enough. essentially, yeah. it just started curling up halfway in. yeah. however, it did successfuly print half of it! test 5: turned layer speeds from 70mm/s to 80mm/s changed max volumetric speed from 4mm^3/s to 3mm^3/s (seems like i forgot to do it whoops) most devious gcode modifications and slicer shenanigans later devious part 2 well, it’s 6:02 AM now, after lots of editing, submitted the forms, time to head off to bed! and yeah, good night!
7/23/2026 - 80th Update! well. so im back from open sauce! actually, flight entered back to NYC on the morning of 7/21/2026, but the last two days have really just trying to get back in motion lol (turns out having crazy fun and instantly returning to “normal life” is somewhat rough) anyways, it’s 9:18 PM, here’s a recap! i dont think timelapsing all the work there would be reasonable (i estimate probably around 8 hours of work?), but yeah, mostly just config tuning and working on irl stuff, the base plate sort of didnt like the flight (but it’s really alright? basically the screws kinda ripped through the tape a bit) after the return flight, one of the LM2596’s input wires fell out, took a bit to get it in (haha get it screwdriver bit), anyways, still got a lot to do, i think for now im gonna just finish the update log on the stardance site, then update all the graphics over here, and yeah, prepare for something new??? (i have some ideas…) anyways, i think im gonna prep the stardance project to ship, idk if i can? ok, 11:00 PM, updated the front image, gonna work on updating some stuff ok, 11:06 PM (almost typed AM, that would be funny), added the open sauce image to the readme, brb! back at 12:42 AM, yeah, i think it’s a good time to ship? mfw fixing the position so the aspect ratio for the banner and the project banner (the different pages) are so so hard to get correct anyways, yeah, gonna copy this stuff over and we should be good to go? well, 1:22 AM, for now, good night!
7/28/2026 - 81st Update! Note: I wrote this back on 7/28/2026 but never published it here! (What? The return of Spark?) Well, not exactly, this is more of a thing for the latest announcement in #stardance-bulletin ! Here’s the edited video from a while back! It’s kinda for vertical/short form content, also, BIG EPILEPSY WARNING!!! While you’re here, you should definitely check out fermion , the “spark v2” in a way! It has a very different architecture (that’s surprisingly hard to cad), so check that out! Anyways, here’s the log without further ado… There’s really not that much to say. On July 26th, Spark was repackaged into a box and put into storage, almost a week after returning to New York City. It’s still in an operational state, with few wires disconnected, only with the WiFi credentials incorrect. For a logged 9 months and 2 weeks, a total of 287 days, with 80 progress updates in that time, Spark’s been on my mind for a long while, no doubt about that. Across the more than 64k words, 240+ hours, from the definitely overscoped original concept to the rush to finish it before Blueprint ended, Spark has existed between two whole YSWS programs, one used for design and one used for build. I have to say, with more than three quarters of a year, a lot has changed, both outside, in my actual life, and with Spark, as the idea changed through every log, slowly and carefully. There were highs and lows, and really, really, low lows, from feeling lost at the end of day 9 of build, to the excitment of the first motor turning during day 11. But now, it’s all neatly packed in the garage, waiting to be used another day. Spark isn’t gone, it still physically exists. It may not be resting on a giant wooden board I use for soldering next to my bed, but it still exists next to me through all the hard CAD and build days. It’s strange, this sudden change. For the last week, I haven’t really done much besides plan. And that’s probably a good thing, given all the planning Spark took. I haven’t really done much build, I haven’t really felt anything. Post convention depressions, I have to say, is hitting pretty hard. After such insane fun and wonder for a week, it’s suddenly back to a cool, rainy day, here in New York City. Sleeping through the afternoon, after sleeping not enough hours in the morning. As the rain starts pouring from the sky again, I’ve been wondering what the meaning of joy is. Alas, it might just be time. Adapting to such changes is obviously difficult, and the road of projects is too. But that doesn’t mean roadstops aren’t along the way. As I wrap up this update log, I want to leave a quick quote, one of my favorites. It probably sounds like a dumb platitude to say “it’s not the destination, it’s the journey”, but truth is, we’re made up of journeys. You’re never going to be who you’re supposed to be unless you take that road. … There is room in there for surprise, for deviations, for re-evaluations. I wouldn’t dare deprive you of that adventure. You only get one , after all. I know, you’re tired; resting is part of the journey too. But not giving up… Winter, in Housepets! (Rick Griffin, Dec 25, 2020) That said, what’s next? Well, first we’re gonna take a stepping stone. What’s next is still in concept form, but the unique constraints might require a custom PCB, which is where river comes in. First, it’s gonna be a quick project, just a custom PCB music player, just to jog the electrical skills. But after a quick skip over a stream, what’s truly next? What’s the successor to Spark? What’s next to rival its top 1 status? Fermion. See ya around.
Ships:
Well, after 120+ hours of building across some 18 days, and another hundred hours of CAD previously, it’s a good time to present Spark, this time irl! Anyways, after last summer, I fell into a sort of hole of demotivation where I didn’t really see what I was “working towards” in terms of school and just waiting six months for the FRC build season to start. In order to try to get my creativity and to prove to myself I wasn’t washed, I decided to throw myself into the deep end and to create a 3D printer. That said, 9 months later and way too many demotivation breaks, I locked in after exams and fully assembled and programmed and tested the build in 18 days! It features a coreXY gantry system, along with a passive tool changing setup with latches and the friction of the top docking piece. This kept the overall motor count to be 5 (2 for xy, 2 for z, 1 for tool). The tool changing setup and printing is nowhere near perfect (after all, this thing’s mostly made of PLA and was programmed in a week), but it’s definitely able to be tuned and better perfected with more programming time! In the end, Spark did achieve its goal of sparking some figurative sparks for me to continue building! After this, it was shipped off and exhibited at Open Sauce in California as part of Outpost where I’ve met amazing people and learned more about 3D printers and how to design them better!
hey! re-ship with an edited video! (and the bonus updatelog!)(NOTE: EPILEPSY WARNING! (it is an edit after all)) ( https://www.youtube.com/watch?v=ktODngPF7UI ) (i have fond memories of this, it was the saturday before the week of outpost and i stayed up to 6 AM edited, after a full day of getting footage and stuff (and dealing with goofy kdenlive crashes)) i also somehow did 10hrs+ that day so that was pretty insane! anyways, thanks for reviewing :D...
|
1793332294.9277868
|
1793418694.9277868
|
|
7748
|
Flow by @twinx | Stardance
|
twinx
|
6
|
106.0
|
791
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-11T13:20:24Z", "hours": 13.0, "multiplier": 17.94, "payout": 120, "blessing": "neutral", "text": "So after everyone’s request i added support for all platforms , i haven’t tested it on mac (cause i don’t that🙃️) but i have tested on all other platforms and hope that it works on your systems too. Also i have added some new features for u all : a new log for seeing what broke new display i.e. rich that makes it more cool looking new commands and insane customization 😎️", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 2, "ts": "2026-10-01T10:07:35Z", "hours": 35.0, "multiplier": 18.78, "payout": 331, "blessing": "neutral", "text": "Changes from last ship : new database from json to db ( sqlite ) and new codebase Added TUI and also improved the web mode Added new commands and docs Added plugins system and community plugins Major and minor bug fixes", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 3, "ts": "2026-08-02T15:52:05Z", "hours": 22.0, "multiplier": 7.29, "payout": 73, "blessing": "neutral", "text": "So added few not actually few but many like better ui for web formats using ffmpeg playlist feature bug fixes and much more I want to thank you all for support and hopping to add more features. Also do visit the flow page. Enjoy !", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 4, "ts": "2026-07-18T08:24:18Z", "hours": 12.0, "multiplier": 16.41, "payout": 33, "blessing": "neutral", "text": "Ship #3 Added many features such as : background playback so you don’t need to open a terminal just for flow. bars for you to enjoy the vibe. lyrics so you can sing along the song it is also time-synced . and much more such as configs customization. How to install : Head to release page for a linux binary or type it in terminal but make sure you have python and vlc installed pip install flow-twinx and then flow", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 5, "ts": "2026-07-05T01:38:26Z", "hours": 12.0, "multiplier": 14.1, "payout": 109, "blessing": "neutral", "text": "Flow version v0.4.0 This version includes Saavan playback , Saavan is a music player with high quality songs. Please do also keep this in mind that Songs on saavan are only playable on saavan commands and there is no radio mode for it. The difficult part about this thing is the API , actually the API is build by me hosted on NEST as a part of SINGULARITY my another project some similar features but more advanced. Do check out that also!", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}, {"ship_num": 6, "ts": "2026-06-17T08:20:51Z", "hours": 12.0, "multiplier": 10.78, "payout": 125, "blessing": "neutral", "text": "I build a terminal music player that uses vlc and yt_dlp , that has both offline and online support for music you can either play from folders or online. Hardest part to make it run on all os.", "repo": "https://github.com/flow-twinx/flow", "demo": "https://flow-twinx.pages.dev/download"}]...
|
[{"post_id": 78737, "ts": "202 [{"post_id": 78737, "ts": "2026-10-11T13:09:32Z", "hours": 4.8319, "text": "v0.9.1 So after hours added support for all platforms and made website and hosted it on cloudflare here also i have added a better logs system to tell if anything goes wrong , aslo this time please rate it as much as u could i have spend 100+ hours working on this still i get 200 stardust :("}, {"post_id": 78322, "ts": "2026-10-10T12:35:40Z", "hours": 8.4858, "text": "v0.8.4 Forgot to add the versions from some devlogs. New features : added a full for showcase added a minimal version so ai agents and ssh terminals can work too added a new progress bar and some bug fixes… i tried adding cookies but it works good without cookies also so would add a import option to import external songs. Also i am working on making it play on all platforms including termux of mobile phones."}, {"post_id": 75842, "ts": "2026-10-01T10:00:50Z", "hours": 1.4978, "text": "So i have to really fix this bug not too much big but it resulted in multiple vlc instance to start also changed export to export songs instead of a zip file and with custom path can be used by -p PATH or default to Downloads/music ."}, {"post_id": 74510, "ts": "2026-09-27T15:17:11Z", "hours": 0.2864, "text": "#v0.8.0 Just finished some last parts and added it to ship."}, {"post_id": 73966, "ts": "2026-09-26T12:39:28Z", "hours": 8.5808, "text": "So mostly made changes to backend and the structure of the project. Changes : migrated from json to sqlite for history and other new features soon added a plugins system with a repo for community plugins separate commands for sperate playform like flow-web for flow"}, {"post_id": 69636, "ts": "2026-09-17T13:37:22Z", "hours": 2.6986, "text": "v0.7.0 So finally made the tui using textual and it looks pretty good i wasn’t expecting much but yeah looks good also there are pretty much 10 themes i guess so enjoy that are given in textual by default. Also changed the structure of the code repo as it was a disaster so now it has /backend /tui and /cli"}, {"post_id": 65826, "ts": "2026-09-11T07:08:47Z", "hours": 3.4658, "text": "v0.6.1 Replaced the old UI with new UI , as previous one looked awful for most people i hope this is good. Also added this demo video , i tried to add a more professional one with openscreen but quality issues with the app , so will add later till then this is the demo video."}, {"post_id": 62823, "ts": "2026-09-06T10:56:04Z", "hours": 5.4986, "text": "Hey everyone hope ur doing well. Today i think mostly i did was just making it cool and easy to navigate and bug fixes for the most time. Bugs: Ctrl + Q not working in radio mode d not working in new selection mode not showing [Paused] when paused and much more that is too big to explain here and started working on gui mode using PySide6"}, {"post_id": 60253, "ts": "2026-09-02T14:48:41Z", "hours": 2.2642, "text": "v0.6.0 So , i have added a new selection using arrow keys for config search and play for better navigation also to reduce the typing thing in terminal to change the value. Also replaced the bars for a better looking and customizable bars it includes custom char + 3 modes."}, {"post_id": 56448, "ts": "2026-08-28T06:39:47Z", "hours": 2.4575, "text": "So added more commands and few mid level bug fixes : added delete command added more flags to control it by using other programs improved the name shorter to include other laung added the m and pick songs in play also thing as shown in video. improved the –status command to show images."}, {"post_id": 52872, "ts": "2026-08-23T07:46:12Z", "hours": 2.0144, "text": "v0.5.8 So added a better playlist management system that has support for local songs before it had different playlist logic for different mode , now it shares same logic with also bug fixes and in future updates gonna add island as a way u can do it without any configs also better status."}, {"post_id": 50472, "ts": "2026-08-19T17:14:05Z", "hours": 6.7164, "text": "So yeah still alive after many days cause i thought it needed more work. I made something to help u in KDE and Hyprland by using dbus to expose name and a custom --status command wit img support and all that to provide u with a support for custom modules. The island shown here is my custom build and is not included in the flow project. Also made few more thing in here to help u out and fixed bugs."}, {"post_id": 39542, "ts": "2026-08-02T15:48:47Z", "hours": 0.27, "text": "So last fix i guess for this ship , it includes changes in dependencies i previously forgot to add toml so it caused error in some OS i think not in my one , so i switched to pyproject.toml i kept that so users can use pip also not only uv."}, {"post_id": 39528, "ts": "2026-08-02T15:25:31Z", "hours": 0.4983, "text": "So fixed a bug where after closing a radio when user searched for other song and then played it continued from last play instead of new one."}, {"post_id": 38934, "ts": "2026-08-01T15:24:47Z", "hours": 3.4775, "text": "v0.5.0 So fixed major stuffs mostly like : playlist not created error fixed format in web mode as it downloaded in mp3 fixed another download bug as it downloaded in mp4 , when set to default fixed loop during playback which caused one command execution only and other were not listened And added some more thing: a export feature added better port handling added –port ( ~5 commands ) and –version commands"}, {"post_id": 35788, "ts": "2026-07-27T13:20:01Z", "hours": 1.6367, "text": "Added playlist feature and a lot more features like format - opus , mp3 , m4a and webm. Also fixed some bugs regarding downloads and added a check feature to check flow gets all things like vlc , ffmpeg .etc"}, {"post_id": 34615, "ts": "2026-07-25T14:20:28Z", "hours": 0.4917, "text": "So trying to make the web version so u know a better docs instead of terminal one with better installation support. Thought of notifying everyone so u can guess what will be the next few develops about."}, {"post_id": 34070, "ts": "2026-07-24T15:03:24Z", "hours": 2.9269, "text": "Finally added playlist it has following commands: playlist ( to list all ) playlist add playlist remove pl.. -d radio -p ( to save as playlist ) also download or -d download radio as a playlist instead of songs in downloads"}, {"post_id": 32728, "ts": "2026-07-22T02:01:00Z", "hours": 0.74, "text": "v0.4.7 So i am just kinda dumb i think. I didn’t even commited the changes and lost all the works 🥲 i do managed to re-write the code once again for some parts like DEV MODE and bug fix regarding the playback. So playlist features are on a hold"}, {"post_id": 32438, "ts": "2026-07-21T16:57:32Z", "hours": 2.5728, "text": "So fixed some major and minor bugs and flaws like user can even download the song in /boot/ also added history and auto-completion , it also now has playlist commands and features with better UI in web mode not too much but still. Also added format option so u can download in whichever format u want. And made this banner"}, {"post_id": 31875, "ts": "2026-07-20T16:54:25Z", "hours": 8.9078, "text": "0.4.5 So after ~7hr ( some are not recorded which i spent in browser ) I made the UI of the flow in web looking forward for a desktop UI also but later i think. What is New and what is changed Web UI with pixel theme Local support for UI also and liked songs Minor bug fixes"}, {"post_id": 30572, "ts": "2026-07-18T08:19:25Z", "hours": 0.3758, "text": "Nothing added just fixed more things and made a new video for upload at github pages. You can see video here it also has audio. added a linux binary at release page and links to my github account in PyPi"}, {"post_id": 30520, "ts": "2026-07-18T05:06:55Z", "hours": 0.4369, "text": "So added these bars looks weird i know because i set their width to 3 and spacing : fit that’s why but u can customize it however you want. Also fully added the lyrics , mostly you will see lyrics not found if are listening in other laung then eng because YtLyrics doesn’t have much songs lyrics i guess."}, {"post_id": 30505, "ts": "2026-07-18T04:13:45Z", "hours": 1.0981, "text": "So this is going crazy like really! What i added today? A bar that reacts to sound. fixed errors in bg mode which triggered the playing of two music at the same time. Also trying to add like 50% added the lyrics with time synced."}, {"post_id": 30120, "ts": "2026-07-17T13:09:14Z", "hours": 9.635, "text": "So i made some new changes like a background player no need to open a terminal just for a music also fixed some major errors like calling fetch when not needed in radio mode."}, {"post_id": 22528, "ts": "2026-07-05T01:33:25Z", "hours": 3.9431, "text": "Published v0.4.0 this version includes Saavan playback also and new commands i.e. : savan : play songs directly( alias: svn ) savan-s : search songs by name ( alias : svn-s )"}, {"post_id": 16137, "ts": "2026-06-26T07:14:21Z", "hours": 2.9075, "text": "Added many features here are some of them : better radio with play next config feature theme changing better colors."}, {"post_id": 15463, "ts": "2026-06-25T04:23:40Z", "hours": 2.0053, "text": "uploaded to PyPi with features such as: radio mode which auto suggest songs alias for quick commands major bug fixes"}, {"post_id": 13075, "ts": "2026-06-21T11:57:16Z", "hours": 2.5681, "text": "added alias for commands such as hl for help , pl for play these are default and can be changed later by running short <index> <value> also added more detailed help command that gives user more info , can be run by using help -i or hl -i or as per your alias. Features in new update: suggestion of songs (fetched from youtube) custom themes more option for using tools"}, {"post_id": 11113, "ts": "2026-06-18T05:43:07Z", "hours": 0.3356, "text": "Finally after hard work as i have never uploaded anything to Pypi anything before so totally a disaster that includes import error and much more. You can install this package by typing pip install flow-twinx"}, {"post_id": 10500, "ts": "2026-06-17T07:47:16Z", "hours": 0.2867, "text": "fixed the error when doing install.sh in windows as the path are not same in linux and windows"}, {"post_id": 10490, "ts": "2026-06-17T07:23:31Z", "hours": 0.4394, "text": "added readme.md and finished by adding features listed also added install.sh"}, {"post_id": 10471, "ts": "2026-06-17T06:45:47Z", "hours": 2.6703, "text": "made few things as listed: a progress bar offline download of songs shuffle and repeat songs liked songs and much more adding : offline support like liked songs , album"}, {"post_id": 10390, "ts": "2026-06-17T02:17:36Z", "hours": 1.2692, "text": "Re-started the project and this time adding both offline and online features i.e. yet to implement , i have already made the ping.py file so it can check if host has connections. also some few changes in future :- online playback mode without downloading the song. offline mode. will try to add suggestion by adding &start_radio=1 to get suggestion directly from YouTube"}, {"post_id": 5516, "ts": "2026-06-09T10:11:49Z", "hours": 1.8011, "text": "Tried too much to add cross-fade but the audio just glitches , will be trying more if not possible i will leave this feature and focus on something different.Also added the bash install for different os so it becomes flow play not py main.py play."}, {"post_id": 4843, "ts": "2026-06-08T11:24:27Z", "hours": 2.4728, "text": "Finally made functional and working , have to make it once more took more help from AI i didn’t wanted to but sometimes vlc was giving error and sometimes yt_dlp even though i was following the module guide , i don’t know what was happening. Currently adding the spinners and more things. Features added till now: like music make playlist Fuzzy search or smart search"}, {"post_id": 4229, "ts": "2026-06-07T13:53:21Z", "hours": 2.8981, "text": "| | This is my first post on this project , this project is about a feature rich and apple music inspired terminal music player | | . Today i made basic commands like play , delete , random , like .etc . The best part was to create the file handling as i have learned how to handle the .yaml files instead of json files for settings and hardest part was nothing except me trying to use vlc without AI or docs."}]...
|
Title: Flow by @twinx | Stardance
Devlogs:
| | Th Title: Flow by @twinx | Stardance
Devlogs:
| | This is my first post on this project , this project is about a feature rich and apple music inspired terminal music player | | . Today i made basic commands like play , delete , random , like .etc . The best part was to create the file handling as i have learned how to handle the .yaml files instead of json files for settings and hardest part was nothing except me trying to use vlc without AI or docs.
Finally made functional and working , have to make it once more took more help from AI i didn’t wanted to but sometimes vlc was giving error and sometimes yt_dlp even though i was following the module guide , i don’t know what was happening. Currently adding the spinners and more things. Features added till now: like music make playlist Fuzzy search or smart search
Tried too much to add cross-fade but the audio just glitches , will be trying more if not possible i will leave this feature and focus on something different.Also added the bash install for different os so it becomes flow play not py main.py play.
Re-started the project and this time adding both offline and online features i.e. yet to implement , i have already made the ping.py file so it can check if host has connections. also some few changes in future :- online playback mode without downloading the song. offline mode. will try to add suggestion by adding &start_radio=1 to get suggestion directly from YouTube
made few things as listed: a progress bar offline download of songs shuffle and repeat songs liked songs and much more adding : offline support like liked songs , album
added readme.md and finished by adding features listed also added install.sh
fixed the error when doing install.sh in windows as the path are not same in linux and windows
Finally after hard work as i have never uploaded anything to Pypi anything before so totally a disaster that includes import error and much more. You can install this package by typing pip install flow-twinx
added alias for commands such as hl for help , pl for play these are default and can be changed later by running short <index> <value> also added more detailed help command that gives user more info , can be run by using help -i or hl -i or as per your alias. Features in new update: suggestion of songs (fetched from youtube) custom themes more option for using tools
uploaded to PyPi with features such as: radio mode which auto suggest songs alias for quick commands major bug fixes
Added many features here are some of them : better radio with play next config feature theme changing better colors.
Published v0.4.0 this version includes Saavan playback also and new commands i.e. : savan : play songs directly( alias: svn ) savan-s : search songs by name ( alias : svn-s )
So i made some new changes like a background player no need to open a terminal just for a music also fixed some major errors like calling fetch when not needed in radio mode.
So this is going crazy like really! What i added today? A bar that reacts to sound. fixed errors in bg mode which triggered the playing of two music at the same time. Also trying to add like 50% added the lyrics with time synced.
So added these bars looks weird i know because i set their width to 3 and spacing : fit that’s why but u can customize it however you want. Also fully added the lyrics , mostly you will see lyrics not found if are listening in other laung then eng because YtLyrics doesn’t have much songs lyrics i guess.
Nothing added just fixed more things and made a new video for upload at github pages. You can see video here it also has audio. added a linux binary at release page and links to my github account in PyPi
0.4.5 So after ~7hr ( some are not recorded which i spent in browser ) I made the UI of the flow in web looking forward for a desktop UI also but later i think. What is New and what is changed Web UI with pixel theme Local support for UI also and liked songs Minor bug fixes
So fixed some major and minor bugs and flaws like user can even download the song in /boot/ also added history and auto-completion , it also now has playlist commands and features with better UI in web mode not too much but still. Also added format option so u can download in whichever format u want. And made this banner
v0.4.7 So i am just kinda dumb i think. I didn’t even commited the changes and lost all the works 🥲 i do managed to re-write the code once again for some parts like DEV MODE and bug fix regarding the playback. So playlist features are on a hold
Finally added playlist it has following commands: playlist ( to list all ) playlist add playlist remove pl.. -d radio -p ( to save as playlist ) also download or -d download radio as a playlist instead of songs in downloads
So trying to make the web version so u know a better docs instead of terminal one with better installation support. Thought of notifying everyone so u can guess what will be the next few develops about.
Added playlist feature and a lot more features like format - opus , mp3 , m4a and webm. Also fixed some bugs regarding downloads and added a check feature to check flow gets all things like vlc , ffmpeg .etc
v0.5.0 So fixed major stuffs mostly like : playlist not created error fixed format in web mode as it downloaded in mp3 fixed another download bug as it downloaded in mp4 , when set to default fixed loop during playback which caused one command execution only and other were not listened And added some more thing: a export feature added better port handling added –port ( ~5 commands ) and –version commands
So fixed a bug where after closing a radio when user searched for other song and then played it continued from last play instead of new one.
So last fix i guess for this ship , it includes changes in dependencies i previously forgot to add toml so it caused error in some OS i think not in my one , so i switched to pyproject.toml i kept that so users can use pip also not only uv.
So yeah still alive after many days cause i thought it needed more work. I made something to help u in KDE and Hyprland by using dbus to expose name and a custom --status command wit img support and all that to provide u with a support for custom modules. The island shown here is my custom build and is not included in the flow project. Also made few more thing in here to help u out and fixed bugs.
v0.5.8 So added a better playlist management system that has support for local songs before it had different playlist logic for different mode , now it shares same logic with also bug fixes and in future updates gonna add island as a way u can do it without any configs also better status.
So added more commands and few mid level bug fixes : added delete command added more flags to control it by using other programs improved the name shorter to include other laung added the m and pick songs in play also thing as shown in video. improved the –status command to show images.
v0.6.0 So , i have added a new selection using arrow keys for config search and play for better navigation also to reduce the typing thing in terminal to change the value. Also replaced the bars for a better looking and customizable bars it includes custom char + 3 modes.
Hey everyone hope ur doing well. Today i think mostly i did was just making it cool and easy to navigate and bug fixes for the most time. Bugs: Ctrl + Q not working in radio mode d not working in new selection mode not showing [Paused] when paused and much more that is too big to explain here and started working on gui mode using PySide6
v0.6.1 Replaced the old UI with new UI , as previous one looked awful for most people i hope this is good. Also added this demo video , i tried to add a more professional one with openscreen but quality issues with the app , so will add later till then this is the demo video.
v0.7.0 So finally made the tui using textual and it looks pretty good i wasn’t expecting much but yeah looks good also there are pretty much 10 themes i guess so enjoy that are given in textual by default. Also changed the structure of the code repo as it was a disaster so now it has /backend /tui and /cli
So mostly made changes to backend and the structure of the project. Changes : migrated from json to sqlite for history and other new features soon added a plugins system with a repo for community plugins separate commands for sperate playform like flow-web for flow
#v0.8.0 Just finished some last parts and added it to ship.
So i have to really fix this bug not too much big but it resulted in multiple vlc instance to start also changed export to export songs instead of a zip file and with custom path can be used by -p PATH or default to Downloads/music .
v0.8.4 Forgot to add the versions from some devlogs. New features : added a full for showcase added a minimal version so ai agents and ssh terminals can work too added a new progress bar and some bug fixes… i tried adding cookies but it works good without cookies also so would add a import option to import external songs. Also i am working on making it play on all platforms including termux of mobile phones.
v0.9.1 So after hours added support for all platforms and made website and hosted it on cloudflare here also i have added a better logs system to tell if anything goes wrong , aslo this time please rate it as much as u could i have spend 100+ hours working on this still i get 200 stardust :(
Ships:
I build a terminal music player that uses vlc and yt_dlp , that has both offline and online support for music you can either play from folders or online. Hardest part to make it run on all os.
Flow version v0.4.0 This version includes Saavan playback , Saavan is a music player with high quality songs. Please do also keep this in mind that Songs on saavan are only playable on saavan commands and there is no radio mode for it. The difficult part about this thing is the API , actually the API is build by me hosted on NEST as a part of SINGULARITY my another project some similar features but more advanced. Do check out that also!
Ship #3 Added many features such as : background playback so you don’t need to open a terminal just for flow. bars for you to enjoy the vibe. lyrics so you can sing along the song it is also time-synced . and much more such as configs customization. How to install : Head to release page for a linux binary or type it in terminal but make sure you have python and vlc installed pip install flow-twinx and then flow
So added few not actually few but many like better ui for web formats using ffmpeg playlist feature bug fixes and much more I want to thank you all for support and hopping to add more features. Also do visit the flow page. Enjoy !
Changes from last ship : new database from json to db ( sqlite ) and new codebase Added TUI and also improved the web mode Added new commands and docs Added plugins system and community plugins Major and minor bug fixes
So after everyone’s request i added support for all platforms , i haven’t tested it on mac (cause i don’t that🙃️) but i have tested on all other platforms and hope that it works on your systems too. Also i have added some new features for u all : a new log for seeing what broke new display i.e. rich that makes it more cool looking new commands and insane customization 😎️...
|
1793310865.2656906
|
1793397265.2656906
|
|
7750
|
Updato by @NellowTCS | Stardance
|
NellowTCS
|
1
|
5.0
|
78
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T04:27:18Z", "hours": 5.0, "multiplier": 14.89, "payout": 78, "blessing": "neutral", "text": "Updato is a decentralized update system for web apps. A GitHub Action publishes builds to a CDN branch, a Cloudflare Worker handles version checks, and a client library hot-swaps files in the browser with no reload. It’s on npm as @nellowtcs /updato. It works end to end. Push code, Action builds it, Worker picks it up, client swaps files live. No server, no database. Also there’s a live demo, a docs site, and a real npm package now. It became a real project somewhere along the way. CSS hot-swapping was a whole thing. Ended up using CSSStyleSheet.replaceSync with adoptedStyleSheets to make it work without flashing or breaking CSP. Also npm told me my package name was too similar to “upath” which is just not true but whatever, scoped it and moved on. The live demo ( https://nellowtcs.me/updato/ ) is a clock app that checks for updates from the Worker. You can also install it with npm i @nellowtcs/updato and the docs are at https://nellowtcs.me/updato/docs .", "repo": "https://github.com/NellowTCS/updato", "demo": "https://nellowtcs.me/updato/"}]...
|
[{"post_id": 3282, "ts": "2026 [{"post_id": 3282, "ts": "2026-06-06T04:21:10Z", "hours": 0.6542, "text": "devlog: shipped updato is published. it’s on npm. it has a version number and everything. the publish switched the build from vite to tsdown. vite was fine for dev but tsdown gives you dual esm/cjs output with proper .mjs/.cjs extensions and matching declaration files out of the box. the package exports map has real conditional exports now — separate import and require entries with their own types. it’s the kind of package.json that doesn’t make people file issues. scoped it to @nellowtcs/updato because apparently updato was too close to upath for npm’s similarity check. it is not similar. at all. but scoped names are better practice anyway so whatever, npm wins this round. the release workflow strips private , scripts , and devDependencies from package.json before publish. originally did that with an inline node script, swapped it to a one-liner jq pipe because why run a whole runtime to delete three keys. 1.0.0 → 1.0.1 released 1.0.0. immediately released 1.0.1 because of the name conflict. so it goes. the important thing is npm i @nellowtcs/updato works and the types resolve and the imports are correct. tested it, it’s real. what actually shipped all of it: github action that publishes builds to a cdn branch cloudflare worker that serves version checks from KV client library on npm with hot-swap, two update modes, optional metrics live demo at nellowtcs.me/updato docs site at nellowtcs.me/updato/docs ci pipeline for all of it a readme that actually explains what this thing does what’s left one item on the todo list: custom domain for the worker. that’s a “maybe” and it’s been a “maybe” for a while. it can stay a maybe. closing this started as a dumb idea about pushing updates without a server. it is now a real system with five directories and a package on npm and documentation with a sidebar. i don’t know when it became a real project but it did and now it’s done. first release. final (nah, probably not) devlog."}, {"post_id": 3255, "ts": "2026-06-06T03:05:19Z", "hours": 1.6772, "text": "devlog: docs, workflows, and the finish line this is the “make it real” commit. everything that was on the todo list under “before you can call this a real project” happened in one sitting. docs site built a full docs site using docmd. lives in Docs/ with its own package. seven pages covering everything: home/landing page, quickstart guide, core concepts explainer, and individual reference pages for the client library, github action, worker, hot-swap internals, manifest format, and download metrics. the client library page has full config tables, event references, api docs for every public method, and the UpdateNotification component. the action page documents every input and shows what the cdn branch looks like after a deploy. the worker page covers both endpoints, version comparison logic, caching, and rate limiting. the hot-swap page explains how each asset type gets replaced: scripts via dom replacement with data-hot-file tagging for subsequent updates, css via CSSStyleSheet.replaceSync and adoptedStyleSheets (which is CSP-safe), and images via base64 data uris. used the “sky” theme with system dark mode toggle. search, sitemap plugin, code highlighting, all enabled. github pages deployment new workflow at .github/workflows/static.yml . builds the client library, builds the demo, builds the docs, then assembles them into a single pages-root/ directory. demo goes under /demo/ , docs go at the root. deploys to gh-pages with peaceiris/actions-gh-pages. npm publish workflow .github/workflows/release-npm.yml . triggers on github release publish or manual dispatch with a dry-run option. builds the client library, strips private , scripts , and devDependencies from package.json, copies in the readme and license, then publishes with --provenance . also removed \"private\": true from Build/package.json so npm will actually accept it. security audit workflow daily cron job plus on-push when lockfiles change. runs npm audit --audit-level=high across every package (root, Build, Worker, Action, Demo, Docs). all the audit steps have || true so the workflow reports issues without failing the build, which felt like the right balance for now. separate test workflow split the test job out of ci.yml into its own .github/workflows/test.yml . same matrix across node 20 and 22, runs jest in all three packages. keeps the ci workflow focused on lint and build. todo status checked off docs. what’s left: update the readme with better examples, maybe attach the worker to a custom domain, and publish to npm. the npm workflow is ready, just need to actually pull the trigger."}, {"post_id": 3067, "ts": "2026-06-05T23:24:18Z", "hours": 1.5717, "text": "devlog: the three commits i forgot to write about got in a flow state and forgot to devlog. here’s the catch-up. multi-branch support + notification ui the whole system was hardcoded to a branch called cdn . now you can pass a branch parameter everywhere. the worker accepts it as a query param (defaults to cdn ), the client sends it with check requests, and download urls use the right branch. manifest cache keys in kv include the branch name so different environments don’t collide. the idea is you could have cdn-staging and cdn-production in the same repo and point different app builds at different ones. added branch validation in the worker too since someone’s going to try passing something weird eventually. also built an UpdateNotification class in update-ui.ts . it’s a drop-in banner component that handles the whole flow. you pick top or bottom, set it dismissable or not, and call notification.show(result) when there’s an update. clicking the button downloads and applies. if the download fails it resets. styling is all inline so there’s no css file to import. updated both examples to use it. the example-app.html went from a hand-rolled banner with window.__pendingUpdate to just notification.show(result) . much cleaner. module scripts + download metrics the action now scans html files for <script type=\"module\"> tags and includes a modules array in the manifest. the client passes this through to hot-swap so module scripts get replaced with type=\"module\" set on the new element. the regex for finding them is a little fragile but it works for standard vite/webpack output. also switched the action bundler from @vercel/ncc to esbuild . ncc was fine but esbuild is faster and i was already using it elsewhere. added an opt-in DownloadMetrics class that records timing data per file download (start, end, duration, size, url) in localStorage. pass it into the config and it starts tracking. you can export as json or clear it. useful for debugging slow updates but not the kind of thing you want on by default. tests + ci wrote jest tests for all three packages. action tests mock @actions/core , @actions/github , and @actions/exec . covers input parsing, repo context, package.json version reading, recursive file listing, module script detection, and clone url construction. had to export a bunch of internal functions to make them testable. client tests use jsdom with mocked fetch. covers hot-swap (regular scripts, module scripts, stylesheets, images, unknown types), the metrics class, and the main updato class (version tracking, cache management, update checking, downloads, event callbacks). worker tests cover validation helpers, the full fetch handler (missing params, invalid params, successful checks, unknown endpoints, OPTIONS, method rejection), manifest validation with every field failure case, and the rate limiter with fake timers. ci workflow at .github/workflows/ci.yml . runs on push and pr to main, matrix across node 20 and 22. lints, runs all tests, builds all three packages. todo status checked off: multi-branch, notification ui, module types, metrics, tests, ci. what’s left is docs, a demo, and release automation. the core functionality is done."}, {"post_id": 2861, "ts": "2026-06-05T18:37:02Z", "hours": 0.8061, "text": "devlog: the “just rename it” update (and a bunch of other stuff) the name thing changed name: Updato to name: Updato Action in action.yml. that’s it. that’s the fix. spent hours filing a support ticket, got a polite “no” from github, and the solution was adding one word. sometimes software development is humbling. hot-swap got its own file ripped the hot-swap logic out of updato.ts and gave it a proper home in hot-swap.ts . while i was in there i figured i might as well make it actually good. it now supports images too. png, jpg, gif, svg, webp, ico, bmp, avif. it finds matching <img> , <source> , and favicon <link> elements by basename and swaps their src/href to a base64 data uri. so if your update is just a new logo, no reload needed. also switched the element matching from substring ( src*=\"${file}\" ) to basename comparison, which is way less fragile. before, a file called app.js could’ve accidentally matched webapp.js . now it actually compares the filename part properly. the css swap switched from btoa() to encodeURIComponent() which handles unicode better. small thing but the kind of thing that would’ve been a weird bug later. everything returns a typed HotSwapResult now instead of just a boolean. so the caller knows what got swapped, what type it was, and which file it was for. manifest validation added a real validator in Worker/src/manifest.ts . before, the worker was just casting response.json() as Manifest and hoping for the best with a couple of if-checks. now there’s a validateManifest() function that checks every field properly and returns typed errors. each error tells you which field failed and why. this runs both when fetching fresh manifests from github and when reading cached ones from kv. if a cached manifest is corrupted it just falls through and re-fetches. rate limiting new file: Worker/src/rate-limit.ts . uses cloudflare kv to track requests per ip. 60 requests per 60 second window, which is generous enough for normal usage but should keep anyone from hammering it. uses CF-Connecting-IP for the real client ip, falls back to X-Forwarded-For . returns a proper 429 with a Retry-After header when you hit the limit. the kv entries auto-expire so they don’t pile up forever. I half wanted to make the 429 return silly messages, but I gotta be serious apparently sometimes :/ had to add a kv namespace binding in wrangler.toml for this. the worker was fully stateless before, now it has a little bit of state. felt like a big architectural decision for what’s basically a counter but whatever, it’s the right call. kv caching for manifests while i was adding kv for rate limiting i figured i might as well use it for manifest caching too. previously every /check request was hitting github’s raw content cdn directly. now it caches the manifest in kv with a configurable ttl (defaults to 300 seconds). means fewer github api calls and faster responses for repeat checks. worker got lint + prettier too copied the eslint + prettier setup from Build into Worker. also added projectService and tsconfigRootDir to both eslint configs so typescript-eslint can actually find the tsconfigs. this was one of those “why is eslint yelling at me” rabbit holes. todo cleanup checked off rate limiting and manifest validation. removed the already-completed items that were cluttering the list. it’s getting shorter."}, {"post_id": 2619, "ts": "2026-06-05T07:31:58Z", "hours": 0.3933, "text": "devlog: hot-swap and cleanup two things happened here and they’re very different vibes. hot-swap so previously applyUpdate() was just… reload the page. which works, obviously, but it’s not exactly elegant. if you’re updating a css file there’s no reason to nuke the entire page state. now it actually tries to be smart about it. when you call applyUpdate() , it looks at each file’s extension and attempts to swap it in-place: for .js files, it finds the matching <script> tag by src and replaces it with a new one containing the updated content for .css files, it finds the matching <link> stylesheet and swaps it with a base64 data url version of the new css if none of the files can be hot-swapped (like if there’s no matching dom element, or it’s a file type it doesn’t know about), it falls back to the classic window.location.reload() . so nothing breaks, it just tries the nice path first. the base64 css thing is a little cursed honestly. but it works and avoids needing to host the file anywhere. the browser just reads it inline. i might revisit this later if it causes issues with large stylesheets but for now it’s fine. eslint + prettier added eslint and prettier to the Build package because the code was starting to look inconsistent and it was bothering me. set up a flat config with typescript-eslint, browser globals, the usual. named the prettier script make-pretty because i thought it was funny. and idk, it’s how i do it ig prettier immediately reformatted a bunch of stuff in updato.ts . removed some unnecessary quote wrapping on \"Accept\" , collapsed a few multi-line expressions that didn’t need to be multi-line, cleaned up trailing commas. nothing behavioral, just formatting. also committed the lockfile. should’ve done that earlier but here we are. todo progress checked off hot-swap support and the linting setup. removed the version bump script todo since that was already done in the last round. the list is getting shorter. slowly."}, {"post_id": 2606, "ts": "2026-06-05T06:58:58Z", "hours": 0.3131, "text": "the one big devlog so updato exists now. figured i should write down what actually happened before i forget why i made half these decisions. what even is this updato is a decentralized update system for browser apps. the whole idea is: you push code, your app knows there’s a new version, and it updates itself. no app store, no server infrastructure you have to maintain. just github and a cloudflare worker. it’s three pieces: a github action that takes your build output and pushes it to a cdn branch on your repo. every version gets its own folder, plus there’s always a latest/ copy. it writes a manifest.json with metadata about what’s current. a cloudflare worker that acts as the middleman. your app asks it “hey is there an update?” and it goes and reads your manifest off github, compares versions, and tells the client yes or no. stateless, basically free to run. a js client library that you drop into your app. it talks to the worker, downloads new files if there’s an update, caches them in localStorage, and reloads when you’re ready. two modes because i couldn’t pick one there’s commit mode and version mode. commit mode means every push is a new version and the “version” is just the commit sha. version mode uses semver from your package.json. commit mode is nice for apps where you just want continuous deployment. version mode is for when you want to be more intentional about it. honestly i went back and forth on whether to support both. decided it was easy enough to keep and the action just reads a flag. the action lives in Action/ . typescript, compiled with ncc. it clones your cdn branch into a temp directory (or inits a fresh one if the branch doesn’t exist yet), copies your dist folder into latest/ and versions/{version}/ , writes the manifest, commits, and pushes. the commit messages are kinda nice actually, they show what version replaced what: deploy: abc123 (was def456) . one thing i’m quietly proud of is that it handles the “branch doesn’t exist yet” case gracefully. first run just works. the worker lives in Worker/ . pretty small. two endpoints: /check and /manifest . /check takes a repo and your current version, fetches the manifest from github, does the comparison, and returns whether there’s an update. wrote my own semver parser because i didn’t want to pull in a dependency for what’s basically three number comparisons. it’s probably fine. it validates the repo format with a regex so you can’t pass in weird stuff. set up wrangler.toml with a production and staging env. the client lives in Build/ . this is the part that actually runs in people’s apps. it’s a class called Updato (creative naming, i know). you init it with your repo, mode, and current version. then you can check for updates, download them, and apply them. downloads get cached in localStorage with version tags so stale cache gets cleaned up automatically. built with vite, outputs both esm and umd so you can import it or just drop a script tag. tooling i added after wrote a bump-version.js script that bumps the version across all four package.jsons (root + the three workspace packages), commits, tags, and pushes. one command to do a release, basically. also a little print-cdn-commit.js that tells you what the latest cdn branch commit is, which is useful for debugging. there’s a TODO.md with a bunch of stuff i want to do eventually. hot-swap support, rate limiting in the worker, tests, linting, npm publishing. the usual “i’ll get to it” list. current status it works. the action runs, the worker deploys, the client checks and downloads. trying to publish the action to the github marketplace but the name “Updato” is apparently reserved by a ghost account that doesn’t exist. so that’s cool. working on that."}]...
|
Title: Updato by @NellowTCS | Stardance
Devlogs:
Title: Updato by @NellowTCS | Stardance
Devlogs:
the one big devlog so updato exists now. figured i should write down what actually happened before i forget why i made half these decisions. what even is this updato is a decentralized update system for browser apps. the whole idea is: you push code, your app knows there’s a new version, and it updates itself. no app store, no server infrastructure you have to maintain. just github and a cloudflare worker. it’s three pieces: a github action that takes your build output and pushes it to a cdn branch on your repo. every version gets its own folder, plus there’s always a latest/ copy. it writes a manifest.json with metadata about what’s current. a cloudflare worker that acts as the middleman. your app asks it “hey is there an update?” and it goes and reads your manifest off github, compares versions, and tells the client yes or no. stateless, basically free to run. a js client library that you drop into your app. it talks to the worker, downloads new files if there’s an update, caches them in localStorage, and reloads when you’re ready. two modes because i couldn’t pick one there’s commit mode and version mode. commit mode means every push is a new version and the “version” is just the commit sha. version mode uses semver from your package.json. commit mode is nice for apps where you just want continuous deployment. version mode is for when you want to be more intentional about it. honestly i went back and forth on whether to support both. decided it was easy enough to keep and the action just reads a flag. the action lives in Action/ . typescript, compiled with ncc. it clones your cdn branch into a temp directory (or inits a fresh one if the branch doesn’t exist yet), copies your dist folder into latest/ and versions/{version}/ , writes the manifest, commits, and pushes. the commit messages are kinda nice actually, they show what version replaced what: deploy: abc123 (was def456) . one thing i’m quietly proud of is that it handles the “branch doesn’t exist yet” case gracefully. first run just works. the worker lives in Worker/ . pretty small. two endpoints: /check and /manifest . /check takes a repo and your current version, fetches the manifest from github, does the comparison, and returns whether there’s an update. wrote my own semver parser because i didn’t want to pull in a dependency for what’s basically three number comparisons. it’s probably fine. it validates the repo format with a regex so you can’t pass in weird stuff. set up wrangler.toml with a production and staging env. the client lives in Build/ . this is the part that actually runs in people’s apps. it’s a class called Updato (creative naming, i know). you init it with your repo, mode, and current version. then you can check for updates, download them, and apply them. downloads get cached in localStorage with version tags so stale cache gets cleaned up automatically. built with vite, outputs both esm and umd so you can import it or just drop a script tag. tooling i added after wrote a bump-version.js script that bumps the version across all four package.jsons (root + the three workspace packages), commits, tags, and pushes. one command to do a release, basically. also a little print-cdn-commit.js that tells you what the latest cdn branch commit is, which is useful for debugging. there’s a TODO.md with a bunch of stuff i want to do eventually. hot-swap support, rate limiting in the worker, tests, linting, npm publishing. the usual “i’ll get to it” list. current status it works. the action runs, the worker deploys, the client checks and downloads. trying to publish the action to the github marketplace but the name “Updato” is apparently reserved by a ghost account that doesn’t exist. so that’s cool. working on that.
devlog: hot-swap and cleanup two things happened here and they’re very different vibes. hot-swap so previously applyUpdate() was just… reload the page. which works, obviously, but it’s not exactly elegant. if you’re updating a css file there’s no reason to nuke the entire page state. now it actually tries to be smart about it. when you call applyUpdate() , it looks at each file’s extension and attempts to swap it in-place: for .js files, it finds the matching <script> tag by src and replaces it with a new one containing the updated content for .css files, it finds the matching <link> stylesheet and swaps it with a base64 data url version of the new css if none of the files can be hot-swapped (like if there’s no matching dom element, or it’s a file type it doesn’t know about), it falls back to the classic window.location.reload() . so nothing breaks, it just tries the nice path first. the base64 css thing is a little cursed honestly. but it works and avoids needing to host the file anywhere. the browser just reads it inline. i might revisit this later if it causes issues with large stylesheets but for now it’s fine. eslint + prettier added eslint and prettier to the Build package because the code was starting to look inconsistent and it was bothering me. set up a flat config with typescript-eslint, browser globals, the usual. named the prettier script make-pretty because i thought it was funny. and idk, it’s how i do it ig prettier immediately reformatted a bunch of stuff in updato.ts . removed some unnecessary quote wrapping on "Accept" , collapsed a few multi-line expressions that didn’t need to be multi-line, cleaned up trailing commas. nothing behavioral, just formatting. also committed the lockfile. should’ve done that earlier but here we are. todo progress checked off hot-swap support and the linting setup. removed the version bump script todo since that was already done in the last round. the list is getting shorter. slowly.
devlog: the “just rename it” update (and a bunch of other stuff) the name thing changed name: Updato to name: Updato Action in action.yml. that’s it. that’s the fix. spent hours filing a support ticket, got a polite “no” from github, and the solution was adding one word. sometimes software development is humbling. hot-swap got its own file ripped the hot-swap logic out of updato.ts and gave it a proper home in hot-swap.ts . while i was in there i figured i might as well make it actually good. it now supports images too. png, jpg, gif, svg, webp, ico, bmp, avif. it finds matching <img> , <source> , and favicon <link> elements by basename and swaps their src/href to a base64 data uri. so if your update is just a new logo, no reload needed. also switched the element matching from substring ( src*="${file}" ) to basename comparison, which is way less fragile. before, a file called app.js could’ve accidentally matched webapp.js . now it actually compares the filename part properly. the css swap switched from btoa() to encodeURIComponent() which handles unicode better. small thing but the kind of thing that would’ve been a weird bug later. everything returns a typed HotSwapResult now instead of just a boolean. so the caller knows what got swapped, what type it was, and which file it was for. manifest validation added a real validator in Worker/src/manifest.ts . before, the worker was just casting response.json() as Manifest and hoping for the best with a couple of if-checks. now there’s a validateManifest() function that checks every field properly and returns typed errors. each error tells you which field failed and why. this runs both when fetching fresh manifests from github and when reading cached ones from kv. if a cached manifest is corrupted it just falls through and re-fetches. rate limiting new file: Worker/src/rate-limit.ts . uses cloudflare kv to track requests per ip. 60 requests per 60 second window, which is generous enough for normal usage but should keep anyone from hammering it. uses CF-Connecting-IP for the real client ip, falls back to X-Forwarded-For . returns a proper 429 with a Retry-After header when you hit the limit. the kv entries auto-expire so they don’t pile up forever. I half wanted to make the 429 return silly messages, but I gotta be serious apparently sometimes :/ had to add a kv namespace binding in wrangler.toml for this. the worker was fully stateless before, now it has a little bit of state. felt like a big architectural decision for what’s basically a counter but whatever, it’s the right call. kv caching for manifests while i was adding kv for rate limiting i figured i might as well use it for manifest caching too. previously every /check request was hitting github’s raw content cdn directly. now it caches the manifest in kv with a configurable ttl (defaults to 300 seconds). means fewer github api calls and faster responses for repeat checks. worker got lint + prettier too copied the eslint + prettier setup from Build into Worker. also added projectService and tsconfigRootDir to both eslint configs so typescript-eslint can actually find the tsconfigs. this was one of those “why is eslint yelling at me” rabbit holes. todo cleanup checked off rate limiting and manifest validation. removed the already-completed items that were cluttering the list. it’s getting shorter.
devlog: the three commits i forgot to write about got in a flow state and forgot to devlog. here’s the catch-up. multi-branch support + notification ui the whole system was hardcoded to a branch called cdn . now you can pass a branch parameter everywhere. the worker accepts it as a query param (defaults to cdn ), the client sends it with check requests, and download urls use the right branch. manifest cache keys in kv include the branch name so different environments don’t collide. the idea is you could have cdn-staging and cdn-production in the same repo and point different app builds at different ones. added branch validation in the worker too since someone’s going to try passing something weird eventually. also built an UpdateNotification class in update-ui.ts . it’s a drop-in banner component that handles the whole flow. you pick top or bottom, set it dismissable or not, and call notification.show(result) when there’s an update. clicking the button downloads and applies. if the download fails it resets. styling is all inline so there’s no css file to import. updated both examples to use it. the example-app.html went from a hand-rolled banner with window.__pendingUpdate to just notification.show(result) . much cleaner. module scripts + download metrics the action now scans html files for <script type="module"> tags and includes a modules array in the manifest. the client passes this through to hot-swap so module scripts get replaced with type="module" set on the new element. the regex for finding them is a little fragile but it works for standard vite/webpack output. also switched the action bundler from @vercel/ncc to esbuild . ncc was fine but esbuild is faster and i was already using it elsewhere. added an opt-in DownloadMetrics class that records timing data per file download (start, end, duration, size, url) in localStorage. pass it into the config and it starts tracking. you can export as json or clear it. useful for debugging slow updates but not the kind of thing you want on by default. tests + ci wrote jest tests for all three packages. action tests mock @actions/core , @actions/github , and @actions/exec . covers input parsing, repo context, package.json version reading, recursive file listing, module script detection, and clone url construction. had to export a bunch of internal functions to make them testable. client tests use jsdom with mocked fetch. covers hot-swap (regular scripts, module scripts, stylesheets, images, unknown types), the metrics class, and the main updato class (version tracking, cache management, update checking, downloads, event callbacks). worker tests cover validation helpers, the full fetch handler (missing params, invalid params, successful checks, unknown endpoints, OPTIONS, method rejection), manifest validation with every field failure case, and the rate limiter with fake timers. ci workflow at .github/workflows/ci.yml . runs on push and pr to main, matrix across node 20 and 22. lints, runs all tests, builds all three packages. todo status checked off: multi-branch, notification ui, module types, metrics, tests, ci. what’s left is docs, a demo, and release automation. the core functionality is done.
devlog: docs, workflows, and the finish line this is the “make it real” commit. everything that was on the todo list under “before you can call this a real project” happened in one sitting. docs site built a full docs site using docmd. lives in Docs/ with its own package. seven pages covering everything: home/landing page, quickstart guide, core concepts explainer, and individual reference pages for the client library, github action, worker, hot-swap internals, manifest format, and download metrics. the client library page has full config tables, event references, api docs for every public method, and the UpdateNotification component. the action page documents every input and shows what the cdn branch looks like after a deploy. the worker page covers both endpoints, version comparison logic, caching, and rate limiting. the hot-swap page explains how each asset type gets replaced: scripts via dom replacement with data-hot-file tagging for subsequent updates, css via CSSStyleSheet.replaceSync and adoptedStyleSheets (which is CSP-safe), and images via base64 data uris. used the “sky” theme with system dark mode toggle. search, sitemap plugin, code highlighting, all enabled. github pages deployment new workflow at .github/workflows/static.yml . builds the client library, builds the demo, builds the docs, then assembles them into a single pages-root/ directory. demo goes under /demo/ , docs go at the root. deploys to gh-pages with peaceiris/actions-gh-pages. npm publish workflow .github/workflows/release-npm.yml . triggers on github release publish or manual dispatch with a dry-run option. builds the client library, strips private , scripts , and devDependencies from package.json, copies in the readme and license, then publishes with --provenance . also removed "private": true from Build/package.json so npm will actually accept it. security audit workflow daily cron job plus on-push when lockfiles change. runs npm audit --audit-level=high across every package (root, Build, Worker, Action, Demo, Docs). all the audit steps have || true so the workflow reports issues without failing the build, which felt like the right balance for now. separate test workflow split the test job out of ci.yml into its own .github/workflows/test.yml . same matrix across node 20 and 22, runs jest in all three packages. keeps the ci workflow focused on lint and build. todo status checked off docs. what’s left: update the readme with better examples, maybe attach the worker to a custom domain, and publish to npm. the npm workflow is ready, just need to actually pull the trigger.
devlog: shipped updato is published. it’s on npm. it has a version number and everything. the publish switched the build from vite to tsdown. vite was fine for dev but tsdown gives you dual esm/cjs output with proper .mjs/.cjs extensions and matching declaration files out of the box. the package exports map has real conditional exports now — separate import and require entries with their own types. it’s the kind of package.json that doesn’t make people file issues. scoped it to @nellowtcs/updato because apparently updato was too close to upath for npm’s similarity check. it is not similar. at all. but scoped names are better practice anyway so whatever, npm wins this round. the release workflow strips private , scripts , and devDependencies from package.json before publish. originally did that with an inline node script, swapped it to a one-liner jq pipe because why run a whole runtime to delete three keys. 1.0.0 → 1.0.1 released 1.0.0. immediately released 1.0.1 because of the name conflict. so it goes. the important thing is npm i @nellowtcs/updato works and the types resolve and the imports are correct. tested it, it’s real. what actually shipped all of it: github action that publishes builds to a cdn branch cloudflare worker that serves version checks from KV client library on npm with hot-swap, two update modes, optional metrics live demo at nellowtcs.me/updato docs site at nellowtcs.me/updato/docs ci pipeline for all of it a readme that actually explains what this thing does what’s left one item on the todo list: custom domain for the worker. that’s a “maybe” and it’s been a “maybe” for a while. it can stay a maybe. closing this started as a dumb idea about pushing updates without a server. it is now a real system with five directories and a package on npm and documentation with a sidebar. i don’t know when it became a real project but it did and now it’s done. first release. final (nah, probably not) devlog.
Ships:
Updato is a decentralized update system for web apps. A GitHub Action publishes builds to a CDN branch, a Cloudflare Worker handles version checks, and a client library hot-swaps files in the browser with no reload. It’s on npm as @nellowtcs /updato. It works end to end. Push code, Action builds it, Worker picks it up, client swaps files live. No server, no database. Also there’s a live demo, a docs site, and a real npm package now. It became a real project somewhere along the way. CSS hot-swapping was a whole thing. Ended up using CSSStyleSheet.replaceSync with adoptedStyleSheets to make it work without flashing or breaking CSP. Also npm told me my package name was too similar to “upath” which is just not true but whatever, scoped it and moved on. The live demo ( https://nellowtcs.me/updato/ ) is a clock app that checks for updates from the Worker. You can also install it with npm i @nellowtcs/updato and the docs are at https://nellowtcs.me/updato/docs ....
|
1793278389.6500065
|
1793364789.6500065
|